summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/system/610-format.bats152
1 files changed, 152 insertions, 0 deletions
diff --git a/test/system/610-format.bats b/test/system/610-format.bats
new file mode 100644
index 000000000..77921b9a2
--- /dev/null
+++ b/test/system/610-format.bats
@@ -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