
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.