virshtest.c 12.1 KB
Newer Older
1
#include <config.h>
2 3 4 5

#include <stdio.h>
#include <string.h>
#include <unistd.h>
6

7
#include "internal.h"
8
#include "xml.h"
9
#include "util.h"
10 11
#include "testutils.h"

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 31 32

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\
Max memory:     261072 kB\n\
Used memory:    131072 kB\n\
33
Persistent:     yes\n\
34
Autostart:      disable\n\
35
Managed save:   unknown\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
                          const char *toRemove) {
44 45 46 47 48 49 50 51 52 53 54 55 56 57
  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;
}

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

65 66
    if (virtTestCaptureProgramOutput(argv, &actualData, 4096) < 0)
        goto cleanup;
67

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

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

76
    result = 0;
77

78
cleanup:
79
    VIR_FREE(actualData);
80

81
    return result;
82
}
83

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

static char *custom_uri;

90
# define VIRSH_CUSTOM     "../tools/virsh", \
91 92 93
    "--connect", \
    custom_uri

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

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

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

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

149
static int testCompareDominfoByID(const void *data ATTRIBUTE_UNUSED) {
150 151 152
  const char *const argv[] = { VIRSH_CUSTOM, "dominfo", "2", NULL };
  const char *exp = dominfo_fc4;
  return testCompareOutputLit(exp, "\nCPU time:", argv);
153 154
}

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

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

167
static int testCompareDomuuidByID(const void *data ATTRIBUTE_UNUSED) {
168 169 170
  const char *const argv[] = { VIRSH_CUSTOM, "domuuid", "2", NULL };
  const char *exp = domuuid_fc4;
  return testCompareOutputLit(exp, NULL, argv);
171 172
}

173
static int testCompareDomuuidByName(const void *data ATTRIBUTE_UNUSED) {
174 175 176
  const char *const argv[] = { VIRSH_CUSTOM, "domuuid", "fc4", NULL };
  const char *exp = domuuid_fc4;
  return testCompareOutputLit(exp, NULL, argv);
177 178
}

179
static int testCompareDomidByName(const void *data ATTRIBUTE_UNUSED) {
180 181 182
  const char *const argv[] = { VIRSH_CUSTOM, "domid", "fc4", NULL };
  const char *exp = domid_fc4;
  return testCompareOutputLit(exp, NULL, argv);
183 184
}

185
static int testCompareDomidByUUID(const void *data ATTRIBUTE_UNUSED) {
186 187 188
  const char *const argv[] = { VIRSH_CUSTOM, "domid", DOM_UUID, NULL };
  const char *exp = domid_fc4;
  return testCompareOutputLit(exp, NULL, argv);
189 190
}

191
static int testCompareDomnameByID(const void *data ATTRIBUTE_UNUSED) {
192 193 194
  const char *const argv[] = { VIRSH_CUSTOM, "domname", "2", NULL };
  const char *exp = domname_fc4;
  return testCompareOutputLit(exp, NULL, argv);
195 196
}

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

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

209
static int testCompareDomstateByUUID(const void *data ATTRIBUTE_UNUSED) {
210 211 212
  const char *const argv[] = { VIRSH_CUSTOM, "domstate", DOM_UUID, NULL };
  const char *exp = domstate_fc4;
  return testCompareOutputLit(exp, NULL, argv);
213 214
}

215
static int testCompareDomstateByName(const void *data ATTRIBUTE_UNUSED) {
216 217 218
  const char *const argv[] = { VIRSH_CUSTOM, "domstate", "fc4", NULL };
  const char *exp = domstate_fc4;
  return testCompareOutputLit(exp, NULL, argv);
219 220
}

221 222 223 224 225 226 227 228 229 230 231
struct testInfo {
    const char *const *argv;
    const char *result;
};

static int testCompareEcho(const void *data) {
    const struct testInfo *info = data;
    return testCompareOutputLit(info->result, NULL, info->argv);
}


232
static int
E
Eric Blake 已提交
233
mymain(void)
234 235 236
{
    int ret = 0;

237 238 239
    if (virAsprintf(&custom_uri, "test://%s/../examples/xml/test/testnode.xml",
                    abs_srcdir) < 0)
        return EXIT_FAILURE;
240

241
    if (virtTestRun("virsh list (default)",
242
                    1, testCompareListDefault, NULL) != 0)
243 244 245
        ret = -1;

    if (virtTestRun("virsh list (custom)",
246
                    1, testCompareListCustom, NULL) != 0)
247 248 249
        ret = -1;

    if (virtTestRun("virsh nodeinfo (default)",
250
                    1, testCompareNodeinfoDefault, NULL) != 0)
251 252 253
        ret = -1;

    if (virtTestRun("virsh nodeinfo (custom)",
254
                    1, testCompareNodeinfoCustom, NULL) != 0)
255 256 257
        ret = -1;

    if (virtTestRun("virsh dominfo (by id)",
258
                    1, testCompareDominfoByID, NULL) != 0)
259 260 261
        ret = -1;

    if (virtTestRun("virsh dominfo (by uuid)",
262
                    1, testCompareDominfoByUUID, NULL) != 0)
263 264 265
        ret = -1;

    if (virtTestRun("virsh dominfo (by name)",
266
                    1, testCompareDominfoByName, NULL) != 0)
267 268 269
        ret = -1;

    if (virtTestRun("virsh domid (by name)",
270
                    1, testCompareDomidByName, NULL) != 0)
271 272 273
        ret = -1;

    if (virtTestRun("virsh domid (by uuid)",
274
                    1, testCompareDomidByUUID, NULL) != 0)
275 276 277
        ret = -1;

    if (virtTestRun("virsh domuuid (by id)",
278
                    1, testCompareDomuuidByID, NULL) != 0)
279 280 281
        ret = -1;

    if (virtTestRun("virsh domuuid (by name)",
282
                    1, testCompareDomuuidByName, NULL) != 0)
283 284 285
        ret = -1;

    if (virtTestRun("virsh domname (by id)",
286
                    1, testCompareDomnameByID, NULL) != 0)
287 288 289
        ret = -1;

    if (virtTestRun("virsh domname (by uuid)",
290
                    1, testCompareDomnameByUUID, NULL) != 0)
291 292 293
        ret = -1;

    if (virtTestRun("virsh domstate (by id)",
294
                    1, testCompareDomstateByID, NULL) != 0)
295 296 297
        ret = -1;

    if (virtTestRun("virsh domstate (by uuid)",
298
                    1, testCompareDomstateByUUID, NULL) != 0)
299 300 301
        ret = -1;

    if (virtTestRun("virsh domstate (by name)",
302
                    1, testCompareDomstateByName, NULL) != 0)
303 304
        ret = -1;

305 306
    /* It's a bit awkward listing result before argument, but that's a
     * limitation of C99 vararg macros.  */
307
# define DO_TEST(i, result, ...)                                         \
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 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
    do {                                                                \
        const char *myargv[] = { VIRSH_DEFAULT, __VA_ARGS__, NULL };    \
        const struct testInfo info = { myargv, result };                \
        if (virtTestRun("virsh echo " #i,                               \
                        1, testCompareEcho, &info) < 0)                 \
            ret = -1;                                                   \
    } 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 已提交
389 390 391 392 393 394
    /* 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");

395
# undef DO_TEST
396

397
    VIR_FREE(custom_uri);
398
    return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
399
}
400 401

VIRT_TEST_MAIN(mymain)
402 403

#endif /* WIN32 */