mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
tests: Move testQemuInfo* to testutilsqemu
So it can eventually be shared with qemuxml2xml Reviewed-by: Andrea Bolognani <abologna@redhat.com> Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
parent
4234676a78
commit
2b9d64096f
@ -288,25 +288,6 @@ static virNWFilterDriver fakeNWFilterDriver = {
|
|||||||
.nwfilterBindingDelete = fakeNWFilterBindingDelete,
|
.nwfilterBindingDelete = fakeNWFilterBindingDelete,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FLAG_EXPECT_FAILURE = 1 << 0,
|
|
||||||
FLAG_EXPECT_PARSE_ERROR = 1 << 1,
|
|
||||||
FLAG_FIPS = 1 << 2,
|
|
||||||
FLAG_REAL_CAPS = 1 << 3,
|
|
||||||
FLAG_SKIP_LEGACY_CPUS = 1 << 4,
|
|
||||||
} testQemuInfoFlags;
|
|
||||||
|
|
||||||
struct testQemuInfo {
|
|
||||||
const char *name;
|
|
||||||
char *infile;
|
|
||||||
char *outfile;
|
|
||||||
virQEMUCapsPtr qemuCaps;
|
|
||||||
const char *migrateFrom;
|
|
||||||
int migrateFd;
|
|
||||||
unsigned int flags;
|
|
||||||
unsigned int parseFlags;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
testAddCPUModels(virQEMUCapsPtr caps, bool skipLegacy)
|
testAddCPUModels(virQEMUCapsPtr caps, bool skipLegacy)
|
||||||
@ -593,160 +574,6 @@ testCompareXMLToArgv(const void *data)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
# define TEST_CAPS_PATH abs_srcdir "/qemucapabilitiesdata"
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
ARG_QEMU_CAPS,
|
|
||||||
ARG_GIC,
|
|
||||||
ARG_MIGRATE_FROM,
|
|
||||||
ARG_MIGRATE_FD,
|
|
||||||
ARG_FLAGS,
|
|
||||||
ARG_PARSEFLAGS,
|
|
||||||
ARG_CAPS_ARCH,
|
|
||||||
ARG_CAPS_VER,
|
|
||||||
ARG_END,
|
|
||||||
} testQemuInfoArgName;
|
|
||||||
|
|
||||||
static int
|
|
||||||
testQemuInfoSetArgs(struct testQemuInfo *info,
|
|
||||||
virHashTablePtr capslatest, ...)
|
|
||||||
{
|
|
||||||
va_list argptr;
|
|
||||||
testQemuInfoArgName argname;
|
|
||||||
virQEMUCapsPtr qemuCaps = NULL;
|
|
||||||
int gic = GIC_NONE;
|
|
||||||
char *capsarch = NULL;
|
|
||||||
char *capsver = NULL;
|
|
||||||
VIR_AUTOFREE(char *) capsfile = NULL;
|
|
||||||
int flag;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
va_start(argptr, capslatest);
|
|
||||||
argname = va_arg(argptr, testQemuInfoArgName);
|
|
||||||
while (argname != ARG_END) {
|
|
||||||
switch (argname) {
|
|
||||||
case ARG_QEMU_CAPS:
|
|
||||||
if (qemuCaps || !(qemuCaps = virQEMUCapsNew()))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
while ((flag = va_arg(argptr, int)) < QEMU_CAPS_LAST)
|
|
||||||
virQEMUCapsSet(qemuCaps, flag);
|
|
||||||
|
|
||||||
/* Some tests are run with NONE capabilities, which is just
|
|
||||||
* another name for QEMU_CAPS_LAST. If that is the case the
|
|
||||||
* arguments look like this :
|
|
||||||
*
|
|
||||||
* ARG_QEMU_CAPS, NONE, QEMU_CAPS_LAST, ARG_END
|
|
||||||
*
|
|
||||||
* Fetch one argument more and if it is QEMU_CAPS_LAST then
|
|
||||||
* break from the switch() to force getting next argument
|
|
||||||
* in the line. If it is not QEMU_CAPS_LAST then we've
|
|
||||||
* fetched real ARG_* and we must process it.
|
|
||||||
*/
|
|
||||||
if ((flag = va_arg(argptr, int)) != QEMU_CAPS_LAST) {
|
|
||||||
argname = flag;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ARG_GIC:
|
|
||||||
gic = va_arg(argptr, int);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ARG_MIGRATE_FROM:
|
|
||||||
info->migrateFrom = va_arg(argptr, char *);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ARG_MIGRATE_FD:
|
|
||||||
info->migrateFd = va_arg(argptr, int);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ARG_FLAGS:
|
|
||||||
info->flags = va_arg(argptr, int);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ARG_PARSEFLAGS:
|
|
||||||
info->parseFlags = va_arg(argptr, int);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ARG_CAPS_ARCH:
|
|
||||||
capsarch = va_arg(argptr, char *);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ARG_CAPS_VER:
|
|
||||||
capsver = va_arg(argptr, char *);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ARG_END:
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Unexpected test info argument");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
argname = va_arg(argptr, testQemuInfoArgName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!!capsarch ^ !!capsver) {
|
|
||||||
fprintf(stderr, "ARG_CAPS_ARCH and ARG_CAPS_VER "
|
|
||||||
"must be specified together.\n");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemuCaps && (capsarch || capsver)) {
|
|
||||||
fprintf(stderr, "ARG_QEMU_CAPS can not be combined with ARG_CAPS_ARCH "
|
|
||||||
"or ARG_CAPS_VER\n");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!qemuCaps && capsarch && capsver) {
|
|
||||||
bool stripmachinealiases = false;
|
|
||||||
|
|
||||||
if (STREQ(capsver, "latest")) {
|
|
||||||
if (VIR_STRDUP(capsfile, virHashLookup(capslatest, capsarch)) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
stripmachinealiases = true;
|
|
||||||
} else if (virAsprintf(&capsfile, "%s/caps_%s.%s.xml",
|
|
||||||
TEST_CAPS_PATH, capsver, capsarch) < 0) {
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(qemuCaps = qemuTestParseCapabilitiesArch(virArchFromString(capsarch),
|
|
||||||
capsfile))) {
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stripmachinealiases)
|
|
||||||
virQEMUCapsStripMachineAliases(qemuCaps);
|
|
||||||
info->flags |= FLAG_REAL_CAPS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!qemuCaps) {
|
|
||||||
fprintf(stderr, "No qemuCaps generated\n");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
VIR_STEAL_PTR(info->qemuCaps, qemuCaps);
|
|
||||||
|
|
||||||
if (gic != GIC_NONE && testQemuCapsSetGIC(info->qemuCaps, gic) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virObjectUnref(qemuCaps);
|
|
||||||
va_end(argptr);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
testQemuInfoClear(struct testQemuInfo *info)
|
|
||||||
{
|
|
||||||
VIR_FREE(info->infile);
|
|
||||||
VIR_FREE(info->outfile);
|
|
||||||
virObjectUnref(info->qemuCaps);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
testInfoSetPaths(struct testQemuInfo *info,
|
testInfoSetPaths(struct testQemuInfo *info,
|
||||||
const char *suffix)
|
const char *suffix)
|
||||||
|
@ -918,3 +918,147 @@ testQemuCapsIterate(const char *dirname,
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define TEST_CAPS_PATH abs_srcdir "/qemucapabilitiesdata"
|
||||||
|
|
||||||
|
int
|
||||||
|
testQemuInfoSetArgs(struct testQemuInfo *info,
|
||||||
|
virHashTablePtr capslatest, ...)
|
||||||
|
{
|
||||||
|
va_list argptr;
|
||||||
|
testQemuInfoArgName argname;
|
||||||
|
virQEMUCapsPtr qemuCaps = NULL;
|
||||||
|
int gic = GIC_NONE;
|
||||||
|
char *capsarch = NULL;
|
||||||
|
char *capsver = NULL;
|
||||||
|
VIR_AUTOFREE(char *) capsfile = NULL;
|
||||||
|
int flag;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
va_start(argptr, capslatest);
|
||||||
|
argname = va_arg(argptr, testQemuInfoArgName);
|
||||||
|
while (argname != ARG_END) {
|
||||||
|
switch (argname) {
|
||||||
|
case ARG_QEMU_CAPS:
|
||||||
|
if (qemuCaps || !(qemuCaps = virQEMUCapsNew()))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
while ((flag = va_arg(argptr, int)) < QEMU_CAPS_LAST)
|
||||||
|
virQEMUCapsSet(qemuCaps, flag);
|
||||||
|
|
||||||
|
/* Some tests are run with NONE capabilities, which is just
|
||||||
|
* another name for QEMU_CAPS_LAST. If that is the case the
|
||||||
|
* arguments look like this :
|
||||||
|
*
|
||||||
|
* ARG_QEMU_CAPS, NONE, QEMU_CAPS_LAST, ARG_END
|
||||||
|
*
|
||||||
|
* Fetch one argument more and if it is QEMU_CAPS_LAST then
|
||||||
|
* break from the switch() to force getting next argument
|
||||||
|
* in the line. If it is not QEMU_CAPS_LAST then we've
|
||||||
|
* fetched real ARG_* and we must process it.
|
||||||
|
*/
|
||||||
|
if ((flag = va_arg(argptr, int)) != QEMU_CAPS_LAST) {
|
||||||
|
argname = flag;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARG_GIC:
|
||||||
|
gic = va_arg(argptr, int);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARG_MIGRATE_FROM:
|
||||||
|
info->migrateFrom = va_arg(argptr, char *);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARG_MIGRATE_FD:
|
||||||
|
info->migrateFd = va_arg(argptr, int);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARG_FLAGS:
|
||||||
|
info->flags = va_arg(argptr, int);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARG_PARSEFLAGS:
|
||||||
|
info->parseFlags = va_arg(argptr, int);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARG_CAPS_ARCH:
|
||||||
|
capsarch = va_arg(argptr, char *);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARG_CAPS_VER:
|
||||||
|
capsver = va_arg(argptr, char *);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARG_END:
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Unexpected test info argument");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
argname = va_arg(argptr, testQemuInfoArgName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!!capsarch ^ !!capsver) {
|
||||||
|
fprintf(stderr, "ARG_CAPS_ARCH and ARG_CAPS_VER "
|
||||||
|
"must be specified together.\n");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qemuCaps && (capsarch || capsver)) {
|
||||||
|
fprintf(stderr, "ARG_QEMU_CAPS can not be combined with ARG_CAPS_ARCH "
|
||||||
|
"or ARG_CAPS_VER\n");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qemuCaps && capsarch && capsver) {
|
||||||
|
bool stripmachinealiases = false;
|
||||||
|
|
||||||
|
if (STREQ(capsver, "latest")) {
|
||||||
|
if (VIR_STRDUP(capsfile, virHashLookup(capslatest, capsarch)) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
stripmachinealiases = true;
|
||||||
|
} else if (virAsprintf(&capsfile, "%s/caps_%s.%s.xml",
|
||||||
|
TEST_CAPS_PATH, capsver, capsarch) < 0) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(qemuCaps = qemuTestParseCapabilitiesArch(virArchFromString(capsarch),
|
||||||
|
capsfile))) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stripmachinealiases)
|
||||||
|
virQEMUCapsStripMachineAliases(qemuCaps);
|
||||||
|
info->flags |= FLAG_REAL_CAPS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qemuCaps) {
|
||||||
|
fprintf(stderr, "No qemuCaps generated\n");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
VIR_STEAL_PTR(info->qemuCaps, qemuCaps);
|
||||||
|
|
||||||
|
if (gic != GIC_NONE && testQemuCapsSetGIC(info->qemuCaps, gic) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virObjectUnref(qemuCaps);
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
testQemuInfoClear(struct testQemuInfo *info)
|
||||||
|
{
|
||||||
|
VIR_FREE(info->infile);
|
||||||
|
VIR_FREE(info->outfile);
|
||||||
|
virObjectUnref(info->qemuCaps);
|
||||||
|
}
|
||||||
|
@ -32,6 +32,37 @@ enum {
|
|||||||
GIC_BOTH,
|
GIC_BOTH,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ARG_QEMU_CAPS,
|
||||||
|
ARG_GIC,
|
||||||
|
ARG_MIGRATE_FROM,
|
||||||
|
ARG_MIGRATE_FD,
|
||||||
|
ARG_FLAGS,
|
||||||
|
ARG_PARSEFLAGS,
|
||||||
|
ARG_CAPS_ARCH,
|
||||||
|
ARG_CAPS_VER,
|
||||||
|
ARG_END,
|
||||||
|
} testQemuInfoArgName;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
FLAG_EXPECT_FAILURE = 1 << 0,
|
||||||
|
FLAG_EXPECT_PARSE_ERROR = 1 << 1,
|
||||||
|
FLAG_FIPS = 1 << 2,
|
||||||
|
FLAG_REAL_CAPS = 1 << 3,
|
||||||
|
FLAG_SKIP_LEGACY_CPUS = 1 << 4,
|
||||||
|
} testQemuInfoFlags;
|
||||||
|
|
||||||
|
struct testQemuInfo {
|
||||||
|
const char *name;
|
||||||
|
char *infile;
|
||||||
|
char *outfile;
|
||||||
|
virQEMUCapsPtr qemuCaps;
|
||||||
|
const char *migrateFrom;
|
||||||
|
int migrateFd;
|
||||||
|
unsigned int flags;
|
||||||
|
unsigned int parseFlags;
|
||||||
|
};
|
||||||
|
|
||||||
virCapsPtr testQemuCapsInit(void);
|
virCapsPtr testQemuCapsInit(void);
|
||||||
virDomainXMLOptionPtr testQemuXMLConfInit(void);
|
virDomainXMLOptionPtr testQemuXMLConfInit(void);
|
||||||
|
|
||||||
@ -71,6 +102,10 @@ int testQemuCapsIterate(const char *dirname,
|
|||||||
testQemuCapsIterateCallback callback,
|
testQemuCapsIterateCallback callback,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
|
|
||||||
|
int testQemuInfoSetArgs(struct testQemuInfo *info,
|
||||||
|
virHashTablePtr capslatest, ...);
|
||||||
|
void testQemuInfoClear(struct testQemuInfo *info);
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#endif /* LIBVIRT_TESTUTILSQEMU_H */
|
#endif /* LIBVIRT_TESTUTILSQEMU_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user