podman
218 строк · 6.7 Кб
1//go:build linux
2
3package specgenutil
4
5import (
6"fmt"
7"strings"
8"testing"
9
10"github.com/containers/common/pkg/machine"
11"github.com/containers/podman/v5/pkg/domain/entities"
12"github.com/containers/podman/v5/pkg/specgen"
13"github.com/stretchr/testify/assert"
14)
15
16func TestWinPath(t *testing.T) {
17const (
18fail = false
19pass = true
20)
21tests := []struct {
22vol string
23source string
24dest string
25isN bool
26outcome bool
27mach string
28}{
29{`C:\Foo:/blah`, "/mnt/c/Foo", "/blah", false, pass, "wsl"},
30{`C:\Foo:/blah`, "/mnt/c/Foo", "/blah", false, fail, ""},
31{`\\?\C:\Foo:/blah`, "/mnt/c/Foo", "/blah", false, pass, "wsl"},
32{`/c/bar:/blah`, "/mnt/c/bar", "/blah", false, pass, "wsl"},
33{`/c/bar:/blah`, "/c/bar", "/blah", false, pass, ""},
34{`/test/this:/blah`, "/test/this", "/blah", false, pass, "wsl"},
35{`c:/bar/something:/other`, "/mnt/c/bar/something", "/other", false, pass, "wsl"},
36{`c:/foo:ro`, "c", "/foo", true, pass, ""},
37{`\\computer\loc:/dest`, "", "", false, fail, "wsl"},
38{`\\.\drive\loc:/target`, "/mnt/wsl/drive/loc", "/target", false, pass, "wsl"},
39}
40
41f := func(vol string, mach string) (*specgen.SpecGenerator, error) {
42machine := machine.GetMachineMarker()
43oldEnable, oldType := machine.Enabled, machine.Type
44machine.Enabled, machine.Type = len(mach) > 0, mach
45sg := specgen.NewSpecGenerator("nothing", false)
46err := FillOutSpecGen(sg, &entities.ContainerCreateOptions{
47ImageVolume: "ignore",
48Volume: []string{vol}}, []string{},
49)
50machine.Enabled, machine.Type = oldEnable, oldType
51return sg, err
52}
53
54for _, test := range tests {
55msg := "Checking: " + test.vol
56sg, err := f(test.vol, test.mach)
57if test.outcome == fail {
58assert.NotNil(t, err, msg)
59continue
60}
61if !assert.Nil(t, err, msg) {
62continue
63}
64if test.isN {
65if !assert.Equal(t, 1, len(sg.Volumes), msg) {
66continue
67}
68assert.Equal(t, test.source, sg.Volumes[0].Name, msg)
69assert.Equal(t, test.dest, sg.Volumes[0].Dest, msg)
70} else {
71if !assert.Equal(t, 1, len(sg.Mounts), msg) {
72continue
73}
74assert.Equal(t, test.source, sg.Mounts[0].Source, msg)
75assert.Equal(t, test.dest, sg.Mounts[0].Destination, msg)
76}
77}
78}
79
80func TestParseLinuxResourcesDeviceAccess(t *testing.T) {
81d, err := parseLinuxResourcesDeviceAccess("a *:* rwm")
82assert.Nil(t, err, "err is nil")
83assert.True(t, d.Allow, "allow is true")
84assert.Equal(t, d.Type, "a", "type is 'a'")
85assert.Nil(t, d.Minor, "minor is nil")
86assert.Nil(t, d.Major, "major is nil")
87
88d, err = parseLinuxResourcesDeviceAccess("b 3:* rwm")
89assert.Nil(t, err, "err is nil")
90assert.True(t, d.Allow, "allow is true")
91assert.Equal(t, d.Type, "b", "type is 'b'")
92assert.Nil(t, d.Minor, "minor is nil")
93assert.NotNil(t, d.Major, "major is not nil")
94assert.Equal(t, *d.Major, int64(3), "major is 3")
95
96d, err = parseLinuxResourcesDeviceAccess("a *:3 rwm")
97assert.Nil(t, err, "err is nil")
98assert.True(t, d.Allow, "allow is true")
99assert.Equal(t, d.Type, "a", "type is 'a'")
100assert.Nil(t, d.Major, "major is nil")
101assert.NotNil(t, d.Minor, "minor is not nil")
102assert.Equal(t, *d.Minor, int64(3), "minor is 3")
103
104d, err = parseLinuxResourcesDeviceAccess("c 1:2 rwm")
105assert.Nil(t, err, "err is nil")
106assert.True(t, d.Allow, "allow is true")
107assert.Equal(t, d.Type, "c", "type is 'c'")
108assert.NotNil(t, d.Major, "minor is not nil")
109assert.Equal(t, *d.Major, int64(1), "minor is 1")
110assert.NotNil(t, d.Minor, "minor is not nil")
111assert.Equal(t, *d.Minor, int64(2), "minor is 2")
112
113_, err = parseLinuxResourcesDeviceAccess("q *:* rwm")
114assert.NotNil(t, err, "err is not nil")
115
116_, err = parseLinuxResourcesDeviceAccess("a a:* rwm")
117assert.NotNil(t, err, "err is not nil")
118
119_, err = parseLinuxResourcesDeviceAccess("a *:a rwm")
120assert.NotNil(t, err, "err is not nil")
121
122_, err = parseLinuxResourcesDeviceAccess("a *:* abc")
123assert.NotNil(t, err, "err is not nil")
124
125_, err = parseLinuxResourcesDeviceAccess("* *:* *")
126assert.NotNil(t, err, "err is not nil")
127
128_, err = parseLinuxResourcesDeviceAccess("* *:a2 *")
129assert.NotNil(t, err, "err is not nil")
130
131_, err = parseLinuxResourcesDeviceAccess("*")
132assert.NotNil(t, err, "err is not nil")
133
134_, err = parseLinuxResourcesDeviceAccess("*:*")
135assert.NotNil(t, err, "err is not nil")
136
137_, err = parseLinuxResourcesDeviceAccess("a *:*")
138assert.NotNil(t, err, "err is not nil")
139
140_, err = parseLinuxResourcesDeviceAccess("a *:*")
141assert.NotNil(t, err, "err is not nil")
142
143_, err = parseLinuxResourcesDeviceAccess("a 12a:* r")
144assert.NotNil(t, err, "err is not nil")
145
146_, err = parseLinuxResourcesDeviceAccess("a a12:* r")
147assert.NotNil(t, err, "err is not nil")
148
149_, err = parseLinuxResourcesDeviceAccess("a 0x1:* r")
150assert.NotNil(t, err, "err is not nil")
151
152_, err = parseLinuxResourcesDeviceAccess("a -2:* r")
153assert.NotNil(t, err, "err is not nil")
154
155_, err = parseLinuxResourcesDeviceAccess("a *:-3 r")
156assert.NotNil(t, err, "err is not nil")
157}
158
159func TestGenRlimits(t *testing.T) {
160testLimits := map[string]string{
161"core": "1:2",
162"cpu": "1:2",
163"data": "1:2",
164"fsize": "1:2",
165"locks": "1:2",
166"memlock": "1:2",
167"msgqueue": "1:2",
168"nice": "1:2",
169"nofile": "1:2",
170"nproc": "1:2",
171"rss": "1:2",
172"rtprio": "1:2",
173"rttime": "1:2",
174"sigpending": "1:2",
175"stack": "1:2",
176}
177
178lowerCaseLimits := make([]string, 0, len(testLimits))
179upperCaseLimitsWithPrefix := make([]string, 0, len(testLimits))
180for name, limit := range testLimits {
181lowerCaseLimits = append(lowerCaseLimits, fmt.Sprintf("%s=%s", name, limit))
182upperCaseLimitsWithPrefix = append(upperCaseLimitsWithPrefix, strings.ToUpper(fmt.Sprintf("%s%s=%s", rlimitPrefix, name, limit)))
183}
184
185parsedLimits, err := GenRlimits(lowerCaseLimits)
186assert.NoError(t, err, "err is nil")
187
188for _, limit := range parsedLimits {
189val, ok := testLimits[limit.Type]
190assert.True(t, ok, "%s matched", limit.Type)
191assert.Equal(t, val, fmt.Sprintf("%d:%d", limit.Soft, limit.Hard), "soft and hard limits are equal")
192}
193
194parsedLimits, err = GenRlimits(upperCaseLimitsWithPrefix)
195assert.NoError(t, err, "err is nil")
196
197for _, limit := range parsedLimits {
198val, ok := testLimits[limit.Type]
199assert.True(t, ok, "%s matched", limit.Type)
200assert.Equal(t, val, fmt.Sprintf("%d:%d", limit.Soft, limit.Hard), "soft and hard limits are equal")
201}
202
203// go-utils module has no tests for the parser.
204_, err = GenRlimits([]string{"foo=1:1"})
205assert.Error(t, err, "err is not nil")
206
207_, err = GenRlimits([]string{"RLIMIT_FOO=1:1"})
208assert.Error(t, err, "err is not nil")
209
210_, err = GenRlimits([]string{"nofile"})
211assert.Error(t, err, "err is not nil")
212
213_, err = GenRlimits([]string{"nofile=bar"})
214assert.Error(t, err, "err is not nil")
215
216_, err = GenRlimits([]string{"nofile=bar:buzz"})
217assert.Error(t, err, "err is not nil")
218}
219