Skip to content

Commit 49305c7

Browse files
committed
Extract qemuimg test package
The qemuimg package provides now only qemuimg.Convert(). I plan to add qemuimg.Create(), qemuimg.Info(), qemuimg.Map(), and qemuimg.Compare(). This makes the code nicer to work with, but adds a test only dependency. The qcow2reader tests use now qemu2reader_test package, so the dependency should be built only for tests. The qemuimg test package will also be useful for other project using this library, since testing code using the library typically requires creating, converting and comparing qcow2 images. Signed-off-by: Nir Soffer <[email protected]>
1 parent b008ef1 commit 49305c7

File tree

2 files changed

+55
-38
lines changed

2 files changed

+55
-38
lines changed

qcow2reader_test.go

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
1-
package qcow2reader
1+
// Package qcow2reader_test keeps blackbox tests for qcow2reader.
2+
package qcow2reader_test
23

34
import (
4-
"bytes"
5-
"errors"
65
"fmt"
76
"io"
87
"math/rand"
98
"os"
10-
"os/exec"
119
"path/filepath"
1210
"testing"
1311

12+
"github.com/lima-vm/go-qcow2reader"
1413
"github.com/lima-vm/go-qcow2reader/convert"
15-
"github.com/lima-vm/go-qcow2reader/image"
16-
"github.com/lima-vm/go-qcow2reader/image/qcow2"
14+
"github.com/lima-vm/go-qcow2reader/test/qemuimg"
1715
)
1816

1917
const (
2018
MiB = int64(1) << 20
2119
GiB = int64(1) << 30
22-
23-
CompressionTypeNone = qcow2.CompressionType(255)
2420
)
2521

2622
// Benchmark completely empty sparse image (0% utilization). This is the best
@@ -33,7 +29,7 @@ func Benchmark0p(b *testing.B) {
3329
}
3430
b.Run("qcow2", func(b *testing.B) {
3531
img := base + ".qocw2"
36-
if err := qemuImgConvert(base, img, qcow2.Type, CompressionTypeNone); err != nil {
32+
if err := qemuimg.Convert(base, img, qemuimg.FormatQcow2, qemuimg.CompressionNone); err != nil {
3733
b.Fatal(err)
3834
}
3935
b.Run("read", func(b *testing.B) {
@@ -51,7 +47,7 @@ func Benchmark0p(b *testing.B) {
5147
})
5248
b.Run("qcow2 zlib", func(b *testing.B) {
5349
img := base + ".zlib.qcow2"
54-
if err := qemuImgConvert(base, img, qcow2.Type, qcow2.CompressionTypeZlib); err != nil {
50+
if err := qemuimg.Convert(base, img, qemuimg.FormatQcow2, qemuimg.CompressionZlib); err != nil {
5551
b.Fatal(err)
5652
}
5753
b.Run("read", func(b *testing.B) {
@@ -79,7 +75,7 @@ func Benchmark50p(b *testing.B) {
7975
}
8076
b.Run("qcow2", func(b *testing.B) {
8177
img := base + ".qocw2"
82-
if err := qemuImgConvert(base, img, qcow2.Type, CompressionTypeNone); err != nil {
78+
if err := qemuimg.Convert(base, img, qemuimg.FormatQcow2, qemuimg.CompressionNone); err != nil {
8379
b.Fatal(err)
8480
}
8581
b.Run("read", func(b *testing.B) {
@@ -97,7 +93,7 @@ func Benchmark50p(b *testing.B) {
9793
})
9894
b.Run("qcow2 zlib", func(b *testing.B) {
9995
img := base + ".zlib.qcow2"
100-
if err := qemuImgConvert(base, img, qcow2.Type, qcow2.CompressionTypeZlib); err != nil {
96+
if err := qemuimg.Convert(base, img, qemuimg.FormatQcow2, qemuimg.CompressionZlib); err != nil {
10197
b.Fatal(err)
10298
}
10399
b.Run("read", func(b *testing.B) {
@@ -126,7 +122,7 @@ func Benchmark100p(b *testing.B) {
126122
}
127123
b.Run("qcow2", func(b *testing.B) {
128124
img := base + ".qocw2"
129-
if err := qemuImgConvert(base, img, qcow2.Type, CompressionTypeNone); err != nil {
125+
if err := qemuimg.Convert(base, img, qemuimg.FormatQcow2, qemuimg.CompressionNone); err != nil {
130126
b.Fatal(err)
131127
}
132128
b.Run("read", func(b *testing.B) {
@@ -144,7 +140,7 @@ func Benchmark100p(b *testing.B) {
144140
})
145141
b.Run("qcow2 zlib", func(b *testing.B) {
146142
img := base + ".zlib.qcow2"
147-
if err := qemuImgConvert(base, img, qcow2.Type, qcow2.CompressionTypeZlib); err != nil {
143+
if err := qemuimg.Convert(base, img, qemuimg.FormatQcow2, qemuimg.CompressionZlib); err != nil {
148144
b.Fatal(err)
149145
}
150146
b.Run("read", func(b *testing.B) {
@@ -171,7 +167,7 @@ func benchmarkRead(b *testing.B, filename string) {
171167
b.Fatal(err)
172168
}
173169
defer f.Close()
174-
img, err := Open(f)
170+
img, err := qcow2reader.Open(f)
175171
if err != nil {
176172
b.Fatal(err)
177173
}
@@ -198,7 +194,7 @@ func benchmarkConvert(b *testing.B, filename string) {
198194
b.Fatal(err)
199195
}
200196
defer f.Close()
201-
img, err := Open(f)
197+
img, err := qcow2reader.Open(f)
202198
if err != nil {
203199
b.Fatal(err)
204200
}
@@ -289,25 +285,3 @@ func (g *Generator) Read(b []byte) (int, error) {
289285
})
290286
return len(b), nil
291287
}
292-
293-
func qemuImgConvert(src, dst string, dstFormat image.Type, compressionType qcow2.CompressionType) error {
294-
args := []string{"convert", "-O", string(dstFormat)}
295-
if compressionType != CompressionTypeNone {
296-
args = append(args, "-c", "-o", "compression_type="+compressionType.String())
297-
}
298-
args = append(args, src, dst)
299-
cmd := exec.Command("qemu-img", args...)
300-
301-
var stderr bytes.Buffer
302-
cmd.Stderr = &stderr
303-
304-
if err := cmd.Run(); err != nil {
305-
// Return qemu-img stderr instead of the unhelpful default error (exited
306-
// with status 1).
307-
if _, ok := err.(*exec.ExitError); ok {
308-
return errors.New(stderr.String())
309-
}
310-
return err
311-
}
312-
return nil
313-
}

test/qemuimg/qemuimg.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package qemuimg
2+
3+
import (
4+
"bytes"
5+
"errors"
6+
"os/exec"
7+
)
8+
9+
type CompressionType string
10+
type Format string
11+
12+
const (
13+
// Compression types.
14+
CompressionNone = CompressionType("")
15+
CompressionZlib = CompressionType("zlib")
16+
CompressionZstd = CompressionType("zstd")
17+
18+
// Image formats.
19+
FormatQcow2 = Format("qcow2")
20+
FormatRaw = Format("raw")
21+
)
22+
23+
func Convert(src, dst string, dstFormat Format, compressionType CompressionType) error {
24+
args := []string{"convert", "-O", string(dstFormat)}
25+
if compressionType != CompressionNone {
26+
args = append(args, "-c", "-o", "compression_type="+string(compressionType))
27+
}
28+
args = append(args, src, dst)
29+
cmd := exec.Command("qemu-img", args...)
30+
31+
var stderr bytes.Buffer
32+
cmd.Stderr = &stderr
33+
34+
if err := cmd.Run(); err != nil {
35+
// Return qemu-img stderr instead of the unhelpful default error (exited
36+
// with status 1).
37+
if _, ok := err.(*exec.ExitError); ok {
38+
return errors.New(stderr.String())
39+
}
40+
return err
41+
}
42+
return nil
43+
}

0 commit comments

Comments
 (0)