[libvirt] [PATCHv2 5/5] Introduce virschematest
Peter Krempa
pkrempa at redhat.com
Wed Jun 8 07:58:50 UTC 2016
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.
More information about the libvir-list
mailing list