Cover surrogates, invalid escapes, and noncharacters. This demonstrates that valid surrogate pairs are misinterpreted, and invalid surrogates and noncharacters aren't rejected.
Signed-off-by: Markus Armbruster <arm...@redhat.com> --- tests/check-qjson.c | 53 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/tests/check-qjson.c b/tests/check-qjson.c index 8f51f57af9..e899e2d361 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -59,6 +59,38 @@ static void escaped_string(void) { "single byte utf-8 \\u0020", "single byte utf-8 ", .skip = 1 }, { "double byte utf-8 \\u00A2", "double byte utf-8 \xc2\xa2" }, { "triple byte utf-8 \\u20AC", "triple byte utf-8 \xe2\x82\xac" }, + { "quadruple byte utf-8 \\uD834\\uDD1E", /* U+1D11E */ + /* bug: want \xF0\x9D\x84\x9E */ + "quadruple byte utf-8 \xED\xA0\xB4\xED\xB4\x9E", .skip = 1 }, + { "\\z", NULL }, + { "\\ux", NULL }, + { "\\u1x", NULL }, + { "\\u12x", NULL }, + { "\\u123x", NULL }, + { "\\u12345", "\341\210\2645" }, + { "\\u12345", "\341\210\2645" }, + { "\\u0000x", "x", .skip = 1}, /* bug: want \xC0\x80x */ + { "unpaired leading surrogate \\uD800\\uD800", + /* bug: not rejected */ + "unpaired leading surrogate \355\240\200\355\240\200", .skip = 1 }, + { "unpaired trailing surrogate \\uDC00\\uDC00", + /* bug: not rejected */ + "unpaired trailing surrogate \355\260\200\355\260\200", .skip = 1}, + { "backward surrogate pair \\uDC00\\uD800", + /* bug: not rejected */ + "backward surrogate pair \355\260\200\355\240\200", .skip = 1}, + { "noncharacter U+FDD0 \\uFDD0", + /* bug: not rejected */ + "noncharacter U+FDD0 \xEF\xB7\x90", .skip = 1}, + { "noncharacter U+FDEF \\uFDEF", + /* bug: not rejected */ + "noncharacter U+FDEF \xEF\xB7\xAF", .skip = 1}, + { "noncharacter U+1FFFE \\uD87F\\uDFFE", + /* bug: not rejected */ + "noncharacter U+1FFFE \xED\xA1\xBF\xED\xBF\xBE", .skip = 1}, + { "noncharacter U+10FFFF \\uDC3F\\uDFFF", + /* bug: not rejected */ + "noncharacter U+10FFFF \xED\xB0\xBF\xED\xBF\xBF", .skip = 1}, {} }; int i, j; @@ -67,15 +99,20 @@ static void escaped_string(void) for (i = 0; test_cases[i].json_in; i++) { for (j = 0; j < 2; j++) { - cstr = from_json_str(test_cases[i].json_in, &error_abort, j); - g_assert_cmpstr(qstring_get_try_str(cstr), - ==, test_cases[i].utf8_out); - if (test_cases[i].skip == 0) { - jstr = to_json_str(cstr); - g_assert_cmpstr(jstr, ==, test_cases[i].json_in); - g_free(jstr); + if (test_cases[i].utf8_out) { + cstr = from_json_str(test_cases[i].json_in, &error_abort, j); + g_assert_cmpstr(qstring_get_try_str(cstr), + ==, test_cases[i].utf8_out); + if (!test_cases[i].skip) { + jstr = to_json_str(cstr); + g_assert_cmpstr(jstr, ==, test_cases[i].json_in); + g_free(jstr); + } + qobject_unref(cstr); + } else { + cstr = from_json_str(test_cases[i].json_in, NULL, j); + g_assert(!cstr); } - qobject_unref(cstr); } } } -- 2.17.1