[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 08/45] tests: add more int/number ranges checks
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v2 08/45] tests: add more int/number ranges checks |
Date: |
Wed, 31 May 2017 17:56:32 +0400 |
Suggested by Markus Armbruster:
We should systematically cover the integers, in particular the
boundaries (because that's where bugs like to hide):
* Integers in [-2^63,0) can be visited with visit_type_int() and
visit_type_number().
* Integers in [0,2^63) can be visited with visit_type_int(),
visit_type_uint64() and visit_type_number().
* Integers in [2^63,2^64) can be visited with visit_type_uint64() and
visit_type_number().
* Integers outside [-2^63,2^53) can be visited with visit_type_number().
In any case, visit_type_number() loses precision beyond 53 bits.
Signed-off-by: Marc-André Lureau <address@hidden>
---
tests/test-qobject-input-visitor.c | 38 ++++++++++++++++++++++++++++++++++++--
1 file changed, 36 insertions(+), 2 deletions(-)
diff --git a/tests/test-qobject-input-visitor.c
b/tests/test-qobject-input-visitor.c
index 83d663d11d..f2ed3161af 100644
--- a/tests/test-qobject-input-visitor.c
+++ b/tests/test-qobject-input-visitor.c
@@ -102,11 +102,11 @@ static Visitor
*visitor_input_test_init_raw(TestInputVisitorData *data,
{
return visitor_input_test_init_internal(data, false, json_string, NULL);
}
-
static void test_visitor_in_int(TestInputVisitorData *data,
const void *unused)
{
int64_t res = 0;
+ double dbl;
int value = -42;
Visitor *v;
@@ -114,6 +114,9 @@ static void test_visitor_in_int(TestInputVisitorData *data,
visit_type_int(v, NULL, &res, &error_abort);
g_assert_cmpint(res, ==, value);
+
+ visit_type_number(v, NULL, &dbl, &error_abort);
+ g_assert_cmpfloat(dbl, ==, -42.0);
}
static void test_visitor_in_uint(TestInputVisitorData *data,
@@ -121,6 +124,8 @@ static void test_visitor_in_uint(TestInputVisitorData *data,
{
Error *err = NULL;
uint64_t res = 0;
+ int64_t i64;
+ double dbl;
int value = 42;
Visitor *v;
@@ -129,8 +134,13 @@ static void test_visitor_in_uint(TestInputVisitorData
*data,
visit_type_uint64(v, NULL, &res, &error_abort);
g_assert_cmpuint(res, ==, (uint64_t)value);
- /* BUG: value between INT64_MIN and -1 accepted modulo 2^64 */
+ visit_type_int(v, NULL, &i64, &error_abort);
+ g_assert_cmpint(i64, ==, value);
+ visit_type_number(v, NULL, &dbl, &error_abort);
+ g_assert_cmpfloat(dbl, ==, value);
+
+ /* BUG: value between INT64_MIN and -1 accepted modulo 2^64 */
v = visitor_input_test_init(data, "%d", -value);
visit_type_uint64(v, NULL, &res, &error_abort);
@@ -142,6 +152,8 @@ static void test_visitor_in_uint(TestInputVisitorData *data,
visit_type_uint64(v, NULL, &res, &err);
error_free_or_abort(&err);
+
+ visit_type_number(v, NULL, &dbl, &error_abort);
}
static void test_visitor_in_int_overflow(TestInputVisitorData *data,
@@ -260,6 +272,26 @@ static void test_visitor_in_number(TestInputVisitorData
*data,
g_assert_cmpfloat(res, ==, value);
}
+static void test_visitor_in_large_number(TestInputVisitorData *data,
+ const void *unused)
+{
+ Error *err = NULL;
+ double res = 0;
+ int64_t i64;
+ uint64_t u64;
+ Visitor *v;
+
+ v = visitor_input_test_init(data, "-18446744073709551616"); /* -2^64 */
+
+ visit_type_number(v, NULL, &res, &error_abort);
+
+ visit_type_int(v, NULL, &i64, &err);
+ error_free_or_abort(&err);
+
+ visit_type_uint64(v, NULL, &u64, &err);
+ error_free_or_abort(&err);
+}
+
static void test_visitor_in_number_keyval(TestInputVisitorData *data,
const void *unused)
{
@@ -1253,6 +1285,8 @@ int main(int argc, char **argv)
NULL, test_visitor_in_bool_str_fail);
input_visitor_test_add("/visitor/input/number",
NULL, test_visitor_in_number);
+ input_visitor_test_add("/visitor/input/large_number",
+ NULL, test_visitor_in_large_number);
input_visitor_test_add("/visitor/input/number_keyval",
NULL, test_visitor_in_number_keyval);
input_visitor_test_add("/visitor/input/number_str_keyval",
--
2.13.0.91.g00982b8dd
- [Qemu-devel] [PATCH v2 00/45] qobject/qapi: add uint type, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 01/45] qobject-input-visitor: Reject non-finite numbers with keyval, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 02/45] qapi: Document visit_type_any() issues with keyval input, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 03/45] tests/qapi-schema: Avoid 'str' in alternate test cases, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 04/45] qapi: Reject alternates that can't work with keyval_parse(), Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 05/45] qdev: remove PropertyInfo.qtype field, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 06/45] object: fix potential leak in getters, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 07/45] tests: remove alt num-int cases, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 08/45] tests: add more int/number ranges checks,
Marc-André Lureau <=
- [Qemu-devel] [PATCH v2 10/45] qapi: Remove visit_start_alternate() parameter promote_int, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 09/45] qapi: merge QInt and QFloat in QNum, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 11/45] tests: remove /qnum/destroy test, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 12/45] qnum: add uint type, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 13/45] json: learn to parse uint64 numbers, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 14/45] qapi: update the qobject visitor to use QNUM_U64, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 15/45] object: add uint property setter/getter, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 16/45] q35: fix get_mmcfg_size to use uint64 visitor, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 17/45] object: use more specific property type names, Marc-André Lureau, 2017/05/31
- [Qemu-devel] [PATCH v2 18/45] qdev: make default property int, Marc-André Lureau, 2017/05/31