From b41bde935d2d504534bdb53e7cf6376add0e8dc9 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 12 Mar 2024 17:03:56 +0100 Subject: [PATCH] virshtest: Add test cases for command completion helper Add both single invocations as well as a script containing the same commands. Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- tests/virshtest.c | 55 +++++++++++++- .../completion-arg-full-argv-next.out | 2 + .../completion-arg-full-argv.out | 2 + .../completion-arg-full-bool-next.out | 7 ++ .../completion-arg-full-bool.out | 2 + .../completion-arg-full-string-next.out | 7 ++ .../completion-arg-full-string.out | 2 + .../virshtestdata/completion-arg-partial.out | 4 ++ .../completion-arg-positional-empty.out | 3 + ...completion-arg-positional-partial-next.out | 2 + .../completion-arg-positional-partial.out | 2 + tests/virshtestdata/completion-args.out | 7 ++ .../completion-argv-multiple-next.out | 25 +++++++ ...mpletion-argv-multiple-positional-next.out | 25 +++++++ .../completion-argv-multiple-positional.out | 2 + .../completion-argv-multiple.out | 2 + .../completion-command-complete.out | 2 + tests/virshtestdata/completion-command.out | 2 + tests/virshtestdata/completion.in | 16 +++++ tests/virshtestdata/completion.out | 71 +++++++++++++++++++ 20 files changed, 237 insertions(+), 3 deletions(-) create mode 100644 tests/virshtestdata/completion-arg-full-argv-next.out create mode 100644 tests/virshtestdata/completion-arg-full-argv.out create mode 100644 tests/virshtestdata/completion-arg-full-bool-next.out create mode 100644 tests/virshtestdata/completion-arg-full-bool.out create mode 100644 tests/virshtestdata/completion-arg-full-string-next.out create mode 100644 tests/virshtestdata/completion-arg-full-string.out create mode 100644 tests/virshtestdata/completion-arg-partial.out create mode 100644 tests/virshtestdata/completion-arg-positional-empty.out create mode 100644 tests/virshtestdata/completion-arg-positional-partial-next.out create mode 100644 tests/virshtestdata/completion-arg-positional-partial.out create mode 100644 tests/virshtestdata/completion-args.out create mode 100644 tests/virshtestdata/completion-argv-multiple-next.out create mode 100644 tests/virshtestdata/completion-argv-multiple-positional-next.out create mode 100644 tests/virshtestdata/completion-argv-multiple-positional.out create mode 100644 tests/virshtestdata/completion-argv-multiple.out create mode 100644 tests/virshtestdata/completion-command-complete.out create mode 100644 tests/virshtestdata/completion-command.out create mode 100644 tests/virshtestdata/completion.in create mode 100644 tests/virshtestdata/completion.out diff --git a/tests/virshtest.c b/tests/virshtest.c index 14a96f2d35..a1ae481316 100644 --- a/tests/virshtest.c +++ b/tests/virshtest.c @@ -96,6 +96,7 @@ struct testInfo { bool expensive; const char *const *env; /* extra environment variables to pass */ bool forbid_root; + bool need_readline; }; static int testCompare(const void *data) @@ -109,6 +110,11 @@ static int testCompare(const void *data) if (info->forbid_root && geteuid() == 0) return EXIT_AM_SKIP; +# ifndef WITH_READLINE + if (info->need_readline) + return EXIT_AM_SKIP; +# endif + if (info->testname) { outfile = g_strdup_printf("%s/virshtestdata/%s.out", abs_srcdir, info->testname); @@ -206,6 +212,7 @@ static int mymain(void) { int ret = 0; + bool need_readline = false; custom_uri = g_strdup_printf("test://%s/../examples/xml/test/testnode.xml", abs_srcdir); @@ -217,7 +224,7 @@ mymain(void) abs_srcdir, testname); \ const char *myargv[] = { __VA_ARGS__, NULL, NULL }; \ const char **tmp = myargv; \ - const struct testInfo info = { testname, testfilter, myargv, expensive, NULL, false}; \ + const struct testInfo info = { testname, testfilter, myargv, expensive, NULL, false, need_readline}; \ g_autofree char *scriptarg = NULL; \ if (virFileReadAll(infile, 256 * 1024, &scriptarg) < 0) { \ fprintf(stderr, "\nfailed to load '%s'\n", infile); \ @@ -246,7 +253,7 @@ mymain(void) # define DO_TEST_FULL(testname, filter, ...) \ do { \ const char *myargv[] = { __VA_ARGS__, NULL }; \ - const struct testInfo info = { testname, NULL, myargv, false, NULL, false }; \ + const struct testInfo info = { testname, NULL, myargv, false, NULL, false, need_readline }; \ DO_TEST_INFO(&info); \ } while (0) @@ -342,6 +349,48 @@ mymain(void) "checkpoint-create test --redefine checkpoint-c2.xml ;" "checkpoint-info test c2"); + /* completion doesn't work on non-readline builds */ + need_readline = true; + + DO_TEST_FULL("completion-command", NULL, VIRSH_CUSTOM, + "complete", "--", "ech"); + DO_TEST_FULL("completion-command-complete", NULL, VIRSH_CUSTOM, + "complete", "--", "echo"); + DO_TEST_FULL("completion-args", NULL, VIRSH_CUSTOM, + "complete", "--", "echo", ""); + DO_TEST_FULL("completion-arg-partial", NULL, VIRSH_CUSTOM, + "complete", "--", "echo", "--xm", "--s"); + DO_TEST_FULL("completion-arg-full-bool", NULL, VIRSH_CUSTOM, + "complete", "--", "echo", "--nonexistant-arg", "--xml"); + DO_TEST_FULL("completion-arg-full-bool-next", NULL, VIRSH_CUSTOM, + "complete", "--", "echo", "--nonexistant-arg", "--xml", ""); + DO_TEST_FULL("completion-arg-full-string", NULL, VIRSH_CUSTOM, + "complete", "--", "echo", "--nonexistant-arg", "--prefix"); + DO_TEST_FULL("completion-arg-full-string-next", NULL, VIRSH_CUSTOM, + "complete", "--", "echo", "--nonexistant-arg", "--prefix", ""); + DO_TEST_FULL("completion-arg-full-argv", NULL, VIRSH_CUSTOM, + "complete", "--", "domstats", "--domain"); + DO_TEST_FULL("completion-arg-full-argv-next", NULL, VIRSH_DEFAULT, + "complete", "--", "domstats", "--domain", ""); + DO_TEST_FULL("completion-argv-multiple", NULL, VIRSH_CUSTOM, + "complete", "--", "domstats", "--domain", "fc", "--domain", "fv"); + DO_TEST_FULL("completion-argv-multiple-next", NULL, VIRSH_CUSTOM, + "complete", "--", "domstats", "--domain", "fv", "--domain", "fc", ""); + DO_TEST_FULL("completion-argv-multiple-positional", NULL, VIRSH_CUSTOM, + "complete", "--", "domstats", "--domain", "fc", "fv"); + DO_TEST_FULL("completion-argv-multiple-positional-next", NULL, VIRSH_CUSTOM, + "complete", "--", "domstats", "--domain", "fc", "fv", ""); + DO_TEST_FULL("completion-arg-positional-empty", NULL, VIRSH_CUSTOM, + "complete", "--", "domstate", ""); + DO_TEST_FULL("completion-arg-positional-partial", NULL, VIRSH_CUSTOM, + "complete", "--", "domstate", "fv"); + DO_TEST_FULL("completion-arg-positional-partial-next", NULL, VIRSH_CUSTOM, + "complete", "--", "domstate", "fv", ""); + + DO_TEST_SCRIPT("completion", NULL, VIRSH_DEFAULT); + + need_readline = false; + if (virTestRun("read-big-pipe", testVirshPipe, NULL) < 0) ret = -1; @@ -369,7 +418,7 @@ mymain(void) const char *uriTest = "uri; connect; uri"; const char *myargv_noconnect[] = { abs_top_builddir "/tools/virsh", uriTest, NULL }; const char *xdgDirBad = "XDG_CONFIG_HOME=" abs_srcdir "/virshtestdata/uriprecedence-xdg/bad/"; - struct testInfo info = { NULL, NULL, myargv_noconnect, false, NULL, false }; + struct testInfo info = { NULL, NULL, myargv_noconnect, false, NULL, false, false }; /* test 1 - default from config */ { diff --git a/tests/virshtestdata/completion-arg-full-argv-next.out b/tests/virshtestdata/completion-arg-full-argv-next.out new file mode 100644 index 0000000000..76e579ae4c --- /dev/null +++ b/tests/virshtestdata/completion-arg-full-argv-next.out @@ -0,0 +1,2 @@ +test + diff --git a/tests/virshtestdata/completion-arg-full-argv.out b/tests/virshtestdata/completion-arg-full-argv.out new file mode 100644 index 0000000000..2d795410c2 --- /dev/null +++ b/tests/virshtestdata/completion-arg-full-argv.out @@ -0,0 +1,2 @@ +--domain + diff --git a/tests/virshtestdata/completion-arg-full-bool-next.out b/tests/virshtestdata/completion-arg-full-bool-next.out new file mode 100644 index 0000000000..3fc6e035d0 --- /dev/null +++ b/tests/virshtestdata/completion-arg-full-bool-next.out @@ -0,0 +1,7 @@ +--shell +--xml +--split +--err +--prefix +--string + diff --git a/tests/virshtestdata/completion-arg-full-bool.out b/tests/virshtestdata/completion-arg-full-bool.out new file mode 100644 index 0000000000..511582e4c9 --- /dev/null +++ b/tests/virshtestdata/completion-arg-full-bool.out @@ -0,0 +1,2 @@ +--xml + diff --git a/tests/virshtestdata/completion-arg-full-string-next.out b/tests/virshtestdata/completion-arg-full-string-next.out new file mode 100644 index 0000000000..3fc6e035d0 --- /dev/null +++ b/tests/virshtestdata/completion-arg-full-string-next.out @@ -0,0 +1,7 @@ +--shell +--xml +--split +--err +--prefix +--string + diff --git a/tests/virshtestdata/completion-arg-full-string.out b/tests/virshtestdata/completion-arg-full-string.out new file mode 100644 index 0000000000..b29473399a --- /dev/null +++ b/tests/virshtestdata/completion-arg-full-string.out @@ -0,0 +1,2 @@ +--prefix + diff --git a/tests/virshtestdata/completion-arg-partial.out b/tests/virshtestdata/completion-arg-partial.out new file mode 100644 index 0000000000..cc2820d9a8 --- /dev/null +++ b/tests/virshtestdata/completion-arg-partial.out @@ -0,0 +1,4 @@ +--shell +--split +--string + diff --git a/tests/virshtestdata/completion-arg-positional-empty.out b/tests/virshtestdata/completion-arg-positional-empty.out new file mode 100644 index 0000000000..cf2bdf1586 --- /dev/null +++ b/tests/virshtestdata/completion-arg-positional-empty.out @@ -0,0 +1,3 @@ +--domain +--reason + diff --git a/tests/virshtestdata/completion-arg-positional-partial-next.out b/tests/virshtestdata/completion-arg-positional-partial-next.out new file mode 100644 index 0000000000..d9e9cd0a05 --- /dev/null +++ b/tests/virshtestdata/completion-arg-positional-partial-next.out @@ -0,0 +1,2 @@ +--reason + diff --git a/tests/virshtestdata/completion-arg-positional-partial.out b/tests/virshtestdata/completion-arg-positional-partial.out new file mode 100644 index 0000000000..4289a724d9 --- /dev/null +++ b/tests/virshtestdata/completion-arg-positional-partial.out @@ -0,0 +1,2 @@ +fv0 + diff --git a/tests/virshtestdata/completion-args.out b/tests/virshtestdata/completion-args.out new file mode 100644 index 0000000000..3fc6e035d0 --- /dev/null +++ b/tests/virshtestdata/completion-args.out @@ -0,0 +1,7 @@ +--shell +--xml +--split +--err +--prefix +--string + diff --git a/tests/virshtestdata/completion-argv-multiple-next.out b/tests/virshtestdata/completion-argv-multiple-next.out new file mode 100644 index 0000000000..b29a060eff --- /dev/null +++ b/tests/virshtestdata/completion-argv-multiple-next.out @@ -0,0 +1,25 @@ +--state +--cpu-total +--balloon +--vcpu +--interface +--block +--perf +--iothread +--memory +--dirtyrate +--vm +--list-active +--list-inactive +--list-persistent +--list-transient +--list-running +--list-paused +--list-shutoff +--list-other +--raw +--enforce +--backing +--nowait +--domain + diff --git a/tests/virshtestdata/completion-argv-multiple-positional-next.out b/tests/virshtestdata/completion-argv-multiple-positional-next.out new file mode 100644 index 0000000000..b29a060eff --- /dev/null +++ b/tests/virshtestdata/completion-argv-multiple-positional-next.out @@ -0,0 +1,25 @@ +--state +--cpu-total +--balloon +--vcpu +--interface +--block +--perf +--iothread +--memory +--dirtyrate +--vm +--list-active +--list-inactive +--list-persistent +--list-transient +--list-running +--list-paused +--list-shutoff +--list-other +--raw +--enforce +--backing +--nowait +--domain + diff --git a/tests/virshtestdata/completion-argv-multiple-positional.out b/tests/virshtestdata/completion-argv-multiple-positional.out new file mode 100644 index 0000000000..4289a724d9 --- /dev/null +++ b/tests/virshtestdata/completion-argv-multiple-positional.out @@ -0,0 +1,2 @@ +fv0 + diff --git a/tests/virshtestdata/completion-argv-multiple.out b/tests/virshtestdata/completion-argv-multiple.out new file mode 100644 index 0000000000..4289a724d9 --- /dev/null +++ b/tests/virshtestdata/completion-argv-multiple.out @@ -0,0 +1,2 @@ +fv0 + diff --git a/tests/virshtestdata/completion-command-complete.out b/tests/virshtestdata/completion-command-complete.out new file mode 100644 index 0000000000..40cf7bd7c0 --- /dev/null +++ b/tests/virshtestdata/completion-command-complete.out @@ -0,0 +1,2 @@ +echo + diff --git a/tests/virshtestdata/completion-command.out b/tests/virshtestdata/completion-command.out new file mode 100644 index 0000000000..40cf7bd7c0 --- /dev/null +++ b/tests/virshtestdata/completion-command.out @@ -0,0 +1,2 @@ +echo + diff --git a/tests/virshtestdata/completion.in b/tests/virshtestdata/completion.in new file mode 100644 index 0000000000..cd2594609f --- /dev/null +++ b/tests/virshtestdata/completion.in @@ -0,0 +1,16 @@ +complete -- ech +complete -- echo +complete -- echo '' +complete -- echo --xm --s +complete -- echo --nonexistant-arg --xml +complete -- echo --nonexistant-arg --xml '' +complete -- echo --nonexistant-arg --prefix +complete -- echo --nonexistant-arg --prefix '' +complete -- domstats --domain +complete -- domstats --domain '' +complete -- domstats --domain f +complete -- domstats --domain fc --domain fv +complete -- domstats --domain fv --domain fc '' +complete -- domstats --domain fc fv +complete -- domstate '' +complete -- domstate fv diff --git a/tests/virshtestdata/completion.out b/tests/virshtestdata/completion.out new file mode 100644 index 0000000000..9cceb088e3 --- /dev/null +++ b/tests/virshtestdata/completion.out @@ -0,0 +1,71 @@ +echo + +echo + +--shell +--xml +--split +--err +--prefix +--string + +--shell +--split +--string + +--xml + +--shell +--xml +--split +--err +--prefix +--string + +--prefix + +--shell +--xml +--split +--err +--prefix +--string + +--domain + +test + + + +--state +--cpu-total +--balloon +--vcpu +--interface +--block +--perf +--iothread +--memory +--dirtyrate +--vm +--list-active +--list-inactive +--list-persistent +--list-transient +--list-running +--list-paused +--list-shutoff +--list-other +--raw +--enforce +--backing +--nowait +--domain + + +--domain +--reason + + + +## Exit code: 1