Skip to content

Commit b1216d8

Browse files
authored
Merge pull request #3735 from unsuman/test/registry
Add unit tests for VM Driver Registry package
2 parents b41430f + ca8e13a commit b1216d8

File tree

2 files changed

+232
-1
lines changed

2 files changed

+232
-1
lines changed

pkg/registry/registry.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func registerDriverFile(path string) {
177177
name = strings.TrimSuffix(strings.TrimPrefix(base, "lima-driver-"), ".exe")
178178
}
179179
} else {
180-
if strings.HasPrefix(base, "lima-driver-") {
180+
if strings.HasPrefix(base, "lima-driver-") && !strings.HasSuffix(base, ".exe") {
181181
name = strings.TrimPrefix(base, "lima-driver-")
182182
}
183183
}

pkg/registry/registry_test.go

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
// SPDX-FileCopyrightText: Copyright The Lima Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package registry
5+
6+
import (
7+
"context"
8+
"net"
9+
"os"
10+
"path/filepath"
11+
"runtime"
12+
"testing"
13+
14+
"gotest.tools/v3/assert"
15+
16+
"github.com/lima-vm/lima/v2/pkg/driver"
17+
"github.com/lima-vm/lima/v2/pkg/store"
18+
)
19+
20+
type mockDriver struct {
21+
Name string
22+
}
23+
24+
func newMockDriver(name string) *mockDriver {
25+
return &mockDriver{Name: name}
26+
}
27+
28+
var _ driver.Driver = (*mockDriver)(nil)
29+
30+
func (m *mockDriver) Validate() error { return nil }
31+
func (m *mockDriver) Initialize(_ context.Context) error { return nil }
32+
func (m *mockDriver) CreateDisk(_ context.Context) error { return nil }
33+
func (m *mockDriver) Start(_ context.Context) (chan error, error) { return nil, nil }
34+
func (m *mockDriver) Stop(_ context.Context) error { return nil }
35+
func (m *mockDriver) RunGUI() error { return nil }
36+
func (m *mockDriver) ChangeDisplayPassword(_ context.Context, _ string) error { return nil }
37+
func (m *mockDriver) DisplayConnection(_ context.Context) (string, error) { return "", nil }
38+
func (m *mockDriver) CreateSnapshot(_ context.Context, _ string) error { return nil }
39+
func (m *mockDriver) ApplySnapshot(_ context.Context, _ string) error { return nil }
40+
func (m *mockDriver) DeleteSnapshot(_ context.Context, _ string) error { return nil }
41+
func (m *mockDriver) ListSnapshots(_ context.Context) (string, error) { return "", nil }
42+
func (m *mockDriver) Register(_ context.Context) error { return nil }
43+
func (m *mockDriver) Unregister(_ context.Context) error { return nil }
44+
func (m *mockDriver) ForwardGuestAgent() bool { return false }
45+
func (m *mockDriver) GuestAgentConn(_ context.Context) (net.Conn, string, error) { return nil, "", nil }
46+
func (m *mockDriver) Info() driver.Info { return driver.Info{DriverName: m.Name} }
47+
func (m *mockDriver) Configure(_ *store.Instance, _ int) *driver.ConfiguredDriver { return nil }
48+
49+
func TestRegister(t *testing.T) {
50+
BackupRegistry(t)
51+
52+
mockDrv := newMockDriver("test-driver")
53+
mockDrv2 := newMockDriver("test-driver-2")
54+
Register(mockDrv)
55+
Register(mockDrv2)
56+
57+
assert.Equal(t, len(internalDrivers), 2)
58+
assert.Equal(t, internalDrivers["test-driver"], mockDrv)
59+
assert.Equal(t, internalDrivers["test-driver-2"], mockDrv2)
60+
61+
// Test registering duplicate driver (should not overwrite)
62+
mockDrv3 := newMockDriver("test-driver")
63+
Register(mockDrv3)
64+
65+
assert.Equal(t, len(internalDrivers), 2)
66+
assert.Equal(t, internalDrivers["test-driver"], mockDrv)
67+
68+
driverType := CheckInternalOrExternal("test-driver")
69+
assert.Equal(t, driverType, Internal)
70+
71+
extDriver, intDriver, exists := Get("test-driver")
72+
assert.Equal(t, exists, true)
73+
assert.Assert(t, extDriver == nil)
74+
assert.Assert(t, intDriver != nil)
75+
assert.Equal(t, intDriver.Info().DriverName, "test-driver")
76+
77+
vmTypes := List()
78+
assert.Equal(t, vmTypes["test-driver-2"], Internal)
79+
}
80+
81+
func TestDiscoverDriversInDir(t *testing.T) {
82+
BackupRegistry(t)
83+
84+
tempDir := t.TempDir()
85+
86+
var driverPath string
87+
driverName := "mockext"
88+
if runtime.GOOS == "windows" {
89+
driverPath = filepath.Join(tempDir, "lima-driver-"+driverName+".exe")
90+
} else {
91+
driverPath = filepath.Join(tempDir, "lima-driver-"+driverName)
92+
}
93+
94+
err := os.WriteFile(driverPath, []byte(""), 0o755)
95+
assert.NilError(t, err)
96+
97+
err = discoverDriversInDir(tempDir)
98+
assert.NilError(t, err)
99+
100+
assert.Equal(t, len(ExternalDrivers), 1)
101+
extDriver := ExternalDrivers[driverName]
102+
assert.Assert(t, extDriver != nil)
103+
assert.Equal(t, extDriver.Name, driverName)
104+
assert.Equal(t, extDriver.Path, driverPath)
105+
106+
driverType := CheckInternalOrExternal(driverName)
107+
assert.Equal(t, driverType, External)
108+
109+
extDriver, intDriver, exists := Get(driverName)
110+
assert.Equal(t, exists, true)
111+
assert.Assert(t, extDriver != nil)
112+
assert.Assert(t, intDriver == nil)
113+
assert.Equal(t, extDriver.Name, driverName)
114+
115+
vmTypes := List()
116+
assert.Equal(t, vmTypes[driverName], driverPath)
117+
}
118+
119+
func TestRegisterDriverFile(t *testing.T) {
120+
BackupRegistry(t)
121+
122+
tests := []struct {
123+
name string
124+
filename string
125+
expectDriver bool
126+
expectedName string
127+
}{
128+
{
129+
name: "valid driver file",
130+
filename: "lima-driver-test",
131+
expectDriver: runtime.GOOS != "windows",
132+
expectedName: "test",
133+
},
134+
{
135+
name: "valid driver file with extension on Windows",
136+
filename: "lima-driver-windows.exe",
137+
expectDriver: runtime.GOOS == "windows",
138+
expectedName: "windows",
139+
},
140+
{
141+
name: "invalid filename - no prefix",
142+
filename: "not-a-driver",
143+
expectDriver: false,
144+
},
145+
{
146+
name: "invalid filename - wrong prefix",
147+
filename: "driver-lima-test",
148+
expectDriver: false,
149+
},
150+
{
151+
name: "empty name after prefix",
152+
filename: "lima-driver-",
153+
expectDriver: false,
154+
},
155+
}
156+
157+
for _, tt := range tests {
158+
t.Run(tt.name, func(t *testing.T) {
159+
ExternalDrivers = make(map[string]*ExternalDriver)
160+
registerDriverFile(filepath.Join("/test/path", tt.filename))
161+
162+
if tt.expectDriver {
163+
assert.Equal(t, len(ExternalDrivers), 1)
164+
extDriver := ExternalDrivers[tt.expectedName]
165+
assert.Assert(t, extDriver != nil)
166+
assert.Equal(t, extDriver.Name, tt.expectedName)
167+
assert.Equal(t, extDriver.Path, filepath.Join("/test/path", tt.filename))
168+
} else {
169+
assert.Equal(t, len(ExternalDrivers), 0)
170+
}
171+
})
172+
}
173+
}
174+
175+
func TestGet(t *testing.T) {
176+
BackupRegistry(t)
177+
178+
mockDrv := newMockDriver("internal-test")
179+
Register(mockDrv)
180+
181+
extDriver, intDriver, exists := Get("internal-test")
182+
assert.Equal(t, exists, true)
183+
assert.Assert(t, extDriver == nil)
184+
assert.Equal(t, intDriver, mockDrv)
185+
186+
registerExternalDriver("external-test", "/path/to/external")
187+
188+
extDriver, intDriver, exists = Get("external-test")
189+
assert.Equal(t, exists, true)
190+
assert.Assert(t, extDriver != nil)
191+
assert.Assert(t, intDriver == nil)
192+
assert.Equal(t, extDriver.Name, "external-test")
193+
194+
extDriver, intDriver, exists = Get("non-existent")
195+
assert.Equal(t, exists, false)
196+
assert.Assert(t, extDriver == nil)
197+
assert.Assert(t, intDriver == nil)
198+
}
199+
200+
func TestList(t *testing.T) {
201+
BackupRegistry(t)
202+
203+
vmTypes := List()
204+
assert.Equal(t, len(vmTypes), 0)
205+
206+
mockDrv := newMockDriver("internal-test")
207+
Register(mockDrv)
208+
209+
vmTypes = List()
210+
assert.Equal(t, len(vmTypes), 1)
211+
assert.Equal(t, vmTypes["internal-test"], Internal)
212+
213+
registerExternalDriver("external-test", "/path/to/external")
214+
215+
vmTypes = List()
216+
assert.Equal(t, len(vmTypes), 2)
217+
assert.Equal(t, vmTypes["internal-test"], Internal)
218+
assert.Equal(t, vmTypes["external-test"], "/path/to/external")
219+
}
220+
221+
func BackupRegistry(t *testing.T) {
222+
originalExternalDrivers := ExternalDrivers
223+
originalInternalDrivers := internalDrivers
224+
t.Cleanup(func() {
225+
ExternalDrivers = originalExternalDrivers
226+
internalDrivers = originalInternalDrivers
227+
})
228+
229+
internalDrivers = make(map[string]driver.Driver)
230+
ExternalDrivers = make(map[string]*ExternalDriver)
231+
}

0 commit comments

Comments
 (0)