[libvirt] [PATCH 2/2] tests: Add unit tests for internal CPU APIs

Jiri Denemark jdenemar at redhat.com
Thu Nov 25 17:24:12 UTC 2010


---
 tests/Makefile.am                                  |   12 +-
 tests/cputest.c                                    |  610 ++++++++++++++++++++
 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 +
 .../cputestdata/x86-baseline-no-vendor-result.xml  |    5 +
 tests/cputestdata/x86-baseline-no-vendor.xml       |   12 +
 .../x86-baseline-some-vendors-result.xml           |    3 +
 tests/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 +
 .../cputestdata/x86-host+guest,model486-result.xml |   37 ++
 .../x86-host+guest,models,Penryn-result.xml        |   13 +
 .../x86-host+guest,models,qemu64-result.xml        |   14 +
 tests/cputestdata/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 +
 .../cputestdata/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 +
 .../x86-host-better+pentium3,core2duo-result.xml   |   21 +
 .../x86-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 +
 tests/cputestdata/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            |    6 +
 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, 1215 insertions(+), 1 deletions(-)
 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 77b6fb9..021670e 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 0000000..d9e6dad
--- /dev/null
+++ b/tests/cputest.c
@@ -0,0 +1,610 @@
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <fcntl.h>
+
+#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);
+    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 0000000..e376f74
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-1-result.xml
@@ -0,0 +1,5 @@
+<cpu match='exact'>
+  <model>Conroe</model>
+  <vendor>Intel</vendor>
+  <feature policy='disable' name='lahf_lm'/>
+</cpu>
diff --git a/tests/cputestdata/x86-baseline-1.xml b/tests/cputestdata/x86-baseline-1.xml
new file mode 100644
index 0000000..509e6a8
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-1.xml
@@ -0,0 +1,20 @@
+<cpuTest>
+<cpu>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <vendor>Intel</vendor>
+  <topology sockets='2' cores='4' threads='1'/>
+</cpu>
+<cpu>
+  <arch>x86_64</arch>
+  <model>Conroe</model>
+  <vendor>Intel</vendor>
+  <topology sockets='1' cores='1' threads='1'/>
+</cpu>
+<cpu>
+  <arch>x86_64</arch>
+  <model>core2duo</model>
+  <vendor>Intel</vendor>
+  <topology sockets='1' cores='1' threads='1'/>
+</cpu>
+</cpuTest>
diff --git a/tests/cputestdata/x86-baseline-2-result.xml b/tests/cputestdata/x86-baseline-2-result.xml
new file mode 100644
index 0000000..3fd0551
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-2-result.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>core2duo</model>
+  <feature policy='disable' name='nx'/>
+</cpu>
diff --git a/tests/cputestdata/x86-baseline-2.xml b/tests/cputestdata/x86-baseline-2.xml
new file mode 100644
index 0000000..055223f
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-2.xml
@@ -0,0 +1,22 @@
+<cpuTest>
+<cpu>
+  <arch>x86_64</arch>
+  <model>core2duo</model>
+  <topology sockets='1' cores='2' threads='1'/>
+</cpu>
+<cpu>
+  <arch>x86_64</arch>
+  <model>pentiumpro</model>
+  <topology sockets='1' cores='2' threads='1'/>
+  <feature name='mtrr'/>
+  <feature name='clflush'/>
+  <feature name='mca'/>
+  <feature name='vme'/>
+  <feature name='pse36'/>
+  <feature name='pni'/>
+  <feature name='monitor'/>
+  <feature name='ssse3'/>
+  <feature name='lm'/>
+  <feature name='syscall'/>
+</cpu>
+</cpuTest>
diff --git a/tests/cputestdata/x86-baseline-incompatible-vendors.xml b/tests/cputestdata/x86-baseline-incompatible-vendors.xml
new file mode 100644
index 0000000..ead1fbf
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-incompatible-vendors.xml
@@ -0,0 +1,14 @@
+<cpuTest>
+<cpu>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <vendor>Intel</vendor>
+  <topology sockets='2' cores='4' threads='1'/>
+</cpu>
+<cpu>
+  <arch>x86_64</arch>
+  <model>Opteron_G3</model>
+  <vendor>AMD</vendor>
+  <topology sockets='1' cores='1' threads='1'/>
+</cpu>
+</cpuTest>
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 0000000..0fc0892
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-no-vendor-result.xml
@@ -0,0 +1,5 @@
+<cpu match='exact'>
+  <model>Opteron_G2</model>
+  <feature policy='disable' name='svm'/>
+  <feature policy='disable' name='rdtscp'/>
+</cpu>
diff --git a/tests/cputestdata/x86-baseline-no-vendor.xml b/tests/cputestdata/x86-baseline-no-vendor.xml
new file mode 100644
index 0000000..84605a4
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-no-vendor.xml
@@ -0,0 +1,12 @@
+<cpuTest>
+<cpu>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <topology sockets='2' cores='4' threads='1'/>
+</cpu>
+<cpu>
+  <arch>x86_64</arch>
+  <model>Opteron_G3</model>
+  <topology sockets='1' cores='1' threads='1'/>
+</cpu>
+</cpuTest>
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 0000000..2ddfcc5
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-some-vendors-result.xml
@@ -0,0 +1,3 @@
+<cpu match='exact'>
+  <model>Opteron_G1</model>
+</cpu>
diff --git a/tests/cputestdata/x86-baseline-some-vendors.xml b/tests/cputestdata/x86-baseline-some-vendors.xml
new file mode 100644
index 0000000..816ed6b
--- /dev/null
+++ b/tests/cputestdata/x86-baseline-some-vendors.xml
@@ -0,0 +1,13 @@
+<cpuTest>
+<cpu>
+  <arch>x86_64</arch>
+  <model>Opteron_G1</model>
+  <topology sockets='2' cores='4' threads='1'/>
+</cpu>
+<cpu>
+  <arch>x86_64</arch>
+  <model>Opteron_G3</model>
+  <vendor>AMD</vendor>
+  <topology sockets='1' cores='1' threads='1'/>
+</cpu>
+</cpuTest>
diff --git a/tests/cputestdata/x86-bogus-feature.xml b/tests/cputestdata/x86-bogus-feature.xml
new file mode 100644
index 0000000..5a11814
--- /dev/null
+++ b/tests/cputestdata/x86-bogus-feature.xml
@@ -0,0 +1,4 @@
+<cpu match='minimum'>
+  <model>Penryn</model>
+  <feature name='bogus' policy='optional'/>
+</cpu>
diff --git a/tests/cputestdata/x86-bogus-model.xml b/tests/cputestdata/x86-bogus-model.xml
new file mode 100644
index 0000000..f39392f
--- /dev/null
+++ b/tests/cputestdata/x86-bogus-model.xml
@@ -0,0 +1,3 @@
+<cpu match='minimum'>
+  <model>Bogus</model>
+</cpu>
diff --git a/tests/cputestdata/x86-bogus-vendor.xml b/tests/cputestdata/x86-bogus-vendor.xml
new file mode 100644
index 0000000..2ffdefe
--- /dev/null
+++ b/tests/cputestdata/x86-bogus-vendor.xml
@@ -0,0 +1,4 @@
+<cpu match='minimum'>
+  <model>Penryn</model>
+  <vendor>Bogus</vendor>
+</cpu>
diff --git a/tests/cputestdata/x86-exact-disable-extra.xml b/tests/cputestdata/x86-exact-disable-extra.xml
new file mode 100644
index 0000000..c84bd5b
--- /dev/null
+++ b/tests/cputestdata/x86-exact-disable-extra.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature name='3dnowext' policy='disable'/>
+</cpu>
diff --git a/tests/cputestdata/x86-exact-disable.xml b/tests/cputestdata/x86-exact-disable.xml
new file mode 100644
index 0000000..202eb27
--- /dev/null
+++ b/tests/cputestdata/x86-exact-disable.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature name='vmx' policy='disable'/>
+</cpu>
diff --git a/tests/cputestdata/x86-exact-disable2.xml b/tests/cputestdata/x86-exact-disable2.xml
new file mode 100644
index 0000000..9baa58b
--- /dev/null
+++ b/tests/cputestdata/x86-exact-disable2.xml
@@ -0,0 +1,5 @@
+<cpu match='exact'>
+  <model>Nehalem</model>
+  <feature name='popcnt' policy='disable'/>
+  <feature name='sse4.2' policy='disable'/>
+</cpu>
diff --git a/tests/cputestdata/x86-exact-forbid-extra.xml b/tests/cputestdata/x86-exact-forbid-extra.xml
new file mode 100644
index 0000000..0a261ad
--- /dev/null
+++ b/tests/cputestdata/x86-exact-forbid-extra.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature name='3dnowext' policy='forbid'/>
+</cpu>
diff --git a/tests/cputestdata/x86-exact-forbid.xml b/tests/cputestdata/x86-exact-forbid.xml
new file mode 100644
index 0000000..d9660ca
--- /dev/null
+++ b/tests/cputestdata/x86-exact-forbid.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature name='vmx' policy='forbid'/>
+</cpu>
diff --git a/tests/cputestdata/x86-exact-force.xml b/tests/cputestdata/x86-exact-force.xml
new file mode 100644
index 0000000..c0fa127
--- /dev/null
+++ b/tests/cputestdata/x86-exact-force.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature name='3dnowext' policy='force'/>
+</cpu>
diff --git a/tests/cputestdata/x86-exact-require-extra.xml b/tests/cputestdata/x86-exact-require-extra.xml
new file mode 100644
index 0000000..5e89cda
--- /dev/null
+++ b/tests/cputestdata/x86-exact-require-extra.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature name='3dnowext' policy='require'/>
+</cpu>
diff --git a/tests/cputestdata/x86-exact-require.xml b/tests/cputestdata/x86-exact-require.xml
new file mode 100644
index 0000000..2d196df
--- /dev/null
+++ b/tests/cputestdata/x86-exact-require.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature name='sse4.1' policy='require'/>
+</cpu>
diff --git a/tests/cputestdata/x86-exact.xml b/tests/cputestdata/x86-exact.xml
new file mode 100644
index 0000000..18b7ef4
--- /dev/null
+++ b/tests/cputestdata/x86-exact.xml
@@ -0,0 +1,3 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+</cpu>
diff --git a/tests/cputestdata/x86-guest.xml b/tests/cputestdata/x86-guest.xml
new file mode 100644
index 0000000..d8685e6
--- /dev/null
+++ b/tests/cputestdata/x86-guest.xml
@@ -0,0 +1,18 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <topology sockets='2' cores='4' threads='1'/>
+  <!--feature name='sse4.1' policy='optional'/-->
+  <feature name='dca' policy='optional'/>
+  <feature name='xtpr' policy='optional'/>
+  <feature name='sse4.2' policy='optional'/>
+  <feature name='3dnow' policy='optional'/>
+  <feature name='ssse3' policy='optional'/>
+  <feature name='vmx' policy='disable'/>
+  <feature name='ds_cpl' policy='disable'/>
+  <feature name='sse' policy='disable'/>
+  <feature name='monitor' policy='force'/>
+  <feature name='pbe' policy='force'/>
+  <feature name='3dnowext' policy='force'/>
+  <feature name='svm' policy='force'/>
+  <feature name='popcnt' policy='forbid'/>
+</cpu>
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 0000000..fb1bb4b
--- /dev/null
+++ b/tests/cputestdata/x86-host+guest,model486-result.xml
@@ -0,0 +1,37 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>486</model>
+  <feature policy='require' name='svm'/>
+  <feature policy='require' name='lahf_lm'/>
+  <feature policy='require' name='3dnowext'/>
+  <feature policy='require' name='lm'/>
+  <feature policy='require' name='nx'/>
+  <feature policy='require' name='syscall'/>
+  <feature policy='require' name='sse4.1'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='cx16'/>
+  <feature policy='require' name='ssse3'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pni'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='require' name='sse2'/>
+  <feature policy='require' name='fxsr'/>
+  <feature policy='require' name='mmx'/>
+  <feature policy='require' name='clflush'/>
+  <feature policy='require' name='pse36'/>
+  <feature policy='require' name='pat'/>
+  <feature policy='require' name='cmov'/>
+  <feature policy='require' name='mca'/>
+  <feature policy='require' name='pge'/>
+  <feature policy='require' name='mtrr'/>
+  <feature policy='require' name='sep'/>
+  <feature policy='require' name='apic'/>
+  <feature policy='require' name='cx8'/>
+  <feature policy='require' name='mce'/>
+  <feature policy='require' name='pae'/>
+  <feature policy='require' name='msr'/>
+  <feature policy='require' name='tsc'/>
+  <feature policy='require' name='de'/>
+  <feature policy='disable' name='vme'/>
+</cpu>
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 0000000..9559465
--- /dev/null
+++ b/tests/cputestdata/x86-host+guest,models,Penryn-result.xml
@@ -0,0 +1,13 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>Nehalem</model>
+  <feature policy='require' name='svm'/>
+  <feature policy='require' name='3dnowext'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='disable' name='popcnt'/>
+  <feature policy='disable' name='sse4.2'/>
+  <feature policy='disable' name='sse'/>
+</cpu>
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 0000000..b41863e
--- /dev/null
+++ b/tests/cputestdata/x86-host+guest,models,qemu64-result.xml
@@ -0,0 +1,14 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>qemu64</model>
+  <feature policy='require' name='lahf_lm'/>
+  <feature policy='require' name='3dnowext'/>
+  <feature policy='require' name='sse4.1'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='cx16'/>
+  <feature policy='require' name='ssse3'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='disable' name='sse'/>
+</cpu>
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 0000000..9559465
--- /dev/null
+++ b/tests/cputestdata/x86-host+guest,models-result.xml
@@ -0,0 +1,13 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>Nehalem</model>
+  <feature policy='require' name='svm'/>
+  <feature policy='require' name='3dnowext'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='disable' name='popcnt'/>
+  <feature policy='disable' name='sse4.2'/>
+  <feature policy='disable' name='sse'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host+guest-result.xml b/tests/cputestdata/x86-host+guest-result.xml
new file mode 100644
index 0000000..544a388
--- /dev/null
+++ b/tests/cputestdata/x86-host+guest-result.xml
@@ -0,0 +1,11 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <feature policy='require' name='svm'/>
+  <feature policy='require' name='3dnowext'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='disable' name='sse'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host+guest.xml b/tests/cputestdata/x86-host+guest.xml
new file mode 100644
index 0000000..c3fca87
--- /dev/null
+++ b/tests/cputestdata/x86-host+guest.xml
@@ -0,0 +1,17 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <topology sockets='2' cores='4' threads='1'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='disable' name='sse4.2'/>
+  <feature policy='disable' name='3dnow'/>
+  <feature policy='require' name='ssse3'/>
+  <feature policy='disable' name='vmx'/>
+  <feature policy='disable' name='ds_cpl'/>
+  <feature policy='disable' name='sse'/>
+  <feature policy='force' name='monitor'/>
+  <feature policy='force' name='pbe'/>
+  <feature policy='force' name='3dnowext'/>
+  <feature policy='force' name='svm'/>
+  <feature policy='forbid' name='popcnt'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host+min.xml b/tests/cputestdata/x86-host+min.xml
new file mode 100644
index 0000000..d22c7b6
--- /dev/null
+++ b/tests/cputestdata/x86-host+min.xml
@@ -0,0 +1,17 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='tm2'/>
+  <feature policy='require' name='est'/>
+  <feature policy='require' name='vmx'/>
+  <feature policy='require' name='ds_cpl'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='require' name='tm'/>
+  <feature policy='require' name='ht'/>
+  <feature policy='require' name='ss'/>
+  <feature policy='require' name='acpi'/>
+  <feature policy='require' name='ds'/>
+  <feature policy='require' name='vme'/>
+</cpu>
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 0000000..162685f
--- /dev/null
+++ b/tests/cputestdata/x86-host+nehalem-force-result.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>Nehalem</model>
+</cpu>
diff --git a/tests/cputestdata/x86-host+pentium3.xml b/tests/cputestdata/x86-host+pentium3.xml
new file mode 100644
index 0000000..d141d9e
--- /dev/null
+++ b/tests/cputestdata/x86-host+pentium3.xml
@@ -0,0 +1,27 @@
+<cpu match='exact'>
+  <model>pentium3</model>
+  <feature policy='require' name='lahf_lm'/>
+  <feature policy='require' name='lm'/>
+  <feature policy='require' name='nx'/>
+  <feature policy='require' name='syscall'/>
+  <feature policy='require' name='sse4.1'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='cx16'/>
+  <feature policy='require' name='ssse3'/>
+  <feature policy='require' name='tm2'/>
+  <feature policy='require' name='est'/>
+  <feature policy='require' name='vmx'/>
+  <feature policy='require' name='ds_cpl'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pni'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='require' name='tm'/>
+  <feature policy='require' name='ht'/>
+  <feature policy='require' name='ss'/>
+  <feature policy='require' name='sse2'/>
+  <feature policy='require' name='acpi'/>
+  <feature policy='require' name='ds'/>
+  <feature policy='require' name='clflush'/>
+  <feature policy='require' name='apic'/>
+</cpu>
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 0000000..e47933c
--- /dev/null
+++ b/tests/cputestdata/x86-host+strict-force-extra-result.xml
@@ -0,0 +1,19 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <feature policy='require' name='3dnow'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='tm2'/>
+  <feature policy='require' name='est'/>
+  <feature policy='require' name='vmx'/>
+  <feature policy='require' name='ds_cpl'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='require' name='tm'/>
+  <feature policy='require' name='ht'/>
+  <feature policy='require' name='ss'/>
+  <feature policy='require' name='acpi'/>
+  <feature policy='require' name='ds'/>
+  <feature policy='require' name='vme'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host-amd-fake.xml b/tests/cputestdata/x86-host-amd-fake.xml
new file mode 100644
index 0000000..c81990a
--- /dev/null
+++ b/tests/cputestdata/x86-host-amd-fake.xml
@@ -0,0 +1,20 @@
+<cpu>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <vendor>AMD</vendor>
+  <topology sockets='1' cores='4' threads='1'/>
+  <feature name='dca'/>
+  <feature name='xtpr'/>
+  <feature name='tm2'/>
+  <feature name='est'/>
+  <feature name='vmx'/>
+  <feature name='ds_cpl'/>
+  <feature name='monitor'/>
+  <feature name='pbe'/>
+  <feature name='tm'/>
+  <feature name='ht'/>
+  <feature name='ss'/>
+  <feature name='acpi'/>
+  <feature name='ds'/>
+  <feature name='vme'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host-amd.xml b/tests/cputestdata/x86-host-amd.xml
new file mode 100644
index 0000000..e662829
--- /dev/null
+++ b/tests/cputestdata/x86-host-amd.xml
@@ -0,0 +1,18 @@
+<cpu>
+  <arch>x86_64</arch>
+  <model>Opteron_G3</model>
+  <vendor>AMD</vendor>
+  <topology sockets='8' cores='1' threads='1'/>
+  <feature name='osvw'/>
+  <feature name='3dnowprefetch'/>
+  <feature name='cr8legacy'/>
+  <feature name='extapic'/>
+  <feature name='cmp_legacy'/>
+  <feature name='3dnow'/>
+  <feature name='3dnowext'/>
+  <feature name='pdpe1gb'/>
+  <feature name='fxsr_opt'/>
+  <feature name='mmxext'/>
+  <feature name='ht'/>
+  <feature name='vme'/>
+</cpu>
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 0000000..c2d8ddd
--- /dev/null
+++ b/tests/cputestdata/x86-host-better+pentium3,core2duo-result.xml
@@ -0,0 +1,21 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>core2duo</model>
+  <feature policy='require' name='lahf_lm'/>
+  <feature policy='require' name='popcnt'/>
+  <feature policy='require' name='sse4.2'/>
+  <feature policy='require' name='sse4.1'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='cx16'/>
+  <feature policy='require' name='tm2'/>
+  <feature policy='require' name='est'/>
+  <feature policy='require' name='vmx'/>
+  <feature policy='require' name='ds_cpl'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='require' name='tm'/>
+  <feature policy='require' name='ht'/>
+  <feature policy='require' name='ss'/>
+  <feature policy='require' name='acpi'/>
+  <feature policy='require' name='ds'/>
+</cpu>
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 0000000..6e246a8
--- /dev/null
+++ b/tests/cputestdata/x86-host-better+pentium3,pentium3-result.xml
@@ -0,0 +1,30 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>pentium3</model>
+  <feature policy='require' name='lahf_lm'/>
+  <feature policy='require' name='lm'/>
+  <feature policy='require' name='nx'/>
+  <feature policy='require' name='syscall'/>
+  <feature policy='require' name='popcnt'/>
+  <feature policy='require' name='sse4.2'/>
+  <feature policy='require' name='sse4.1'/>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='cx16'/>
+  <feature policy='require' name='ssse3'/>
+  <feature policy='require' name='tm2'/>
+  <feature policy='require' name='est'/>
+  <feature policy='require' name='vmx'/>
+  <feature policy='require' name='ds_cpl'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pni'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='require' name='tm'/>
+  <feature policy='require' name='ht'/>
+  <feature policy='require' name='ss'/>
+  <feature policy='require' name='sse2'/>
+  <feature policy='require' name='acpi'/>
+  <feature policy='require' name='ds'/>
+  <feature policy='require' name='clflush'/>
+  <feature policy='require' name='apic'/>
+</cpu>
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 0000000..b918363
--- /dev/null
+++ b/tests/cputestdata/x86-host-better+pentium3-result.xml
@@ -0,0 +1,18 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>Nehalem</model>
+  <feature policy='require' name='dca'/>
+  <feature policy='require' name='xtpr'/>
+  <feature policy='require' name='tm2'/>
+  <feature policy='require' name='est'/>
+  <feature policy='require' name='vmx'/>
+  <feature policy='require' name='ds_cpl'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='require' name='tm'/>
+  <feature policy='require' name='ht'/>
+  <feature policy='require' name='ss'/>
+  <feature policy='require' name='acpi'/>
+  <feature policy='require' name='ds'/>
+  <feature policy='require' name='vme'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host-better.xml b/tests/cputestdata/x86-host-better.xml
new file mode 100644
index 0000000..8340f11
--- /dev/null
+++ b/tests/cputestdata/x86-host-better.xml
@@ -0,0 +1,20 @@
+<cpu>
+  <arch>x86_64</arch>
+  <model>Nehalem</model>
+  <vendor>Intel</vendor>
+  <topology sockets='2' cores='4' threads='1'/>
+  <feature name='dca'/>
+  <feature name='xtpr'/>
+  <feature name='tm2'/>
+  <feature name='est'/>
+  <feature name='vmx'/>
+  <feature name='ds_cpl'/>
+  <feature name='monitor'/>
+  <feature name='pbe'/>
+  <feature name='tm'/>
+  <feature name='ht'/>
+  <feature name='ss'/>
+  <feature name='acpi'/>
+  <feature name='ds'/>
+  <feature name='vme'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host-incomp-arch.xml b/tests/cputestdata/x86-host-incomp-arch.xml
new file mode 100644
index 0000000..f7c064e
--- /dev/null
+++ b/tests/cputestdata/x86-host-incomp-arch.xml
@@ -0,0 +1,6 @@
+<cpu>
+  <arch>ia64</arch>
+  <model>Penryn</model>
+  <vendor>Intel</vendor>
+  <topology sockets='1' cores='4' threads='1'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host-no-vendor.xml b/tests/cputestdata/x86-host-no-vendor.xml
new file mode 100644
index 0000000..efb0a44
--- /dev/null
+++ b/tests/cputestdata/x86-host-no-vendor.xml
@@ -0,0 +1,19 @@
+<cpu>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <topology sockets='2' cores='4' threads='1'/>
+  <feature name='dca'/>
+  <feature name='xtpr'/>
+  <feature name='tm2'/>
+  <feature name='est'/>
+  <feature name='vmx'/>
+  <feature name='ds_cpl'/>
+  <feature name='monitor'/>
+  <feature name='pbe'/>
+  <feature name='tm'/>
+  <feature name='ht'/>
+  <feature name='ss'/>
+  <feature name='acpi'/>
+  <feature name='ds'/>
+  <feature name='vme'/>
+</cpu>
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 0000000..036177a
--- /dev/null
+++ b/tests/cputestdata/x86-host-worse+guest-result.xml
@@ -0,0 +1,9 @@
+<cpu match='exact'>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <feature policy='require' name='svm'/>
+  <feature policy='require' name='3dnowext'/>
+  <feature policy='require' name='monitor'/>
+  <feature policy='require' name='pbe'/>
+  <feature policy='disable' name='sse'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host-worse.xml b/tests/cputestdata/x86-host-worse.xml
new file mode 100644
index 0000000..dcf4670
--- /dev/null
+++ b/tests/cputestdata/x86-host-worse.xml
@@ -0,0 +1,6 @@
+<cpu>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <vendor>Intel</vendor>
+  <topology sockets='2' cores='4' threads='1'/>
+</cpu>
diff --git a/tests/cputestdata/x86-host.xml b/tests/cputestdata/x86-host.xml
new file mode 100644
index 0000000..f1c163d
--- /dev/null
+++ b/tests/cputestdata/x86-host.xml
@@ -0,0 +1,20 @@
+<cpu>
+  <arch>x86_64</arch>
+  <model>Penryn</model>
+  <vendor>Intel</vendor>
+  <topology sockets='2' cores='4' threads='1'/>
+  <feature name='dca'/>
+  <feature name='xtpr'/>
+  <feature name='tm2'/>
+  <feature name='est'/>
+  <feature name='vmx'/>
+  <feature name='ds_cpl'/>
+  <feature name='monitor'/>
+  <feature name='pbe'/>
+  <feature name='tm'/>
+  <feature name='ht'/>
+  <feature name='ss'/>
+  <feature name='acpi'/>
+  <feature name='ds'/>
+  <feature name='vme'/>
+</cpu>
diff --git a/tests/cputestdata/x86-min.xml b/tests/cputestdata/x86-min.xml
new file mode 100644
index 0000000..795645d
--- /dev/null
+++ b/tests/cputestdata/x86-min.xml
@@ -0,0 +1,3 @@
+<cpu match='minimum'>
+  <model>Penryn</model>
+</cpu>
diff --git a/tests/cputestdata/x86-nehalem-force.xml b/tests/cputestdata/x86-nehalem-force.xml
new file mode 100644
index 0000000..4084b87
--- /dev/null
+++ b/tests/cputestdata/x86-nehalem-force.xml
@@ -0,0 +1,6 @@
+<cpu match='exact'>
+  <model>Penryn</model>
+  <feature name='popcnt' policy='force'/>
+  <feature name='sse4.2' policy='force'/>
+</cpu>
+
diff --git a/tests/cputestdata/x86-pentium3-amd.xml b/tests/cputestdata/x86-pentium3-amd.xml
new file mode 100644
index 0000000..5fd73e4
--- /dev/null
+++ b/tests/cputestdata/x86-pentium3-amd.xml
@@ -0,0 +1,4 @@
+<cpu match='exact'>
+  <model>pentium3</model>
+  <vendor>AMD</vendor>
+</cpu>
diff --git a/tests/cputestdata/x86-pentium3.xml b/tests/cputestdata/x86-pentium3.xml
new file mode 100644
index 0000000..187e83d
--- /dev/null
+++ b/tests/cputestdata/x86-pentium3.xml
@@ -0,0 +1,3 @@
+<cpu match='minimum'>
+  <model>pentium3</model>
+</cpu>
diff --git a/tests/cputestdata/x86-strict-disable.xml b/tests/cputestdata/x86-strict-disable.xml
new file mode 100644
index 0000000..f2bac1a
--- /dev/null
+++ b/tests/cputestdata/x86-strict-disable.xml
@@ -0,0 +1,18 @@
+<cpu match='strict'>
+  <model>Penryn</model>
+  <feature name='dca' policy='require'/>
+  <feature name='xtpr' policy='require'/>
+  <feature name='tm2' policy='require'/>
+  <feature name='est' policy='require'/>
+  <feature name='vmx' policy='require'/>
+  <feature name='ds_cpl' policy='require'/>
+  <feature name='monitor' policy='disable'/>
+  <feature name='pbe' policy='require'/>
+  <feature name='tm' policy='require'/>
+  <feature name='ht' policy='require'/>
+  <feature name='ss' policy='disable'/>
+  <feature name='acpi' policy='require'/>
+  <feature name='ds' policy='require'/>
+  <feature name='vme' policy='require'/>
+  <feature name='3dnow' policy='disable'/>
+</cpu>
diff --git a/tests/cputestdata/x86-strict-force-extra.xml b/tests/cputestdata/x86-strict-force-extra.xml
new file mode 100644
index 0000000..dbae38c
--- /dev/null
+++ b/tests/cputestdata/x86-strict-force-extra.xml
@@ -0,0 +1,18 @@
+<cpu match='strict'>
+  <model>Penryn</model>
+  <feature name='dca' policy='require'/>
+  <feature name='xtpr' policy='require'/>
+  <feature name='tm2' policy='require'/>
+  <feature name='est' policy='require'/>
+  <feature name='vmx' policy='require'/>
+  <feature name='ds_cpl' policy='require'/>
+  <feature name='monitor' policy='require'/>
+  <feature name='pbe' policy='require'/>
+  <feature name='tm' policy='require'/>
+  <feature name='ht' policy='require'/>
+  <feature name='ss' policy='require'/>
+  <feature name='acpi' policy='require'/>
+  <feature name='ds' policy='require'/>
+  <feature name='vme' policy='require'/>
+  <feature name='3dnow' policy='force'/>
+</cpu>
diff --git a/tests/cputestdata/x86-strict-full.xml b/tests/cputestdata/x86-strict-full.xml
new file mode 100644
index 0000000..2dbe250
--- /dev/null
+++ b/tests/cputestdata/x86-strict-full.xml
@@ -0,0 +1,17 @@
+<cpu match='strict'>
+  <model>Penryn</model>
+  <feature name='dca' policy='require'/>
+  <feature name='xtpr' policy='require'/>
+  <feature name='tm2' policy='require'/>
+  <feature name='est' policy='require'/>
+  <feature name='vmx' policy='require'/>
+  <feature name='ds_cpl' policy='require'/>
+  <feature name='monitor' policy='require'/>
+  <feature name='pbe' policy='require'/>
+  <feature name='tm' policy='require'/>
+  <feature name='ht' policy='require'/>
+  <feature name='ss' policy='require'/>
+  <feature name='acpi' policy='require'/>
+  <feature name='ds' policy='require'/>
+  <feature name='vme' policy='require'/>
+</cpu>
diff --git a/tests/cputestdata/x86-strict.xml b/tests/cputestdata/x86-strict.xml
new file mode 100644
index 0000000..a64c262
--- /dev/null
+++ b/tests/cputestdata/x86-strict.xml
@@ -0,0 +1,3 @@
+<cpu match='strict'>
+  <model>Penryn</model>
+</cpu>
-- 
1.7.3.2




More information about the libvir-list mailing list