static int testRemove(const void *args) { const struct testSplitData *data = args; char **list = NULL; size_t ntokens; size_t i; int ret = -1; if (!(list = virStringSplitCount(data->string, data->delim, data->max_tokens, &ntokens))) { VIR_DEBUG("Got no tokens at all"); return -1; } for (i = 0; data->tokens[i]; i++) { virStringListRemove(&list, data->tokens[i]); if (virStringListHasString((const char **) list, data->tokens[i])) { virFilePrintf(stderr, "Not removed %s", data->tokens[i]); goto cleanup; } } if (list && list[0]) { virFilePrintf(stderr, "Not removed all tokens: %s", list[0]); goto cleanup; } ret = 0; cleanup: virStringListFree(list); return ret; }
static int testSplit(const void *args) { const struct testSplitData *data = args; char **got; size_t ntokens; size_t exptokens = 0; char **tmp1; const char **tmp2; int ret = -1; if (!(got = virStringSplitCount(data->string, data->delim, data->max_tokens, &ntokens))) { VIR_DEBUG("Got no tokens at all"); return -1; } tmp1 = got; tmp2 = data->tokens; while (*tmp1 && *tmp2) { if (STRNEQ(*tmp1, *tmp2)) { virFilePrintf(stderr, "Mismatch '%s' vs '%s'\n", *tmp1, *tmp2); goto cleanup; } tmp1++; tmp2++; exptokens++; } if (*tmp1) { virFilePrintf(stderr, "Too many pieces returned\n"); goto cleanup; } if (*tmp2) { virFilePrintf(stderr, "Too few pieces returned\n"); goto cleanup; } if (ntokens != exptokens) { virFilePrintf(stderr, "Returned token count (%zu) doesn't match " "expected count (%zu)", ntokens, exptokens); goto cleanup; } ret = 0; cleanup: virStringListFree(got); return ret; }
static int mymain(void) { char scratchdir[] = SCRATCHDIRTEMPLATE; int ret = 0; const char *iohelper = abs_builddir "/../src/libvirt_iohelper"; virFDStreamSetIOHelper(iohelper); if (!mkdtemp(scratchdir)) { virFilePrintf(stderr, "Cannot create fakesysfsdir"); abort(); } if (virtTestRun("Stream read blocking ", testFDStreamReadBlock, scratchdir) < 0) ret = -1; if (virtTestRun("Stream read non-blocking ", testFDStreamReadNonblock, scratchdir) < 0) ret = -1; if (virtTestRun("Stream write blocking ", testFDStreamWriteBlock, scratchdir) < 0) ret = -1; if (virtTestRun("Stream write non-blocking ", testFDStreamWriteNonblock, scratchdir) < 0) ret = -1; if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(scratchdir); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; }
static int mymain(void) { char scratchdir[] = SCRATCHDIRTEMPLATE; int ret = 0; if (!mkdtemp(scratchdir)) { virFilePrintf(stderr, "Cannot create fdstreamdir"); abort(); } if (virTestRun("Stream read blocking ", testFDStreamReadBlock, scratchdir) < 0) ret = -1; if (virTestRun("Stream read non-blocking ", testFDStreamReadNonblock, scratchdir) < 0) ret = -1; if (virTestRun("Stream write blocking ", testFDStreamWriteBlock, scratchdir) < 0) ret = -1; if (virTestRun("Stream write non-blocking ", testFDStreamWriteNonblock, scratchdir) < 0) ret = -1; if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(scratchdir); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; }
static int testSplit(const void *args) { const struct testSplitData *data = args; char **got; char **tmp1; const char **tmp2; int ret = -1; if (!(got = virStringSplit(data->string, data->delim, data->max_tokens))) { VIR_DEBUG("Got no tokens at all"); return -1; } tmp1 = got; tmp2 = data->tokens; while (*tmp1 && *tmp2) { if (STRNEQ(*tmp1, *tmp2)) { virFilePrintf(stderr, "Mismatch '%s' vs '%s'\n", *tmp1, *tmp2); goto cleanup; } tmp1++; tmp2++; } if (*tmp1) { virFilePrintf(stderr, "Too many pieces returned\n"); goto cleanup; } if (*tmp2) { virFilePrintf(stderr, "Too few pieces returned\n"); goto cleanup; } ret = 0; cleanup: virStringFreeList(got); return ret; }
static int testJoin(const void *args) { const struct testJoinData *data = args; char *got; int ret = -1; if (!(got = virStringListJoin(data->tokens, data->delim))) { VIR_DEBUG("Got no result"); return -1; } if (STRNEQ(got, data->string)) { virFilePrintf(stderr, "Mismatch '%s' vs '%s'\n", got, data->string); goto cleanup; } ret = 0; cleanup: VIR_FREE(got); return ret; }
static int testAdd(const void *args) { const struct testJoinData *data = args; char **list = NULL; char *got = NULL; int ret = -1; size_t i; for (i = 0; data->tokens[i]; i++) { char **tmp = virStringListAdd((const char **)list, data->tokens[i]); if (!tmp) goto cleanup; virStringListFree(list); list = tmp; tmp = NULL; } if (!list && VIR_ALLOC(list) < 0) goto cleanup; if (!(got = virStringListJoin((const char **)list, data->delim))) { VIR_DEBUG("Got no result"); goto cleanup; } if (STRNEQ(got, data->string)) { virFilePrintf(stderr, "Mismatch '%s' vs '%s'\n", got, data->string); goto cleanup; } ret = 0; cleanup: virStringListFree(list); VIR_FREE(got); return ret; }
int qemuTestDriverInit(virQEMUDriver *driver) { virSecurityManagerPtr mgr = NULL; char statedir[] = STATEDIRTEMPLATE; char configdir[] = CONFIGDIRTEMPLATE; memset(driver, 0, sizeof(*driver)); if (virMutexInit(&driver->lock) < 0) return -1; driver->config = virQEMUDriverConfigNew(false); if (!driver->config) goto error; /* Do this early so that qemuTestDriverFree() doesn't see (unlink) the real * dirs. */ VIR_FREE(driver->config->stateDir); VIR_FREE(driver->config->configDir); /* Overwrite some default paths so it's consistent for tests. */ VIR_FREE(driver->config->libDir); VIR_FREE(driver->config->channelTargetDir); if (VIR_STRDUP(driver->config->libDir, "/tmp/lib") < 0 || VIR_STRDUP(driver->config->channelTargetDir, "/tmp/channel") < 0) goto error; if (!mkdtemp(statedir)) { virFilePrintf(stderr, "Cannot create fake stateDir"); goto error; } if (VIR_STRDUP(driver->config->stateDir, statedir) < 0) { rmdir(statedir); goto error; } if (!mkdtemp(configdir)) { virFilePrintf(stderr, "Cannot create fake configDir"); goto error; } if (VIR_STRDUP(driver->config->configDir, configdir) < 0) { rmdir(configdir); goto error; } driver->caps = testQemuCapsInit(); if (!driver->caps) goto error; /* Using /dev/null for libDir and cacheDir automatically produces errors * upon attempt to use any of them */ driver->qemuCapsCache = virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0); if (!driver->qemuCapsCache) goto error; driver->xmlopt = virQEMUDriverCreateXMLConf(driver); if (!driver->xmlopt) goto error; if (qemuTestCapsCacheInsert(driver->qemuCapsCache, NULL) < 0) goto error; if (!(mgr = virSecurityManagerNew("none", "qemu", VIR_SECURITY_MANAGER_PRIVILEGED))) goto error; if (!(driver->securityManager = virSecurityManagerNewStack(mgr))) goto error; return 0; error: virObjectUnref(mgr); qemuTestDriverFree(driver); return -1; }
static int testFDStreamReadCommon(const char *scratchdir, bool blocking) { int fd = -1; char *file = NULL; int ret = -1; char *pattern = NULL; char *buf = NULL; virStreamPtr st = NULL; size_t i; virConnectPtr conn = NULL; int flags = 0; if (!blocking) flags |= VIR_STREAM_NONBLOCK; if (!(conn = virConnectOpen("test:///default"))) goto cleanup; if (VIR_ALLOC_N(pattern, PATTERN_LEN) < 0 || VIR_ALLOC_N(buf, PATTERN_LEN) < 0) goto cleanup; for (i = 0; i < PATTERN_LEN; i++) pattern[i] = i; if (virAsprintf(&file, "%s/input.data", scratchdir) < 0) goto cleanup; if ((fd = open(file, O_CREAT|O_WRONLY|O_EXCL, 0600)) < 0) goto cleanup; for (i = 0; i < 10; i++) { if (safewrite(fd, pattern, PATTERN_LEN) != PATTERN_LEN) goto cleanup; } if (VIR_CLOSE(fd) < 0) goto cleanup; if (!(st = virStreamNew(conn, flags))) goto cleanup; /* Start reading 1/2 way through first pattern * and end 1/2 way through last pattern */ if (virFDStreamOpenFile(st, file, PATTERN_LEN / 2, PATTERN_LEN * 9, O_RDONLY) < 0) goto cleanup; for (i = 0; i < 10; i++) { size_t offset = 0; size_t want; if (i == 0) want = PATTERN_LEN / 2; else want = PATTERN_LEN; while (want > 0) { int got; reread: got = st->driver->streamRecv(st, buf + offset, want); if (got < 0) { if (got == -2 && !blocking) { usleep(20 * 1000); goto reread; } virFilePrintf(stderr, "Failed to read stream: %s\n", virGetLastErrorMessage()); goto cleanup; } if (got == 0) { /* Expect EOF 1/2 through last pattern */ if (i == 9 && want == (PATTERN_LEN / 2)) break; virFilePrintf(stderr, "Unexpected EOF block %zu want %zu\n", i, want); goto cleanup; } offset += got; want -= got; } if (i == 0) { if (memcmp(buf, pattern + (PATTERN_LEN / 2), PATTERN_LEN / 2) != 0) { virFilePrintf(stderr, "Mismatched pattern data iteration %zu\n", i); goto cleanup; } } else if (i == 9) { if (memcmp(buf, pattern, PATTERN_LEN / 2) != 0) { virFilePrintf(stderr, "Mismatched pattern data iteration %zu\n", i); goto cleanup; } } else { if (memcmp(buf, pattern, PATTERN_LEN) != 0) { virFilePrintf(stderr, "Mismatched pattern data iteration %zu\n", i); goto cleanup; } } } if (st->driver->streamFinish(st) != 0) { virFilePrintf(stderr, "Failed to finish stream: %s\n", virGetLastErrorMessage()); goto cleanup; } ret = 0; cleanup: if (st) virStreamFree(st); VIR_FORCE_CLOSE(fd); if (file != NULL) unlink(file); if (conn) virConnectClose(conn); VIR_FREE(file); VIR_FREE(pattern); VIR_FREE(buf); return ret; }