qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 06/36] qobject-input-visitor: Avoid dynamic JSON in


From: Eric Blake
Subject: [Qemu-devel] [PATCH 06/36] qobject-input-visitor: Avoid dynamic JSON in tests
Date: Wed, 30 Nov 2016 13:44:24 -0600

As argued elsewhere, we want to get rid of the pseudo-printf
dynamic JSON parsing of qobject_from_jsonv(). In the qobject-input
visitor tests, it is trivial to convert to using the direct
qobject_from_json() or a hand-built QObject.

While at it, wrap some long lines noticed while auditing callers.

Signed-off-by: Eric Blake <address@hidden>
---
 tests/test-qobject-input-strict.c  | 37 +++----------------
 tests/test-qobject-input-visitor.c | 75 ++++++++++++++++----------------------
 2 files changed, 37 insertions(+), 75 deletions(-)

diff --git a/tests/test-qobject-input-strict.c 
b/tests/test-qobject-input-strict.c
index 4087ea3..8e6a74a 100644
--- a/tests/test-qobject-input-strict.c
+++ b/tests/test-qobject-input-strict.c
@@ -41,16 +41,15 @@ static void validate_teardown(TestInputVisitorData *data,
     }
 }

-/* The various test_init functions are provided instead of a test setup
+/* The test_init function is provided instead of a test setup
    function so that the JSON string used by the tests are kept in the test
    functions (and not in main()). */
-static Visitor *validate_test_init_internal(TestInputVisitorData *data,
-                                            const char *json_string,
-                                            va_list *ap)
+static Visitor *validate_test_init(TestInputVisitorData *data,
+                                   const char *json_string)
 {
     validate_teardown(data, NULL);

-    data->obj = qobject_from_jsonv(json_string, ap);
+    data->obj = qobject_from_json(json_string);
     g_assert(data->obj);

     data->qiv = qobject_input_visitor_new(data->obj, true);
@@ -58,32 +57,6 @@ static Visitor 
*validate_test_init_internal(TestInputVisitorData *data,
     return data->qiv;
 }

-static GCC_FMT_ATTR(2, 3)
-Visitor *validate_test_init(TestInputVisitorData *data,
-                             const char *json_string, ...)
-{
-    Visitor *v;
-    va_list ap;
-
-    va_start(ap, json_string);
-    v = validate_test_init_internal(data, json_string, &ap);
-    va_end(ap);
-    return v;
-}
-
-/* similar to validate_test_init(), but does not expect a string
- * literal/format json_string argument and so can be used for
- * programatically generated strings (and we can't pass in programatically
- * generated strings via %s format parameters since qobject_from_jsonv()
- * will wrap those in double-quotes and treat the entire object as a
- * string)
- */
-static Visitor *validate_test_init_raw(TestInputVisitorData *data,
-                                       const char *json_string)
-{
-    return validate_test_init_internal(data, json_string, NULL);
-}
-

 static void test_validate_struct(TestInputVisitorData *data,
                                   const void *unused)
@@ -315,7 +288,7 @@ static void 
do_test_validate_qmp_introspect(TestInputVisitorData *data,
     SchemaInfoList *schema = NULL;
     Visitor *v;

-    v = validate_test_init_raw(data, schema_json);
+    v = validate_test_init(data, schema_json);

     visit_type_SchemaInfoList(v, NULL, &schema, &error_abort);
     g_assert(schema);
diff --git a/tests/test-qobject-input-visitor.c 
b/tests/test-qobject-input-visitor.c
index 945404a..4c1436d 100644
--- a/tests/test-qobject-input-visitor.c
+++ b/tests/test-qobject-input-visitor.c
@@ -40,44 +40,24 @@ static void visitor_input_teardown(TestInputVisitorData 
*data,
 /* The various test_init functions are provided instead of a test setup
    function so that the JSON string used by the tests are kept in the test
    functions (and not in main()). */
-static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data,
-                                                 const char *json_string,
-                                                 va_list *ap)
+static Visitor *visitor_input_test_init_obj(TestInputVisitorData *data,
+                                            QObject *obj)
 {
     visitor_input_teardown(data, NULL);

-    data->obj = qobject_from_jsonv(json_string, ap);
-    g_assert(data->obj);
-
+    data->obj = obj;
     data->qiv = qobject_input_visitor_new(data->obj, false);
     g_assert(data->qiv);
     return data->qiv;
 }

-static GCC_FMT_ATTR(2, 3)
-Visitor *visitor_input_test_init(TestInputVisitorData *data,
-                                 const char *json_string, ...)
-{
-    Visitor *v;
-    va_list ap;
-
-    va_start(ap, json_string);
-    v = visitor_input_test_init_internal(data, json_string, &ap);
-    va_end(ap);
-    return v;
-}
-
-/* similar to visitor_input_test_init(), but does not expect a string
- * literal/format json_string argument and so can be used for
- * programatically generated strings (and we can't pass in programatically
- * generated strings via %s format parameters since qobject_from_jsonv()
- * will wrap those in double-quotes and treat the entire object as a
- * string)
+/* similar to visitor_input_test_init_obj(), but takes input as a raw JSON
+ * string rather than a preformed QObject
  */
-static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data,
-                                            const char *json_string)
+static Visitor *visitor_input_test_init(TestInputVisitorData *data,
+                                        const char *json_string)
 {
-    return visitor_input_test_init_internal(data, json_string, NULL);
+    return visitor_input_test_init_obj(data, qobject_from_json(json_string));
 }

 static void test_visitor_in_int(TestInputVisitorData *data,
@@ -87,7 +67,7 @@ static void test_visitor_in_int(TestInputVisitorData *data,
     int value = -42;
     Visitor *v;

-    v = visitor_input_test_init(data, "%d", value);
+    v = visitor_input_test_init_obj(data, QOBJECT(qint_from_int(value)));

     visit_type_int(v, NULL, &res, &error_abort);
     g_assert_cmpint(res, ==, value);
@@ -104,7 +84,8 @@ static void 
test_visitor_in_int_overflow(TestInputVisitorData *data,
      * a QFloat/double field instead, leading to an error if we pass it
      * to visit_type_int. confirm this.
      */
-    v = visitor_input_test_init(data, "%f", DBL_MAX);
+    v = visitor_input_test_init_obj(data,
+                                    QOBJECT(qfloat_from_double(DBL_MAX)));

     visit_type_int(v, NULL, &res, &err);
     error_free_or_abort(&err);
@@ -116,7 +97,7 @@ static void test_visitor_in_bool(TestInputVisitorData *data,
     bool res = false;
     Visitor *v;

-    v = visitor_input_test_init(data, "true");
+    v = visitor_input_test_init_obj(data, QOBJECT(qbool_from_bool(true)));

     visit_type_bool(v, NULL, &res, &error_abort);
     g_assert_cmpint(res, ==, true);
@@ -128,7 +109,7 @@ static void test_visitor_in_number(TestInputVisitorData 
*data,
     double res = 0, value = 3.14;
     Visitor *v;

-    v = visitor_input_test_init(data, "%f", value);
+    v = visitor_input_test_init_obj(data, QOBJECT(qfloat_from_double(value)));

     visit_type_number(v, NULL, &res, &error_abort);
     g_assert_cmpfloat(res, ==, value);
@@ -140,7 +121,7 @@ static void test_visitor_in_string(TestInputVisitorData 
*data,
     char *res = NULL, *value = (char *) "Q E M U";
     Visitor *v;

-    v = visitor_input_test_init(data, "%s", value);
+    v = visitor_input_test_init_obj(data, QOBJECT(qstring_from_str(value)));

     visit_type_str(v, NULL, &res, &error_abort);
     g_assert_cmpstr(res, ==, value);
@@ -156,8 +137,9 @@ static void test_visitor_in_enum(TestInputVisitorData *data,

     for (i = 0; EnumOne_lookup[i]; i++) {
         EnumOne res = -1;
+        QString *str = qstring_from_str(EnumOne_lookup[i]);

-        v = visitor_input_test_init(data, "%s", EnumOne_lookup[i]);
+        v = visitor_input_test_init_obj(data, QOBJECT(str));

         visit_type_EnumOne(v, NULL, &res, &error_abort);
         g_assert_cmpint(i, ==, res);
@@ -171,7 +153,8 @@ static void test_visitor_in_struct(TestInputVisitorData 
*data,
     TestStruct *p = NULL;
     Visitor *v;

-    v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 
'string': 'foo' }");
+    v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true,"
+                                " 'string': 'foo' }");

     visit_type_TestStruct(v, NULL, &p, &error_abort);
     g_assert_cmpint(p->integer, ==, -42);
@@ -191,7 +174,8 @@ static void 
test_visitor_in_struct_nested(TestInputVisitorData *data,
     v = visitor_input_test_init(data, "{ 'string0': 'string0', "
                                 "'dict1': { 'string1': 'string1', "
                                 "'dict2': { 'userdef': { 'integer': 42, "
-                                "'string': 'string' }, 'string': 
'string2'}}}");
+                                "'string': 'string' }, "
+                                "'string': 'string2'}}}");

     visit_type_UserDefTwo(v, NULL, &udp, &error_abort);

@@ -212,7 +196,10 @@ static void test_visitor_in_list(TestInputVisitorData 
*data,
     Visitor *v;
     int i;

-    v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 
}, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44 
} ]");
+    v = visitor_input_test_init(data,
+                                "[ { 'string': 'string0', 'integer': 42 },"
+                                "{ 'string': 'string1', 'integer': 43 }, "
+                                "{ 'string': 'string2', 'integer': 44 } ]");

     visit_type_UserDefOneList(v, NULL, &head, &error_abort);
     g_assert(head != NULL);
@@ -252,7 +239,8 @@ static void test_visitor_in_any(TestInputVisitorData *data,
     g_assert_cmpint(qint_get_int(qint), ==, -42);
     qobject_decref(res);

-    v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 
'string': 'foo' }");
+    v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, "
+                                "'string': 'foo' }");
     visit_type_any(v, NULL, &res, &error_abort);
     qdict = qobject_to_qdict(res);
     g_assert(qdict && qdict_size(qdict) == 3);
@@ -375,7 +363,8 @@ static void test_visitor_in_alternate(TestInputVisitorData 
*data,
     g_assert_cmpstr(wrap->alt->u.s, ==, "string");
     qapi_free_WrapAlternate(wrap);

-    v = visitor_input_test_init(data, "{ 'alt': {'integer':1, 'string':'str', "
+    v = visitor_input_test_init(data, "{ 'alt': {'integer':1, "
+                                "'string':'str', "
                                 "'enum1':'value1', 'boolean':true} }");
     visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
     g_assert_cmpint(wrap->alt->type, ==, QTYPE_QDICT);
@@ -492,7 +481,7 @@ static void 
test_native_list_integer_helper(TestInputVisitorData *data,
     g_string_append_printf(gstr_union,  "{ 'type': '%s', 'data': [ %s ] }",
                            UserDefNativeListUnionKind_lookup[kind],
                            gstr_list->str);
-    v = visitor_input_test_init_raw(data,  gstr_union->str);
+    v = visitor_input_test_init(data,  gstr_union->str);

     visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
     g_assert(cvalue != NULL);
@@ -654,7 +643,7 @@ static void 
test_visitor_in_native_list_bool(TestInputVisitorData *data,
     }
     g_string_append_printf(gstr_union,  "{ 'type': 'boolean', 'data': [ %s ] 
}",
                            gstr_list->str);
-    v = visitor_input_test_init_raw(data,  gstr_union->str);
+    v = visitor_input_test_init(data,  gstr_union->str);

     visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
     g_assert(cvalue != NULL);
@@ -687,7 +676,7 @@ static void 
test_visitor_in_native_list_string(TestInputVisitorData *data,
     }
     g_string_append_printf(gstr_union,  "{ 'type': 'string', 'data': [ %s ] }",
                            gstr_list->str);
-    v = visitor_input_test_init_raw(data,  gstr_union->str);
+    v = visitor_input_test_init(data,  gstr_union->str);

     visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
     g_assert(cvalue != NULL);
@@ -724,7 +713,7 @@ static void 
test_visitor_in_native_list_number(TestInputVisitorData *data,
     }
     g_string_append_printf(gstr_union,  "{ 'type': 'number', 'data': [ %s ] }",
                            gstr_list->str);
-    v = visitor_input_test_init_raw(data,  gstr_union->str);
+    v = visitor_input_test_init(data,  gstr_union->str);

     visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
     g_assert(cvalue != NULL);
-- 
2.7.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]