forked from containers/podman
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Ed Santiago <[email protected]>
- Loading branch information
1 parent
43f7bdf
commit 1acebdd
Showing
1 changed file
with
152 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
#!/usr/bin/env bats -*- bats -*- | ||
# | ||
# PR #15673: For all commands that accept --format '{{.GoTemplate}}', | ||
# invoke with --format '{{"\n"}}' and make sure they don't choke. | ||
# | ||
|
||
load helpers | ||
|
||
function teardown() { | ||
# In case test fails: standard teardown does not wipe machines | ||
run_podman '?' machine rm -f mymachine | ||
|
||
basic_teardown | ||
} | ||
|
||
# Most commands can't just be run with --format; they need an argument or | ||
# option. This table defines what those are. | ||
# | ||
# FIXME: once you've finished fixing them all, remove the SKIPs (just | ||
# remove the entire lines, except for pod-inspect, just remove the SKIP | ||
# but leave "mypod") | ||
extra_args_table=" | ||
info | SKIP | ||
system info | SKIP | ||
machine info | SKIP | ||
version | SKIP | ||
history | $IMAGE | ||
image history | $IMAGE | ||
image inspect | $IMAGE | ||
container inspect | no-such-container | ||
machine inspect | mymachine | ||
volume inspect | -a | ||
secret inspect | -a | ||
network inspect | podman | ||
ps | -a | ||
image search | sdfsdf | ||
search | sdfsdf | ||
pod inspect | mypod SKIP | ||
container stats | --no-stream | ||
pod stats | --no-stream | ||
stats | --no-stream | ||
events | --stream=false --events-backend=file | ||
" | ||
|
||
# Main test loop. Recursively runs 'podman [subcommand] help', looks for: | ||
# > '[command]', which indicates, recurse; or | ||
# > '--format', in which case we | ||
# > check autocompletion, look for Go templates, in which case we | ||
# > run the command with --format '{{"\n"}}' and make sure it passes | ||
function check_subcommand() { | ||
for cmd in $(_podman_commands "$@"); do | ||
# Human-readable podman command string, with multiple spaces collapsed | ||
command_string="podman $* $cmd" | ||
command_string=${command_string// / } # 'podman x' -> 'podman x' | ||
|
||
# Run --help, decide if this is a subcommand with subcommands | ||
run_podman "$@" $cmd --help | ||
local full_help="$output" | ||
|
||
# The line immediately after 'Usage:' gives us a 1-line synopsis | ||
usage=$(echo "$full_help" | grep -A1 '^Usage:' | tail -1) | ||
assert "$usage" != "" "podman $cmd: no Usage message found" | ||
|
||
# Strip off the leading command string; we no longer need it | ||
usage=$(sed -e "s/^ $command_string \?//" <<<"$usage") | ||
|
||
# If usage ends in '[command]', recurse into subcommands | ||
if expr "$usage" : '\[command\]' >/dev/null; then | ||
# (except for 'podman help', which is a special case) | ||
if [[ $cmd != "help" ]]; then | ||
check_subcommand "$@" $cmd | ||
fi | ||
continue | ||
fi | ||
|
||
# Not a subcommand-subcommand. Look for --format option | ||
if [[ ! "$output" =~ "--format" ]]; then | ||
continue | ||
fi | ||
|
||
# Have --format. Make sure it's a Go-template option, not like --push | ||
run_podman __completeNoDesc "$@" "$cmd" --format '{{.' | ||
if [[ ! "$output" =~ \{\{\.[A-Z] ]]; then | ||
continue | ||
fi | ||
|
||
# Got one. | ||
dprint "$command_string has --format" | ||
|
||
# Whatever is needed to make a runnable command | ||
local extra=${extra_args[$command_string]} | ||
if [[ -n "$extra" ]]; then | ||
# Cross off our list | ||
unset extra_args["$command_string"] | ||
fi | ||
|
||
# FIXME: you can remove this once you're finished with #15673 | ||
if [[ "$extra" =~ SKIP ]]; then | ||
continue | ||
fi | ||
|
||
# This is what does the work. We should never see the unterminated err | ||
run_podman '?' "$@" "$cmd" $extra --format '{{"\n"}}' | ||
assert "$output" !~ "unterminated quoted string" \ | ||
"$command_string --format <newline>" | ||
|
||
# This will (probably) only trigger if we get a new podman subcommand. | ||
# It means someone needs to figure out the right magic args to use | ||
# when invoking the subcommand. | ||
if [[ $status -ne 0 ]]; then | ||
if [[ -z "$extra" ]]; then | ||
die "'$command_string' barfed with '$output'. You probably need to special-case this command in extra_args_table in this script." | ||
fi | ||
fi | ||
done | ||
} | ||
|
||
# Test entry point | ||
@test "check Go template formatting" { | ||
skip_if_remote | ||
|
||
# Convert the table at top to an associative array, keyed on subcommand | ||
declare -A extra_args | ||
while read subcommand extra; do | ||
extra_args["podman $subcommand"]=$extra | ||
done < <(parse_table "$extra_args_table") | ||
|
||
# Setup: 'pod ps' needs an actual pod; 'machine inspect' needs a machine | ||
run_podman pod create mypod | ||
run_podman machine init --image-path=/dev/null mymachine | ||
|
||
# Run the test | ||
check_subcommand | ||
|
||
# Clean up | ||
run_podman pod rm mypod | ||
run_podman rmi $(pause_image) | ||
run_podman machine rm -f mymachine | ||
|
||
# Make sure there are no leftover commands in our table - this would | ||
# indicate a typo in the table, or a flaw in our logic such that | ||
# we're not actually recursing. | ||
local leftovers="${!extra_args[@]}" | ||
assert "$leftovers" = "" "Did not find (or test) subcommands:" | ||
} | ||
|
||
# vim: filetype=sh |