virshtest.c 12.0 KB
Newer Older
1
#include <config.h>
2 3

#include <unistd.h>
4

5
#include "internal.h"
6
#include "virxml.h"
7
#include "testutils.h"
8
#include "virstring.h"
9

10 11
#define VIR_FROM_THIS VIR_FROM_NONE

12 13 14 15 16 17 18 19 20 21 22
#ifdef WIN32

int
main(void)
{
    return EXIT_AM_SKIP;
}

#else

# define DOM_UUID "ef861801-45b9-11cb-88e3-afbfe5370493"
23 24 25 26 27 28 29 30

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\
31 32
Max memory:     261072 KiB\n\
Used memory:    131072 KiB\n\
33
Persistent:     yes\n\
34
Autostart:      disable\n\
C
Cole Robinson 已提交
35
Managed save:   no\n\
36 37 38 39 40 41
\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";

42
static int testFilterLine(char *buffer,
43 44
                          const char *toRemove)
{
45 46 47 48 49 50 51 52 53 54 55 56
    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;
57 58
}

59 60 61 62 63 64
static int
testCompareOutputLit(const char *expectData,
                     const char *filter, const char *const argv[])
{
    int result = -1;
    char *actualData = NULL;
65

66
    if (virTestCaptureProgramOutput(argv, &actualData, 4096) < 0)
67
        goto cleanup;
68

69 70
    if (filter && testFilterLine(actualData, filter) < 0)
        goto cleanup;
71

72
    if (STRNEQ(expectData, actualData)) {
73
        virTestDifference(stderr, expectData, actualData);
74 75
        goto cleanup;
    }
76

77
    result = 0;
78

79
 cleanup:
80
    VIR_FREE(actualData);
81

82
    return result;
83
}
84

85
# define VIRSH_DEFAULT abs_topbuilddir "/tools/virsh", \
86 87 88 89 90
    "--connect", \
    "test:///default"

static char *custom_uri;

91
# define VIRSH_CUSTOM  abs_topbuilddir "/tools/virsh", \
92 93 94
    "--connect", \
    custom_uri

95 96
static int testCompareListDefault(const void *data ATTRIBUTE_UNUSED)
{
97 98
    const char *const argv[] = { VIRSH_DEFAULT, "list", NULL };
    const char *exp = "\
99
 Id   Name   State\n\
100
----------------------\n\
101
 1    test   running\n\
102
\n";
103
    return testCompareOutputLit(exp, NULL, argv);
104 105
}

106 107
static int testCompareListCustom(const void *data ATTRIBUTE_UNUSED)
{
108 109
    const char *const argv[] = { VIRSH_CUSTOM, "list", NULL };
    const char *exp = "\
110
 Id   Name   State\n\
111
----------------------\n\
112 113
 1    fv0    running\n\
 2    fc4    running\n\
114
\n";
115
    return testCompareOutputLit(exp, NULL, argv);
116 117
}

118 119
static int testCompareNodeinfoDefault(const void *data ATTRIBUTE_UNUSED)
{
120 121
    const char *const argv[] = { VIRSH_DEFAULT, "nodeinfo", NULL };
    const char *exp = "\
122 123 124 125 126 127 128
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\
129
Memory size:         3145728 KiB\n\
130
\n";
131
    return testCompareOutputLit(exp, NULL, argv);
132 133
}

134 135
static int testCompareNodeinfoCustom(const void *data ATTRIBUTE_UNUSED)
{
136 137 138 139 140 141
    const char *const argv[] = {
        VIRSH_CUSTOM,
        "nodeinfo",
        NULL
    };
    const char *exp = "\
142 143 144 145 146 147 148
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\
149
Memory size:         8192000 KiB\n\
150
\n";
151
    return testCompareOutputLit(exp, NULL, argv);
152 153
}

154 155
static int testCompareDominfoByID(const void *data ATTRIBUTE_UNUSED)
{
156 157 158
    const char *const argv[] = { VIRSH_CUSTOM, "dominfo", "2", NULL };
    const char *exp = dominfo_fc4;
    return testCompareOutputLit(exp, "\nCPU time:", argv);
159 160
}

161 162
static int testCompareDominfoByUUID(const void *data ATTRIBUTE_UNUSED)
{
163 164 165
    const char *const argv[] = { VIRSH_CUSTOM, "dominfo", DOM_UUID, NULL };
    const char *exp = dominfo_fc4;
    return testCompareOutputLit(exp, "\nCPU time:", argv);
166 167
}

168 169
static int testCompareDominfoByName(const void *data ATTRIBUTE_UNUSED)
{
170 171 172
    const char *const argv[] = { VIRSH_CUSTOM, "dominfo", "fc4", NULL };
    const char *exp = dominfo_fc4;
    return testCompareOutputLit(exp, "\nCPU time:", argv);
173 174
}

175 176
static int testCompareDomuuidByID(const void *data ATTRIBUTE_UNUSED)
{
177 178 179
    const char *const argv[] = { VIRSH_CUSTOM, "domuuid", "2", NULL };
    const char *exp = domuuid_fc4;
    return testCompareOutputLit(exp, NULL, argv);
180 181
}

182 183
static int testCompareDomuuidByName(const void *data ATTRIBUTE_UNUSED)
{
184 185 186
    const char *const argv[] = { VIRSH_CUSTOM, "domuuid", "fc4", NULL };
    const char *exp = domuuid_fc4;
    return testCompareOutputLit(exp, NULL, argv);
187 188
}

189 190
static int testCompareDomidByName(const void *data ATTRIBUTE_UNUSED)
{
191 192 193
    const char *const argv[] = { VIRSH_CUSTOM, "domid", "fc4", NULL };
    const char *exp = domid_fc4;
    return testCompareOutputLit(exp, NULL, argv);
194 195
}

196 197
static int testCompareDomidByUUID(const void *data ATTRIBUTE_UNUSED)
{
198 199 200
    const char *const argv[] = { VIRSH_CUSTOM, "domid", DOM_UUID, NULL };
    const char *exp = domid_fc4;
    return testCompareOutputLit(exp, NULL, argv);
201 202
}

203 204
static int testCompareDomnameByID(const void *data ATTRIBUTE_UNUSED)
{
205 206 207
    const char *const argv[] = { VIRSH_CUSTOM, "domname", "2", NULL };
    const char *exp = domname_fc4;
    return testCompareOutputLit(exp, NULL, argv);
208 209
}

210 211
static int testCompareDomnameByUUID(const void *data ATTRIBUTE_UNUSED)
{
212 213 214
    const char *const argv[] = { VIRSH_CUSTOM, "domname", DOM_UUID, NULL };
    const char *exp = domname_fc4;
    return testCompareOutputLit(exp, NULL, argv);
215 216
}

217 218
static int testCompareDomstateByID(const void *data ATTRIBUTE_UNUSED)
{
219 220 221
    const char *const argv[] = { VIRSH_CUSTOM, "domstate", "2", NULL };
    const char *exp = domstate_fc4;
    return testCompareOutputLit(exp, NULL, argv);
222 223
}

224 225
static int testCompareDomstateByUUID(const void *data ATTRIBUTE_UNUSED)
{
226 227 228
    const char *const argv[] = { VIRSH_CUSTOM, "domstate", DOM_UUID, NULL };
    const char *exp = domstate_fc4;
    return testCompareOutputLit(exp, NULL, argv);
229 230
}

231 232
static int testCompareDomstateByName(const void *data ATTRIBUTE_UNUSED)
{
233 234 235
    const char *const argv[] = { VIRSH_CUSTOM, "domstate", "fc4", NULL };
    const char *exp = domstate_fc4;
    return testCompareOutputLit(exp, NULL, argv);
236 237
}

238 239 240 241 242
struct testInfo {
    const char *const *argv;
    const char *result;
};

243 244
static int testCompareEcho(const void *data)
{
245 246 247 248 249
    const struct testInfo *info = data;
    return testCompareOutputLit(info->result, NULL, info->argv);
}


250
static int
E
Eric Blake 已提交
251
mymain(void)
252 253 254
{
    int ret = 0;

255 256 257
    if (virAsprintf(&custom_uri, "test://%s/../examples/xml/test/testnode.xml",
                    abs_srcdir) < 0)
        return EXIT_FAILURE;
258

259 260
    if (virTestRun("virsh list (default)",
                   testCompareListDefault, NULL) != 0)
261 262
        ret = -1;

263 264
    if (virTestRun("virsh list (custom)",
                   testCompareListCustom, NULL) != 0)
265 266
        ret = -1;

267 268
    if (virTestRun("virsh nodeinfo (default)",
                   testCompareNodeinfoDefault, NULL) != 0)
269 270
        ret = -1;

271 272
    if (virTestRun("virsh nodeinfo (custom)",
                   testCompareNodeinfoCustom, NULL) != 0)
273 274
        ret = -1;

275 276
    if (virTestRun("virsh dominfo (by id)",
                   testCompareDominfoByID, NULL) != 0)
277 278
        ret = -1;

279 280
    if (virTestRun("virsh dominfo (by uuid)",
                   testCompareDominfoByUUID, NULL) != 0)
281 282
        ret = -1;

283 284
    if (virTestRun("virsh dominfo (by name)",
                   testCompareDominfoByName, NULL) != 0)
285 286
        ret = -1;

287 288
    if (virTestRun("virsh domid (by name)",
                   testCompareDomidByName, NULL) != 0)
289 290
        ret = -1;

291 292
    if (virTestRun("virsh domid (by uuid)",
                   testCompareDomidByUUID, NULL) != 0)
293 294
        ret = -1;

295 296
    if (virTestRun("virsh domuuid (by id)",
                   testCompareDomuuidByID, NULL) != 0)
297 298
        ret = -1;

299 300
    if (virTestRun("virsh domuuid (by name)",
                   testCompareDomuuidByName, NULL) != 0)
301 302
        ret = -1;

303 304
    if (virTestRun("virsh domname (by id)",
                   testCompareDomnameByID, NULL) != 0)
305 306
        ret = -1;

307 308
    if (virTestRun("virsh domname (by uuid)",
                   testCompareDomnameByUUID, NULL) != 0)
309 310
        ret = -1;

311 312
    if (virTestRun("virsh domstate (by id)",
                   testCompareDomstateByID, NULL) != 0)
313 314
        ret = -1;

315 316
    if (virTestRun("virsh domstate (by uuid)",
                   testCompareDomstateByUUID, NULL) != 0)
317 318
        ret = -1;

319 320
    if (virTestRun("virsh domstate (by name)",
                   testCompareDomstateByName, NULL) != 0)
321 322
        ret = -1;

323 324
    /* It's a bit awkward listing result before argument, but that's a
     * limitation of C99 vararg macros.  */
325 326 327 328 329 330 331
# 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; \
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
    } 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 + * ; . &apos; &quot; / ? =   \n &lt; &gt; &amp;\n",
            "echo", "--xml", "a", "A", "0", "+", "*", ";", ".", "'", "\"",
            "/", "?", "=", " ", "\n", "<", ">", "&");
    DO_TEST(16, "a A 0 + '*' ';' . '&apos;' '&quot;' / '?' = ' ' '\n' '&lt;'"
            " '&gt;' '&amp;'\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");

E
Eric Blake 已提交
407 408 409 410 411
    /* 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");
412
    DO_TEST(35, "hello\n", "echo --hi");
E
Eric Blake 已提交
413

414 415 416 417
    /* 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");

418
# undef DO_TEST
419

420
    VIR_FREE(custom_uri);
421
    return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
422
}
423

424
VIR_TEST_MAIN(mymain)
425 426

#endif /* WIN32 */