Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/registry/registry_test.go
2614 views
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/limatype"
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(_ context.Context) error { return nil }
31
func (m *mockDriver) Create(_ context.Context) error { return nil }
32
func (m *mockDriver) Delete(_ context.Context) error { return nil }
33
func (m *mockDriver) CreateDisk(_ context.Context) error { return nil }
34
func (m *mockDriver) Start(_ context.Context) (chan error, error) { return nil, nil }
35
func (m *mockDriver) Stop(_ context.Context) error { return nil }
36
func (m *mockDriver) RunGUI() error { return nil }
37
func (m *mockDriver) ChangeDisplayPassword(_ context.Context, _ string) error { return nil }
38
func (m *mockDriver) DisplayConnection(_ context.Context) (string, error) { return "", nil }
39
func (m *mockDriver) CreateSnapshot(_ context.Context, _ string) error { return nil }
40
func (m *mockDriver) ApplySnapshot(_ context.Context, _ string) error { return nil }
41
func (m *mockDriver) DeleteSnapshot(_ context.Context, _ string) error { return nil }
42
func (m *mockDriver) ListSnapshots(_ context.Context) (string, error) { return "", nil }
43
func (m *mockDriver) Register(_ context.Context) error { return nil }
44
func (m *mockDriver) Unregister(_ context.Context) error { return nil }
45
func (m *mockDriver) ForwardGuestAgent() bool { return false }
46
func (m *mockDriver) GuestAgentConn(_ context.Context) (net.Conn, string, error) { return nil, "", nil }
47
func (m *mockDriver) Info() driver.Info {
48
return driver.Info{Name: m.Name}
49
}
50
func (m *mockDriver) Configure(_ *limatype.Instance) *driver.ConfiguredDriver { return nil }
51
func (m *mockDriver) FillConfig(_ context.Context, _ *limatype.LimaYAML, _ string) error { return nil }
52
func (m *mockDriver) InspectStatus(_ context.Context, _ *limatype.Instance) string { return "" }
53
func (m *mockDriver) SSHAddress(_ context.Context) (string, error) { return "", nil }
54
func (m *mockDriver) BootScripts() (map[string][]byte, error) { return nil, nil }
55
func (m *mockDriver) AdditionalSetupForSSH(_ context.Context) error { return nil }
56
57
func TestRegister(t *testing.T) {
58
BackupRegistry(t)
59
60
mockDrv := newMockDriver("test-driver")
61
mockDrv2 := newMockDriver("test-driver-2")
62
Register(mockDrv)
63
Register(mockDrv2)
64
65
assert.Equal(t, len(internalDrivers), 2)
66
assert.Equal(t, internalDrivers["test-driver"], mockDrv)
67
assert.Equal(t, internalDrivers["test-driver-2"], mockDrv2)
68
69
// Test registering duplicate driver (should not overwrite)
70
mockDrv3 := newMockDriver("test-driver")
71
Register(mockDrv3)
72
73
assert.Equal(t, len(internalDrivers), 2)
74
assert.Equal(t, internalDrivers["test-driver"], mockDrv)
75
76
driverType := CheckInternalOrExternal("test-driver")
77
assert.Equal(t, driverType, Internal)
78
79
extDriver, intDriver, exists := Get("test-driver")
80
assert.Equal(t, exists, true)
81
assert.Assert(t, extDriver == nil)
82
assert.Assert(t, intDriver != nil)
83
assert.Equal(t, intDriver.Info().Name, "test-driver")
84
85
vmTypes := List()
86
assert.Equal(t, vmTypes["test-driver-2"], Internal)
87
}
88
89
func TestDiscoverDriversInDir(t *testing.T) {
90
BackupRegistry(t)
91
92
tempDir := t.TempDir()
93
94
var driverPath string
95
driverName := "mockext"
96
if runtime.GOOS == "windows" {
97
driverPath = filepath.Join(tempDir, "lima-driver-"+driverName+".exe")
98
} else {
99
driverPath = filepath.Join(tempDir, "lima-driver-"+driverName)
100
}
101
102
err := os.WriteFile(driverPath, []byte(""), 0o755)
103
assert.NilError(t, err)
104
105
err = discoverDriversInDir(tempDir)
106
assert.NilError(t, err)
107
108
assert.Equal(t, len(ExternalDrivers), 1)
109
extDriver := ExternalDrivers[driverName]
110
assert.Assert(t, extDriver != nil)
111
assert.Equal(t, extDriver.Name, driverName)
112
assert.Equal(t, extDriver.Path, driverPath)
113
114
driverType := CheckInternalOrExternal(driverName)
115
assert.Equal(t, driverType, External)
116
117
extDriver, intDriver, exists := Get(driverName)
118
assert.Equal(t, exists, true)
119
assert.Assert(t, extDriver != nil)
120
assert.Assert(t, intDriver == nil)
121
assert.Equal(t, extDriver.Name, driverName)
122
123
vmTypes := List()
124
assert.Equal(t, vmTypes[driverName], driverPath)
125
}
126
127
func TestRegisterDriverFile(t *testing.T) {
128
BackupRegistry(t)
129
130
tests := []struct {
131
name string
132
filename string
133
expectDriver bool
134
expectedName string
135
}{
136
{
137
name: "valid driver file",
138
filename: "lima-driver-test",
139
expectDriver: runtime.GOOS != "windows",
140
expectedName: "test",
141
},
142
{
143
name: "valid driver file with extension on Windows",
144
filename: "lima-driver-windows.exe",
145
expectDriver: runtime.GOOS == "windows",
146
expectedName: "windows",
147
},
148
{
149
name: "invalid filename - no prefix",
150
filename: "not-a-driver",
151
expectDriver: false,
152
},
153
{
154
name: "invalid filename - wrong prefix",
155
filename: "driver-lima-test",
156
expectDriver: false,
157
},
158
{
159
name: "empty name after prefix",
160
filename: "lima-driver-",
161
expectDriver: false,
162
},
163
}
164
165
for _, tt := range tests {
166
t.Run(tt.name, func(t *testing.T) {
167
ExternalDrivers = make(map[string]*ExternalDriver)
168
registerDriverFile(filepath.Join("/test/path", tt.filename))
169
170
if tt.expectDriver {
171
assert.Equal(t, len(ExternalDrivers), 1)
172
extDriver := ExternalDrivers[tt.expectedName]
173
assert.Assert(t, extDriver != nil)
174
assert.Equal(t, extDriver.Name, tt.expectedName)
175
assert.Equal(t, extDriver.Path, filepath.Join("/test/path", tt.filename))
176
} else {
177
assert.Equal(t, len(ExternalDrivers), 0)
178
}
179
})
180
}
181
}
182
183
func TestGet(t *testing.T) {
184
BackupRegistry(t)
185
186
mockDrv := newMockDriver("internal-test")
187
Register(mockDrv)
188
189
extDriver, intDriver, exists := Get("internal-test")
190
assert.Equal(t, exists, true)
191
assert.Assert(t, extDriver == nil)
192
assert.Equal(t, intDriver, mockDrv)
193
194
registerExternalDriver("external-test", "/path/to/external")
195
196
extDriver, intDriver, exists = Get("external-test")
197
assert.Equal(t, exists, true)
198
assert.Assert(t, extDriver != nil)
199
assert.Assert(t, intDriver == nil)
200
assert.Equal(t, extDriver.Name, "external-test")
201
202
extDriver, intDriver, exists = Get("non-existent")
203
assert.Equal(t, exists, false)
204
assert.Assert(t, extDriver == nil)
205
assert.Assert(t, intDriver == nil)
206
}
207
208
func TestList(t *testing.T) {
209
BackupRegistry(t)
210
211
vmTypes := List()
212
assert.Equal(t, len(vmTypes), 0)
213
214
mockDrv := newMockDriver("internal-test")
215
Register(mockDrv)
216
217
vmTypes = List()
218
assert.Equal(t, len(vmTypes), 1)
219
assert.Equal(t, vmTypes["internal-test"], Internal)
220
221
registerExternalDriver("external-test", "/path/to/external")
222
223
vmTypes = List()
224
assert.Equal(t, len(vmTypes), 2)
225
assert.Equal(t, vmTypes["internal-test"], Internal)
226
assert.Equal(t, vmTypes["external-test"], "/path/to/external")
227
}
228
229
func BackupRegistry(t *testing.T) {
230
originalExternalDrivers := ExternalDrivers
231
originalInternalDrivers := internalDrivers
232
t.Cleanup(func() {
233
ExternalDrivers = originalExternalDrivers
234
internalDrivers = originalInternalDrivers
235
})
236
237
internalDrivers = make(map[string]driver.Driver)
238
ExternalDrivers = make(map[string]*ExternalDriver)
239
}
240
241