Refactor the code so that we pass in the repeated 'schema' and 'debug' arguments via a new struct testQEMUSchemaValidateCtxt. This will simplify adding new parameters in the future. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- tests/testutilsqemuschema.c | 152 ++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 76 deletions(-) diff --git a/tests/testutilsqemuschema.c b/tests/testutilsqemuschema.c index a43cbe2f91..b449171d15 100644 --- a/tests/testutilsqemuschema.c +++ b/tests/testutilsqemuschema.c @@ -21,16 +21,21 @@ #include "testutilsqemuschema.h" #include "qemu/qemu_qapi.h" +struct testQEMUSchemaValidateCtxt { + virHashTablePtr schema; + virBufferPtr debug; +}; + + static int testQEMUSchemaValidateRecurse(virJSONValuePtr obj, virJSONValuePtr root, - virHashTablePtr schema, - virBufferPtr debug); + struct testQEMUSchemaValidateCtxt *ctxt); static int testQEMUSchemaValidateBuiltin(virJSONValuePtr obj, virJSONValuePtr root, - virBufferPtr debug) + struct testQEMUSchemaValidateCtxt *ctxt) { const char *t = virJSONValueObjectGetString(root, "json-type"); const char *s = NULL; @@ -81,17 +86,16 @@ testQEMUSchemaValidateBuiltin(virJSONValuePtr obj, cleanup: if (ret == 0) - virBufferAsprintf(debug, "'%s': OK", s); + virBufferAsprintf(ctxt->debug, "'%s': OK", s); else - virBufferAsprintf(debug, "ERROR: expected type '%s', actual type %d", + virBufferAsprintf(ctxt->debug, "ERROR: expected type '%s', actual type %d", t, virJSONValueGetType(obj)); return ret; } struct testQEMUSchemaValidateObjectMemberData { virJSONValuePtr rootmembers; - virHashTablePtr schema; - virBufferPtr debug; + struct testQEMUSchemaValidateCtxt *ctxt; bool missingMandatory; }; @@ -128,27 +132,26 @@ testQEMUSchemaValidateObjectMember(const char *key, virJSONValuePtr keyschema = NULL; int rc; - virBufferStrcat(data->debug, key, ": ", NULL); + virBufferStrcat(data->ctxt->debug, key, ": ", NULL); /* lookup 'member' entry for key */ if (!(keymember = testQEMUSchemaStealObjectMemberByName(key, data->rootmembers))) { - virBufferAddLit(data->debug, "ERROR: attribute not in schema\n"); + virBufferAddLit(data->ctxt->debug, "ERROR: attribute not in schema\n"); return -1; } /* lookup schema entry for keytype */ if (!(keytype = virJSONValueObjectGetString(keymember, "type")) || - !(keyschema = virHashLookup(data->schema, keytype))) { - virBufferAsprintf(data->debug, "ERROR: can't find schema for type '%s'\n", + !(keyschema = virHashLookup(data->ctxt->schema, keytype))) { + virBufferAsprintf(data->ctxt->debug, "ERROR: can't find schema for type '%s'\n", NULLSTR(keytype)); return -2; } /* recurse */ - rc = testQEMUSchemaValidateRecurse(value, keyschema, data->schema, - data->debug); + rc = testQEMUSchemaValidateRecurse(value, keyschema, data->ctxt); - virBufferAddLit(data->debug, "\n"); + virBufferAddLit(data->ctxt->debug, "\n"); return rc; } @@ -181,8 +184,7 @@ static int testQEMUSchemaValidateObjectMergeVariant(virJSONValuePtr root, const char *variantfield, const char *variantname, - virHashTablePtr schema, - virBufferPtr debug) + struct testQEMUSchemaValidateCtxt *ctxt) { size_t i; g_autoptr(virJSONValue) variants = NULL; @@ -193,7 +195,7 @@ testQEMUSchemaValidateObjectMergeVariant(virJSONValuePtr root, const char *varianttype = NULL; if (!(variants = virJSONValueObjectStealArray(root, "variants"))) { - virBufferAddLit(debug, "ERROR: missing 'variants' in schema\n"); + virBufferAddLit(ctxt->debug, "ERROR: missing 'variants' in schema\n"); return -2; } @@ -208,14 +210,14 @@ testQEMUSchemaValidateObjectMergeVariant(virJSONValuePtr root, } if (!varianttype) { - virBufferAsprintf(debug, "ERROR: variant '%s' for discriminator '%s' not found\n", + virBufferAsprintf(ctxt->debug, "ERROR: variant '%s' for discriminator '%s' not found\n", variantname, variantfield); return -1; } - if (!(variantschema = virHashLookup(schema, varianttype)) || + if (!(variantschema = virHashLookup(ctxt->schema, varianttype)) || !(variantschemamembers = virJSONValueObjectGetArray(variantschema, "members"))) { - virBufferAsprintf(debug, + virBufferAsprintf(ctxt->debug, "ERROR: missing schema or schema members for variant '%s'(%s)\n", variantname, varianttype); return -2; @@ -241,7 +243,7 @@ testQEMUSchemaValidateObjectMandatoryMember(size_t pos G_GNUC_UNUSED, struct testQEMUSchemaValidateObjectMemberData *data = opaque; if (virJSONValueObjectHasKey(item, "default") != 1) { - virBufferAsprintf(data->debug, "ERROR: missing mandatory attribute '%s'\n", + virBufferAsprintf(data->ctxt->debug, "ERROR: missing mandatory attribute '%s'\n", NULLSTR(virJSONValueObjectGetString(item, "name"))); data->missingMandatory = true; } @@ -253,22 +255,20 @@ testQEMUSchemaValidateObjectMandatoryMember(size_t pos G_GNUC_UNUSED, static int testQEMUSchemaValidateObject(virJSONValuePtr obj, virJSONValuePtr root, - virHashTablePtr schema, - virBufferPtr debug) + struct testQEMUSchemaValidateCtxt *ctxt) { - struct testQEMUSchemaValidateObjectMemberData data = { NULL, schema, - debug, false }; + struct testQEMUSchemaValidateObjectMemberData data = { NULL, ctxt, false }; g_autoptr(virJSONValue) localroot = NULL; const char *variantfield; const char *variantname; if (virJSONValueGetType(obj) != VIR_JSON_TYPE_OBJECT) { - virBufferAddLit(debug, "ERROR: not an object"); + virBufferAddLit(ctxt->debug, "ERROR: not an object"); return -1; } - virBufferAddLit(debug, "{\n"); - virBufferAdjustIndent(debug, 3); + virBufferAddLit(ctxt->debug, "{\n"); + virBufferAdjustIndent(ctxt->debug, 3); /* copy schema */ if (!(localroot = virJSONValueCopy(root))) @@ -277,14 +277,13 @@ testQEMUSchemaValidateObject(virJSONValuePtr obj, /* remove variant */ if ((variantfield = virJSONValueObjectGetString(localroot, "tag"))) { if (!(variantname = virJSONValueObjectGetString(obj, variantfield))) { - virBufferAsprintf(debug, "ERROR: missing variant discriminator attribute '%s'\n", + virBufferAsprintf(ctxt->debug, "ERROR: missing variant discriminator attribute '%s'\n", variantfield); return -1; } if (testQEMUSchemaValidateObjectMergeVariant(localroot, variantfield, - variantname, - schema, debug) < 0) + variantname, ctxt) < 0) return -1; } @@ -306,8 +305,8 @@ testQEMUSchemaValidateObject(virJSONValuePtr obj, if (data.missingMandatory) return -1; - virBufferAdjustIndent(debug, -3); - virBufferAddLit(debug, "} OK"); + virBufferAdjustIndent(ctxt->debug, -3); + virBufferAddLit(ctxt->debug, "} OK"); return 0; } @@ -315,7 +314,7 @@ testQEMUSchemaValidateObject(virJSONValuePtr obj, static int testQEMUSchemaValidateEnum(virJSONValuePtr obj, virJSONValuePtr root, - virBufferPtr debug) + struct testQEMUSchemaValidateCtxt *ctxt) { const char *objstr; virJSONValuePtr values = NULL; @@ -323,14 +322,14 @@ testQEMUSchemaValidateEnum(virJSONValuePtr obj, size_t i; if (virJSONValueGetType(obj) != VIR_JSON_TYPE_STRING) { - virBufferAddLit(debug, "ERROR: not a string"); + virBufferAddLit(ctxt->debug, "ERROR: not a string"); return -1; } objstr = virJSONValueGetString(obj); if (!(values = virJSONValueObjectGetArray(root, "values"))) { - virBufferAsprintf(debug, "ERROR: missing enum values in schema '%s'", + virBufferAsprintf(ctxt->debug, "ERROR: missing enum values in schema '%s'", NULLSTR(virJSONValueObjectGetString(root, "name"))); return -2; } @@ -339,12 +338,12 @@ testQEMUSchemaValidateEnum(virJSONValuePtr obj, value = virJSONValueArrayGet(values, i); if (STREQ_NULLABLE(objstr, virJSONValueGetString(value))) { - virBufferAsprintf(debug, "'%s' OK", NULLSTR(objstr)); + virBufferAsprintf(ctxt->debug, "'%s' OK", NULLSTR(objstr)); return 0; } } - virBufferAsprintf(debug, "ERROR: enum value '%s' is not in schema", + virBufferAsprintf(ctxt->debug, "ERROR: enum value '%s' is not in schema", NULLSTR(objstr)); return -1; } @@ -353,8 +352,7 @@ testQEMUSchemaValidateEnum(virJSONValuePtr obj, static int testQEMUSchemaValidateArray(virJSONValuePtr objs, virJSONValuePtr root, - virHashTablePtr schema, - virBufferPtr debug) + struct testQEMUSchemaValidateCtxt *ctxt) { const char *elemtypename = virJSONValueObjectGetString(root, "element-type"); virJSONValuePtr elementschema; @@ -362,29 +360,29 @@ testQEMUSchemaValidateArray(virJSONValuePtr objs, size_t i; if (virJSONValueGetType(objs) != VIR_JSON_TYPE_ARRAY) { - virBufferAddLit(debug, "ERROR: not an array\n"); + virBufferAddLit(ctxt->debug, "ERROR: not an array\n"); return -1; } if (!elemtypename || - !(elementschema = virHashLookup(schema, elemtypename))) { - virBufferAsprintf(debug, "ERROR: missing schema for array element type '%s'", + !(elementschema = virHashLookup(ctxt->schema, elemtypename))) { + virBufferAsprintf(ctxt->debug, "ERROR: missing schema for array element type '%s'", NULLSTR(elemtypename)); return -2; } - virBufferAddLit(debug, "[\n"); - virBufferAdjustIndent(debug, 3); + virBufferAddLit(ctxt->debug, "[\n"); + virBufferAdjustIndent(ctxt->debug, 3); for (i = 0; i < virJSONValueArraySize(objs); i++) { obj = virJSONValueArrayGet(objs, i); - if (testQEMUSchemaValidateRecurse(obj, elementschema, schema, debug) < 0) + if (testQEMUSchemaValidateRecurse(obj, elementschema, ctxt) < 0) return -1; - virBufferAddLit(debug, ",\n"); + virBufferAddLit(ctxt->debug, ",\n"); } - virBufferAddLit(debug, "] OK"); - virBufferAdjustIndent(debug, -3); + virBufferAddLit(ctxt->debug, "] OK"); + virBufferAdjustIndent(ctxt->debug, -3); return 0; } @@ -392,8 +390,7 @@ testQEMUSchemaValidateArray(virJSONValuePtr objs, static int testQEMUSchemaValidateAlternate(virJSONValuePtr obj, virJSONValuePtr root, - virHashTablePtr schema, - virBufferPtr debug) + struct testQEMUSchemaValidateCtxt *ctxt) { virJSONValuePtr members; virJSONValuePtr member; @@ -405,44 +402,44 @@ testQEMUSchemaValidateAlternate(virJSONValuePtr obj, int rc; if (!(members = virJSONValueObjectGetArray(root, "members"))) { - virBufferAddLit(debug, "ERROR: missing 'members' for alternate schema"); + virBufferAddLit(ctxt->debug, "ERROR: missing 'members' for alternate schema"); return -2; } - virBufferAddLit(debug, "(\n"); - virBufferAdjustIndent(debug, 3); - indent = virBufferGetIndent(debug); + virBufferAddLit(ctxt->debug, "(\n"); + virBufferAdjustIndent(ctxt->debug, 3); + indent = virBufferGetIndent(ctxt->debug); n = virJSONValueArraySize(members); for (i = 0; i < n; i++) { membertype = NULL; /* P != NP */ - virBufferAsprintf(debug, "(alternate %zu/%zu)\n", i + 1, n); - virBufferAdjustIndent(debug, 3); + virBufferAsprintf(ctxt->debug, "(alternate %zu/%zu)\n", i + 1, n); + virBufferAdjustIndent(ctxt->debug, 3); if (!(member = virJSONValueArrayGet(members, i)) || !(membertype = virJSONValueObjectGetString(member, "type")) || - !(memberschema = virHashLookup(schema, membertype))) { - virBufferAsprintf(debug, "ERROR: missing schema for alternate type '%s'", + !(memberschema = virHashLookup(ctxt->schema, membertype))) { + virBufferAsprintf(ctxt->debug, "ERROR: missing schema for alternate type '%s'", NULLSTR(membertype)); return -2; } - rc = testQEMUSchemaValidateRecurse(obj, memberschema, schema, debug); + rc = testQEMUSchemaValidateRecurse(obj, memberschema, ctxt); - virBufferAddLit(debug, "\n"); - virBufferSetIndent(debug, indent); - virBufferAsprintf(debug, "(/alternate %zu/%zu)\n", i + 1, n); + virBufferAddLit(ctxt->debug, "\n"); + virBufferSetIndent(ctxt->debug, indent); + virBufferAsprintf(ctxt->debug, "(/alternate %zu/%zu)\n", i + 1, n); if (rc == 0) { - virBufferAdjustIndent(debug, -3); - virBufferAddLit(debug, ") OK"); + virBufferAdjustIndent(ctxt->debug, -3); + virBufferAddLit(ctxt->debug, ") OK"); return 0; } } - virBufferAddLit(debug, "ERROR: no alternate type was matched"); + virBufferAddLit(ctxt->debug, "ERROR: no alternate type was matched"); return -1; } @@ -450,25 +447,24 @@ testQEMUSchemaValidateAlternate(virJSONValuePtr obj, static int testQEMUSchemaValidateRecurse(virJSONValuePtr obj, virJSONValuePtr root, - virHashTablePtr schema, - virBufferPtr debug) + struct testQEMUSchemaValidateCtxt *ctxt) { const char *n = virJSONValueObjectGetString(root, "name"); const char *t = virJSONValueObjectGetString(root, "meta-type"); if (STREQ_NULLABLE(t, "builtin")) { - return testQEMUSchemaValidateBuiltin(obj, root, debug); + return testQEMUSchemaValidateBuiltin(obj, root, ctxt); } else if (STREQ_NULLABLE(t, "object")) { - return testQEMUSchemaValidateObject(obj, root, schema, debug); + return testQEMUSchemaValidateObject(obj, root, ctxt); } else if (STREQ_NULLABLE(t, "enum")) { - return testQEMUSchemaValidateEnum(obj, root, debug); + return testQEMUSchemaValidateEnum(obj, root, ctxt); } else if (STREQ_NULLABLE(t, "array")) { - return testQEMUSchemaValidateArray(obj, root, schema, debug); + return testQEMUSchemaValidateArray(obj, root, ctxt); } else if (STREQ_NULLABLE(t, "alternate")) { - return testQEMUSchemaValidateAlternate(obj, root, schema, debug); + return testQEMUSchemaValidateAlternate(obj, root, ctxt); } - virBufferAsprintf(debug, + virBufferAsprintf(ctxt->debug, "qapi schema meta-type '%s' of type '%s' not handled\n", NULLSTR(t), NULLSTR(n)); return -2; @@ -494,7 +490,9 @@ testQEMUSchemaValidate(virJSONValuePtr obj, virHashTablePtr schema, virBufferPtr debug) { - return testQEMUSchemaValidateRecurse(obj, root, schema, debug); + struct testQEMUSchemaValidateCtxt ctxt = { .schema = schema, + .debug = debug }; + return testQEMUSchemaValidateRecurse(obj, root, &ctxt); } @@ -518,6 +516,8 @@ testQEMUSchemaValidateCommand(const char *command, virHashTablePtr schema, virBufferPtr debug) { + struct testQEMUSchemaValidateCtxt ctxt = { .schema = schema, + .debug = debug }; g_autofree char *schemapatharguments = g_strdup_printf("%s/arg-type", command); g_autoptr(virJSONValue) emptyargs = NULL; virJSONValuePtr schemarootcommand; @@ -538,7 +538,7 @@ testQEMUSchemaValidateCommand(const char *command, return -1; } - return testQEMUSchemaValidateRecurse(arguments, schemarootarguments, schema, debug); + return testQEMUSchemaValidateRecurse(arguments, schemarootarguments, &ctxt); } -- 2.26.2