From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: marcandre.lureau@redhat.com, mdroth@linux.vnet.ibm.com,
eblake@redhat.com
Subject: [Qemu-devel] [PATCH v3 16/58] check-qjson: Cover interpolation more thoroughly
Date: Thu, 23 Aug 2018 18:39:43 +0200 [thread overview]
Message-ID: <20180823164025.12553-17-armbru@redhat.com> (raw)
In-Reply-To: <20180823164025.12553-1-armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
tests/check-qjson.c | 166 +++++++++++++++++++++++++++-----------------
1 file changed, 102 insertions(+), 64 deletions(-)
diff --git a/tests/check-qjson.c b/tests/check-qjson.c
index a586189d87..1688b2f5c1 100644
--- a/tests/check-qjson.c
+++ b/tests/check-qjson.c
@@ -876,30 +876,6 @@ static void utf8_string(void)
}
}
-static void vararg_string(void)
-{
- int i;
- struct {
- const char *decoded;
- } test_cases[] = {
- { "hello world" },
- { "the quick brown fox jumped over the fence" },
- {}
- };
-
- for (i = 0; test_cases[i].decoded; i++) {
- QString *str;
-
- str = qobject_to(QString,
- qobject_from_jsonf_nofail("%s",
- test_cases[i].decoded));
- g_assert(str);
- g_assert(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
-
- qobject_unref(str);
- }
-}
-
static void simple_number(void)
{
int i;
@@ -1017,29 +993,6 @@ static void float_number(void)
}
}
-static void vararg_number(void)
-{
- QNum *qnum;
- int value = 0x2342;
- long long value_ll = 0x2342342343LL;
- double valuef = 2.323423423;
- int64_t val;
-
- qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%d", value));
- g_assert(qnum_get_try_int(qnum, &val));
- g_assert_cmpint(val, ==, value);
- qobject_unref(qnum);
-
- qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%lld", value_ll));
- g_assert(qnum_get_try_int(qnum, &val));
- g_assert_cmpint(val, ==, value_ll);
- qobject_unref(qnum);
-
- qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%f", valuef));
- g_assert(qnum_get_double(qnum) == valuef);
- qobject_unref(qnum);
-}
-
static void keyword_literal(void)
{
QObject *obj;
@@ -1069,17 +1022,6 @@ static void keyword_literal(void)
qobject_unref(qbool);
- qbool = qobject_to(QBool, qobject_from_jsonf_nofail("%i", false));
- g_assert(qbool);
- g_assert(qbool_get_bool(qbool) == false);
- qobject_unref(qbool);
-
- /* Test that non-zero values other than 1 get collapsed to true */
- qbool = qobject_to(QBool, qobject_from_jsonf_nofail("%i", 2));
- g_assert(qbool);
- g_assert(qbool_get_bool(qbool) == true);
- qobject_unref(qbool);
-
obj = qobject_from_json("null", &error_abort);
g_assert(obj != NULL);
g_assert(qobject_type(obj) == QTYPE_QNULL);
@@ -1091,6 +1033,101 @@ static void keyword_literal(void)
qobject_unref(null);
}
+static void interpolation_valid(void)
+{
+ long long value_lld = 0x123456789abcdefLL;
+ long value_ld = (long)value_lld;
+ int value_d = (int)value_lld;
+ unsigned long long value_llu = 0xfedcba9876543210ULL;
+ unsigned long value_lu = (unsigned long)value_llu;
+ unsigned value_u = (unsigned)value_llu;
+ double value_f = 2.323423423;
+ const char *value_s = "hello world";
+ QObject *value_p = QOBJECT(qnull());
+ QBool *qbool;
+ QNum *qnum;
+ QString *qstr;
+ QObject *qobj;
+
+ /* bool */
+
+ qbool = qobject_to(QBool, qobject_from_jsonf_nofail("%i", false));
+ g_assert(qbool);
+ g_assert(qbool_get_bool(qbool) == false);
+ qobject_unref(qbool);
+
+ /* Test that non-zero values other than 1 get collapsed to true */
+ qbool = qobject_to(QBool, qobject_from_jsonf_nofail("%i", 2));
+ g_assert(qbool);
+ g_assert(qbool_get_bool(qbool) == true);
+ qobject_unref(qbool);
+
+ /* number */
+
+ qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%d", value_d));
+ g_assert_cmpint(qnum_get_int(qnum), ==, value_d);
+ qobject_unref(qnum);
+
+ qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%ld", value_ld));
+ g_assert_cmpint(qnum_get_int(qnum), ==, value_ld);
+ qobject_unref(qnum);
+
+ qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%lld", value_lld));
+ g_assert_cmpint(qnum_get_int(qnum), ==, value_lld);
+ qobject_unref(qnum);
+
+ qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%u", value_u));
+ g_assert_cmpuint(qnum_get_uint(qnum), ==, value_u);
+ qobject_unref(qnum);
+
+ qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%lu", value_lu));
+ g_assert_cmpuint(qnum_get_uint(qnum), ==, value_lu);
+ qobject_unref(qnum);
+
+ qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%llu", value_llu));
+ g_assert_cmpuint(qnum_get_uint(qnum), ==, value_llu);
+ qobject_unref(qnum);
+
+ qnum = qobject_to(QNum, qobject_from_jsonf_nofail("%f", value_f));
+ g_assert(qnum_get_double(qnum) == value_f);
+ qobject_unref(qnum);
+
+ /* string */
+
+ qstr = qobject_to(QString,
+ qobject_from_jsonf_nofail("%s", value_s));
+ g_assert_cmpstr(qstring_get_try_str(qstr), ==, value_s);
+ qobject_unref(qstr);
+
+ /* object */
+
+ qobj = qobject_from_jsonf_nofail("%p", value_p);
+ g_assert(qobj == value_p);
+}
+
+static void interpolation_unknown(void)
+{
+ if (g_test_subprocess()) {
+ qobject_from_jsonf_nofail("%x", 666);
+ }
+ g_test_trap_subprocess(NULL, 0, 0);
+ g_test_trap_assert_failed();
+}
+
+static void interpolation_string(void)
+{
+ QLitObject decoded = QLIT_QLIST(((QLitObject[]){
+ QLIT_QSTR("%s"),
+ QLIT_QSTR("eins"),
+ {}}));
+ QObject *qobj;
+
+ /* Dangerous misfeature: % is silently ignored in strings */
+ qobj = qobject_from_jsonf_nofail("['%s', %s]", "eins", "zwei");
+ g_assert(qlit_equal_qobject(&decoded, qobj));
+ qobject_unref(qobj);
+}
+
static void simple_dict(void)
{
int i;
@@ -1309,7 +1346,7 @@ static void simple_whitespace(void)
}
}
-static void simple_varargs(void)
+static void simple_interpolation(void)
{
QObject *embedded_obj;
QObject *obj;
@@ -1506,22 +1543,23 @@ int main(int argc, char **argv)
g_test_add_func("/literals/string/escaped", escaped_string);
g_test_add_func("/literals/string/quotes", string_with_quotes);
g_test_add_func("/literals/string/utf8", utf8_string);
- g_test_add_func("/literals/string/vararg", vararg_string);
g_test_add_func("/literals/number/simple", simple_number);
g_test_add_func("/literals/number/large", large_number);
g_test_add_func("/literals/number/float", float_number);
- g_test_add_func("/literals/number/vararg", vararg_number);
g_test_add_func("/literals/keyword", keyword_literal);
+ g_test_add_func("/literals/interpolation/valid", interpolation_valid);
+ g_test_add_func("/literals/interpolation/unkown", interpolation_unknown);
+ g_test_add_func("/literals/interpolation/string", interpolation_string);
+
g_test_add_func("/dicts/simple_dict", simple_dict);
g_test_add_func("/dicts/large_dict", large_dict);
g_test_add_func("/lists/simple_list", simple_list);
- g_test_add_func("/whitespace/simple_whitespace", simple_whitespace);
-
- g_test_add_func("/varargs/simple_varargs", simple_varargs);
+ g_test_add_func("/mixed/simple_whitespace", simple_whitespace);
+ g_test_add_func("/mixed/interpolation", simple_interpolation);
g_test_add_func("/errors/empty", empty_input);
g_test_add_func("/errors/blank", blank_input);
--
2.17.1
next prev parent reply other threads:[~2018-08-23 16:42 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-23 16:39 [Qemu-devel] [PATCH v3 00/58] json: Fixes, error reporting improvements, cleanups Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 01/58] docs/interop/qmp-spec: How to force known good parser state Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 02/58] check-qjson: Cover multiple JSON objects in same string Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 03/58] check-qjson: Cover blank and lexically erroneous input Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 04/58] check-qjson: Cover whitespace more thoroughly Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 05/58] qmp-cmd-test: Split off qmp-test Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 06/58] qmp-test: Cover syntax and lexical errors Markus Armbruster
2018-08-23 17:05 ` Eric Blake
2018-08-24 19:32 ` Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 07/58] test-qga: Clean up how we test QGA synchronization Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 08/58] check-qjson: Cover escaped characters more thoroughly, part 1 Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 09/58] check-qjson: Streamline escaped_string()'s test strings Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 10/58] check-qjson: Cover escaped characters more thoroughly, part 2 Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 11/58] check-qjson: Consolidate partly redundant string tests Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 12/58] check-qjson: Cover UTF-8 in single quoted strings Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 13/58] check-qjson: Simplify utf8_string() Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 14/58] check-qjson: Fix utf8_string() to test all invalid sequences Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 15/58] check-qjson qmp-test: Cover control characters more thoroughly Markus Armbruster
2018-08-23 16:39 ` Markus Armbruster [this message]
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 17/58] json: Fix lexer to include the bad character in JSON_ERROR token Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 18/58] json: Reject unescaped control characters Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 19/58] json: Revamp lexer documentation Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 20/58] json: Tighten and simplify qstring_from_escaped_str()'s loop Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 21/58] check-qjson: Document we expect invalid UTF-8 to be rejected Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 22/58] json: Reject invalid UTF-8 sequences Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 23/58] json: Report first rather than last parse error Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 24/58] json: Leave rejecting invalid UTF-8 to parser Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 25/58] json: Accept overlong \xC0\x80 as U+0000 ("modified UTF-8") Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 26/58] json: Leave rejecting invalid escape sequences to parser Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 27/58] json: Simplify parse_string() Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 28/58] json: Reject invalid \uXXXX, fix \u0000 Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 29/58] json: Fix \uXXXX for surrogate pairs Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 30/58] check-qjson: Fix and enable utf8_string()'s disabled part Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 31/58] json: remove useless return value from lexer/parser Markus Armbruster
2018-08-23 16:39 ` [Qemu-devel] [PATCH v3 32/58] json-parser: simplify and avoid JSONParserContext allocation Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 33/58] json: Have lexer call streamer directly Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 34/58] json: Redesign the callback to consume JSON values Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 35/58] json: Don't pass null @tokens to json_parser_parse() Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 36/58] json: Don't create JSON_ERROR tokens that won't be used Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 37/58] json: Rename token JSON_ESCAPE & friends to JSON_INTERP Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 38/58] json: Treat unwanted interpolation as lexical error Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 39/58] json: Pass lexical errors and limit violations to callback Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 40/58] json: Leave rejecting invalid interpolation to parser Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 41/58] json: Replace %I64d, %I64u by %PRId64, %PRIu64 Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 42/58] json: Improve names of lexer states related to numbers Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 43/58] qjson: Fix qobject_from_json() & friends for multiple values Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 44/58] json: Fix latent parser aborts at end of input Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 45/58] json: Fix streamer not to ignore trailing unterminated structures Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 46/58] json: Assert json_parser_parse() consumes all tokens on success Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 47/58] qjson: Have qobject_from_json() & friends reject empty and blank Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 48/58] json: Enforce token count and size limits more tightly Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 49/58] json: Streamline json_message_process_token() Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 50/58] json: Unbox tokens queue in JSONMessageParser Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 51/58] json: Make JSONToken opaque outside json-parser.c Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 52/58] qobject: Drop superfluous includes of qemu-common.h Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 53/58] json: Clean up headers Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 54/58] tests/drive_del-test: Fix harmless JSON interpolation bug Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 55/58] json: Keep interpolation state in JSONParserContext Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 56/58] json: Improve safety of qobject_from_jsonf_nofail() & friends Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 57/58] json: Support %% in JSON strings when interpolating Markus Armbruster
2018-08-23 16:40 ` [Qemu-devel] [PATCH v3 58/58] json: Update references to RFC 7159 to RFC 8259 Markus Armbruster
2018-08-23 17:39 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180823164025.12553-17-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).