mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
qemuxml2argvtest: Extract setup/parse step
Extract the common setup and parsing of the input XML into a separate helper testQemuConfXMLCommon(). The helper has semantics which will allow us to call it from multiple places so that VIR_TEST_RANGE will still work properly even when we'll add multiple steps reusing the prepared data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
002daa184d
commit
75f7105f5c
@ -599,23 +599,37 @@ testInfoCheckDuplicate(testQemuInfo *info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
/**
|
||||||
testCompareXMLToArgv(const void *data)
|
* testQemuConfXMLCommon: Prepare common test data (e.g. parse input XML)
|
||||||
|
* for a test case.
|
||||||
|
*
|
||||||
|
* @info: test info struct to prepare
|
||||||
|
* @rv: return value that the caller is supposed to return (see below)
|
||||||
|
*
|
||||||
|
* Since some of the prepared data is reused by multiple tests, which can be
|
||||||
|
* potentially skipped via 'VIR_TEST_RANGE', this function is designed to be
|
||||||
|
* callable multiple times but processes data just once.
|
||||||
|
*
|
||||||
|
* Returns 'true' if subsequent tests are expected to run (input XML was parsed
|
||||||
|
* properly and test is not expected to fail on parse error). Otherwise 'false'
|
||||||
|
* is returned and rv is populated according to the following logic:
|
||||||
|
* 1) expected failure of parsing (FLAG_EXPECT_PARSE_ERROR)
|
||||||
|
* - first invocation sets @rv to 0
|
||||||
|
* - other invocations set rv to EXIT_AM_SKIP
|
||||||
|
* 2) unexpected error
|
||||||
|
* - all invocations return -1
|
||||||
|
* - first invocation reports actual error
|
||||||
|
* - other invocations report replacement error
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
testQemuConfXMLCommon(testQemuInfo *info,
|
||||||
|
int *rv)
|
||||||
{
|
{
|
||||||
testQemuInfo *info = (void *) data;
|
g_autoptr(virDomainDef) def = NULL;
|
||||||
g_autofree char *migrateURI = NULL;
|
|
||||||
g_auto(virBuffer) actualBuf = VIR_BUFFER_INITIALIZER;
|
/* initialize a test just once */
|
||||||
g_autofree char *actualargv = NULL;
|
if (info->prepared)
|
||||||
unsigned int flags = info->flags;
|
goto cleanup;
|
||||||
unsigned int parseFlags = info->parseFlags;
|
|
||||||
int ret = -1;
|
|
||||||
virDomainObj *vm = NULL;
|
|
||||||
virDomainChrSourceDef monitor_chr = { 0 };
|
|
||||||
virError *err = NULL;
|
|
||||||
g_autofree char *log = NULL;
|
|
||||||
g_autoptr(virCommand) cmd = NULL;
|
|
||||||
qemuDomainObjPrivate *priv = NULL;
|
|
||||||
g_autoptr(virIdentity) sysident = virIdentityGetSystem();
|
|
||||||
|
|
||||||
/* mark test case as used */
|
/* mark test case as used */
|
||||||
ignore_value(g_hash_table_remove(info->conf->existingTestCases, info->infile));
|
ignore_value(g_hash_table_remove(info->conf->existingTestCases, info->infile));
|
||||||
@ -630,7 +644,8 @@ testCompareXMLToArgv(const void *data)
|
|||||||
/* when compiled without nbdkit support we want to skip the test after
|
/* when compiled without nbdkit support we want to skip the test after
|
||||||
* marking it as used */
|
* marking it as used */
|
||||||
if (info->args.fakeNbdkitCaps) {
|
if (info->args.fakeNbdkitCaps) {
|
||||||
ret = EXIT_AM_SKIP;
|
info->prep_skip = true;
|
||||||
|
info->prepared = true;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
# endif /* !WITH_NBDKIT */
|
# endif /* !WITH_NBDKIT */
|
||||||
@ -645,9 +660,6 @@ testCompareXMLToArgv(const void *data)
|
|||||||
testUpdateQEMUCapsHostCPUModel(info->qemuCaps, driver.hostarch);
|
testUpdateQEMUCapsHostCPUModel(info->qemuCaps, driver.hostarch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virIdentitySetCurrent(sysident) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (testCheckExclusiveFlags(info->flags) < 0)
|
if (testCheckExclusiveFlags(info->flags) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -656,6 +668,94 @@ testCompareXMLToArgv(const void *data)
|
|||||||
if (qemuTestCapsCacheInsert(driver.qemuCapsCache, info->qemuCaps) < 0)
|
if (qemuTestCapsCacheInsert(driver.qemuCapsCache, info->qemuCaps) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!virFileExists(info->infile)) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
"Input file '%s' not found", info->infile);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(def = virDomainDefParseFile(info->infile, driver.xmlopt, NULL,
|
||||||
|
info->parseFlags | VIR_DOMAIN_DEF_PARSE_INACTIVE))) {
|
||||||
|
virError *err = virGetLastError();
|
||||||
|
|
||||||
|
if (!err) {
|
||||||
|
VIR_TEST_DEBUG("no error was reported for expected parse error");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->flags & FLAG_EXPECT_PARSE_ERROR) {
|
||||||
|
g_autofree char *tmperr = g_strdup_printf("%s\n", NULLSTR(err->message));
|
||||||
|
if (virTestCompareToFile(tmperr, info->errfile) >= 0) {
|
||||||
|
info->prep_skip = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->flags & FLAG_EXPECT_PARSE_ERROR) {
|
||||||
|
VIR_TEST_DEBUG("passed instead of expected parse error");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
info->def = g_steal_pointer(&def);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
/* definition is present and correct, return true to signal that caller can continue */
|
||||||
|
if (info->def) {
|
||||||
|
info->prepared = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* definition is not present, but failure was expected */
|
||||||
|
if (info->prep_skip) {
|
||||||
|
/* first time we report success, any subsequent time EXIT_AM_SKIP */
|
||||||
|
if (!info->prepared)
|
||||||
|
*rv = 0;
|
||||||
|
else
|
||||||
|
*rv = EXIT_AM_SKIP;
|
||||||
|
} else {
|
||||||
|
/* any other failure always results in error in all invocations
|
||||||
|
* so that the user will see all the failures in the final error
|
||||||
|
* message which is suggesting a VIR_TEST_RANGE-limited run for
|
||||||
|
* debugging. */
|
||||||
|
*rv = -1;
|
||||||
|
|
||||||
|
/* report replacement error on subsequent runs */
|
||||||
|
if (!info->prepared)
|
||||||
|
VIR_TEST_VERBOSE("error from testQemuConfXMLCommon() was reported in the first invocation");
|
||||||
|
}
|
||||||
|
|
||||||
|
info->prepared = true;
|
||||||
|
/* caller is not expected to run tests */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
testCompareXMLToArgv(const void *data)
|
||||||
|
{
|
||||||
|
testQemuInfo *info = (void *) data;
|
||||||
|
g_autofree char *migrateURI = NULL;
|
||||||
|
g_auto(virBuffer) actualBuf = VIR_BUFFER_INITIALIZER;
|
||||||
|
g_autofree char *actualargv = NULL;
|
||||||
|
unsigned int flags = info->flags;
|
||||||
|
int ret = -1;
|
||||||
|
virDomainObj *vm = NULL;
|
||||||
|
virDomainChrSourceDef monitor_chr = { 0 };
|
||||||
|
virError *err = NULL;
|
||||||
|
g_autofree char *log = NULL;
|
||||||
|
g_autoptr(virCommand) cmd = NULL;
|
||||||
|
qemuDomainObjPrivate *priv = NULL;
|
||||||
|
g_autoptr(virIdentity) sysident = virIdentityGetSystem();
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (!testQemuConfXMLCommon(info, &rc))
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
if (virIdentitySetCurrent(sysident) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if (info->nbdkitCaps) {
|
if (info->nbdkitCaps) {
|
||||||
if (virFileCacheInsertData(driver.nbdkitCapsCache, TEST_NBDKIT_PATH,
|
if (virFileCacheInsertData(driver.nbdkitCapsCache, TEST_NBDKIT_PATH,
|
||||||
g_object_ref(info->nbdkitCaps)) < 0) {
|
g_object_ref(info->nbdkitCaps)) < 0) {
|
||||||
@ -672,31 +772,7 @@ testCompareXMLToArgv(const void *data)
|
|||||||
if (!(vm = virDomainObjNew(driver.xmlopt)))
|
if (!(vm = virDomainObjNew(driver.xmlopt)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!virFileExists(info->infile)) {
|
vm->def = info->def;
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
"Input file '%s' not found", info->infile);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
parseFlags |= VIR_DOMAIN_DEF_PARSE_INACTIVE;
|
|
||||||
|
|
||||||
if (!(vm->def = virDomainDefParseFile(info->infile, driver.xmlopt, NULL, parseFlags))) {
|
|
||||||
err = virGetLastError();
|
|
||||||
if (!err) {
|
|
||||||
VIR_TEST_DEBUG("no error was reported for expected parse error");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
if (flags & FLAG_EXPECT_PARSE_ERROR) {
|
|
||||||
g_autofree char *tmperr = g_strdup_printf("%s\n", NULLSTR(err->message));
|
|
||||||
if (virTestCompareToFile(tmperr, info->errfile) >= 0)
|
|
||||||
goto ok;
|
|
||||||
}
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
if (flags & FLAG_EXPECT_PARSE_ERROR) {
|
|
||||||
VIR_TEST_DEBUG("passed instead of expected parse error");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
priv = vm->privateData;
|
priv = vm->privateData;
|
||||||
|
|
||||||
if (info->args.fds) {
|
if (info->args.fds) {
|
||||||
@ -770,7 +846,10 @@ testCompareXMLToArgv(const void *data)
|
|||||||
if (info->args.capsHostCPUModel)
|
if (info->args.capsHostCPUModel)
|
||||||
qemuTestSetHostCPU(&driver, driver.hostarch, NULL);
|
qemuTestSetHostCPU(&driver, driver.hostarch, NULL);
|
||||||
virDomainChrSourceDefClear(&monitor_chr);
|
virDomainChrSourceDefClear(&monitor_chr);
|
||||||
|
if (vm) {
|
||||||
|
vm->def = NULL;
|
||||||
virObjectUnref(vm);
|
virObjectUnref(vm);
|
||||||
|
}
|
||||||
virIdentitySetCurrent(NULL);
|
virIdentitySetCurrent(NULL);
|
||||||
if (info->arch != VIR_ARCH_NONE && info->arch != VIR_ARCH_X86_64)
|
if (info->arch != VIR_ARCH_NONE && info->arch != VIR_ARCH_X86_64)
|
||||||
qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
|
qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
|
||||||
@ -848,6 +927,12 @@ testRun(const char *name,
|
|||||||
info->errfile = g_strdup_printf("%s/qemuxml2argvdata/%s%s.err", abs_srcdir, info->name, suffix);
|
info->errfile = g_strdup_printf("%s/qemuxml2argvdata/%s%s.err", abs_srcdir, info->name, suffix);
|
||||||
|
|
||||||
virTestRunLog(ret, testname, testCompareXMLToArgv, info);
|
virTestRunLog(ret, testname, testCompareXMLToArgv, info);
|
||||||
|
|
||||||
|
/* clear overriden host cpu */
|
||||||
|
if (info->args.capsHostCPUModel)
|
||||||
|
qemuTestSetHostCPU(&driver, driver.hostarch, NULL);
|
||||||
|
if (info->arch != VIR_ARCH_NONE && info->arch != VIR_ARCH_X86_64)
|
||||||
|
qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,6 +112,12 @@ struct _testQemuInfo {
|
|||||||
virArch arch;
|
virArch arch;
|
||||||
GHashTable *qmpSchema; /* borrowed pointer from the cache */
|
GHashTable *qmpSchema; /* borrowed pointer from the cache */
|
||||||
|
|
||||||
|
/* Some tests have a common prepare step for multiple cases, but
|
||||||
|
* the common setup needs to be invoked with each virTestRun to facilitate
|
||||||
|
* test skipping */
|
||||||
|
bool prepared;
|
||||||
|
bool prep_skip;
|
||||||
|
|
||||||
struct testQemuArgs args;
|
struct testQemuArgs args;
|
||||||
struct testQemuConf *conf;
|
struct testQemuConf *conf;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user