Skip to content

Commit 00bce5e

Browse files
committed
add unit tests for Registry pkg
Signed-off-by: Ansuman Sahoo <[email protected]>
1 parent d7f297a commit 00bce5e

File tree

2 files changed

+223
-1
lines changed

2 files changed

+223
-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: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
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/pkg/driver"
17+
"github.com/lima-vm/lima/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+
mockDrv := newMockDriver("test-driver")
51+
mockDrv2 := newMockDriver("test-driver-2")
52+
Register(mockDrv)
53+
Register(mockDrv2)
54+
55+
assert.Equal(t, len(internalDrivers), 2)
56+
assert.Equal(t, internalDrivers["test-driver"], mockDrv)
57+
assert.Equal(t, internalDrivers["test-driver-2"], mockDrv2)
58+
59+
// Test registering duplicate driver (should not overwrite)
60+
mockDrv3 := newMockDriver("test-driver")
61+
Register(mockDrv3)
62+
63+
assert.Equal(t, len(internalDrivers), 2)
64+
assert.Equal(t, internalDrivers["test-driver"], mockDrv)
65+
66+
driverType := CheckInternalOrExternal("test-driver")
67+
assert.Equal(t, driverType, Internal)
68+
69+
extDriver, intDriver, exists := Get("test-driver")
70+
assert.Equal(t, exists, true)
71+
assert.Assert(t, extDriver == nil)
72+
assert.Assert(t, intDriver != nil)
73+
assert.Equal(t, intDriver.Info().DriverName, "test-driver")
74+
75+
vmTypes := List()
76+
assert.Equal(t, vmTypes["test-driver-2"], Internal)
77+
}
78+
79+
func TestDiscoverDriversInDir(t *testing.T) {
80+
tempDir := t.TempDir()
81+
82+
var driverPath string
83+
driverName := "mockext"
84+
if runtime.GOOS == "windows" {
85+
driverPath = filepath.Join(tempDir, "lima-driver-"+driverName+".exe")
86+
} else {
87+
driverPath = filepath.Join(tempDir, "lima-driver-"+driverName)
88+
}
89+
90+
err := os.WriteFile(driverPath, []byte(""), 0o755)
91+
assert.NilError(t, err)
92+
t.Cleanup(func() {
93+
err := os.Remove(driverPath)
94+
assert.NilError(t, err)
95+
96+
_, err = os.Stat(driverPath)
97+
assert.Assert(t, os.IsNotExist(err))
98+
})
99+
100+
err = discoverDriversInDir(tempDir)
101+
assert.NilError(t, err)
102+
103+
assert.Equal(t, len(ExternalDrivers), 1)
104+
extDriver := ExternalDrivers[driverName]
105+
assert.Assert(t, extDriver != nil)
106+
assert.Equal(t, extDriver.Name, driverName)
107+
assert.Equal(t, extDriver.Path, driverPath)
108+
109+
driverType := CheckInternalOrExternal(driverName)
110+
assert.Equal(t, driverType, External)
111+
112+
extDriver, intDriver, exists := Get(driverName)
113+
assert.Equal(t, exists, true)
114+
assert.Assert(t, extDriver != nil)
115+
assert.Assert(t, intDriver == nil)
116+
assert.Equal(t, extDriver.Name, driverName)
117+
118+
vmTypes := List()
119+
assert.Equal(t, vmTypes[driverName], driverPath)
120+
}
121+
122+
func TestRegisterDriverFile(t *testing.T) {
123+
tests := []struct {
124+
name string
125+
filename string
126+
expectDriver bool
127+
expectedName string
128+
}{
129+
{
130+
name: "valid driver file",
131+
filename: "lima-driver-test",
132+
expectDriver: !(runtime.GOOS == "windows"),
133+
expectedName: "test",
134+
},
135+
{
136+
name: "valid driver file with extension on Windows",
137+
filename: "lima-driver-windows.exe",
138+
expectDriver: runtime.GOOS == "windows",
139+
expectedName: "windows",
140+
},
141+
{
142+
name: "invalid filename - no prefix",
143+
filename: "not-a-driver",
144+
expectDriver: false,
145+
},
146+
{
147+
name: "invalid filename - wrong prefix",
148+
filename: "driver-lima-test",
149+
expectDriver: false,
150+
},
151+
{
152+
name: "empty name after prefix",
153+
filename: "lima-driver-",
154+
expectDriver: false,
155+
},
156+
}
157+
158+
for _, tt := range tests {
159+
t.Run(tt.name, func(t *testing.T) {
160+
ExternalDrivers = make(map[string]*ExternalDriver)
161+
registerDriverFile(filepath.Join("/test/path", tt.filename))
162+
163+
if tt.expectDriver {
164+
assert.Equal(t, len(ExternalDrivers), 1)
165+
extDriver := ExternalDrivers[tt.expectedName]
166+
assert.Assert(t, extDriver != nil)
167+
assert.Equal(t, extDriver.Name, tt.expectedName)
168+
assert.Equal(t, extDriver.Path, filepath.Join("/test/path", tt.filename))
169+
} else {
170+
assert.Equal(t, len(ExternalDrivers), 0)
171+
}
172+
})
173+
}
174+
}
175+
176+
func TestGet(t *testing.T) {
177+
internalDrivers = make(map[string]driver.Driver)
178+
ExternalDrivers = make(map[string]*ExternalDriver)
179+
180+
mockDrv := newMockDriver("internal-test")
181+
Register(mockDrv)
182+
183+
extDriver, intDriver, exists := Get("internal-test")
184+
assert.Equal(t, exists, true)
185+
assert.Assert(t, extDriver == nil)
186+
assert.Equal(t, intDriver, mockDrv)
187+
188+
registerExternalDriver("external-test", "/path/to/external")
189+
190+
extDriver, intDriver, exists = Get("external-test")
191+
assert.Equal(t, exists, true)
192+
assert.Assert(t, extDriver != nil)
193+
assert.Assert(t, intDriver == nil)
194+
assert.Equal(t, extDriver.Name, "external-test")
195+
196+
extDriver, intDriver, exists = Get("non-existent")
197+
assert.Equal(t, exists, false)
198+
assert.Assert(t, extDriver == nil)
199+
assert.Assert(t, intDriver == nil)
200+
}
201+
202+
func TestList(t *testing.T) {
203+
internalDrivers = make(map[string]driver.Driver)
204+
ExternalDrivers = make(map[string]*ExternalDriver)
205+
206+
vmTypes := List()
207+
assert.Equal(t, len(vmTypes), 0)
208+
209+
mockDrv := newMockDriver("internal-test")
210+
Register(mockDrv)
211+
212+
vmTypes = List()
213+
assert.Equal(t, len(vmTypes), 1)
214+
assert.Equal(t, vmTypes["internal-test"], Internal)
215+
216+
registerExternalDriver("external-test", "/path/to/external")
217+
218+
vmTypes = List()
219+
assert.Equal(t, len(vmTypes), 2)
220+
assert.Equal(t, vmTypes["internal-test"], Internal)
221+
assert.Equal(t, vmTypes["external-test"], "/path/to/external")
222+
}

0 commit comments

Comments
 (0)