Several tests fail when run as root on a Xen-dom0-system, since
virInitialize() then succeeds to open /proc/xen/privcmd and returns the
actual supported features instead of the faked one when calling
xenHypervisorMakeCapabilitiesInternal(). Since Xen-4.1 supports
additional features like "hap" and "viridian", the xencapstest fails.
For now disable those 4 tests and return EXIT_AM_SKIP for them.
A better fix would probably just check for the minimum required features
instead of comparing the two XML documents for bit-equivalence.
mergeTestRun() is implemented locally instead of globally in
testutils.c, since the merge strategy for compound tests heavily depends
on the specific test cases being merged.
Signed-off-by: Philipp Hahn <hahn(a)univention.de>
---
tests/xencapstest.c | 95 +++++++++++++++++++++++++++++++++++----------------
1 files changed, 65 insertions(+), 30 deletions(-)
diff --git a/tests/xencapstest.c b/tests/xencapstest.c
index 9c1eba4..0bc830d 100644
--- a/tests/xencapstest.c
+++ b/tests/xencapstest.c
@@ -2,6 +2,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <string.h>
#include <unistd.h>
@@ -11,6 +12,31 @@
#include "xen/xen_hypervisor.h"
#include "virfile.h"
+/* When building as root in a Xen-4.1-dom0, the Hypervisor is accessible and
+ * reports additional features (hap, viridian), which breaks all HVM tests,
+ * since the XML-documents are compared for bit-equivalence. */
+static bool
+skip_if_root(void)
+{
+ if (getuid())
+ return false;
+ if (getenv("FAKEROOTKEY"))
+ return false;
+ return true;
+}
+
+static int
+mergeTestRun(int ret, int tr)
+{
+ switch (tr) {
+ default:
+ return -1;
+ case 0:
+ case EXIT_AM_SKIP:
+ return ret;
+ }
+}
+
static int
testCompareFiles(const char *hostmachine, const char *xml_rel,
const char *cpuinfo_rel, const char *capabilities_rel)
@@ -81,6 +107,8 @@ static int testXeni686PAE(const void *data ATTRIBUTE_UNUSED) {
}
static int testXeni686PAEHVM(const void *data ATTRIBUTE_UNUSED) {
+ if (skip_if_root())
+ return EXIT_AM_SKIP;
return testCompareFiles("i686",
"xencapsdata/xen-i686-pae-hvm.xml",
"xencapsdata/xen-i686-pae-hvm.cpuinfo",
@@ -105,6 +133,8 @@ static int testXenx86_64(const void *data ATTRIBUTE_UNUSED) {
"xencapsdata/xen-x86_64.caps");
}
static int testXenx86_64HVM(const void *data ATTRIBUTE_UNUSED) {
+ if (skip_if_root())
+ return EXIT_AM_SKIP;
return testCompareFiles("x86_64",
"xencapsdata/xen-x86_64-hvm.xml",
"xencapsdata/xen-x86_64-hvm.cpuinfo",
@@ -125,12 +155,16 @@ static int testXenia64BE(const void *data ATTRIBUTE_UNUSED) {
}
static int testXenia64HVM(const void *data ATTRIBUTE_UNUSED) {
+ if (skip_if_root())
+ return EXIT_AM_SKIP;
return testCompareFiles("ia64",
"xencapsdata/xen-ia64-hvm.xml",
"xencapsdata/xen-ia64-hvm.cpuinfo",
"xencapsdata/xen-ia64-hvm.caps");
}
static int testXenia64BEHVM(const void *data ATTRIBUTE_UNUSED) {
+ if (skip_if_root())
+ return EXIT_AM_SKIP;
return testCompareFiles("ia64",
"xencapsdata/xen-ia64-be-hvm.xml",
"xencapsdata/xen-ia64-be-hvm.cpuinfo",
@@ -148,17 +182,18 @@ static int testXenppc64(const void *data ATTRIBUTE_UNUSED) {
static int
mymain(void)
{
+ int tr;
int ret = 0;
virInitialize();
- if (virtTestRun("Capabilities for i686, no PAE, no HVM",
- 1, testXeni686, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for i686, no PAE, no HVM",
+ 1, testXeni686, NULL);
+ ret = mergeTestRun(ret, tr);
- if (virtTestRun("Capabilities for i686, PAE, no HVM",
- 1, testXeni686PAE, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for i686, PAE, no HVM",
+ 1, testXeni686PAE, NULL);
+ ret = mergeTestRun(ret, tr);
/* No PAE + HVM is non-sensical - all VMX capable
CPUs have PAE */
@@ -167,37 +202,37 @@ mymain(void)
ret = -1;
*/
- if (virtTestRun("Capabilities for i686, PAE, HVM",
- 1, testXeni686PAEHVM, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for i686, PAE, HVM",
+ 1, testXeni686PAEHVM, NULL);
+ ret = mergeTestRun(ret, tr);
- if (virtTestRun("Capabilities for x86_64, no HVM",
- 1, testXenx86_64, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for x86_64, no HVM",
+ 1, testXenx86_64, NULL);
+ ret = mergeTestRun(ret, tr);
- if (virtTestRun("Capabilities for x86_64, HVM",
- 1, testXenx86_64HVM, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for x86_64, HVM",
+ 1, testXenx86_64HVM, NULL);
+ ret = mergeTestRun(ret, tr);
- if (virtTestRun("Capabilities for ia64, no HVM, LE",
- 1, testXenia64, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for ia64, no HVM, LE",
+ 1, testXenia64, NULL);
+ ret = mergeTestRun(ret, tr);
- if (virtTestRun("Capabilities for ia64, HVM, LE",
- 1, testXenia64HVM, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for ia64, HVM, LE",
+ 1, testXenia64HVM, NULL);
+ ret = mergeTestRun(ret, tr);
- if (virtTestRun("Capabilities for ia64, no HVM, BE",
- 1, testXenia64BE, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for ia64, no HVM, BE",
+ 1, testXenia64BE, NULL);
+ ret = mergeTestRun(ret, tr);
- if (virtTestRun("Capabilities for ia64, HVM, BE",
- 1, testXenia64BEHVM, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for ia64, HVM, BE",
+ 1, testXenia64BEHVM, NULL);
+ ret = mergeTestRun(ret, tr);
- if (virtTestRun("Capabilities for ppc64",
- 1, testXenppc64, NULL) != 0)
- ret = -1;
+ tr = virtTestRun("Capabilities for ppc64",
+ 1, testXenppc64, NULL);
+ ret = mergeTestRun(ret, tr);
return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
--
1.7.1