Skip to content

Commit efb2779

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 <ashwatpas@gmail.com>
1 parent f59074b commit efb2779

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed

pkg/driverutil/disk_test.go

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

0 commit comments

Comments
 (0)