Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/limayaml/marshal_test.go
2614 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package limayaml
5
6
import (
7
"strings"
8
"testing"
9
"text/template"
10
11
"github.com/goccy/go-yaml"
12
"gotest.tools/v3/assert"
13
14
"github.com/lima-vm/lima/v2/pkg/limatype"
15
"github.com/lima-vm/lima/v2/pkg/ptr"
16
)
17
18
func dumpYAML(t *testing.T, d any) string {
19
b, err := yaml.Marshal(d)
20
assert.NilError(t, err)
21
return string(b)
22
}
23
24
func TestMarshalEmpty(t *testing.T) {
25
_, err := Marshal(&limatype.LimaYAML{}, false)
26
assert.NilError(t, err)
27
}
28
29
func TestMarshalTilde(t *testing.T) {
30
y := limatype.LimaYAML{
31
Mounts: []limatype.Mount{
32
{Location: "~", Writable: ptr.Of(false)},
33
{Location: "/tmp/lima", Writable: ptr.Of(true)},
34
{Location: "null"},
35
},
36
}
37
b, err := Marshal(&y, true)
38
assert.NilError(t, err)
39
// yaml will load ~ (or null) as null
40
// make sure that it is always quoted
41
assert.Equal(t, string(b), `---
42
mounts:
43
- location: "~"
44
writable: false
45
- location: /tmp/lima
46
writable: true
47
- location: "null"
48
...
49
`)
50
}
51
52
type Opts struct {
53
Foo int
54
Bar string
55
}
56
57
var (
58
opts = Opts{Foo: 1, Bar: "two"}
59
text = `{"foo":1,"bar":"two"}`
60
code any
61
)
62
63
func TestConvert(t *testing.T) {
64
err := yaml.Unmarshal([]byte(text), &code)
65
assert.NilError(t, err)
66
o := opts
67
var a any
68
err = Convert(o, &a, "")
69
assert.NilError(t, err)
70
assert.DeepEqual(t, a, code)
71
err = Convert(a, &o, "")
72
assert.NilError(t, err)
73
assert.Equal(t, o, opts)
74
}
75
76
func TestVMOpts(t *testing.T) {
77
text := `
78
vmType: null
79
`
80
var y limatype.LimaYAML
81
err := Unmarshal([]byte(text), &y, "lima.yaml")
82
assert.NilError(t, err)
83
var o limatype.VMOpts
84
err = Convert(y.VMOpts, &o, "vmOpts")
85
assert.NilError(t, err)
86
t.Log(dumpYAML(t, o))
87
}
88
89
func TestQEMUOpts(t *testing.T) {
90
text := `
91
vmType: "qemu"
92
vmOpts:
93
qemu:
94
minimumVersion: null
95
cpuType:
96
`
97
var y limatype.LimaYAML
98
err := Unmarshal([]byte(text), &y, "lima.yaml")
99
assert.NilError(t, err)
100
var o limatype.QEMUOpts
101
err = Convert(y.VMOpts[limatype.QEMU], &o, "vmOpts.qemu")
102
assert.NilError(t, err)
103
t.Log(dumpYAML(t, o))
104
}
105
106
func TestVZOpts(t *testing.T) {
107
text := `
108
vmType: "vz"
109
vmOpts:
110
vz:
111
diskImageFormat: null
112
rosetta:
113
enabled: null
114
binfmt: null
115
`
116
var y limatype.LimaYAML
117
err := Unmarshal([]byte(text), &y, "lima.yaml")
118
assert.NilError(t, err)
119
var o limatype.VZOpts
120
err = Convert(y.VMOpts[limatype.VZ], &o, "vmOpts.vz")
121
assert.NilError(t, err)
122
t.Log(dumpYAML(t, o))
123
}
124
125
func TestVMOptsNull(t *testing.T) {
126
text := `
127
vmOpts: null
128
`
129
var y limatype.LimaYAML
130
err := Unmarshal([]byte(text), &y, "lima.yaml")
131
assert.NilError(t, err)
132
var o limatype.VMOpts
133
err = Convert(y.VMOpts, &o, "vmOpts")
134
assert.NilError(t, err)
135
var oq limatype.QEMUOpts
136
err = Convert(y.VMOpts[limatype.QEMU], &oq, "vmOpts.qemu")
137
assert.NilError(t, err)
138
var ov limatype.VZOpts
139
err = Convert(y.VMOpts[limatype.VZ], &ov, "vmOpts.vz")
140
assert.NilError(t, err)
141
}
142
143
type FormatData struct {
144
limatype.Instance `yaml:",inline"`
145
}
146
147
func TestVZOptsRosettaMessage(t *testing.T) {
148
text := `
149
vmType: "vz"
150
vmOpts:
151
vz:
152
diskImageFormat: "raw"
153
rosetta:
154
enabled: true
155
binfmt: false
156
157
message: |
158
{{- if .Instance.Config.VMOpts.vz.rosetta.enabled}}
159
Rosetta is enabled in this VM, so you can run x86_64 containers on Apple Silicon.
160
{{- end}}
161
`
162
want := `vmType: vz
163
vmOpts:
164
vz:
165
diskImageFormat: raw
166
rosetta:
167
binfmt: false
168
enabled: true
169
message: |
170
171
Rosetta is enabled in this VM, so you can run x86_64 containers on Apple Silicon.
172
`
173
var y limatype.LimaYAML
174
err := Unmarshal([]byte(text), &y, "lima.yaml")
175
assert.NilError(t, err)
176
tmpl, err := template.New("format").Parse(y.Message)
177
assert.NilError(t, err)
178
inst := limatype.Instance{Config: &y}
179
var message strings.Builder
180
data := FormatData{Instance: inst}
181
err = tmpl.Execute(&message, data)
182
assert.NilError(t, err)
183
y.Message = message.String()
184
b, err := Marshal(&y, false)
185
assert.NilError(t, err)
186
assert.Equal(t, string(b), want)
187
}
188
189