Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/imgutil/nativeimgutil/nativeimgutil_test.go
2621 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package nativeimgutil
5
6
import (
7
"context"
8
"os"
9
"os/exec"
10
"path/filepath"
11
"strings"
12
"testing"
13
14
"github.com/lima-vm/go-qcow2reader/image/raw"
15
"gotest.tools/v3/assert"
16
)
17
18
func TestRoundUp(t *testing.T) {
19
tests := []struct {
20
Size int64
21
Rounded int64
22
}{
23
{0, 0},
24
{1, 512},
25
{511, 512},
26
{512, 512},
27
{123456789, 123457024},
28
}
29
for _, tc := range tests {
30
if roundUp(tc.Size) != tc.Rounded {
31
t.Errorf("expected %d, got %d", tc.Rounded, tc.Size)
32
}
33
}
34
}
35
36
func createImg(ctx context.Context, name, format, size string) error {
37
return exec.CommandContext(ctx, "qemu-img", "create", name, "-f", format, size).Run()
38
}
39
40
func TestConvertToRaw(t *testing.T) {
41
_, err := exec.LookPath("qemu-img")
42
if err != nil {
43
t.Skipf("qemu-img does not seem installed: %v", err)
44
}
45
tmpDir := t.TempDir()
46
ctx := t.Context()
47
48
qcowImage, err := os.Create(filepath.Join(tmpDir, "qcow.img"))
49
assert.NilError(t, err)
50
defer qcowImage.Close()
51
err = createImg(ctx, qcowImage.Name(), "qcow2", "1M")
52
assert.NilError(t, err)
53
54
rawImage, err := os.Create(filepath.Join(tmpDir, "raw.img"))
55
assert.NilError(t, err)
56
defer rawImage.Close()
57
err = createImg(ctx, rawImage.Name(), "raw", "1M")
58
assert.NilError(t, err)
59
60
rawImageExtended, err := os.Create(filepath.Join(tmpDir, "raw_extended.img"))
61
assert.NilError(t, err)
62
defer rawImageExtended.Close()
63
err = createImg(ctx, rawImageExtended.Name(), "raw", "2M")
64
assert.NilError(t, err)
65
66
t.Run("qcow without backing file", func(t *testing.T) {
67
resultImage := filepath.Join(tmpDir, strings.ReplaceAll(strings.ReplaceAll(t.Name(), string(os.PathSeparator), "_"), "/", "_"))
68
69
err = convertTo(raw.Type, qcowImage.Name(), resultImage, nil, false)
70
assert.NilError(t, err)
71
assertFileEquals(t, rawImage.Name(), resultImage)
72
})
73
74
t.Run("qcow with backing file", func(t *testing.T) {
75
resultImage := filepath.Join(tmpDir, strings.ReplaceAll(strings.ReplaceAll(t.Name(), string(os.PathSeparator), "_"), "/", "_"))
76
77
err = convertTo(raw.Type, qcowImage.Name(), resultImage, nil, true)
78
assert.NilError(t, err)
79
assertFileEquals(t, rawImage.Name(), resultImage)
80
})
81
82
t.Run("qcow with extra size", func(t *testing.T) {
83
resultImage := filepath.Join(tmpDir, strings.ReplaceAll(strings.ReplaceAll(t.Name(), string(os.PathSeparator), "_"), "/", "_"))
84
85
size := int64(2_097_152) // 2mb
86
err = convertTo(raw.Type, qcowImage.Name(), resultImage, &size, false)
87
assert.NilError(t, err)
88
assertFileEquals(t, rawImageExtended.Name(), resultImage)
89
})
90
91
t.Run("raw", func(t *testing.T) {
92
resultImage := filepath.Join(tmpDir, strings.ReplaceAll(strings.ReplaceAll(t.Name(), string(os.PathSeparator), "_"), "/", "_"))
93
94
err = convertTo(raw.Type, rawImage.Name(), resultImage, nil, false)
95
assert.NilError(t, err)
96
assertFileEquals(t, rawImage.Name(), resultImage)
97
})
98
}
99
100
func assertFileEquals(t *testing.T, expected, actual string) {
101
expectedContent, err := os.ReadFile(expected)
102
assert.NilError(t, err)
103
actualContent, err := os.ReadFile(actual)
104
assert.NilError(t, err)
105
assert.DeepEqual(t, expectedContent, actualContent)
106
}
107
108