On Tue, Jun 07, 2016 at 20:07:32 +0200, Ján Tomko wrote:
Instead of calling xmllint via a shell script, use our
virXMLValidator
API to do it directly via libxml.
---
.gitignore | 1 -
tests/Makefile.am | 28 ++----
tests/capabilityschematest | 9 --
tests/domaincapsschematest | 10 ---
tests/domainschematest | 14 ---
tests/domainsnapshotschematest | 9 --
tests/interfaceschematest | 9 --
tests/networkschematest | 9 --
tests/nodedevschematest | 9 --
tests/nwfilterschematest | 9 --
tests/schematestutils.sh | 47 ----------
tests/secretschematest | 9 --
tests/storagepoolschematest | 9 --
tests/storagevolschematest | 9 --
tests/virschematest.c | 190 +++++++++++++++++++++++++++++++++++++++++
15 files changed, 196 insertions(+), 175 deletions(-)
create mode 100644 tests/virschematest.c
[...]
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0c4ad3c..3840457 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -88,15 +88,12 @@ EXTRA_DIST = \
bhyvexml2argvdata \
bhyvexml2xmloutdata \
capabilityschemadata \
- capabilityschematest \
commanddata \
cputestdata \
domaincapsschemadata \
- domaincapsschematest \
domainconfdata \
domainschemadata \
domainschematest \
domainschematest was removed too so that line needs to be deleted
- domainsnapshotschematest \
domainsnapshotxml2xmlin \
domainsnapshotxml2xmlout \
fchostdata \
diff --git a/tests/virschematest.c b/tests/virschematest.c
new file mode 100644
index 0000000..11d5375
--- /dev/null
+++ b/tests/virschematest.c
@@ -0,0 +1,190 @@
[...]
+static int
+testSchemaDir(const char *schema,
+ virXMLValidatorPtr validator,
+ const char *dir_path)
+{
+ DIR *dir = NULL;
+ struct dirent *ent;
+ int ret = 0;
+ int rc;
+ char *test_name;
At least this needs to be initialized as it's possible to jump to
cleanup if virAsprintf of xml_path fails in the first iteration.
+ char *xml_path;
+ struct testSchemaData data = {
+ .validator = validator,
+ };
+
+ if (!(dir = opendir(dir_path))) {
+ virReportSystemError(errno,
+ "Failed to opendir path '%s'",
+ dir_path);
+ return -1;
+ }
+
+ while ((rc = virDirRead(dir, &ent, dir_path)) > 0) {
+ if (!virFileHasSuffix(ent->d_name, ".xml"))
+ continue;
+
+ if (virAsprintf(&xml_path, "%s/%s", dir_path, ent->d_name) <
0)
+ goto cleanup;
+
+ if (virAsprintf(&test_name, "Checking %s against %s",
+ ent->d_name, schema) < 0)
+ goto cleanup;
+
+ data.xml_path = xml_path;
+ if (virtTestRun(test_name, testSchemaFile, &data) < 0)
+ ret = -1;
+
+ VIR_FREE(test_name);
+ VIR_FREE(xml_path);
+ }
+
+ if (rc < 0)
+ ret = -1;
+
+ cleanup:
+ VIR_FREE(test_name);
+ VIR_FREE(xml_path);
+ closedir(dir);
+ return ret;
+}
+
+
+static int
+testSchemaDirs(const char *schema, ...)
+{
+ virXMLValidatorPtr validator;
+ va_list args;
+ int ret = 0;
+ char *schema_path = NULL;
+ char *dir_path = NULL;
+ const char *dir;
+
+ if (virAsprintf(&schema_path, "%s/docs/schemas/%s", abs_topsrcdir,
schema) < 0)
+ return -1;
+
+ if (!(validator = virXMLValidatorInit(schema_path)))
+ goto cleanup;
This may jump to cleanup before, ...
+
+ va_start(args, schema);
calling va_start ...
+ while ((dir = va_arg(args, char *))) {
+ if (virAsprintf(&dir_path, "%s/%s", abs_srcdir, dir) < 0) {
+ ret = -1;
+ goto cleanup;
+ }
+ if (testSchemaDir(schema, validator, dir) < 0)
+ ret = -1;
+ VIR_FREE(dir_path);
+ }
+
+ cleanup:
+ virXMLValidatorFree(validator);
+ VIR_FREE(schema_path);
+ VIR_FREE(dir_path);
+ va_end(args);
... and call va_end.
+ return ret;
+}
+
+
+static int
+mymain(void)
+{
+ int ret = 0;
+
+#define DO_TEST(schema, ...) \
+ do { \
+ if (testSchemaDirs(schema, __VA_ARGS__) < 0) \
+ ret = -1; \
+ } while (0) \
+
+ DO_TEST("capability.rng", "capabilityschemadata",
"xencapsdata", NULL);
You can hide the 'NULL' sentinel inside the macro after __VA_ARGS__
ACK with the problems fixed.