It may happen that a developer wants to run just a specific
subset of tests:
tests $ VIR_TEST_RANGE=22 ../run ./virschematest
This now fails miserably:
==6840== Invalid read of size 8
==6840== at 0x4F397C0: virXMLValidatorValidate (virxml.c:1216)
==6840== by 0x402B72: testSchemaFile (virschematest.c:53)
==6840== by 0x403737: virTestRun (testutils.c:180)
==6840== by 0x402CF5: testSchemaDir (virschematest.c:98)
==6840== by 0x402EB1: testSchemaDirs (virschematest.c:131)
==6840== by 0x40314D: mymain (virschematest.c:194)
==6840== by 0x4051AF: virTestMain (testutils.c:982)
==6840== by 0x4035A9: main (virschematest.c:217)
==6840== Address 0x10 is not stack'd, malloc'd or (recently) free'd
Problem is, we are trying to do two types of tests here: validate
RNG schema itself, and validate XML files against RNG schemas.
And the latter tries to re-use a resource allocated in the
former. Therefore if the former is skipped (due to
VIR_TEST_RANGE) we have to allocate the resource manually.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tests/virschematest.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/tests/virschematest.c b/tests/virschematest.c
index c9cc314..1b55dad 100644
--- a/tests/virschematest.c
+++ b/tests/virschematest.c
@@ -38,6 +38,14 @@ struct testSchemaData {
const char *xml_path;
};
+static char *
+testGetSchemaPath(const char *schema)
+{
+ char *schema_path;
+ ignore_value(virAsprintf(&schema_path, "%s/docs/schemas/%s",
+ abs_topsrcdir, schema));
+ return schema_path;
+}
static int
testSchemaFile(const void *args)
@@ -120,6 +128,20 @@ testSchemaDirs(const char *schema, virXMLValidatorPtr validator,
...)
int ret = 0;
char *dir_path = NULL;
const char *dir;
+ bool freeValidator = false;
+
+ if (!validator) {
+ char *schema_path = testGetSchemaPath(schema);
+
+ if (!schema_path ||
+ !(validator = virXMLValidatorInit(schema_path))) {
+ VIR_FREE(schema_path);
+ goto cleanup;
+ }
+
+ VIR_FREE(schema_path);
+ freeValidator = true;
+ }
va_start(args, validator);
@@ -134,6 +156,8 @@ testSchemaDirs(const char *schema, virXMLValidatorPtr validator, ...)
}
cleanup:
+ if (freeValidator)
+ virXMLValidatorFree(validator);
VIR_FREE(dir_path);
va_end(args);
return ret;
@@ -152,8 +176,7 @@ testSchemaGrammar(const void *opaque)
char *schema_path;
int ret = -1;
- if (virAsprintf(&schema_path, "%s/docs/schemas/%s",
- abs_topsrcdir, data->schema) < 0)
+ if (!(schema_path = testGetSchemaPath(data->schema)))
return -1;
if (!(data->validator = virXMLValidatorInit(schema_path)))
--
2.8.4