qapi: fix visitor serialization tests for numbers/doubles
We never actually stored the stringified double values into the strings before we did the comparisons. This left number/double values completely uncovered in test-visitor-serialization tests. Fixing this exposed a bug in our handling of large whole number values in QEMU's JSON parser which is now fixed. Simplify the code while we're at it by dropping the calc_float_string_storage() craziness in favor of GStrings. Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Amos Kong <akong@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
e92cfa0d90
commit
089f26bb73
@ -229,17 +229,6 @@ typedef struct TestArgs {
|
||||
void *test_data;
|
||||
} TestArgs;
|
||||
|
||||
#define FLOAT_STRING_PRECISION 6 /* corresponding to n in %.nf formatting */
|
||||
static gsize calc_float_string_storage(double value)
|
||||
{
|
||||
int whole_value = value;
|
||||
gsize i = 0;
|
||||
do {
|
||||
i++;
|
||||
} while (whole_value /= 10);
|
||||
return i + 2 + FLOAT_STRING_PRECISION;
|
||||
}
|
||||
|
||||
static void test_primitives(gconstpointer opaque)
|
||||
{
|
||||
TestArgs *args = (TestArgs *) opaque;
|
||||
@ -248,7 +237,6 @@ static void test_primitives(gconstpointer opaque)
|
||||
PrimitiveType *pt_copy = g_malloc0(sizeof(*pt_copy));
|
||||
Error *err = NULL;
|
||||
void *serialize_data;
|
||||
char *double1, *double2;
|
||||
|
||||
pt_copy->type = pt->type;
|
||||
ops->serialize(pt, &serialize_data, visit_primitive_type, &err);
|
||||
@ -260,14 +248,17 @@ static void test_primitives(gconstpointer opaque)
|
||||
g_assert_cmpstr(pt->value.string, ==, pt_copy->value.string);
|
||||
g_free((char *)pt_copy->value.string);
|
||||
} else if (pt->type == PTYPE_NUMBER) {
|
||||
GString *double_expected = g_string_new("");
|
||||
GString *double_actual = g_string_new("");
|
||||
/* we serialize with %f for our reference visitors, so rather than fuzzy
|
||||
* floating math to test "equality", just compare the formatted values
|
||||
*/
|
||||
double1 = g_malloc0(calc_float_string_storage(pt->value.number));
|
||||
double2 = g_malloc0(calc_float_string_storage(pt_copy->value.number));
|
||||
g_assert_cmpstr(double1, ==, double2);
|
||||
g_free(double1);
|
||||
g_free(double2);
|
||||
g_string_printf(double_expected, "%.6f", pt->value.number);
|
||||
g_string_printf(double_actual, "%.6f", pt_copy->value.number);
|
||||
g_assert_cmpstr(double_actual->str, ==, double_expected->str);
|
||||
|
||||
g_string_free(double_expected, true);
|
||||
g_string_free(double_actual, true);
|
||||
} else if (pt->type == PTYPE_BOOLEAN) {
|
||||
g_assert_cmpint(!!pt->value.max, ==, !!pt->value.max);
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user