From 01b2ffcedd94ad7b42bc870e4c6936c87ad03429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 7 Jun 2017 20:35:58 +0400 Subject: qapi: merge QInt and QFloat in QNum MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We would like to use a same QObject type to represent numbers, whether they are int, uint, or floats. Getters will allow some compatibility between the various types if the number fits other representations. Add a few more tests while at it. Signed-off-by: Marc-André Lureau Message-Id: <20170607163635.17635-7-marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster [parse_stats_intervals() simplified a bit, comment in test_visitor_in_int_overflow() tidied up, suppress bogus warnings] Signed-off-by: Markus Armbruster --- tests/test-qobject-output-visitor.c | 71 +++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 30 deletions(-) (limited to 'tests/test-qobject-output-visitor.c') diff --git a/tests/test-qobject-output-visitor.c b/tests/test-qobject-output-visitor.c index 4e8fdf1..a16c8f6 100644 --- a/tests/test-qobject-output-visitor.c +++ b/tests/test-qobject-output-visitor.c @@ -58,13 +58,15 @@ static void test_visitor_out_int(TestOutputVisitorData *data, const void *unused) { int64_t value = -42; - QInt *qint; + int64_t val; + QNum *qnum; visit_type_int(data->ov, NULL, &value, &error_abort); - qint = qobject_to_qint(visitor_get(data)); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, value); + qnum = qobject_to_qnum(visitor_get(data)); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, value); } static void test_visitor_out_bool(TestOutputVisitorData *data, @@ -84,13 +86,13 @@ static void test_visitor_out_number(TestOutputVisitorData *data, const void *unused) { double value = 3.14; - QFloat *qfloat; + QNum *qnum; visit_type_number(data->ov, NULL, &value, &error_abort); - qfloat = qobject_to_qfloat(visitor_get(data)); - g_assert(qfloat); - g_assert(qfloat_get_double(qfloat) == value); + qnum = qobject_to_qnum(visitor_get(data)); + g_assert(qnum); + g_assert(qnum_get_double(qnum) == value); } static void test_visitor_out_string(TestOutputVisitorData *data, @@ -329,16 +331,18 @@ static void test_visitor_out_any(TestOutputVisitorData *data, const void *unused) { QObject *qobj; - QInt *qint; + QNum *qnum; QBool *qbool; QString *qstring; QDict *qdict; + int64_t val; - qobj = QOBJECT(qint_from_int(-42)); + qobj = QOBJECT(qnum_from_int(-42)); visit_type_any(data->ov, NULL, &qobj, &error_abort); - qint = qobject_to_qint(visitor_get(data)); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, -42); + qnum = qobject_to_qnum(visitor_get(data)); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, -42); qobject_decref(qobj); visitor_reset(data); @@ -351,9 +355,10 @@ static void test_visitor_out_any(TestOutputVisitorData *data, qobject_decref(qobj); qdict = qobject_to_qdict(visitor_get(data)); g_assert(qdict); - qint = qobject_to_qint(qdict_get(qdict, "integer")); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, -42); + qnum = qobject_to_qnum(qdict_get(qdict, "integer")); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, -42); qbool = qobject_to_qbool(qdict_get(qdict, "boolean")); g_assert(qbool); g_assert(qbool_get_bool(qbool) == true); @@ -388,18 +393,20 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data, const void *unused) { UserDefAlternate *tmp; - QInt *qint; + QNum *qnum; QString *qstr; QDict *qdict; + int64_t val; tmp = g_new0(UserDefAlternate, 1); - tmp->type = QTYPE_QINT; + tmp->type = QTYPE_QNUM; tmp->u.i = 42; visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort); - qint = qobject_to_qint(visitor_get(data)); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, 42); + qnum = qobject_to_qnum(visitor_get(data)); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, 42); qapi_free_UserDefAlternate(tmp); @@ -603,18 +610,22 @@ static void check_native_list(QObject *qobj, case USER_DEF_NATIVE_LIST_UNION_KIND_U16: case USER_DEF_NATIVE_LIST_UNION_KIND_U32: case USER_DEF_NATIVE_LIST_UNION_KIND_U64: - /* all integer elements in JSON arrays get stored into QInts when - * we convert to QObjects, so we can check them all in the same - * fashion, so simply fall through here + /* + * All integer elements in JSON arrays get stored into QNums + * when we convert to QObjects, so we can check them all in + * the same fashion, so simply fall through here. */ case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: for (i = 0; i < 32; i++) { QObject *tmp; - QInt *qvalue; + QNum *qvalue; + int64_t val; + tmp = qlist_peek(qlist); g_assert(tmp); - qvalue = qobject_to_qint(tmp); - g_assert_cmpint(qint_get_int(qvalue), ==, i); + qvalue = qobject_to_qnum(tmp); + g_assert(qnum_get_try_int(qvalue, &val)); + g_assert_cmpint(val, ==, i); qobject_decref(qlist_pop(qlist)); } break; @@ -645,15 +656,15 @@ static void check_native_list(QObject *qobj, case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER: for (i = 0; i < 32; i++) { QObject *tmp; - QFloat *qvalue; + QNum *qvalue; GString *double_expected = g_string_new(""); GString *double_actual = g_string_new(""); tmp = qlist_peek(qlist); g_assert(tmp); - qvalue = qobject_to_qfloat(tmp); + qvalue = qobject_to_qnum(tmp); g_string_printf(double_expected, "%.6f", (double)i / 3); - g_string_printf(double_actual, "%.6f", qfloat_get_double(qvalue)); + g_string_printf(double_actual, "%.6f", qnum_get_double(qvalue)); g_assert_cmpstr(double_actual->str, ==, double_expected->str); qobject_decref(qlist_pop(qlist)); -- cgit v1.1 From 5923f85fb82df7c8c60a89458a5ae856045e5ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 7 Jun 2017 20:36:03 +0400 Subject: qapi: update the qobject visitor to use QNUM_U64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch to use QNum/uint where appropriate to remove i64 limitation. The input visitor will cast i64 input to u64 for compatibility reasons (existing json QMP client already use negative i64 for large u64, and expect an implicit cast in qemu). Note: before the patch, uint64_t values above INT64_MAX are sent over json QMP as negative values, e.g. UINT64_MAX is sent as -1. After the patch, they are sent unmodified. Clearly a bug fix, but we have to consider compatibility issues anyway. libvirt should cope fine, because its parsing of unsigned integers accepts negative values modulo 2^64. There's hope that other clients will, too. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170607163635.17635-12-marcandre.lureau@redhat.com> [check_native_list() tweaked for consistency with signed case] Signed-off-by: Markus Armbruster --- tests/test-qobject-output-visitor.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'tests/test-qobject-output-visitor.c') diff --git a/tests/test-qobject-output-visitor.c b/tests/test-qobject-output-visitor.c index a16c8f6..749c540 100644 --- a/tests/test-qobject-output-visitor.c +++ b/tests/test-qobject-output-visitor.c @@ -602,14 +602,28 @@ static void check_native_list(QObject *qobj, qlist = qlist_copy(qobject_to_qlist(qdict_get(qdict, "data"))); switch (kind) { - case USER_DEF_NATIVE_LIST_UNION_KIND_S8: - case USER_DEF_NATIVE_LIST_UNION_KIND_S16: - case USER_DEF_NATIVE_LIST_UNION_KIND_S32: - case USER_DEF_NATIVE_LIST_UNION_KIND_S64: case USER_DEF_NATIVE_LIST_UNION_KIND_U8: case USER_DEF_NATIVE_LIST_UNION_KIND_U16: case USER_DEF_NATIVE_LIST_UNION_KIND_U32: case USER_DEF_NATIVE_LIST_UNION_KIND_U64: + for (i = 0; i < 32; i++) { + QObject *tmp; + QNum *qvalue; + uint64_t val; + + tmp = qlist_peek(qlist); + g_assert(tmp); + qvalue = qobject_to_qnum(tmp); + g_assert(qnum_get_try_uint(qvalue, &val)); + g_assert_cmpint(val, ==, i); + qobject_decref(qlist_pop(qlist)); + } + break; + + case USER_DEF_NATIVE_LIST_UNION_KIND_S8: + case USER_DEF_NATIVE_LIST_UNION_KIND_S16: + case USER_DEF_NATIVE_LIST_UNION_KIND_S32: + case USER_DEF_NATIVE_LIST_UNION_KIND_S64: /* * All integer elements in JSON arrays get stored into QNums * when we convert to QObjects, so we can check them all in -- cgit v1.1