Skip to content

Commit 39fbe4a

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 asif and raw; base ISO remains unchanged (content hash and ISO signature). - Base image is non-ISO: EnsureDisk converts diffdisk to raw and asif. Signed-off-by: ashwat287 <[email protected]>
1 parent 65f9ec3 commit 39fbe4a

File tree

1 file changed

+165
-0
lines changed

1 file changed

+165
-0
lines changed

pkg/driverutil/disk_test.go

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
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+
"os/exec"
11+
"path/filepath"
12+
"runtime"
13+
"strings"
14+
"sync"
15+
"testing"
16+
17+
"github.com/coreos/go-semver/semver"
18+
"github.com/lima-vm/go-qcow2reader"
19+
"github.com/lima-vm/go-qcow2reader/image"
20+
"gotest.tools/v3/assert"
21+
22+
"github.com/lima-vm/lima/v2/pkg/iso9660util"
23+
"github.com/lima-vm/lima/v2/pkg/limatype/filenames"
24+
)
25+
26+
const (
27+
typeRAW = image.Type("raw")
28+
typeASIF = image.Type("asif")
29+
)
30+
31+
func writeMinimalISO(t *testing.T, path string) {
32+
t.Helper()
33+
entries := []iso9660util.Entry{
34+
{Path: "/hello.txt", Reader: strings.NewReader("hello world")},
35+
}
36+
assert.NilError(t, iso9660util.Write(path, "TESTISO", entries))
37+
}
38+
39+
func writeNonISO(t *testing.T, path string) {
40+
t.Helper()
41+
size := 64 * 1024
42+
buf := make([]byte, size)
43+
copy(buf[0x8001:], "XXXXX")
44+
assert.NilError(t, os.WriteFile(path, buf, 0o644))
45+
}
46+
47+
func sha256File(t *testing.T, path string) string {
48+
t.Helper()
49+
b, err := os.ReadFile(path)
50+
assert.NilError(t, err)
51+
sum := sha256.Sum256(b)
52+
return hex.EncodeToString(sum[:])
53+
}
54+
55+
func detectImageType(t *testing.T, path string) image.Type {
56+
t.Helper()
57+
f, err := os.Open(path)
58+
assert.NilError(t, err)
59+
defer f.Close()
60+
img, err := qcow2reader.Open(f)
61+
assert.NilError(t, err)
62+
return img.Type()
63+
}
64+
65+
func checkDisk(t *testing.T, diff string, expectedType image.Type) {
66+
t.Helper()
67+
fi, err := os.Stat(diff)
68+
assert.NilError(t, err)
69+
assert.Assert(t, fi.Size() > 0)
70+
assert.Equal(t, detectImageType(t, diff), expectedType)
71+
}
72+
73+
var ProductVersion = sync.OnceValues(func() (*semver.Version, error) {
74+
out, err := exec.Command("sw_vers", "-productVersion").Output()
75+
if err != nil {
76+
return nil, err
77+
}
78+
vStr := strings.TrimSpace(string(out))
79+
// Normalize "14.5" -> "14.5.0" so semver accepts it.
80+
if strings.Count(vStr, ".") == 1 {
81+
vStr += ".0"
82+
}
83+
return semver.NewVersion(vStr)
84+
})
85+
86+
func isMacOS26OrHigher() bool {
87+
if runtime.GOOS != "darwin" {
88+
return false
89+
}
90+
version, err := ProductVersion()
91+
if err != nil {
92+
return false
93+
}
94+
return version.Major >= 26
95+
}
96+
97+
func TestEnsureDisk_WithISOBaseImage(t *testing.T) {
98+
instDir := t.TempDir()
99+
base := filepath.Join(instDir, filenames.BaseDisk)
100+
diff := filepath.Join(instDir, filenames.DiffDisk)
101+
102+
writeMinimalISO(t, base)
103+
isISO, err := iso9660util.IsISO9660(base)
104+
assert.NilError(t, err)
105+
assert.Assert(t, isISO)
106+
baseHashBefore := sha256File(t, base)
107+
108+
formats := []image.Type{typeRAW}
109+
if isMacOS26OrHigher() {
110+
formats = append(formats, typeASIF)
111+
}
112+
113+
for _, format := range formats {
114+
assert.NilError(t, EnsureDisk(t.Context(), instDir, "2MiB", format))
115+
isISO, err = iso9660util.IsISO9660(base)
116+
assert.NilError(t, err)
117+
assert.Assert(t, isISO)
118+
assert.Equal(t, baseHashBefore, sha256File(t, base))
119+
checkDisk(t, diff, format)
120+
assert.NilError(t, os.Remove(diff))
121+
}
122+
}
123+
124+
func TestEnsureDisk_WithNonISOBaseImage(t *testing.T) {
125+
instDir := t.TempDir()
126+
base := filepath.Join(instDir, filenames.BaseDisk)
127+
diff := filepath.Join(instDir, filenames.DiffDisk)
128+
129+
writeNonISO(t, base)
130+
isISO, err := iso9660util.IsISO9660(base)
131+
assert.NilError(t, err)
132+
assert.Assert(t, !isISO)
133+
134+
formats := []image.Type{typeRAW}
135+
if isMacOS26OrHigher() {
136+
formats = append(formats, typeASIF)
137+
}
138+
139+
for _, format := range formats {
140+
assert.NilError(t, EnsureDisk(t.Context(), instDir, "2MiB", format))
141+
checkDisk(t, diff, format)
142+
assert.NilError(t, os.Remove(diff))
143+
}
144+
}
145+
146+
func TestEnsureDisk_ExistingDiffDisk(t *testing.T) {
147+
instDir := t.TempDir()
148+
base := filepath.Join(instDir, filenames.BaseDisk)
149+
diff := filepath.Join(instDir, filenames.DiffDisk)
150+
151+
writeNonISO(t, base)
152+
153+
formats := []image.Type{typeRAW}
154+
if isMacOS26OrHigher() {
155+
formats = append(formats, typeASIF)
156+
}
157+
158+
for _, format := range formats {
159+
assert.NilError(t, os.WriteFile(diff, []byte("preexisting"), 0o644))
160+
origHash := sha256File(t, diff)
161+
assert.NilError(t, EnsureDisk(t.Context(), instDir, "2MiB", format))
162+
assert.Equal(t, sha256File(t, diff), origHash)
163+
assert.NilError(t, os.Remove(diff))
164+
}
165+
}

0 commit comments

Comments
 (0)