2008-01-30 02:15:54 +08:00
|
|
|
#include <config.h>
|
2006-08-25 05:46:28 +08:00
|
|
|
|
|
|
|
#include <unistd.h>
|
2007-11-26 20:03:34 +08:00
|
|
|
|
Wed Dec 5 13:48:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
* python/libvir.c, python/libvirt_wrap.h, qemud/qemud.c,
qemud/remote.c, src/internal.h, src/openvz_conf.c,
src/openvz_driver.c, src/proxy_internal.h, src/qemu_conf.c,
src/qemu_driver.c, src/remote_internal.h, src/test.h, src/util.c,
src/xen_unified.c, src/xen_unified.h, tests/nodeinfotest.c,
tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/reconnect.c,
tests/sexpr2xmltest.c, tests/virshtest.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c:
Change #include <> to #include "" for local includes.
Removed many includes from src/internal.h and put them in
the C files which actually use them.
Removed <ansidecl.h> - unused.
Added a comment around __func__.
Removed a clashing redefinition of VERSION symbol.
All limits (PATH_MAX etc) now done in src/internal.h, so we
don't need to include those headers in other files.
2007-12-05 21:56:22 +08:00
|
|
|
#include "internal.h"
|
2012-12-14 02:13:21 +08:00
|
|
|
#include "virxml.h"
|
2006-08-25 05:46:28 +08:00
|
|
|
#include "testutils.h"
|
2020-02-09 09:00:06 +08:00
|
|
|
#include "vircommand.h"
|
2013-04-03 18:36:23 +08:00
|
|
|
#include "virstring.h"
|
2006-08-25 05:46:28 +08:00
|
|
|
|
2013-06-07 23:10:28 +08:00
|
|
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
|
|
|
|
2011-07-28 23:48:12 +08:00
|
|
|
#ifdef WIN32
|
|
|
|
|
|
|
|
int
|
|
|
|
main(void)
|
|
|
|
{
|
|
|
|
return EXIT_AM_SKIP;
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
# define DOM_UUID "ef861801-45b9-11cb-88e3-afbfe5370493"
|
2008-11-24 15:11:26 +08:00
|
|
|
|
|
|
|
static const char *dominfo_fc4 = "\
|
|
|
|
Id: 2\n\
|
|
|
|
Name: fc4\n\
|
|
|
|
UUID: " DOM_UUID "\n\
|
|
|
|
OS Type: linux\n\
|
|
|
|
State: running\n\
|
|
|
|
CPU(s): 1\n\
|
2012-05-01 04:27:56 +08:00
|
|
|
Max memory: 261072 KiB\n\
|
|
|
|
Used memory: 131072 KiB\n\
|
2010-06-17 15:57:12 +08:00
|
|
|
Persistent: yes\n\
|
2008-11-24 15:11:26 +08:00
|
|
|
Autostart: disable\n\
|
2013-08-07 07:33:25 +08:00
|
|
|
Managed save: no\n\
|
2008-11-24 15:11:26 +08:00
|
|
|
\n";
|
|
|
|
static const char *domuuid_fc4 = DOM_UUID "\n\n";
|
|
|
|
static const char *domid_fc4 = "2\n\n";
|
|
|
|
static const char *domname_fc4 = "fc4\n\n";
|
|
|
|
static const char *domstate_fc4 = "running\n\n";
|
|
|
|
|
2006-08-25 05:46:28 +08:00
|
|
|
static int testFilterLine(char *buffer,
|
2014-03-18 16:13:43 +08:00
|
|
|
const char *toRemove)
|
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
char *start;
|
|
|
|
char *end;
|
|
|
|
|
|
|
|
if (!(start = strstr(buffer, toRemove)))
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (!(end = strstr(start+1, "\n"))) {
|
|
|
|
*start = '\0';
|
|
|
|
} else {
|
|
|
|
memmove(start, end, strlen(end)+1);
|
|
|
|
}
|
|
|
|
return 0;
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2011-04-25 06:25:10 +08:00
|
|
|
static int
|
|
|
|
testCompareOutputLit(const char *expectData,
|
|
|
|
const char *filter, const char *const argv[])
|
|
|
|
{
|
2020-02-09 09:07:19 +08:00
|
|
|
g_autofree char *actualData = NULL;
|
2020-02-09 09:00:06 +08:00
|
|
|
const char *empty = "";
|
|
|
|
g_autoptr(virCommand) cmd = NULL;
|
|
|
|
g_autofree char *errbuf = NULL;
|
2006-08-25 05:46:28 +08:00
|
|
|
|
2020-02-09 09:00:06 +08:00
|
|
|
if (!(cmd = virCommandNewArgs(argv)))
|
2020-02-09 09:07:19 +08:00
|
|
|
return -1;
|
2006-08-25 05:46:28 +08:00
|
|
|
|
2020-02-09 09:00:06 +08:00
|
|
|
virCommandAddEnvString(cmd, "LANG=C");
|
|
|
|
virCommandSetInputBuffer(cmd, empty);
|
|
|
|
virCommandSetOutputBuffer(cmd, &actualData);
|
|
|
|
virCommandSetErrorBuffer(cmd, &errbuf);
|
|
|
|
|
|
|
|
if (virCommandRun(cmd, NULL) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (STRNEQ(errbuf, "")) {
|
|
|
|
fprintf(stderr, "Command reported error: %s", errbuf);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2011-04-25 06:25:10 +08:00
|
|
|
if (filter && testFilterLine(actualData, filter) < 0)
|
2020-02-09 09:07:19 +08:00
|
|
|
return -1;
|
2006-08-25 05:46:28 +08:00
|
|
|
|
2011-04-25 06:25:10 +08:00
|
|
|
if (STRNEQ(expectData, actualData)) {
|
2016-05-26 23:01:51 +08:00
|
|
|
virTestDifference(stderr, expectData, actualData);
|
2020-02-09 09:07:19 +08:00
|
|
|
return -1;
|
2011-04-25 06:25:10 +08:00
|
|
|
}
|
2006-08-25 05:46:28 +08:00
|
|
|
|
2020-02-09 09:07:19 +08:00
|
|
|
return 0;
|
2008-11-24 15:11:26 +08:00
|
|
|
}
|
2006-08-25 05:46:28 +08:00
|
|
|
|
2019-03-12 22:11:47 +08:00
|
|
|
# define VIRSH_DEFAULT abs_top_builddir "/tools/virsh", \
|
2006-08-25 05:46:28 +08:00
|
|
|
"--connect", \
|
|
|
|
"test:///default"
|
|
|
|
|
|
|
|
static char *custom_uri;
|
|
|
|
|
2019-03-12 22:11:47 +08:00
|
|
|
# define VIRSH_CUSTOM abs_top_builddir "/tools/virsh", \
|
2006-08-25 05:46:28 +08:00
|
|
|
"--connect", \
|
|
|
|
custom_uri
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareListDefault(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_DEFAULT, "list", NULL };
|
|
|
|
const char *exp = "\
|
2018-11-27 17:07:32 +08:00
|
|
|
Id Name State\n\
|
2018-08-23 23:53:42 +08:00
|
|
|
----------------------\n\
|
2018-11-27 17:07:32 +08:00
|
|
|
1 test running\n\
|
2008-11-24 15:11:26 +08:00
|
|
|
\n";
|
2018-09-13 16:55:21 +08:00
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareListCustom(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "list", NULL };
|
|
|
|
const char *exp = "\
|
2018-11-27 17:07:32 +08:00
|
|
|
Id Name State\n\
|
2018-08-23 23:53:42 +08:00
|
|
|
----------------------\n\
|
2018-11-27 17:07:32 +08:00
|
|
|
1 fv0 running\n\
|
|
|
|
2 fc4 running\n\
|
2008-11-24 15:11:26 +08:00
|
|
|
\n";
|
2018-09-13 16:55:21 +08:00
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareNodeinfoDefault(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_DEFAULT, "nodeinfo", NULL };
|
|
|
|
const char *exp = "\
|
2008-11-24 15:11:26 +08:00
|
|
|
CPU model: i686\n\
|
|
|
|
CPU(s): 16\n\
|
|
|
|
CPU frequency: 1400 MHz\n\
|
|
|
|
CPU socket(s): 2\n\
|
|
|
|
Core(s) per socket: 2\n\
|
|
|
|
Thread(s) per core: 2\n\
|
|
|
|
NUMA cell(s): 2\n\
|
2012-05-01 04:27:56 +08:00
|
|
|
Memory size: 3145728 KiB\n\
|
2008-11-24 15:11:26 +08:00
|
|
|
\n";
|
2018-09-13 16:55:21 +08:00
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareNodeinfoCustom(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = {
|
|
|
|
VIRSH_CUSTOM,
|
|
|
|
"nodeinfo",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
const char *exp = "\
|
2008-11-24 15:11:26 +08:00
|
|
|
CPU model: i986\n\
|
|
|
|
CPU(s): 50\n\
|
|
|
|
CPU frequency: 6000 MHz\n\
|
|
|
|
CPU socket(s): 4\n\
|
|
|
|
Core(s) per socket: 4\n\
|
|
|
|
Thread(s) per core: 2\n\
|
|
|
|
NUMA cell(s): 4\n\
|
2012-05-01 04:27:56 +08:00
|
|
|
Memory size: 8192000 KiB\n\
|
2008-11-24 15:11:26 +08:00
|
|
|
\n";
|
2018-09-13 16:55:21 +08:00
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDominfoByID(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "dominfo", "2", NULL };
|
|
|
|
const char *exp = dominfo_fc4;
|
|
|
|
return testCompareOutputLit(exp, "\nCPU time:", argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDominfoByUUID(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "dominfo", DOM_UUID, NULL };
|
|
|
|
const char *exp = dominfo_fc4;
|
|
|
|
return testCompareOutputLit(exp, "\nCPU time:", argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDominfoByName(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "dominfo", "fc4", NULL };
|
|
|
|
const char *exp = dominfo_fc4;
|
|
|
|
return testCompareOutputLit(exp, "\nCPU time:", argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomuuidByID(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domuuid", "2", NULL };
|
|
|
|
const char *exp = domuuid_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomuuidByName(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domuuid", "fc4", NULL };
|
|
|
|
const char *exp = domuuid_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomidByName(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domid", "fc4", NULL };
|
|
|
|
const char *exp = domid_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomidByUUID(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domid", DOM_UUID, NULL };
|
|
|
|
const char *exp = domid_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomnameByID(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domname", "2", NULL };
|
|
|
|
const char *exp = domname_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomnameByUUID(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domname", DOM_UUID, NULL };
|
|
|
|
const char *exp = domname_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomstateByID(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domstate", "2", NULL };
|
|
|
|
const char *exp = domstate_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomstateByUUID(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domstate", DOM_UUID, NULL };
|
|
|
|
const char *exp = domstate_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2019-10-14 20:45:03 +08:00
|
|
|
static int testCompareDomstateByName(const void *data G_GNUC_UNUSED)
|
2014-03-18 16:13:43 +08:00
|
|
|
{
|
2018-09-13 16:55:21 +08:00
|
|
|
const char *const argv[] = { VIRSH_CUSTOM, "domstate", "fc4", NULL };
|
|
|
|
const char *exp = domstate_fc4;
|
|
|
|
return testCompareOutputLit(exp, NULL, argv);
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
|
|
|
|
2010-10-16 00:34:11 +08:00
|
|
|
struct testInfo {
|
|
|
|
const char *const *argv;
|
|
|
|
const char *result;
|
|
|
|
};
|
|
|
|
|
2014-03-18 16:13:43 +08:00
|
|
|
static int testCompareEcho(const void *data)
|
|
|
|
{
|
2010-10-16 00:34:11 +08:00
|
|
|
const struct testInfo *info = data;
|
|
|
|
return testCompareOutputLit(info->result, NULL, info->argv);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-05-30 03:20:22 +08:00
|
|
|
static int
|
2011-04-30 00:21:20 +08:00
|
|
|
mymain(void)
|
2006-08-25 05:46:28 +08:00
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
|
2019-10-22 21:26:14 +08:00
|
|
|
custom_uri = g_strdup_printf("test://%s/../examples/xml/test/testnode.xml",
|
|
|
|
abs_srcdir);
|
2008-02-06 03:27:37 +08:00
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh list (default)",
|
|
|
|
testCompareListDefault, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh list (custom)",
|
|
|
|
testCompareListCustom, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh nodeinfo (default)",
|
|
|
|
testCompareNodeinfoDefault, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh nodeinfo (custom)",
|
|
|
|
testCompareNodeinfoCustom, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh dominfo (by id)",
|
|
|
|
testCompareDominfoByID, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh dominfo (by uuid)",
|
|
|
|
testCompareDominfoByUUID, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh dominfo (by name)",
|
|
|
|
testCompareDominfoByName, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domid (by name)",
|
|
|
|
testCompareDomidByName, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domid (by uuid)",
|
|
|
|
testCompareDomidByUUID, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domuuid (by id)",
|
|
|
|
testCompareDomuuidByID, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domuuid (by name)",
|
|
|
|
testCompareDomuuidByName, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domname (by id)",
|
|
|
|
testCompareDomnameByID, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domname (by uuid)",
|
|
|
|
testCompareDomnameByUUID, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domstate (by id)",
|
|
|
|
testCompareDomstateByID, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domstate (by uuid)",
|
|
|
|
testCompareDomstateByUUID, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2016-05-26 23:01:50 +08:00
|
|
|
if (virTestRun("virsh domstate (by name)",
|
|
|
|
testCompareDomstateByName, NULL) != 0)
|
2006-08-25 05:46:28 +08:00
|
|
|
ret = -1;
|
|
|
|
|
2010-10-16 00:34:11 +08:00
|
|
|
/* It's a bit awkward listing result before argument, but that's a
|
|
|
|
* limitation of C99 vararg macros. */
|
2017-11-03 20:09:47 +08:00
|
|
|
# define DO_TEST(i, result, ...) \
|
|
|
|
do { \
|
|
|
|
const char *myargv[] = { VIRSH_DEFAULT, __VA_ARGS__, NULL }; \
|
|
|
|
const struct testInfo info = { myargv, result }; \
|
|
|
|
if (virTestRun("virsh echo " #i, \
|
|
|
|
testCompareEcho, &info) < 0) \
|
|
|
|
ret = -1; \
|
2010-10-16 00:34:11 +08:00
|
|
|
} while (0)
|
|
|
|
|
|
|
|
/* Arg parsing quote removal tests. */
|
|
|
|
DO_TEST(0, "\n",
|
|
|
|
"echo");
|
|
|
|
DO_TEST(1, "a\n",
|
|
|
|
"echo", "a");
|
|
|
|
DO_TEST(2, "a b\n",
|
|
|
|
"echo", "a", "b");
|
|
|
|
DO_TEST(3, "a b\n",
|
|
|
|
"echo a \t b");
|
|
|
|
DO_TEST(4, "a \t b\n",
|
|
|
|
"echo \"a \t b\"");
|
|
|
|
DO_TEST(5, "a \t b\n",
|
|
|
|
"echo 'a \t b'");
|
|
|
|
DO_TEST(6, "a \t b\n",
|
|
|
|
"echo a\\ \\\t\\ b");
|
|
|
|
DO_TEST(7, "\n\n",
|
|
|
|
"echo ; echo");
|
|
|
|
DO_TEST(8, "a\nb\n",
|
|
|
|
";echo a; ; echo b;");
|
|
|
|
DO_TEST(9, "' \" \\;echo\ta\n",
|
|
|
|
"echo", "'", "\"", "\\;echo\ta");
|
|
|
|
DO_TEST(10, "' \" ;echo a\n",
|
|
|
|
"echo \\' \\\" \\;echo\ta");
|
|
|
|
DO_TEST(11, "' \" \\\na\n",
|
|
|
|
"echo \\' \\\" \\\\;echo\ta");
|
|
|
|
DO_TEST(12, "' \" \\\\\n",
|
|
|
|
"echo \"'\" '\"' '\\'\"\\\\\"");
|
|
|
|
|
|
|
|
/* Tests of echo flags. */
|
|
|
|
DO_TEST(13, "a A 0 + * ; . ' \" / ? = \n < > &\n",
|
|
|
|
"echo", "a", "A", "0", "+", "*", ";", ".", "'", "\"", "/", "?",
|
|
|
|
"=", " ", "\n", "<", ">", "&");
|
|
|
|
DO_TEST(14, "a A 0 + '*' ';' . ''\\''' '\"' / '?' = ' ' '\n' '<' '>' '&'\n",
|
|
|
|
"echo", "--shell", "a", "A", "0", "+", "*", ";", ".", "'", "\"",
|
|
|
|
"/", "?", "=", " ", "\n", "<", ">", "&");
|
|
|
|
DO_TEST(15, "a A 0 + * ; . ' " / ? = \n < > &\n",
|
|
|
|
"echo", "--xml", "a", "A", "0", "+", "*", ";", ".", "'", "\"",
|
|
|
|
"/", "?", "=", " ", "\n", "<", ">", "&");
|
|
|
|
DO_TEST(16, "a A 0 + '*' ';' . ''' '"' / '?' = ' ' '\n' '<'"
|
|
|
|
" '>' '&'\n",
|
|
|
|
"echo", "--shell", "--xml", "a", "A", "0", "+", "*", ";", ".", "'",
|
|
|
|
"\"", "/", "?", "=", " ", "\n", "<", ">", "&");
|
|
|
|
DO_TEST(17, "\n",
|
|
|
|
"echo", "");
|
|
|
|
DO_TEST(18, "''\n",
|
|
|
|
"echo", "--shell", "");
|
|
|
|
DO_TEST(19, "\n",
|
|
|
|
"echo", "--xml", "");
|
|
|
|
DO_TEST(20, "''\n",
|
|
|
|
"echo", "--xml", "--shell", "");
|
|
|
|
DO_TEST(21, "\n",
|
|
|
|
"echo ''");
|
|
|
|
DO_TEST(22, "''\n",
|
|
|
|
"echo --shell \"\"");
|
|
|
|
DO_TEST(23, "\n",
|
|
|
|
"echo --xml ''");
|
|
|
|
DO_TEST(24, "''\n",
|
|
|
|
"echo --xml --shell \"\"''");
|
|
|
|
|
|
|
|
/* Tests of -- handling. */
|
|
|
|
DO_TEST(25, "a\n",
|
|
|
|
"--", "echo", "--shell", "a");
|
|
|
|
DO_TEST(26, "a\n",
|
|
|
|
"--", "echo", "a", "--shell");
|
|
|
|
DO_TEST(27, "a --shell\n",
|
|
|
|
"--", "echo", "--", "a", "--shell");
|
|
|
|
DO_TEST(28, "-- --shell a\n",
|
|
|
|
"echo", "--", "--", "--shell", "a");
|
|
|
|
DO_TEST(29, "a\n",
|
|
|
|
"echo --s\\h'e'\"l\"l -- a");
|
|
|
|
DO_TEST(30, "--shell a\n",
|
|
|
|
"echo \t '-'\"-\" \t --shell \t a");
|
|
|
|
|
2012-03-03 02:01:15 +08:00
|
|
|
/* Tests of alias handling. */
|
|
|
|
DO_TEST(31, "hello\n", "echo", "--string", "hello");
|
|
|
|
DO_TEST(32, "hello\n", "echo --string hello");
|
|
|
|
DO_TEST(33, "hello\n", "echo", "--str", "hello");
|
|
|
|
DO_TEST(34, "hello\n", "echo --str hello");
|
2013-10-24 15:06:29 +08:00
|
|
|
DO_TEST(35, "hello\n", "echo --hi");
|
2012-03-03 02:01:15 +08:00
|
|
|
|
2019-02-22 02:36:32 +08:00
|
|
|
/* Tests of multiple commands. */
|
|
|
|
DO_TEST(36, "a\nb\n", " echo a; echo b;");
|
|
|
|
DO_TEST(37, "a\nb\n", "\necho a\n echo b\n");
|
2019-02-27 02:49:25 +08:00
|
|
|
DO_TEST(38, "a\nb\n", "ec\\\nho a\n echo \\\n b;");
|
|
|
|
DO_TEST(39, "a\n b\n", "\"ec\\\nho\" a\n echo \"\\\n b\";");
|
|
|
|
DO_TEST(40, "a\n\\\n b\n", "ec\\\nho a\n echo '\\\n b';");
|
2019-03-23 03:02:39 +08:00
|
|
|
DO_TEST(41, "a\n", "echo a # b");
|
|
|
|
DO_TEST(42, "a\nc\n", "echo a #b\necho c");
|
|
|
|
DO_TEST(43, "a\nc\n", "echo a # b\\\necho c");
|
|
|
|
DO_TEST(44, "a # b\n", "echo a '#' b");
|
|
|
|
DO_TEST(45, "a # b\n", "echo a \\# b");
|
|
|
|
DO_TEST(46, "a\n", "#unbalanced; 'quotes\"\necho a # b");
|
2019-03-23 03:02:39 +08:00
|
|
|
DO_TEST(47, "a\n", "\\# ignored;echo a\n'#also' ignored");
|
2019-02-22 02:36:32 +08:00
|
|
|
|
2011-07-28 23:48:12 +08:00
|
|
|
# undef DO_TEST
|
2010-10-16 00:34:11 +08:00
|
|
|
|
2012-02-03 07:16:43 +08:00
|
|
|
VIR_FREE(custom_uri);
|
2014-03-17 17:38:38 +08:00
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
2006-08-25 05:46:28 +08:00
|
|
|
}
|
2008-05-30 03:20:22 +08:00
|
|
|
|
2017-03-29 22:45:42 +08:00
|
|
|
VIR_TEST_MAIN(mymain)
|
2011-07-28 23:48:12 +08:00
|
|
|
|
|
|
|
#endif /* WIN32 */
|