From 598b9fe4af09975d8da3daef1b37e89f8dfb4768 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Thu, 7 Oct 2010 16:35:17 +0200 Subject: [PATCH] tests: Add unit tests for internal CPU APIs --- tests/Makefile.am | 12 +- tests/cputest.c | 633 ++++++++++++++++++ tests/cputestdata/x86-baseline-1-result.xml | 5 + tests/cputestdata/x86-baseline-1.xml | 20 + tests/cputestdata/x86-baseline-2-result.xml | 4 + tests/cputestdata/x86-baseline-2.xml | 22 + .../x86-baseline-incompatible-vendors.xml | 14 + .../x86-baseline-no-vendor-result.xml | 5 + tests/cputestdata/x86-baseline-no-vendor.xml | 12 + .../x86-baseline-some-vendors-result.xml | 3 + .../cputestdata/x86-baseline-some-vendors.xml | 13 + tests/cputestdata/x86-bogus-feature.xml | 4 + tests/cputestdata/x86-bogus-model.xml | 3 + tests/cputestdata/x86-bogus-vendor.xml | 4 + tests/cputestdata/x86-exact-disable-extra.xml | 4 + tests/cputestdata/x86-exact-disable.xml | 4 + tests/cputestdata/x86-exact-disable2.xml | 5 + tests/cputestdata/x86-exact-forbid-extra.xml | 4 + tests/cputestdata/x86-exact-forbid.xml | 4 + tests/cputestdata/x86-exact-force.xml | 4 + tests/cputestdata/x86-exact-require-extra.xml | 4 + tests/cputestdata/x86-exact-require.xml | 4 + tests/cputestdata/x86-exact.xml | 3 + tests/cputestdata/x86-guest.xml | 18 + .../x86-host+guest,model486-result.xml | 37 + .../x86-host+guest,models,Penryn-result.xml | 13 + .../x86-host+guest,models,qemu64-result.xml | 14 + .../x86-host+guest,models-result.xml | 13 + tests/cputestdata/x86-host+guest-result.xml | 11 + tests/cputestdata/x86-host+guest.xml | 17 + tests/cputestdata/x86-host+min.xml | 17 + .../x86-host+nehalem-force-result.xml | 4 + tests/cputestdata/x86-host+pentium3.xml | 27 + .../x86-host+strict-force-extra-result.xml | 19 + tests/cputestdata/x86-host-amd-fake.xml | 20 + tests/cputestdata/x86-host-amd.xml | 18 + ...6-host-better+pentium3,core2duo-result.xml | 21 + ...6-host-better+pentium3,pentium3-result.xml | 30 + .../x86-host-better+pentium3-result.xml | 18 + tests/cputestdata/x86-host-better.xml | 20 + tests/cputestdata/x86-host-incomp-arch.xml | 6 + tests/cputestdata/x86-host-no-vendor.xml | 19 + .../x86-host-worse+guest-result.xml | 9 + tests/cputestdata/x86-host-worse.xml | 6 + tests/cputestdata/x86-host.xml | 20 + tests/cputestdata/x86-min.xml | 3 + tests/cputestdata/x86-nehalem-force.xml | 5 + tests/cputestdata/x86-pentium3-amd.xml | 4 + tests/cputestdata/x86-pentium3.xml | 3 + tests/cputestdata/x86-strict-disable.xml | 18 + tests/cputestdata/x86-strict-force-extra.xml | 18 + tests/cputestdata/x86-strict-full.xml | 17 + tests/cputestdata/x86-strict.xml | 3 + 53 files changed, 1237 insertions(+), 1 deletion(-) create mode 100644 tests/cputest.c create mode 100644 tests/cputestdata/x86-baseline-1-result.xml create mode 100644 tests/cputestdata/x86-baseline-1.xml create mode 100644 tests/cputestdata/x86-baseline-2-result.xml create mode 100644 tests/cputestdata/x86-baseline-2.xml create mode 100644 tests/cputestdata/x86-baseline-incompatible-vendors.xml create mode 100644 tests/cputestdata/x86-baseline-no-vendor-result.xml create mode 100644 tests/cputestdata/x86-baseline-no-vendor.xml create mode 100644 tests/cputestdata/x86-baseline-some-vendors-result.xml create mode 100644 tests/cputestdata/x86-baseline-some-vendors.xml create mode 100644 tests/cputestdata/x86-bogus-feature.xml create mode 100644 tests/cputestdata/x86-bogus-model.xml create mode 100644 tests/cputestdata/x86-bogus-vendor.xml create mode 100644 tests/cputestdata/x86-exact-disable-extra.xml create mode 100644 tests/cputestdata/x86-exact-disable.xml create mode 100644 tests/cputestdata/x86-exact-disable2.xml create mode 100644 tests/cputestdata/x86-exact-forbid-extra.xml create mode 100644 tests/cputestdata/x86-exact-forbid.xml create mode 100644 tests/cputestdata/x86-exact-force.xml create mode 100644 tests/cputestdata/x86-exact-require-extra.xml create mode 100644 tests/cputestdata/x86-exact-require.xml create mode 100644 tests/cputestdata/x86-exact.xml create mode 100644 tests/cputestdata/x86-guest.xml create mode 100644 tests/cputestdata/x86-host+guest,model486-result.xml create mode 100644 tests/cputestdata/x86-host+guest,models,Penryn-result.xml create mode 100644 tests/cputestdata/x86-host+guest,models,qemu64-result.xml create mode 100644 tests/cputestdata/x86-host+guest,models-result.xml create mode 100644 tests/cputestdata/x86-host+guest-result.xml create mode 100644 tests/cputestdata/x86-host+guest.xml create mode 100644 tests/cputestdata/x86-host+min.xml create mode 100644 tests/cputestdata/x86-host+nehalem-force-result.xml create mode 100644 tests/cputestdata/x86-host+pentium3.xml create mode 100644 tests/cputestdata/x86-host+strict-force-extra-result.xml create mode 100644 tests/cputestdata/x86-host-amd-fake.xml create mode 100644 tests/cputestdata/x86-host-amd.xml create mode 100644 tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml create mode 100644 tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml create mode 100644 tests/cputestdata/x86-host-better+pentium3-result.xml create mode 100644 tests/cputestdata/x86-host-better.xml create mode 100644 tests/cputestdata/x86-host-incomp-arch.xml create mode 100644 tests/cputestdata/x86-host-no-vendor.xml create mode 100644 tests/cputestdata/x86-host-worse+guest-result.xml create mode 100644 tests/cputestdata/x86-host-worse.xml create mode 100644 tests/cputestdata/x86-host.xml create mode 100644 tests/cputestdata/x86-min.xml create mode 100644 tests/cputestdata/x86-nehalem-force.xml create mode 100644 tests/cputestdata/x86-pentium3-amd.xml create mode 100644 tests/cputestdata/x86-pentium3.xml create mode 100644 tests/cputestdata/x86-strict-disable.xml create mode 100644 tests/cputestdata/x86-strict-force-extra.xml create mode 100644 tests/cputestdata/x86-strict-full.xml create mode 100644 tests/cputestdata/x86-strict.xml diff --git a/tests/Makefile.am b/tests/Makefile.am index 77b6fb97d7..021670e073 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -69,7 +69,8 @@ EXTRA_DIST = \ domainsnapshotschematest \ domainsnapshotxml2xmlout \ domainsnapshotxml2xmlin \ - qemuhelpdata + qemuhelpdata \ + cputestdata check_PROGRAMS = virshtest conftest sockettest \ nodeinfotest qparamtest virbuftest @@ -111,6 +112,8 @@ check_PROGRAMS += nodedevxml2xmltest check_PROGRAMS += interfacexml2xmltest +check_PROGRAMS += cputest + test_scripts = \ capabilityschematest \ interfaceschematest \ @@ -196,6 +199,8 @@ TESTS += nodedevxml2xmltest TESTS += interfacexml2xmltest +TESTS += cputest + path_add = $$abs_top_builddir/src$(PATH_SEPARATOR)$$abs_top_builddir/daemon$(PATH_SEPARATOR)$$abs_top_builddir/tools # NB, automake < 1.10 does not provide the real @@ -326,6 +331,11 @@ interfacexml2xmltest_SOURCES = \ testutils.c testutils.h interfacexml2xmltest_LDADD = $(LDADDS) +cputest_SOURCES = \ + cputest.c \ + testutils.c testutils.h +cputest_LDADD = $(LDADDS) + virshtest_SOURCES = \ virshtest.c \ testutils.c testutils.h diff --git a/tests/cputest.c b/tests/cputest.c new file mode 100644 index 0000000000..bd06958a8a --- /dev/null +++ b/tests/cputest.c @@ -0,0 +1,633 @@ +/* + * cputest.c: Test the libvirtd internal CPU APIs + * + * Copyright (C) 2010 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Jiri Denemark + */ + +#include + +#include +#include +#include +#include + +#include +#include + +#include "internal.h" +#include "xml.h" +#include "memory.h" +#include "buf.h" +#include "testutils.h" +#include "cpu_conf.h" +#include "cpu/cpu.h" +#include "cpu/cpu_map.h" + +static const char *progname; +static const char *abs_srcdir; +static const char *abs_top_srcdir; + +#define VIR_FROM_THIS VIR_FROM_CPU +#define MAX_FILE 4096 + +enum compResultShadow { + ERROR = VIR_CPU_COMPARE_ERROR, + INCOMPATIBLE = VIR_CPU_COMPARE_INCOMPATIBLE, + IDENTICAL = VIR_CPU_COMPARE_IDENTICAL, + SUPERSET = VIR_CPU_COMPARE_SUPERSET +}; + +enum cpuTestBoolWithError { + FAIL = -1, + NO = 0, + YES = 1 +}; + +enum api { + API_COMPARE, + API_GUEST_DATA, + API_BASELINE, + API_UPDATE, + API_HAS_FEATURE +}; + +static const char *apis[] = { + "compare", + "guest data", + "baseline", + "update", + "has feature" +}; + +struct data { + const char *arch; + enum api api; + const char *host; + const char *name; + const char **models; + const char *modelsName; + unsigned int nmodels; + const char *preferred; + int result; +}; + + +static virCPUDefPtr +cpuTestLoadXML(const char *arch, const char *name) +{ + char xml[PATH_MAX]; + xmlDocPtr doc = NULL; + xmlXPathContextPtr ctxt = NULL; + virCPUDefPtr cpu = NULL; + + snprintf(xml, PATH_MAX, + "%s/cputestdata/%s-%s.xml", + abs_srcdir, arch, name); + + if (!(doc = virXMLParseFile(xml)) || + !(ctxt = xmlXPathNewContext(doc))) + goto cleanup; + + ctxt->node = xmlDocGetRootElement(doc); + cpu = virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_AUTO); + +cleanup: + xmlXPathFreeContext(ctxt); + xmlFreeDoc(doc); + return cpu; +} + + +static virCPUDefPtr * +cpuTestLoadMultiXML(const char *arch, + const char *name, + unsigned int *count) +{ + char xml[PATH_MAX]; + xmlDocPtr doc = NULL; + xmlXPathContextPtr ctxt = NULL; + xmlNodePtr *nodes = NULL; + virCPUDefPtr *cpus = NULL; + int n; + int i; + + snprintf(xml, PATH_MAX, + "%s/cputestdata/%s-%s.xml", + abs_srcdir, arch, name); + + if (!(doc = virXMLParseFile(xml)) || + !(ctxt = xmlXPathNewContext(doc))) + goto error; + + ctxt->node = xmlDocGetRootElement(doc); + + n = virXPathNodeSet("/cpuTest/cpu", ctxt, &nodes); + if (n <= 0 || !(cpus = calloc(n, sizeof(virCPUDefPtr)))) + goto error; + + for (i = 0; i < n; i++) { + ctxt->node = nodes[i]; + cpus[i] = virCPUDefParseXML(nodes[i], ctxt, VIR_CPU_TYPE_HOST); + if (!cpus[i]) + goto error; + } + + *count = n; + +cleanup: + free(nodes); + xmlXPathFreeContext(ctxt); + xmlFreeDoc(doc); + return cpus; + +error: + if (cpus) { + for (i = 0; i < n; i++) + virCPUDefFree(cpus[i]); + free(cpus); + cpus = NULL; + } + goto cleanup; +} + + +static int +cpuTestCompareXML(const char *arch, + const virCPUDefPtr cpu, + const char *name) +{ + char xml[PATH_MAX]; + char expected[MAX_FILE]; + char *expectedPtr = &(expected[0]); + char *actual = NULL; + int ret = -1; + + snprintf(xml, PATH_MAX, + "%s/cputestdata/%s-%s.xml", + abs_srcdir, arch, name); + + if (virtTestLoadFile(xml, &expectedPtr, MAX_FILE) < 0) + goto cleanup; + + if (!(actual = virCPUDefFormat(cpu, NULL, 0))) + goto cleanup; + + if (STRNEQ(expected, actual)) { + virtTestDifference(stderr, expected, actual); + goto cleanup; + } + + ret = 0; + +cleanup: + free(actual); + return ret; +} + + +static const char * +cpuTestCompResStr(virCPUCompareResult result) +{ + switch (result) { + case VIR_CPU_COMPARE_ERROR: return "ERROR"; + case VIR_CPU_COMPARE_INCOMPATIBLE: return "INCOMPATIBLE"; + case VIR_CPU_COMPARE_IDENTICAL: return "IDENTICAL"; + case VIR_CPU_COMPARE_SUPERSET: return "SUPERSET"; + } + + return "unknown"; +} + + +static const char * +cpuTestBoolWithErrorStr(enum cpuTestBoolWithError result) +{ + switch (result) { + case FAIL: return "FAIL"; + case NO: return "NO"; + case YES: return "YES"; + } + + return "unknown"; +} + + +static int +cpuTestCompare(const void *arg) +{ + const struct data *data = arg; + int ret = -1; + virCPUDefPtr host = NULL; + virCPUDefPtr cpu = NULL; + virCPUCompareResult result; + + if (!(host = cpuTestLoadXML(data->arch, data->host)) || + !(cpu = cpuTestLoadXML(data->arch, data->name))) + goto cleanup; + + result = cpuCompare(host, cpu); + if (data->result == VIR_CPU_COMPARE_ERROR) + virResetLastError(); + + if (data->result != result) { + if (virTestGetVerbose()) { + fprintf(stderr, "\nExpected result %s, got %s\n", + cpuTestCompResStr(data->result), + cpuTestCompResStr(result)); + /* Pad to line up with test name ... in virTestRun */ + fprintf(stderr, "%74s", "... "); + } + goto cleanup; + } + + ret = 0; + +cleanup: + virCPUDefFree(host); + virCPUDefFree(cpu); + return ret; +} + + +static int +cpuTestGuestData(const void *arg) +{ + const struct data *data = arg; + int ret = -1; + virCPUDefPtr host = NULL; + virCPUDefPtr cpu = NULL; + virCPUDefPtr guest = NULL; + union cpuData *guestData = NULL; + virCPUCompareResult cmpResult; + virBuffer buf = VIR_BUFFER_INITIALIZER; + char *result = NULL; + + if (!(host = cpuTestLoadXML(data->arch, data->host)) || + !(cpu = cpuTestLoadXML(data->arch, data->name))) + goto cleanup; + + cmpResult = cpuGuestData(host, cpu, &guestData); + if (cmpResult == VIR_CPU_COMPARE_ERROR || + cmpResult == VIR_CPU_COMPARE_INCOMPATIBLE) + goto cleanup; + + if (VIR_ALLOC(guest) < 0 || !(guest->arch = strdup(host->arch))) + goto cleanup; + + guest->type = VIR_CPU_TYPE_GUEST; + guest->match = VIR_CPU_MATCH_EXACT; + if (cpuDecode(guest, guestData, data->models, + data->nmodels, data->preferred) < 0) { + if (data->result < 0) { + virResetLastError(); + ret = 0; + } + goto cleanup; + } + + virBufferVSprintf(&buf, "%s+%s", data->host, data->name); + if (data->nmodels) + virBufferVSprintf(&buf, ",%s", data->modelsName); + if (data->preferred) + virBufferVSprintf(&buf, ",%s", data->preferred); + virBufferAddLit(&buf, "-result"); + + if (virBufferError(&buf)) { + virBufferFreeAndReset(&buf); + goto cleanup; + } + result = virBufferContentAndReset(&buf); + + ret = cpuTestCompareXML(data->arch, guest, result); + +cleanup: + VIR_FREE(result); + if (host) + cpuDataFree(host->arch, guestData); + virCPUDefFree(host); + virCPUDefFree(cpu); + virCPUDefFree(guest); + return ret; +} + + +static int +cpuTestBaseline(const void *arg) +{ + const struct data *data = arg; + int ret = -1; + virCPUDefPtr *cpus = NULL; + virCPUDefPtr baseline = NULL; + unsigned int ncpus = 0; + char result[PATH_MAX]; + unsigned int i; + + if (!(cpus = cpuTestLoadMultiXML(data->arch, data->name, &ncpus))) + goto cleanup; + + baseline = cpuBaseline(cpus, ncpus, NULL, 0); + if (data->result < 0) { + virResetLastError(); + if (!baseline) + ret = 0; + else if (virTestGetVerbose()) { + fprintf(stderr, "\n%-70s... ", + "cpuBaseline was expected to fail but it succeeded"); + } + goto cleanup; + } + if (!baseline) + goto cleanup; + + snprintf(result, PATH_MAX, "%s-result", data->name); + if (cpuTestCompareXML(data->arch, baseline, result) < 0) + goto cleanup; + + for (i = 0; i < ncpus; i++) { + virCPUCompareResult cmp; + + cmp = cpuCompare(cpus[i], baseline); + if (cmp != VIR_CPU_COMPARE_SUPERSET && + cmp != VIR_CPU_COMPARE_IDENTICAL) { + if (virTestGetVerbose()) { + fprintf(stderr, + "\nbaseline CPU is incompatible with CPU %u\n", i); + fprintf(stderr, "%74s", "... "); + } + ret = -1; + goto cleanup; + } + } + + ret = 0; + +cleanup: + if (cpus) { + for (i = 0; i < ncpus; i++) + virCPUDefFree(cpus[i]); + free(cpus); + } + virCPUDefFree(baseline); + return ret; +} + + +static int +cpuTestUpdate(const void *arg) +{ + const struct data *data = arg; + int ret = -1; + virCPUDefPtr host = NULL; + virCPUDefPtr cpu = NULL; + char result[PATH_MAX]; + + if (!(host = cpuTestLoadXML(data->arch, data->host)) || + !(cpu = cpuTestLoadXML(data->arch, data->name))) + goto cleanup; + + if (cpuUpdate(cpu, host) < 0) + goto cleanup; + + snprintf(result, PATH_MAX, "%s+%s", data->host, data->name); + ret = cpuTestCompareXML(data->arch, cpu, result); + +cleanup: + virCPUDefFree(host); + virCPUDefFree(cpu); + return ret; +} + + +static int +cpuTestHasFeature(const void *arg) +{ + const struct data *data = arg; + int ret = -1; + virCPUDefPtr host = NULL; + union cpuData *hostData = NULL; + int result; + + if (!(host = cpuTestLoadXML(data->arch, data->host))) + goto cleanup; + + if (cpuEncode(host->arch, host, NULL, &hostData, + NULL, NULL, NULL, NULL) < 0) + goto cleanup; + + result = cpuHasFeature(host->arch, hostData, data->name); + if (data->result == -1) + virResetLastError(); + + if (data->result != result) { + if (virTestGetVerbose()) { + fprintf(stderr, "\nExpected result %s, got %s\n", + cpuTestBoolWithErrorStr(data->result), + cpuTestBoolWithErrorStr(result)); + /* Pad to line up with test name ... in virTestRun */ + fprintf(stderr, "%74s", "... "); + } + goto cleanup; + } + + ret = 0; + +cleanup: + if (host) + cpuDataFree(host->arch, hostData); + virCPUDefFree(host); + return ret; +} + + +static int (*cpuTest[])(const void *) = { + cpuTestCompare, + cpuTestGuestData, + cpuTestBaseline, + cpuTestUpdate, + cpuTestHasFeature +}; + + +static int +cpuTestRun(const char *name, const struct data *data) +{ + char label[PATH_MAX]; + + snprintf(label, PATH_MAX, "CPU %s(%s): %s", + apis[data->api], data->arch, name); + + free(virtTestLogContentAndReset()); + + if (virtTestRun(label, 1, cpuTest[data->api], data) < 0) { + if (virTestGetDebug()) { + char *log; + if ((log = virtTestLogContentAndReset()) && + strlen(log) > 0) + fprintf(stderr, "\n%s\n", log); + free(log); + } + return -1; + } + + return 0; +} + + +static const char *model486[] = { "486" }; +static const char *nomodel[] = { "nomodel" }; +static const char *models[] = { "qemu64", "core2duo", "Nehalem" }; + +static int +mymain(int argc, char **argv) +{ + int ret = 0; + char cwd[PATH_MAX]; + char map[PATH_MAX]; + + progname = argv[0]; + + if (argc > 1) { + fprintf(stderr, "Usage: %s\n", progname); + return EXIT_FAILURE; + } + + abs_srcdir = getenv("abs_srcdir"); + if (!abs_srcdir) + abs_srcdir = getcwd(cwd, sizeof(cwd)); + + abs_top_srcdir = getenv("abs_top_srcdir"); + if (!abs_top_srcdir) + abs_top_srcdir = ".."; + + snprintf(map, PATH_MAX, "%s/src/cpu/cpu_map.xml", abs_top_srcdir); + if (cpuMapOverride(map) < 0) + return EXIT_FAILURE; + +#define DO_TEST(arch, api, name, host, cpu, \ + models, nmodels, preferred, result) \ + do { \ + struct data data = { \ + arch, api, host, cpu, models, \ + models == NULL ? NULL : #models, \ + nmodels, preferred, result \ + }; \ + if (cpuTestRun(name, &data) < 0) \ + ret = -1; \ + } while (0) + +#define DO_TEST_COMPARE(arch, host, cpu, result) \ + DO_TEST(arch, API_COMPARE, \ + host "/" cpu " (" #result ")", \ + host, cpu, NULL, 0, NULL, result) + +#define DO_TEST_UPDATE(arch, host, cpu, result) \ + do { \ + DO_TEST(arch, API_UPDATE, \ + cpu " on " host, \ + host, cpu, NULL, 0, NULL, 0); \ + DO_TEST_COMPARE(arch, host, host "+" cpu, result); \ + } while (0) + +#define DO_TEST_BASELINE(arch, name, result) \ + DO_TEST(arch, API_BASELINE, name, NULL, "baseline-" name, \ + NULL, 0, NULL, result) + +#define DO_TEST_HASFEATURE(arch, host, feature, result) \ + DO_TEST(arch, API_HAS_FEATURE, \ + host "/" feature " (" #result ")", \ + host, feature, NULL, 0, NULL, result) + +#define DO_TEST_GUESTDATA(arch, host, cpu, models, preferred, result) \ + DO_TEST(arch, API_GUEST_DATA, \ + host "/" cpu " (" #models ", pref=" #preferred ")", \ + host, cpu, models, \ + models == NULL ? 0 : sizeof(models) / sizeof(char *), \ + preferred, result) + + /* host to host comparison */ + DO_TEST_COMPARE("x86", "host", "host", IDENTICAL); + DO_TEST_COMPARE("x86", "host", "host-better", INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "host-worse", SUPERSET); + DO_TEST_COMPARE("x86", "host", "host-amd-fake", INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "host-incomp-arch", INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "host-no-vendor", IDENTICAL); + DO_TEST_COMPARE("x86", "host-no-vendor", "host", INCOMPATIBLE); + + /* guest to host comparison */ + DO_TEST_COMPARE("x86", "host", "bogus-model", ERROR); + DO_TEST_COMPARE("x86", "host", "bogus-feature", ERROR); + DO_TEST_COMPARE("x86", "host", "min", SUPERSET); + DO_TEST_COMPARE("x86", "host", "pentium3", SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact", SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-forbid", INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "exact-forbid-extra", SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-disable", SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-disable2", SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-disable-extra", SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-require", SUPERSET); + DO_TEST_COMPARE("x86", "host", "exact-require-extra", INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "exact-force", SUPERSET); + DO_TEST_COMPARE("x86", "host", "strict", INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host", "strict-full", IDENTICAL); + DO_TEST_COMPARE("x86", "host", "strict-disable", IDENTICAL); + DO_TEST_COMPARE("x86", "host", "strict-force-extra", IDENTICAL); + DO_TEST_COMPARE("x86", "host", "guest", SUPERSET); + DO_TEST_COMPARE("x86", "host", "pentium3-amd", INCOMPATIBLE); + DO_TEST_COMPARE("x86", "host-amd", "pentium3-amd", SUPERSET); + DO_TEST_COMPARE("x86", "host-worse", "nehalem-force", IDENTICAL); + + /* guest updates for migration + * automatically compares host CPU with the result */ + DO_TEST_UPDATE("x86", "host", "min", IDENTICAL); + DO_TEST_UPDATE("x86", "host", "pentium3", IDENTICAL); + DO_TEST_UPDATE("x86", "host", "guest", SUPERSET); + + /* computing baseline CPUs */ + DO_TEST_BASELINE("x86", "incompatible-vendors", -1); + DO_TEST_BASELINE("x86", "no-vendor", 0); + DO_TEST_BASELINE("x86", "some-vendors", 0); + DO_TEST_BASELINE("x86", "1", 0); + DO_TEST_BASELINE("x86", "2", 0); + + /* CPU features */ + DO_TEST_HASFEATURE("x86", "host", "vmx", YES); + DO_TEST_HASFEATURE("x86", "host", "lm", YES); + DO_TEST_HASFEATURE("x86", "host", "sse4.1", YES); + DO_TEST_HASFEATURE("x86", "host", "3dnowext", NO); + DO_TEST_HASFEATURE("x86", "host", "skinit", NO); + DO_TEST_HASFEATURE("x86", "host", "foo", FAIL); + + /* computing guest data and decoding the data into a guest CPU XML */ + DO_TEST_GUESTDATA("x86", "host", "guest", NULL, NULL, 0); + DO_TEST_GUESTDATA("x86", "host-better", "pentium3", NULL, NULL, 0); + DO_TEST_GUESTDATA("x86", "host-better", "pentium3", NULL, "pentium3", 0); + DO_TEST_GUESTDATA("x86", "host-better", "pentium3", NULL, "core2duo", 0); + DO_TEST_GUESTDATA("x86", "host-worse", "guest", NULL, NULL, 0); + DO_TEST_GUESTDATA("x86", "host", "strict-force-extra", NULL, NULL, 0); + DO_TEST_GUESTDATA("x86", "host", "nehalem-force", NULL, NULL, 0); + DO_TEST_GUESTDATA("x86", "host", "guest", model486, NULL, 0); + DO_TEST_GUESTDATA("x86", "host", "guest", models, NULL, 0); + DO_TEST_GUESTDATA("x86", "host", "guest", models, "Penryn", 0); + DO_TEST_GUESTDATA("x86", "host", "guest", models, "qemu64", 0); + DO_TEST_GUESTDATA("x86", "host", "guest", nomodel, NULL, -1); + + return (ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE); +} + +VIRT_TEST_MAIN(mymain) diff --git a/tests/cputestdata/x86-baseline-1-result.xml b/tests/cputestdata/x86-baseline-1-result.xml new file mode 100644 index 0000000000..e376f7442f --- /dev/null +++ b/tests/cputestdata/x86-baseline-1-result.xml @@ -0,0 +1,5 @@ + + Conroe + Intel + + diff --git a/tests/cputestdata/x86-baseline-1.xml b/tests/cputestdata/x86-baseline-1.xml new file mode 100644 index 0000000000..509e6a85d2 --- /dev/null +++ b/tests/cputestdata/x86-baseline-1.xml @@ -0,0 +1,20 @@ + + + x86_64 + Penryn + Intel + + + + x86_64 + Conroe + Intel + + + + x86_64 + core2duo + Intel + + + diff --git a/tests/cputestdata/x86-baseline-2-result.xml b/tests/cputestdata/x86-baseline-2-result.xml new file mode 100644 index 0000000000..3fd0551ba8 --- /dev/null +++ b/tests/cputestdata/x86-baseline-2-result.xml @@ -0,0 +1,4 @@ + + core2duo + + diff --git a/tests/cputestdata/x86-baseline-2.xml b/tests/cputestdata/x86-baseline-2.xml new file mode 100644 index 0000000000..055223fd34 --- /dev/null +++ b/tests/cputestdata/x86-baseline-2.xml @@ -0,0 +1,22 @@ + + + x86_64 + core2duo + + + + x86_64 + pentiumpro + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-baseline-incompatible-vendors.xml b/tests/cputestdata/x86-baseline-incompatible-vendors.xml new file mode 100644 index 0000000000..ead1fbf32b --- /dev/null +++ b/tests/cputestdata/x86-baseline-incompatible-vendors.xml @@ -0,0 +1,14 @@ + + + x86_64 + Penryn + Intel + + + + x86_64 + Opteron_G3 + AMD + + + diff --git a/tests/cputestdata/x86-baseline-no-vendor-result.xml b/tests/cputestdata/x86-baseline-no-vendor-result.xml new file mode 100644 index 0000000000..0fc089256f --- /dev/null +++ b/tests/cputestdata/x86-baseline-no-vendor-result.xml @@ -0,0 +1,5 @@ + + Opteron_G2 + + + diff --git a/tests/cputestdata/x86-baseline-no-vendor.xml b/tests/cputestdata/x86-baseline-no-vendor.xml new file mode 100644 index 0000000000..84605a433f --- /dev/null +++ b/tests/cputestdata/x86-baseline-no-vendor.xml @@ -0,0 +1,12 @@ + + + x86_64 + Penryn + + + + x86_64 + Opteron_G3 + + + diff --git a/tests/cputestdata/x86-baseline-some-vendors-result.xml b/tests/cputestdata/x86-baseline-some-vendors-result.xml new file mode 100644 index 0000000000..2ddfcc5807 --- /dev/null +++ b/tests/cputestdata/x86-baseline-some-vendors-result.xml @@ -0,0 +1,3 @@ + + Opteron_G1 + diff --git a/tests/cputestdata/x86-baseline-some-vendors.xml b/tests/cputestdata/x86-baseline-some-vendors.xml new file mode 100644 index 0000000000..816ed6b394 --- /dev/null +++ b/tests/cputestdata/x86-baseline-some-vendors.xml @@ -0,0 +1,13 @@ + + + x86_64 + Opteron_G1 + + + + x86_64 + Opteron_G3 + AMD + + + diff --git a/tests/cputestdata/x86-bogus-feature.xml b/tests/cputestdata/x86-bogus-feature.xml new file mode 100644 index 0000000000..5a11814b7d --- /dev/null +++ b/tests/cputestdata/x86-bogus-feature.xml @@ -0,0 +1,4 @@ + + Penryn + + diff --git a/tests/cputestdata/x86-bogus-model.xml b/tests/cputestdata/x86-bogus-model.xml new file mode 100644 index 0000000000..f39392f40d --- /dev/null +++ b/tests/cputestdata/x86-bogus-model.xml @@ -0,0 +1,3 @@ + + Bogus + diff --git a/tests/cputestdata/x86-bogus-vendor.xml b/tests/cputestdata/x86-bogus-vendor.xml new file mode 100644 index 0000000000..2ffdefe413 --- /dev/null +++ b/tests/cputestdata/x86-bogus-vendor.xml @@ -0,0 +1,4 @@ + + Penryn + Bogus + diff --git a/tests/cputestdata/x86-exact-disable-extra.xml b/tests/cputestdata/x86-exact-disable-extra.xml new file mode 100644 index 0000000000..c84bd5b8a3 --- /dev/null +++ b/tests/cputestdata/x86-exact-disable-extra.xml @@ -0,0 +1,4 @@ + + Penryn + + diff --git a/tests/cputestdata/x86-exact-disable.xml b/tests/cputestdata/x86-exact-disable.xml new file mode 100644 index 0000000000..202eb27223 --- /dev/null +++ b/tests/cputestdata/x86-exact-disable.xml @@ -0,0 +1,4 @@ + + Penryn + + diff --git a/tests/cputestdata/x86-exact-disable2.xml b/tests/cputestdata/x86-exact-disable2.xml new file mode 100644 index 0000000000..9baa58b096 --- /dev/null +++ b/tests/cputestdata/x86-exact-disable2.xml @@ -0,0 +1,5 @@ + + Nehalem + + + diff --git a/tests/cputestdata/x86-exact-forbid-extra.xml b/tests/cputestdata/x86-exact-forbid-extra.xml new file mode 100644 index 0000000000..0a261adce0 --- /dev/null +++ b/tests/cputestdata/x86-exact-forbid-extra.xml @@ -0,0 +1,4 @@ + + Penryn + + diff --git a/tests/cputestdata/x86-exact-forbid.xml b/tests/cputestdata/x86-exact-forbid.xml new file mode 100644 index 0000000000..d9660cab15 --- /dev/null +++ b/tests/cputestdata/x86-exact-forbid.xml @@ -0,0 +1,4 @@ + + Penryn + + diff --git a/tests/cputestdata/x86-exact-force.xml b/tests/cputestdata/x86-exact-force.xml new file mode 100644 index 0000000000..c0fa12751d --- /dev/null +++ b/tests/cputestdata/x86-exact-force.xml @@ -0,0 +1,4 @@ + + Penryn + + diff --git a/tests/cputestdata/x86-exact-require-extra.xml b/tests/cputestdata/x86-exact-require-extra.xml new file mode 100644 index 0000000000..5e89cda731 --- /dev/null +++ b/tests/cputestdata/x86-exact-require-extra.xml @@ -0,0 +1,4 @@ + + Penryn + + diff --git a/tests/cputestdata/x86-exact-require.xml b/tests/cputestdata/x86-exact-require.xml new file mode 100644 index 0000000000..2d196dffad --- /dev/null +++ b/tests/cputestdata/x86-exact-require.xml @@ -0,0 +1,4 @@ + + Penryn + + diff --git a/tests/cputestdata/x86-exact.xml b/tests/cputestdata/x86-exact.xml new file mode 100644 index 0000000000..18b7ef494c --- /dev/null +++ b/tests/cputestdata/x86-exact.xml @@ -0,0 +1,3 @@ + + Penryn + diff --git a/tests/cputestdata/x86-guest.xml b/tests/cputestdata/x86-guest.xml new file mode 100644 index 0000000000..d8685e63e0 --- /dev/null +++ b/tests/cputestdata/x86-guest.xml @@ -0,0 +1,18 @@ + + Penryn + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host+guest,model486-result.xml b/tests/cputestdata/x86-host+guest,model486-result.xml new file mode 100644 index 0000000000..fb1bb4b950 --- /dev/null +++ b/tests/cputestdata/x86-host+guest,model486-result.xml @@ -0,0 +1,37 @@ + + x86_64 + 486 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host+guest,models,Penryn-result.xml b/tests/cputestdata/x86-host+guest,models,Penryn-result.xml new file mode 100644 index 0000000000..955946537c --- /dev/null +++ b/tests/cputestdata/x86-host+guest,models,Penryn-result.xml @@ -0,0 +1,13 @@ + + x86_64 + Nehalem + + + + + + + + + + diff --git a/tests/cputestdata/x86-host+guest,models,qemu64-result.xml b/tests/cputestdata/x86-host+guest,models,qemu64-result.xml new file mode 100644 index 0000000000..b41863eb59 --- /dev/null +++ b/tests/cputestdata/x86-host+guest,models,qemu64-result.xml @@ -0,0 +1,14 @@ + + x86_64 + qemu64 + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host+guest,models-result.xml b/tests/cputestdata/x86-host+guest,models-result.xml new file mode 100644 index 0000000000..955946537c --- /dev/null +++ b/tests/cputestdata/x86-host+guest,models-result.xml @@ -0,0 +1,13 @@ + + x86_64 + Nehalem + + + + + + + + + + diff --git a/tests/cputestdata/x86-host+guest-result.xml b/tests/cputestdata/x86-host+guest-result.xml new file mode 100644 index 0000000000..544a388f76 --- /dev/null +++ b/tests/cputestdata/x86-host+guest-result.xml @@ -0,0 +1,11 @@ + + x86_64 + Penryn + + + + + + + + diff --git a/tests/cputestdata/x86-host+guest.xml b/tests/cputestdata/x86-host+guest.xml new file mode 100644 index 0000000000..c3fca87754 --- /dev/null +++ b/tests/cputestdata/x86-host+guest.xml @@ -0,0 +1,17 @@ + + Penryn + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host+min.xml b/tests/cputestdata/x86-host+min.xml new file mode 100644 index 0000000000..d22c7b6c1c --- /dev/null +++ b/tests/cputestdata/x86-host+min.xml @@ -0,0 +1,17 @@ + + Penryn + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host+nehalem-force-result.xml b/tests/cputestdata/x86-host+nehalem-force-result.xml new file mode 100644 index 0000000000..162685f022 --- /dev/null +++ b/tests/cputestdata/x86-host+nehalem-force-result.xml @@ -0,0 +1,4 @@ + + x86_64 + Nehalem + diff --git a/tests/cputestdata/x86-host+pentium3.xml b/tests/cputestdata/x86-host+pentium3.xml new file mode 100644 index 0000000000..d141d9e333 --- /dev/null +++ b/tests/cputestdata/x86-host+pentium3.xml @@ -0,0 +1,27 @@ + + pentium3 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host+strict-force-extra-result.xml b/tests/cputestdata/x86-host+strict-force-extra-result.xml new file mode 100644 index 0000000000..e47933cc32 --- /dev/null +++ b/tests/cputestdata/x86-host+strict-force-extra-result.xml @@ -0,0 +1,19 @@ + + x86_64 + Penryn + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host-amd-fake.xml b/tests/cputestdata/x86-host-amd-fake.xml new file mode 100644 index 0000000000..c81990a89c --- /dev/null +++ b/tests/cputestdata/x86-host-amd-fake.xml @@ -0,0 +1,20 @@ + + x86_64 + Penryn + AMD + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host-amd.xml b/tests/cputestdata/x86-host-amd.xml new file mode 100644 index 0000000000..e662829ab6 --- /dev/null +++ b/tests/cputestdata/x86-host-amd.xml @@ -0,0 +1,18 @@ + + x86_64 + Opteron_G3 + AMD + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml b/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml new file mode 100644 index 0000000000..c2d8ddd636 --- /dev/null +++ b/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml @@ -0,0 +1,21 @@ + + x86_64 + core2duo + + + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml b/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml new file mode 100644 index 0000000000..6e246a8032 --- /dev/null +++ b/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml @@ -0,0 +1,30 @@ + + x86_64 + pentium3 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host-better+pentium3-result.xml b/tests/cputestdata/x86-host-better+pentium3-result.xml new file mode 100644 index 0000000000..b918363e69 --- /dev/null +++ b/tests/cputestdata/x86-host-better+pentium3-result.xml @@ -0,0 +1,18 @@ + + x86_64 + Nehalem + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host-better.xml b/tests/cputestdata/x86-host-better.xml new file mode 100644 index 0000000000..8340f11e3c --- /dev/null +++ b/tests/cputestdata/x86-host-better.xml @@ -0,0 +1,20 @@ + + x86_64 + Nehalem + Intel + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host-incomp-arch.xml b/tests/cputestdata/x86-host-incomp-arch.xml new file mode 100644 index 0000000000..f7c064e4ce --- /dev/null +++ b/tests/cputestdata/x86-host-incomp-arch.xml @@ -0,0 +1,6 @@ + + ia64 + Penryn + Intel + + diff --git a/tests/cputestdata/x86-host-no-vendor.xml b/tests/cputestdata/x86-host-no-vendor.xml new file mode 100644 index 0000000000..efb0a444b0 --- /dev/null +++ b/tests/cputestdata/x86-host-no-vendor.xml @@ -0,0 +1,19 @@ + + x86_64 + Penryn + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-host-worse+guest-result.xml b/tests/cputestdata/x86-host-worse+guest-result.xml new file mode 100644 index 0000000000..036177a58f --- /dev/null +++ b/tests/cputestdata/x86-host-worse+guest-result.xml @@ -0,0 +1,9 @@ + + x86_64 + Penryn + + + + + + diff --git a/tests/cputestdata/x86-host-worse.xml b/tests/cputestdata/x86-host-worse.xml new file mode 100644 index 0000000000..dcf4670aab --- /dev/null +++ b/tests/cputestdata/x86-host-worse.xml @@ -0,0 +1,6 @@ + + x86_64 + Penryn + Intel + + diff --git a/tests/cputestdata/x86-host.xml b/tests/cputestdata/x86-host.xml new file mode 100644 index 0000000000..f1c163d085 --- /dev/null +++ b/tests/cputestdata/x86-host.xml @@ -0,0 +1,20 @@ + + x86_64 + Penryn + Intel + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-min.xml b/tests/cputestdata/x86-min.xml new file mode 100644 index 0000000000..795645d532 --- /dev/null +++ b/tests/cputestdata/x86-min.xml @@ -0,0 +1,3 @@ + + Penryn + diff --git a/tests/cputestdata/x86-nehalem-force.xml b/tests/cputestdata/x86-nehalem-force.xml new file mode 100644 index 0000000000..12fd274bd4 --- /dev/null +++ b/tests/cputestdata/x86-nehalem-force.xml @@ -0,0 +1,5 @@ + + Penryn + + + diff --git a/tests/cputestdata/x86-pentium3-amd.xml b/tests/cputestdata/x86-pentium3-amd.xml new file mode 100644 index 0000000000..5fd73e4904 --- /dev/null +++ b/tests/cputestdata/x86-pentium3-amd.xml @@ -0,0 +1,4 @@ + + pentium3 + AMD + diff --git a/tests/cputestdata/x86-pentium3.xml b/tests/cputestdata/x86-pentium3.xml new file mode 100644 index 0000000000..187e83d88b --- /dev/null +++ b/tests/cputestdata/x86-pentium3.xml @@ -0,0 +1,3 @@ + + pentium3 + diff --git a/tests/cputestdata/x86-strict-disable.xml b/tests/cputestdata/x86-strict-disable.xml new file mode 100644 index 0000000000..f2bac1a2b1 --- /dev/null +++ b/tests/cputestdata/x86-strict-disable.xml @@ -0,0 +1,18 @@ + + Penryn + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-strict-force-extra.xml b/tests/cputestdata/x86-strict-force-extra.xml new file mode 100644 index 0000000000..dbae38c552 --- /dev/null +++ b/tests/cputestdata/x86-strict-force-extra.xml @@ -0,0 +1,18 @@ + + Penryn + + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-strict-full.xml b/tests/cputestdata/x86-strict-full.xml new file mode 100644 index 0000000000..2dbe25099f --- /dev/null +++ b/tests/cputestdata/x86-strict-full.xml @@ -0,0 +1,17 @@ + + Penryn + + + + + + + + + + + + + + + diff --git a/tests/cputestdata/x86-strict.xml b/tests/cputestdata/x86-strict.xml new file mode 100644 index 0000000000..a64c26232b --- /dev/null +++ b/tests/cputestdata/x86-strict.xml @@ -0,0 +1,3 @@ + + Penryn +