go/qcow2: implement simple image generator
This is a write-at-once, write-only library for qcow2 images. We will
use it in tests to generate copy-on-write, snapshot-style images
(instead of wasting disk space and iops copying the node image every
time).
Change-Id: I3c8eaeb0c6fa1da44255eb7fc577168d6066d8e3
Reviewed-on: https://review.monogon.dev/c/monogon/+/3092
Tested-by: Jenkins CI
Reviewed-by: Jan Schär <jan@monogon.tech>
diff --git a/go/qcow2/qcow2_test.go b/go/qcow2/qcow2_test.go
new file mode 100644
index 0000000..3b987c0
--- /dev/null
+++ b/go/qcow2/qcow2_test.go
@@ -0,0 +1,42 @@
+package qcow2
+
+import (
+ "fmt"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "testing"
+
+ "github.com/bazelbuild/rules_go/go/runfiles"
+)
+
+// TestGenerate exercises the Generate function for a variety of image sizes.
+func TestGenerate(t *testing.T) {
+ qemuImg, err := runfiles.Rlocation("qemu/qemu-img")
+ if err != nil {
+ t.Fatalf("Could not locate qemu-img: %v", err)
+ }
+
+ // Test all orders of magnitude from 1KiB to 1PiB.
+ for i := 20; i < 50; i++ {
+ t.Run(fmt.Sprintf("%d", 1<<i), func(t *testing.T) {
+ path := filepath.Join(t.TempDir(), "test.qcow2")
+
+ f, err := os.Create(path)
+ if err != nil {
+ t.Fatalf("Could not create test image file: %v", err)
+ }
+ if err := Generate(f, GenerateWithFileSize(1<<i)); err != nil {
+ t.Fatalf("Generate(%d bytes): %v", 1<<i, err)
+ }
+ if err := f.Close(); err != nil {
+ t.Fatalf("Close: %v", err)
+ }
+
+ cmd := exec.Command(qemuImg, "check", path)
+ if err := cmd.Run(); err != nil {
+ t.Fatalf("qemu-img check failed: %v", err)
+ }
+ })
+ }
+}