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 9 10 11 12
#include "xml.h"
#include "testutils.h"

#define MAX_FILE 4096

13 14 15 16 17 18 19 20 21 22 23
#define DOM_UUID "ef861801-45b9-11cb-88e3-afbfe5370493"

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\
24
Persistent:     yes\n\
25 26 27 28 29 30 31
Autostart:      disable\n\
\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";

32
static int testFilterLine(char *buffer,
33
                          const char *toRemove) {
34 35 36 37 38 39 40 41 42 43 44 45 46 47
  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;
}

48 49
static int testCompareOutputLit(const char *expectData,
                                const char *filter, const char *const argv[]) {
50 51 52 53 54 55 56 57 58 59
  char actualData[MAX_FILE];
  char *actualPtr = &(actualData[0]);

  if (virtTestCaptureProgramOutput(argv, &actualPtr, MAX_FILE) < 0)
    return -1;

  if (filter)
    if (testFilterLine(actualData, filter) < 0)
      return -1;

60 61 62 63
  if (STRNEQ(expectData, actualData)) {
      virtTestDifference(stderr, expectData, actualData);
      return -1;
  }
64 65 66 67

  return 0;
}

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
#if unused
static int testCompareOutput(const char *expect_rel, const char *filter,
                             const char *const argv[]) {
  char expectData[MAX_FILE];
  char *expectPtr = &(expectData[0]);
  char expect[PATH_MAX];

  snprintf(expect, sizeof expect - 1, "%s/%s", abs_srcdir, expect_rel);

  if (virtTestLoadFile(expect, &expectPtr, MAX_FILE) < 0)
    return -1;

  return testCompareOutputLit(expectData, filter, argv);
}
#endif
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 97 98 99 100 101
  const char *const argv[] = { VIRSH_DEFAULT, "list", NULL };
  const char *exp = "\
 Id Name                 State\n\
----------------------------------\n\
  1 test                 running\n\
\n";
  return testCompareOutputLit(exp, NULL, argv);
102 103
}

104
static int testCompareListCustom(const void *data ATTRIBUTE_UNUSED) {
105 106 107 108 109 110 111 112
  const char *const argv[] = { VIRSH_CUSTOM, "list", NULL };
  const char *exp = "\
 Id Name                 State\n\
----------------------------------\n\
  1 fv0                  running\n\
  2 fc4                  running\n\
\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 237
{
    int ret = 0;
    char buffer[PATH_MAX];

J
Jim Meyering 已提交
238
#ifdef WIN32
239
    exit (EXIT_AM_SKIP);
J
Jim Meyering 已提交
240 241
#endif

E
Eric Blake 已提交
242 243
    snprintf(buffer, PATH_MAX-1,
             "test://%s/../examples/xml/test/testnode.xml", abs_srcdir);
244 245
    buffer[PATH_MAX-1] = '\0';
    custom_uri = buffer;
246

247
    if (virtTestRun("virsh list (default)",
248
                    1, testCompareListDefault, NULL) != 0)
249 250 251
        ret = -1;

    if (virtTestRun("virsh list (custom)",
252
                    1, testCompareListCustom, NULL) != 0)
253 254 255
        ret = -1;

    if (virtTestRun("virsh nodeinfo (default)",
256
                    1, testCompareNodeinfoDefault, NULL) != 0)
257 258 259
        ret = -1;

    if (virtTestRun("virsh nodeinfo (custom)",
260
                    1, testCompareNodeinfoCustom, NULL) != 0)
261 262 263
        ret = -1;

    if (virtTestRun("virsh dominfo (by id)",
264
                    1, testCompareDominfoByID, NULL) != 0)
265 266 267
        ret = -1;

    if (virtTestRun("virsh dominfo (by uuid)",
268
                    1, testCompareDominfoByUUID, NULL) != 0)
269 270 271
        ret = -1;

    if (virtTestRun("virsh dominfo (by name)",
272
                    1, testCompareDominfoByName, NULL) != 0)
273 274 275
        ret = -1;

    if (virtTestRun("virsh domid (by name)",
276
                    1, testCompareDomidByName, NULL) != 0)
277 278 279
        ret = -1;

    if (virtTestRun("virsh domid (by uuid)",
280
                    1, testCompareDomidByUUID, NULL) != 0)
281 282 283
        ret = -1;

    if (virtTestRun("virsh domuuid (by id)",
284
                    1, testCompareDomuuidByID, NULL) != 0)
285 286 287
        ret = -1;

    if (virtTestRun("virsh domuuid (by name)",
288
                    1, testCompareDomuuidByName, NULL) != 0)
289 290 291
        ret = -1;

    if (virtTestRun("virsh domname (by id)",
292
                    1, testCompareDomnameByID, NULL) != 0)
293 294 295
        ret = -1;

    if (virtTestRun("virsh domname (by uuid)",
296
                    1, testCompareDomnameByUUID, NULL) != 0)
297 298 299
        ret = -1;

    if (virtTestRun("virsh domstate (by id)",
300
                    1, testCompareDomstateByID, NULL) != 0)
301 302 303
        ret = -1;

    if (virtTestRun("virsh domstate (by uuid)",
304
                    1, testCompareDomstateByUUID, NULL) != 0)
305 306 307
        ret = -1;

    if (virtTestRun("virsh domstate (by name)",
308
                    1, testCompareDomstateByName, NULL) != 0)
309 310
        ret = -1;

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 389 390 391 392 393 394 395 396
    /* It's a bit awkward listing result before argument, but that's a
     * limitation of C99 vararg macros.  */
#define DO_TEST(i, result, ...)                                         \
    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");

#undef DO_TEST

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

VIRT_TEST_MAIN(mymain)