| 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 |