Skip to content

Commit ea17ac7

Browse files
committed
test(driverutil): add EnsureDisk tests for ISO and non-ISO base images
Add pkg/driverutil/disk_test.go covering: - Base image is ISO: EnsureDisk creates/keeps diffdisk and converts to raw; base ISO remains unchanged (content hash and ISO signature). - Base image is non-ISO: EnsureDisk converts diffdisk to raw. Signed-off-by: ashwat287 <[email protected]>
1 parent f59074b commit ea17ac7

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

pkg/driverutil/disk_test.go

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// SPDX-FileCopyrightText: Copyright The Lima Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package driverutil
5+
6+
import (
7+
"crypto/sha256"
8+
"encoding/hex"
9+
"os"
10+
"path/filepath"
11+
"strings"
12+
"testing"
13+
14+
"github.com/lima-vm/go-qcow2reader"
15+
"github.com/lima-vm/go-qcow2reader/image"
16+
"gotest.tools/v3/assert"
17+
18+
"github.com/lima-vm/lima/v2/pkg/iso9660util"
19+
"github.com/lima-vm/lima/v2/pkg/limatype/filenames"
20+
)
21+
22+
const typeRAW = image.Type("raw")
23+
24+
func makeTempInstanceDir(t *testing.T) string {
25+
t.Helper()
26+
return t.TempDir()
27+
}
28+
29+
func writeMinimalISO(t *testing.T, path string) {
30+
t.Helper()
31+
entries := []iso9660util.Entry{
32+
{Path: "/hello.txt", Reader: strings.NewReader("hello world")},
33+
}
34+
assert.NilError(t, iso9660util.Write(path, "TESTISO", entries))
35+
}
36+
37+
func writeNonISO(t *testing.T, path string) {
38+
t.Helper()
39+
size := 64 * 1024
40+
buf := make([]byte, size)
41+
copy(buf[0x8001:], "XXXXX")
42+
assert.NilError(t, os.WriteFile(path, buf, 0o644))
43+
}
44+
45+
func sha256File(t *testing.T, path string) string {
46+
t.Helper()
47+
b, err := os.ReadFile(path)
48+
assert.NilError(t, err)
49+
sum := sha256.Sum256(b)
50+
return hex.EncodeToString(sum[:])
51+
}
52+
53+
func detectImageType(t *testing.T, path string) image.Type {
54+
t.Helper()
55+
f, err := os.Open(path)
56+
assert.NilError(t, err)
57+
defer f.Close()
58+
img, err := qcow2reader.Open(f)
59+
assert.NilError(t, err)
60+
return img.Type()
61+
}
62+
63+
func TestEnsureDisk_WithISOBaseImage(t *testing.T) {
64+
instDir := makeTempInstanceDir(t)
65+
base := filepath.Join(instDir, filenames.BaseDisk)
66+
diff := filepath.Join(instDir, filenames.DiffDisk)
67+
68+
writeMinimalISO(t, base)
69+
70+
isISO, err := iso9660util.IsISO9660(base)
71+
assert.NilError(t, err)
72+
assert.Assert(t, isISO)
73+
baseHashBefore := sha256File(t, base)
74+
75+
assert.NilError(t, EnsureDisk(t.Context(), instDir, "2MiB", typeRAW))
76+
77+
isISO, err = iso9660util.IsISO9660(base)
78+
assert.NilError(t, err)
79+
assert.Assert(t, isISO)
80+
assert.Equal(t, baseHashBefore, sha256File(t, base))
81+
82+
fi, err := os.Stat(diff)
83+
assert.NilError(t, err)
84+
assert.Assert(t, fi.Size() > 0)
85+
assert.Equal(t, detectImageType(t, diff), typeRAW)
86+
}
87+
88+
func TestEnsureDisk_WithNonISOBaseImage(t *testing.T) {
89+
instDir := makeTempInstanceDir(t)
90+
base := filepath.Join(instDir, filenames.BaseDisk)
91+
diff := filepath.Join(instDir, filenames.DiffDisk)
92+
93+
writeNonISO(t, base)
94+
95+
isISO, err := iso9660util.IsISO9660(base)
96+
assert.NilError(t, err)
97+
assert.Assert(t, !isISO)
98+
99+
assert.NilError(t, EnsureDisk(t.Context(), instDir, "2MiB", typeRAW))
100+
101+
fi, err := os.Stat(diff)
102+
assert.NilError(t, err)
103+
assert.Assert(t, fi.Size() > 0)
104+
assert.Equal(t, detectImageType(t, diff), typeRAW)
105+
}
106+
107+
func TestEnsureDisk_ExistingDiffDisk(t *testing.T) {
108+
instDir := makeTempInstanceDir(t)
109+
base := filepath.Join(instDir, filenames.BaseDisk)
110+
diff := filepath.Join(instDir, filenames.DiffDisk)
111+
112+
writeNonISO(t, base)
113+
assert.NilError(t, os.WriteFile(diff, []byte("preexisting"), 0o644))
114+
origHash := sha256File(t, diff)
115+
116+
assert.NilError(t, EnsureDisk(t.Context(), instDir, "2MiB", typeRAW))
117+
118+
assert.Equal(t, sha256File(t, diff), origHash)
119+
}

0 commit comments

Comments
 (0)