master
h 404 lines 28.2 KB
Raw
1 /*++
2
3 Copyright (c) Microsoft. All rights reserved.
4
5 Module Name:
6
7 CommandLineTestCases.h
8
9 Abstract:
10
11 Test case data for command-line parsing tests.
12
13 --*/
14
15 // These cases should be for testing valid command lines against the defined commands.
16 // This executes the command line parsing logic and verifies that the command line is valid
17 // for the defined commands. It does not actually execute the command.
18
19 // X-Macro definition: COMMAND_LINE_TEST_CASE(commandLine, expectedCommand, shouldSucceed)
20
21 // Root command tests
22 COMMAND_LINE_TEST_CASE(L"", L"root", true)
23 COMMAND_LINE_TEST_CASE(L"--help", L"root", true)
24 COMMAND_LINE_TEST_CASE(L"-?", L"root", true)
25 COMMAND_LINE_TEST_CASE(L"--version", L"root", true)
26 COMMAND_LINE_TEST_CASE(L"-v", L"root", true)
27
28 // Global options (RootCommand::GetGlobalArguments). These must be accepted by
29 // the root-level options-only pass before any subcommand is resolved. A
30 // non-exhaustive sampling — the parser-level matrix lives in ParserTestCases.h.
31 COMMAND_LINE_TEST_CASE(L"--session foo image list --verbose", L"list", true)
32 // Cases that fail because the unknown/misplaced option falls through to a
33 // command that doesn't accept it:
34 COMMAND_LINE_TEST_CASE(L"--notaglobal system list", L"root", false) // Unknown option falls through to root, which rejects it
35 COMMAND_LINE_TEST_CASE(L"container list --session foo", L"list", false) // --session is global; must come before the subcommand
36
37 // System command tests
38 COMMAND_LINE_TEST_CASE(L"system -?", L"system", true)
39 COMMAND_LINE_TEST_CASE(L"system info", L"info", true)
40 COMMAND_LINE_TEST_CASE(L"info", L"info", true)
41 COMMAND_LINE_TEST_CASE(L"system info --help", L"info", true)
42 COMMAND_LINE_TEST_CASE(L"system info --format json", L"info", true)
43 COMMAND_LINE_TEST_CASE(L"system info --format table", L"info", true)
44 COMMAND_LINE_TEST_CASE(L"info --format json", L"info", true)
45 COMMAND_LINE_TEST_CASE(L"system info --format invalid", L"info", false)
46 COMMAND_LINE_TEST_CASE(L"system info --notanarg", L"info", false)
47 COMMAND_LINE_TEST_CASE(L"system info extraarg", L"info", false)
48 COMMAND_LINE_TEST_CASE(L"info --format invalid", L"info", false)
49 COMMAND_LINE_TEST_CASE(L"info --notanarg", L"info", false)
50 COMMAND_LINE_TEST_CASE(L"info extraarg", L"info", false)
51 COMMAND_LINE_TEST_CASE(L"system session list", L"list", true)
52 COMMAND_LINE_TEST_CASE(L"system session list --verbose", L"list", true)
53 COMMAND_LINE_TEST_CASE(L"system session list --verbose --help", L"list", true)
54 COMMAND_LINE_TEST_CASE(L"system session list --notanarg", L"list", false)
55 COMMAND_LINE_TEST_CASE(L"system session list extraarg", L"list", false)
56 COMMAND_LINE_TEST_CASE(L"--session session1 system session shell", L"shell", true)
57 COMMAND_LINE_TEST_CASE(L"system session shell", L"shell", true)
58 COMMAND_LINE_TEST_CASE(L"system session run ls", L"run", true)
59 COMMAND_LINE_TEST_CASE(L"system session run echo foo", L"run", true) // Command with trailing arguments
60 COMMAND_LINE_TEST_CASE(L"system session run ls -la", L"run", true) // Flags after the command are forwarded
61 COMMAND_LINE_TEST_CASE(L"--session session1 system session run ls", L"run", true)
62 COMMAND_LINE_TEST_CASE(L"--session session1 system session run echo foo", L"run", true)
63 COMMAND_LINE_TEST_CASE(L"system session run \"ls -la /tmp\"", L"run", true)
64 COMMAND_LINE_TEST_CASE(L"system session run", L"run", false) // Missing required command positional
65 COMMAND_LINE_TEST_CASE(L"--session session1 system session run", L"run", false) // Missing required command positional
66 COMMAND_LINE_TEST_CASE(L"system session run --notanarg ls", L"run", false) // Invalid flag before command
67 COMMAND_LINE_TEST_CASE(L"--session session1 system session terminate", L"terminate", true)
68 COMMAND_LINE_TEST_CASE(L"system session terminate", L"terminate", true)
69 COMMAND_LINE_TEST_CASE(L"system session enter C:\\storage", L"enter", true)
70 COMMAND_LINE_TEST_CASE(L"system session enter C:\\storage --name my-session", L"enter", true)
71 COMMAND_LINE_TEST_CASE(L"system session enter --name my-session C:\\storage", L"enter", true)
72 COMMAND_LINE_TEST_CASE(L"system session enter", L"enter", false) // Missing required storage-path
73 COMMAND_LINE_TEST_CASE(L"system session enter C:\\storage --notanarg", L"enter", false) // Invalid argument
74 COMMAND_LINE_TEST_CASE(L"system session enter --name my-session", L"enter", false) // Missing required positional before flag
75
76 // Container command tests
77 COMMAND_LINE_TEST_CASE(L"container list", L"list", true)
78 COMMAND_LINE_TEST_CASE(L"container ls", L"list", true)
79 COMMAND_LINE_TEST_CASE(L"container ps", L"list", true)
80 COMMAND_LINE_TEST_CASE(L"list", L"list", true)
81 COMMAND_LINE_TEST_CASE(L"ls", L"list", true)
82 COMMAND_LINE_TEST_CASE(L"ps", L"list", true)
83 COMMAND_LINE_TEST_CASE(L"container list --no-trunc", L"list", true)
84 COMMAND_LINE_TEST_CASE(L"--session foo container list", L"list", true)
85 COMMAND_LINE_TEST_CASE(L"container list -qa", L"list", true)
86 COMMAND_LINE_TEST_CASE(L"container list --format json", L"list", true)
87 COMMAND_LINE_TEST_CASE(L"container list --format table", L"list", true)
88 COMMAND_LINE_TEST_CASE(L"container list --format badformat", L"list", false)
89 COMMAND_LINE_TEST_CASE(L"container prune", L"prune", true)
90 COMMAND_LINE_TEST_CASE(L"--session foo container prune", L"prune", true)
91 COMMAND_LINE_TEST_CASE(L"run ubuntu", L"run", true)
92 COMMAND_LINE_TEST_CASE(L"run --rm -it --entrypoint bash archlinux:latest -c \"echo 123\"", L"run", true)
93 COMMAND_LINE_TEST_CASE(L"run --rm --entrypoint /bin/bash debian:latest -c ls", L"run", true)
94 COMMAND_LINE_TEST_CASE(L"run jrottenberg/ffmpeg:4.4-alpine -i http://url/to/media.mp4 -stats", L"run", true)
95 COMMAND_LINE_TEST_CASE(
96 L"run -v ./:/data jrottenberg/ffmpeg:4.4-scratch -stats -i http://www.hevc-10bit.mkv -c:v libx265 -pix_fmt yuv420p10 -t "
97 L"5 -f mp4 test.mp4",
98 L"run",
99 true)
100 COMMAND_LINE_TEST_CASE(
101 L"run -v ./:/data -it jrottenberg/ffmpeg:4.4-scratch -stats -i https://file-examples/file_example_MP4_480_1_5MG.mp4 -c:v "
102 L"libx265 -pix_fmt yuv420p10 -t 5 -f mp4 /dataout.mp4",
103 L"run",
104 true)
105 COMMAND_LINE_TEST_CASE(L"container run ubuntu bash -c 'echo Hello World'", L"run", true)
106 COMMAND_LINE_TEST_CASE(L"container run ubuntu", L"run", true)
107 COMMAND_LINE_TEST_CASE(L"container run --pull=always ubuntu", L"run", true)
108 COMMAND_LINE_TEST_CASE(L"container run --pull missing ubuntu", L"run", true)
109 COMMAND_LINE_TEST_CASE(L"container run --pull never ubuntu", L"run", true)
110 COMMAND_LINE_TEST_CASE(L"container run --pull invalid ubuntu", L"run", false)
111 COMMAND_LINE_TEST_CASE(L"container run --cidfile C:\\temp\\cidfile ubuntu", L"run", true)
112 COMMAND_LINE_TEST_CASE(L"container run -it --name foo ubuntu", L"run", true)
113 COMMAND_LINE_TEST_CASE(L"container run --rm -it --name foo ubuntu", L"run", true)
114 COMMAND_LINE_TEST_CASE(L"stop", L"stop", false) // Missing required container-id positional
115 COMMAND_LINE_TEST_CASE(L"container stop", L"stop", false) // Missing required container-id positional
116 COMMAND_LINE_TEST_CASE(L"container stop cont1 --signal 9", L"stop", true)
117 COMMAND_LINE_TEST_CASE(L"container stop cont1 --signal SIGALRM", L"stop", true)
118 COMMAND_LINE_TEST_CASE(L"container stop cont1 --signal sigkill", L"stop", true)
119 COMMAND_LINE_TEST_CASE(L"container stop cont1 -s KILL", L"stop", true)
120 COMMAND_LINE_TEST_CASE(L"container stop cont1 --time 5", L"stop", true)
121 COMMAND_LINE_TEST_CASE(L"container stop cont1 -t 5", L"stop", true)
122 COMMAND_LINE_TEST_CASE(L"restart", L"restart", false) // Missing required container-id positional
123 COMMAND_LINE_TEST_CASE(L"container restart", L"restart", false) // Missing required container-id positional
124 COMMAND_LINE_TEST_CASE(L"restart cont1", L"restart", true)
125 COMMAND_LINE_TEST_CASE(L"container restart cont1 cont2", L"restart", true)
126 COMMAND_LINE_TEST_CASE(L"container restart cont1 --signal SIGTERM", L"restart", true)
127 COMMAND_LINE_TEST_CASE(L"container restart cont1 -s KILL", L"restart", true)
128 COMMAND_LINE_TEST_CASE(L"container restart cont1 --timeout 5", L"restart", true)
129 COMMAND_LINE_TEST_CASE(L"container restart cont1 -t 5", L"restart", true)
130 COMMAND_LINE_TEST_CASE(L"start cont", L"start", true)
131 COMMAND_LINE_TEST_CASE(L"container start cont", L"start", true)
132 COMMAND_LINE_TEST_CASE(L"container start --attach cont", L"start", true)
133 COMMAND_LINE_TEST_CASE(L"container start -a cont", L"start", true)
134 COMMAND_LINE_TEST_CASE(L"create ubuntu:latest", L"create", true)
135 COMMAND_LINE_TEST_CASE(L"container create --name foo ubuntu", L"create", true)
136 COMMAND_LINE_TEST_CASE(L"container create --pull=always ubuntu", L"create", true)
137 COMMAND_LINE_TEST_CASE(L"container create --pull missing ubuntu", L"create", true)
138 COMMAND_LINE_TEST_CASE(L"container create --pull never ubuntu", L"create", true)
139 COMMAND_LINE_TEST_CASE(L"container create --pull invalid ubuntu", L"create", false)
140 COMMAND_LINE_TEST_CASE(L"container create --cidfile C:\\temp\\cidfile --name foo ubuntu", L"create", true)
141 COMMAND_LINE_TEST_CASE(L"create --workdir /app ubuntu", L"create", true)
142 COMMAND_LINE_TEST_CASE(L"create -w /app ubuntu", L"create", true)
143 COMMAND_LINE_TEST_CASE(L"container create --workdir /app ubuntu sh", L"create", true)
144 COMMAND_LINE_TEST_CASE(L"create --workdir", L"create", false) // Missing value for --workdir
145 COMMAND_LINE_TEST_CASE(L"create --workdir \"\" ubuntu", L"create", false) // Empty working directory
146 COMMAND_LINE_TEST_CASE(L"run --workdir /app ubuntu echo hello", L"run", true)
147 COMMAND_LINE_TEST_CASE(L"run -w /app ubuntu echo hello", L"run", true)
148 COMMAND_LINE_TEST_CASE(L"container run --workdir /app ubuntu sh", L"run", true)
149 COMMAND_LINE_TEST_CASE(L"run --workdir", L"run", false) // Missing value for --workdir
150 COMMAND_LINE_TEST_CASE(L"run --workdir \"\" ubuntu echo hello", L"run", false) // Empty working directory
151 // DNS tests for container create
152 COMMAND_LINE_TEST_CASE(L"create --dns 1.1.1.1 ubuntu", L"create", true)
153 COMMAND_LINE_TEST_CASE(L"create --dns 1.1.1.1 --dns 8.8.8.8 ubuntu", L"create", true) // Multiple --dns values
154 COMMAND_LINE_TEST_CASE(L"container create --dns-search example.com ubuntu", L"create", true)
155 COMMAND_LINE_TEST_CASE(L"container create --dns-search example.com --dns-search test.local ubuntu", L"create", true) // Multiple --dns-search values
156 COMMAND_LINE_TEST_CASE(L"create --dns-option ndots:5 ubuntu", L"create", true)
157 COMMAND_LINE_TEST_CASE(L"create --dns-option ndots:5 --dns-option timeout:3 ubuntu", L"create", true) // Multiple --dns-option values
158 COMMAND_LINE_TEST_CASE(L"create --dns 1.1.1.1 --dns-search example.com --dns-option ndots:5 ubuntu", L"create", true) // Combined DNS options
159 COMMAND_LINE_TEST_CASE(L"create --dns", L"create", false) // Missing value for --dns
160 COMMAND_LINE_TEST_CASE(L"create --dns-search", L"create", false) // Missing value for --dns-search
161 COMMAND_LINE_TEST_CASE(L"create --dns-option", L"create", false) // Missing value for --dns-option
162 // DNS tests for container run
163 COMMAND_LINE_TEST_CASE(L"run --dns 1.1.1.1 ubuntu", L"run", true)
164 COMMAND_LINE_TEST_CASE(L"run --dns 1.1.1.1 --dns 8.8.8.8 ubuntu", L"run", true) // Multiple --dns values
165 COMMAND_LINE_TEST_CASE(L"container run --dns-search example.com ubuntu", L"run", true)
166 COMMAND_LINE_TEST_CASE(L"container run --dns-search example.com --dns-search test.local ubuntu", L"run", true) // Multiple --dns-search values
167 COMMAND_LINE_TEST_CASE(L"run --dns-option ndots:5 ubuntu", L"run", true)
168 COMMAND_LINE_TEST_CASE(L"run --dns-option ndots:5 --dns-option timeout:3 ubuntu", L"run", true) // Multiple --dns-option values
169 COMMAND_LINE_TEST_CASE(L"run --dns 1.1.1.1 --dns-search example.com --dns-option ndots:5 ubuntu", L"run", true) // Combined DNS options
170 COMMAND_LINE_TEST_CASE(L"run --dns", L"run", false) // Missing value for --dns
171 COMMAND_LINE_TEST_CASE(L"run --dns-search", L"run", false) // Missing value for --dns-search
172 COMMAND_LINE_TEST_CASE(L"run --dns-option", L"run", false) // Missing value for --dns-option
173 // GPU tests for container run
174 COMMAND_LINE_TEST_CASE(L"run --gpus all ubuntu", L"run", true)
175 COMMAND_LINE_TEST_CASE(L"container run --gpus all ubuntu sh", L"run", true)
176 COMMAND_LINE_TEST_CASE(L"run --gpus invalid ubuntu", L"run", false) // Only 'all' is supported
177 COMMAND_LINE_TEST_CASE(L"run --gpus", L"run", false) // Missing value for --gpus
178 // GPU tests for container create
179 COMMAND_LINE_TEST_CASE(L"create --gpus all ubuntu", L"create", true)
180 COMMAND_LINE_TEST_CASE(L"container create --gpus all ubuntu sh", L"create", true)
181 COMMAND_LINE_TEST_CASE(L"create --gpus none ubuntu", L"create", false) // Only 'all' is supported
182 COMMAND_LINE_TEST_CASE(L"create --gpus", L"create", false) // Missing value for --gpus
183 // Health check tests for container run
184 COMMAND_LINE_TEST_CASE(L"run --health-cmd \"exit 0\" ubuntu", L"run", true)
185 COMMAND_LINE_TEST_CASE(
186 L"run --health-interval 30s --health-timeout 5s --health-retries 3 --health-start-period 10s ubuntu", L"run", true)
187 COMMAND_LINE_TEST_CASE(L"run --health-interval 1m30s ubuntu", L"run", true)
188 COMMAND_LINE_TEST_CASE(L"run --health-interval notaduration ubuntu", L"run", false) // Invalid duration
189 COMMAND_LINE_TEST_CASE(L"run --health-timeout -5s ubuntu", L"run", false) // Negative duration
190 COMMAND_LINE_TEST_CASE(L"run --health-retries abc ubuntu", L"run", false) // Non-numeric retries
191 COMMAND_LINE_TEST_CASE(L"run --health-retries -1 ubuntu", L"run", false) // Negative retries
192 COMMAND_LINE_TEST_CASE(L"run --health-interval ubuntu", L"run", false) // Missing value for --health-interval
193 COMMAND_LINE_TEST_CASE(L"run --health-cmd", L"run", false) // Missing value for --health-cmd
194 // Health check tests for container create
195 COMMAND_LINE_TEST_CASE(L"create --health-cmd \"exit 0\" ubuntu", L"create", true)
196 COMMAND_LINE_TEST_CASE(
197 L"container create --health-cmd \"curl -f http://localhost/\" --health-interval 30s --health-timeout 5s --health-retries 3 "
198 L"--health-start-period 10s ubuntu",
199 L"create",
200 true)
201 COMMAND_LINE_TEST_CASE(L"create --health-start-period 500ms ubuntu", L"create", true)
202 COMMAND_LINE_TEST_CASE(L"create --health-timeout invalid ubuntu", L"create", false) // Invalid duration
203 COMMAND_LINE_TEST_CASE(L"create --health-retries 2.5 ubuntu", L"create", false) // Non-integer retries
204 COMMAND_LINE_TEST_CASE(L"exec cont1 echo Hello", L"exec", true)
205 COMMAND_LINE_TEST_CASE(L"exec cont1", L"exec", false) // Missing required command argument
206 COMMAND_LINE_TEST_CASE(L"container exec -it cont1 sh -c \"echo a && echo b\"", L"exec", true) // docker exec example
207 COMMAND_LINE_TEST_CASE(L"exec --workdir /app cont1 echo Hello", L"exec", true)
208 COMMAND_LINE_TEST_CASE(L"exec -w /app cont1 echo Hello", L"exec", true)
209 COMMAND_LINE_TEST_CASE(L"container exec --workdir /app cont1 sh", L"exec", true)
210 COMMAND_LINE_TEST_CASE(L"exec --workdir", L"exec", false) // Missing value for --workdir
211 COMMAND_LINE_TEST_CASE(L"exec --workdir \"\" cont1 echo Hello", L"exec", false) // Empty working directory
212 COMMAND_LINE_TEST_CASE(L"kill cont1 --signal sigkill", L"kill", true)
213 COMMAND_LINE_TEST_CASE(L"container kill cont1 -s KILL", L"kill", true)
214 COMMAND_LINE_TEST_CASE(L"inspect cont1", L"inspect", true)
215 COMMAND_LINE_TEST_CASE(L"container inspect cont1", L"inspect", true)
216 // --format on the inspect family: json is the only accepted value, so `table` is rejected here.
217 COMMAND_LINE_TEST_CASE(L"inspect --format json cont1", L"inspect", true)
218 COMMAND_LINE_TEST_CASE(L"inspect --format table cont1", L"inspect", false)
219 COMMAND_LINE_TEST_CASE(L"inspect --type container --format json cont1", L"inspect", true)
220 COMMAND_LINE_TEST_CASE(L"inspect --format badformat cont1", L"inspect", false)
221 COMMAND_LINE_TEST_CASE(L"container inspect --format json cont1", L"inspect", true)
222 COMMAND_LINE_TEST_CASE(L"container inspect --format table cont1", L"inspect", false)
223 COMMAND_LINE_TEST_CASE(L"container inspect --format badformat cont1", L"inspect", false)
224 COMMAND_LINE_TEST_CASE(L"inspect --size cont1", L"inspect", true)
225 COMMAND_LINE_TEST_CASE(L"inspect -s cont1", L"inspect", true)
226 COMMAND_LINE_TEST_CASE(L"container inspect --size cont1", L"inspect", true)
227 COMMAND_LINE_TEST_CASE(L"container inspect -s cont1", L"inspect", true)
228 COMMAND_LINE_TEST_CASE(L"inspect --size --type container cont1", L"inspect", true)
229 COMMAND_LINE_TEST_CASE(L"inspect --size --type image img1", L"inspect", true)
230 COMMAND_LINE_TEST_CASE(L"inspect --size", L"inspect", false)
231 COMMAND_LINE_TEST_CASE(L"image inspect --size img1", L"inspect", false)
232 COMMAND_LINE_TEST_CASE(L"network inspect --size net1", L"inspect", false)
233 COMMAND_LINE_TEST_CASE(L"volume inspect --size vol1", L"inspect", false)
234 // The inspect family aliases -f to --format, matching `docker inspect -f`. The alias accepts the
235 // same values as the long name and rejects the same ones.
236 COMMAND_LINE_TEST_CASE(L"inspect -f json cont1", L"inspect", true)
237 COMMAND_LINE_TEST_CASE(L"inspect -f=json cont1", L"inspect", true)
238 COMMAND_LINE_TEST_CASE(L"inspect -f table cont1", L"inspect", false)
239 COMMAND_LINE_TEST_CASE(L"inspect -f badformat cont1", L"inspect", false)
240 COMMAND_LINE_TEST_CASE(L"inspect -f", L"inspect", false) // Missing value for -f
241 COMMAND_LINE_TEST_CASE(L"inspect --type container -f json cont1", L"inspect", true)
242 COMMAND_LINE_TEST_CASE(L"container inspect -f json cont1", L"inspect", true)
243 COMMAND_LINE_TEST_CASE(L"container inspect -f table cont1", L"inspect", false)
244 COMMAND_LINE_TEST_CASE(L"remove cont1", L"remove", true)
245 COMMAND_LINE_TEST_CASE(L"container remove cont1 cont2", L"remove", true)
246 COMMAND_LINE_TEST_CASE(L"rm cont1", L"remove", true)
247 COMMAND_LINE_TEST_CASE(L"container rm cont1 cont2", L"remove", true)
248 COMMAND_LINE_TEST_CASE(L"container rm --volumes cont1", L"remove", true)
249 COMMAND_LINE_TEST_CASE(L"container rm -v cont1 cont2", L"remove", true)
250 COMMAND_LINE_TEST_CASE(L"container rm --force --volumes cont1", L"remove", true)
251 COMMAND_LINE_TEST_CASE(L"container rm -fv cont1", L"remove", true) // Combined short flags
252 COMMAND_LINE_TEST_CASE(L"container rm -v", L"remove", false) // Missing required container-id positional
253 COMMAND_LINE_TEST_CASE(L"container attach cont", L"attach", true)
254 COMMAND_LINE_TEST_CASE(L"container attach", L"attach", false)
255 // Stats command tests
256 COMMAND_LINE_TEST_CASE(L"stats", L"stats", true)
257 COMMAND_LINE_TEST_CASE(L"container stats", L"stats", true)
258 COMMAND_LINE_TEST_CASE(L"container stats cont1", L"stats", true)
259 COMMAND_LINE_TEST_CASE(L"container stats cont1 cont2", L"stats", true)
260 COMMAND_LINE_TEST_CASE(L"container stats --no-trunc cont1", L"stats", true)
261 COMMAND_LINE_TEST_CASE(L"container stats --all", L"stats", true)
262 // Export command tests
263 COMMAND_LINE_TEST_CASE(L"export cont1", L"export", true)
264 COMMAND_LINE_TEST_CASE(L"container export cont1", L"export", true)
265 COMMAND_LINE_TEST_CASE(L"container export --output foo cont1", L"export", true)
266 COMMAND_LINE_TEST_CASE(L"container export -o foo cont1", L"export", true)
267 COMMAND_LINE_TEST_CASE(L"container export cont1 --output foo", L"export", true)
268 COMMAND_LINE_TEST_CASE(L"container export cont1 -o foo", L"export", true)
269
270 // Cp command tests
271 COMMAND_LINE_TEST_CASE(L"container cp - cont1:/path", L"cp", true)
272 COMMAND_LINE_TEST_CASE(L"container cp - mycontainer:/usr/local/etc", L"cp", true)
273 COMMAND_LINE_TEST_CASE(L"container cp - cont1:/", L"cp", true)
274 COMMAND_LINE_TEST_CASE(L"container cp - cont1:/path/to/deep/dir", L"cp", true)
275 COMMAND_LINE_TEST_CASE(L"container cp somefile cont1:/path", L"cp", true)
276 COMMAND_LINE_TEST_CASE(L"container cp -a - cont1:/path", L"cp", true)
277 COMMAND_LINE_TEST_CASE(L"container cp --archive - cont1:/path", L"cp", true)
278 COMMAND_LINE_TEST_CASE(L"container cp -a=true - cont1:/path", L"cp", true)
279 COMMAND_LINE_TEST_CASE(L"container cp -a=false - cont1:/path", L"cp", true)
280 COMMAND_LINE_TEST_CASE(L"container cp --archive=true - cont1:/path", L"cp", true)
281 COMMAND_LINE_TEST_CASE(L"container cp --archive=false - cont1:/path", L"cp", true)
282 COMMAND_LINE_TEST_CASE(L"container cp -a=1 - cont1:/path", L"cp", true)
283 COMMAND_LINE_TEST_CASE(L"container cp -a=0 - cont1:/path", L"cp", true)
284 COMMAND_LINE_TEST_CASE(L"container cp -a=invalid - cont1:/path", L"cp", false)
285 COMMAND_LINE_TEST_CASE(L"container cp --archive=invalid - cont1:/path", L"cp", false)
286 COMMAND_LINE_TEST_CASE(L"container cp", L"cp", false)
287 COMMAND_LINE_TEST_CASE(L"container cp -", L"cp", false)
288 COMMAND_LINE_TEST_CASE(L"container cp - ", L"cp", false)
289 COMMAND_LINE_TEST_CASE(L"container cp --unknown - cont1:/path", L"cp", false)
290 COMMAND_LINE_TEST_CASE(L"container cp --help", L"cp", true)
291
292 // Logs command
293 COMMAND_LINE_TEST_CASE(L"logs cont1", L"logs", true)
294 COMMAND_LINE_TEST_CASE(L"container logs cont1", L"logs", true)
295 COMMAND_LINE_TEST_CASE(L"container logs --follow cont1", L"logs", true)
296 COMMAND_LINE_TEST_CASE(L"container logs cont1 -f", L"logs", true)
297 COMMAND_LINE_TEST_CASE(L"container logs", L"logs", false)
298 COMMAND_LINE_TEST_CASE(L"container logs --tail 10 cont1", L"logs", true)
299 COMMAND_LINE_TEST_CASE(L"container logs -n 10 cont1", L"logs", true)
300 COMMAND_LINE_TEST_CASE(L"container logs cont1 --tail 10", L"logs", true)
301 COMMAND_LINE_TEST_CASE(L"container logs --tail=10 cont1", L"logs", true)
302 COMMAND_LINE_TEST_CASE(L"container logs -n=10 cont1", L"logs", true)
303 COMMAND_LINE_TEST_CASE(L"container logs --follow --tail 5 cont1", L"logs", true)
304 COMMAND_LINE_TEST_CASE(L"container logs --tail 0 cont1", L"logs", false)
305 COMMAND_LINE_TEST_CASE(L"container logs --tail abc cont1", L"logs", false)
306 COMMAND_LINE_TEST_CASE(L"container logs -n abc cont1", L"logs", false)
307 COMMAND_LINE_TEST_CASE(L"container logs -n=abc cont1", L"logs", false)
308 COMMAND_LINE_TEST_CASE(L"container logs --tail", L"logs", false)
309 COMMAND_LINE_TEST_CASE(L"container logs -n", L"logs", false)
310 COMMAND_LINE_TEST_CASE(L"container logs --timestamps cont1", L"logs", true)
311 COMMAND_LINE_TEST_CASE(L"container logs -t cont1", L"logs", true)
312 COMMAND_LINE_TEST_CASE(L"container logs --since 1700000000 cont1", L"logs", true)
313 COMMAND_LINE_TEST_CASE(L"container logs --until 1700000000 cont1", L"logs", true)
314 COMMAND_LINE_TEST_CASE(L"container logs --since 1700000000 --until 1700001000 cont1", L"logs", true)
315 COMMAND_LINE_TEST_CASE(L"container logs --since abc cont1", L"logs", false)
316 COMMAND_LINE_TEST_CASE(L"container logs --until abc cont1", L"logs", false)
317 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10:30:00Z cont1", L"logs", true)
318 COMMAND_LINE_TEST_CASE(L"container logs --until 2024-01-15T10:30:00Z cont1", L"logs", true)
319 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10:30:00+05:30 cont1", L"logs", true)
320 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10:30:00.123456789Z cont1", L"logs", true)
321 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-13-15T10:30:00Z cont1", L"logs", false)
322 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T25:30:00Z cont1", L"logs", false)
323 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15 cont1", L"logs", true)
324 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10 cont1", L"logs", true)
325 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10:30 cont1", L"logs", true)
326 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10:30:00 cont1", L"logs", true)
327 COMMAND_LINE_TEST_CASE(L"container logs --since 10m cont1", L"logs", true)
328 COMMAND_LINE_TEST_CASE(L"container logs --since 1h30m cont1", L"logs", true)
329 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10:30:00Zextra cont1", L"logs", false)
330 COMMAND_LINE_TEST_CASE(L"container logs --since 1960-01-15T10:30:00Z cont1", L"logs", true)
331 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-02-31T10:30:00Z cont1", L"logs", false)
332 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10:30:00.Z cont1", L"logs", false)
333 COMMAND_LINE_TEST_CASE(L"container logs --since 2024-01-15T10:30:00+0530 cont1", L"logs", false)
334 COMMAND_LINE_TEST_CASE(L"container logs --follow --timestamps --since 100 --tail 5 cont1", L"logs", true)
335
336 // Image command
337 COMMAND_LINE_TEST_CASE(L"image build C:\\context", L"build", true)
338 COMMAND_LINE_TEST_CASE(L"image build C:\\context --tag test:latest", L"build", true)
339 COMMAND_LINE_TEST_CASE(L"image build C:\\context -t test", L"build", true)
340 COMMAND_LINE_TEST_CASE(L"image build C:\\context --file Dockerfile.custom", L"build", true)
341 COMMAND_LINE_TEST_CASE(L"image build C:\\context -f -", L"build", true)
342 COMMAND_LINE_TEST_CASE(L"image build C:\\context -t test:latest -f Dockerfile.other", L"build", true)
343 COMMAND_LINE_TEST_CASE(L"image build C:\\context -t tag1 -t tag2", L"build", true)
344 COMMAND_LINE_TEST_CASE(L"image build C:\\context --tag tag1 --tag tag2 --tag tag3", L"build", true)
345 COMMAND_LINE_TEST_CASE(L"image build C:\\context --build-arg KEY=VALUE", L"build", true)
346 COMMAND_LINE_TEST_CASE(L"image build C:\\context --build-arg A=1 --build-arg B=2", L"build", true)
347 COMMAND_LINE_TEST_CASE(L"image build C:\\context -t test:latest --build-arg KEY=VALUE -f Dockerfile.custom", L"build", true)
348 COMMAND_LINE_TEST_CASE(L"image build C:\\context --verbose", L"build", true)
349 COMMAND_LINE_TEST_CASE(L"image build C:\\context -t test --build-arg KEY=VALUE --verbose", L"build", true)
350 COMMAND_LINE_TEST_CASE(L"image build C:\\context --no-cache", L"build", true)
351 COMMAND_LINE_TEST_CASE(L"image build C:\\context --no-cache --verbose", L"build", true)
352 COMMAND_LINE_TEST_CASE(L"image build C:\\context -t test --no-cache", L"build", true)
353 COMMAND_LINE_TEST_CASE(L"image build", L"build", false)
354 COMMAND_LINE_TEST_CASE(L"build C:\\context", L"build", true)
355 COMMAND_LINE_TEST_CASE(L"build C:\\context -t test", L"build", true)
356 COMMAND_LINE_TEST_CASE(L"image list", L"list", true)
357 COMMAND_LINE_TEST_CASE(L"image list --no-trunc", L"list", true)
358 COMMAND_LINE_TEST_CASE(L"images", L"images", true) // Aliased off the root changes the name
359 COMMAND_LINE_TEST_CASE(L"image ls", L"list", true)
360 COMMAND_LINE_TEST_CASE(L"image list --format json", L"list", true)
361 COMMAND_LINE_TEST_CASE(L"image list --format badformat", L"list", false)
362 COMMAND_LINE_TEST_CASE(L"image list --verbose", L"list", true)
363 COMMAND_LINE_TEST_CASE(L"image list -q", L"list", true)
364 COMMAND_LINE_TEST_CASE(L"image pull ubuntu", L"pull", true)
365 COMMAND_LINE_TEST_CASE(L"pull ubuntu", L"pull", true)
366 COMMAND_LINE_TEST_CASE(L"pull ubuntu --quiet", L"pull", true)
367 COMMAND_LINE_TEST_CASE(L"pull ubuntu -q", L"pull", true)
368 COMMAND_LINE_TEST_CASE(L"image rm cont1 --force --no-prune", L"remove", true)
369 COMMAND_LINE_TEST_CASE(L"image rm cont1 cont2 cont3 --force --no-prune", L"remove", true)
370 COMMAND_LINE_TEST_CASE(L"image inspect --format json img1", L"inspect", true)
371 COMMAND_LINE_TEST_CASE(L"image inspect --format table img1", L"inspect", false)
372 COMMAND_LINE_TEST_CASE(L"image inspect --format badformat img1", L"inspect", false)
373
374 // Network and volume inspect --format tests
375 COMMAND_LINE_TEST_CASE(L"network inspect --format json net1", L"inspect", true)
376 COMMAND_LINE_TEST_CASE(L"network inspect --format table net1", L"inspect", false)
377 COMMAND_LINE_TEST_CASE(L"network inspect --format badformat net1", L"inspect", false)
378 COMMAND_LINE_TEST_CASE(L"volume inspect --format json vol1", L"inspect", true)
379 COMMAND_LINE_TEST_CASE(L"volume inspect --format table vol1", L"inspect", false)
380 COMMAND_LINE_TEST_CASE(L"volume inspect --format badformat vol1", L"inspect", false)
381 COMMAND_LINE_TEST_CASE(L"image inspect -f json img1", L"inspect", true)
382 COMMAND_LINE_TEST_CASE(L"image inspect -f table img1", L"inspect", false)
383 COMMAND_LINE_TEST_CASE(L"network inspect -f json net1", L"inspect", true)
384 COMMAND_LINE_TEST_CASE(L"network inspect -f table net1", L"inspect", false)
385 COMMAND_LINE_TEST_CASE(L"volume inspect -f json vol1", L"inspect", true)
386 COMMAND_LINE_TEST_CASE(L"volume inspect -f table vol1", L"inspect", false)
387
388 // Version command tests
389 COMMAND_LINE_TEST_CASE(L"version", L"version", true)
390 COMMAND_LINE_TEST_CASE(L"version --help", L"version", true)
391 COMMAND_LINE_TEST_CASE(L"version --format json", L"version", true)
392 COMMAND_LINE_TEST_CASE(L"version --format table", L"version", true)
393 COMMAND_LINE_TEST_CASE(L"version --format invalid", L"version", false)
394 COMMAND_LINE_TEST_CASE(L"version extraarg", L"version", false)
395 // Settings command
396 COMMAND_LINE_TEST_CASE(L"settings", L"settings", true)
397 COMMAND_LINE_TEST_CASE(L"settings reset", L"reset", true)
398
399 // Error cases
400 COMMAND_LINE_TEST_CASE(L"invalid command", L"", false)
401 COMMAND_LINE_TEST_CASE(L"CONTAINER list", L"list", false) // We are intentionally case-sensitive
402 COMMAND_LINE_TEST_CASE(L"container LS", L"list", false) // commands and aliases are case-sensitive
403 COMMAND_LINE_TEST_CASE(L"container list --FORMAT json", L"list", false) // Args also case-sensitive
404 COMMAND_LINE_TEST_CASE(L"container list -A", L"list", false) // So are arg aliases