annotate src/lib/test-json-parser.c @ 23007:36e01285b5b8

lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 18 Mar 2019 00:52:37 +0100
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "test-lib.h"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "str.h"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream-private.h"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "json-parser.h"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
15438
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
8 #define TYPE_SKIP 100
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
9 #define TYPE_STREAM 101
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
10
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 static const char json_input[] =
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 "{\n"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 "\t\"key\"\t:\t\t\"string\","
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 " \"key2\" : 1234, \n"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 "\"key3\":true,"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 "\"key4\":false,"
15438
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
17 "\"skip1\": \"jsifjaisfjiasji\","
15439
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
18 "\"skip2\": { \"x\":{ \"y\":123}, \"z\":[5,[6],{\"k\":0},3]},"
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 "\"key5\":null,"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 "\"key6\": {},"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 "\"key7\": {"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 " \"sub1\":\"value\""
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 "},"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 "\"key8\": {"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 " \"sub2\":-12.456,\n"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 " \"sub3\":12.456e9,\n"
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 " \"sub4\":0.456e-789"
15436
9a31c44c1184 JSON parser fixes
Timo Sirainen <tss@iki.fi>
parents: 15435
diff changeset
28 "},"
16042
ea6636b36b1c test-json-parser: Fixed failing test with some non-gcc/clang compilers.
Timo Sirainen <tss@iki.fi>
parents: 15908
diff changeset
29 "\"key9\": \"foo\\\\\\\"\\b\\f\\n\\r\\t\\u0001\\uffff\","
ea6636b36b1c test-json-parser: Fixed failing test with some non-gcc/clang compilers.
Timo Sirainen <tss@iki.fi>
parents: 15908
diff changeset
30 "\"key10\": \"foo\\\\\\\"\\b\\f\\n\\r\\t\\u0001\\uffff\","
15439
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
31 "\"key11\": [],"
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
32 "\"key12\": [ \"foo\" , 5.24,[true],{\"aobj\":[]}]"
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 "}\n";
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 static struct {
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 enum json_type type;
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 const char *value;
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 } json_output[] = {
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 { JSON_TYPE_OBJECT_KEY, "key" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 { JSON_TYPE_STRING, "string" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 { JSON_TYPE_OBJECT_KEY, "key2" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 { JSON_TYPE_NUMBER, "1234" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 { JSON_TYPE_OBJECT_KEY, "key3" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 { JSON_TYPE_TRUE, "true" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 { JSON_TYPE_OBJECT_KEY, "key4" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 { JSON_TYPE_FALSE, "false" },
15438
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
47 { JSON_TYPE_OBJECT_KEY, "skip1" },
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
48 { TYPE_SKIP, NULL },
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
49 { JSON_TYPE_OBJECT_KEY, "skip2" },
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
50 { TYPE_SKIP, NULL },
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 { JSON_TYPE_OBJECT_KEY, "key5" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 { JSON_TYPE_NULL, NULL },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 { JSON_TYPE_OBJECT_KEY, "key6" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 { JSON_TYPE_OBJECT, NULL },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 { JSON_TYPE_OBJECT_END, NULL },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 { JSON_TYPE_OBJECT_KEY, "key7" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 { JSON_TYPE_OBJECT, NULL },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 { JSON_TYPE_OBJECT_KEY, "sub1" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 { JSON_TYPE_STRING, "value" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 { JSON_TYPE_OBJECT_END, NULL },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 { JSON_TYPE_OBJECT_KEY, "key8" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 { JSON_TYPE_OBJECT, NULL },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 { JSON_TYPE_OBJECT_KEY, "sub2" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 { JSON_TYPE_NUMBER, "-12.456" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 { JSON_TYPE_OBJECT_KEY, "sub3" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 { JSON_TYPE_NUMBER, "12.456e9" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 { JSON_TYPE_OBJECT_KEY, "sub4" },
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 { JSON_TYPE_NUMBER, "0.456e-789" },
15436
9a31c44c1184 JSON parser fixes
Timo Sirainen <tss@iki.fi>
parents: 15435
diff changeset
69 { JSON_TYPE_OBJECT_END, NULL },
9a31c44c1184 JSON parser fixes
Timo Sirainen <tss@iki.fi>
parents: 15435
diff changeset
70 { JSON_TYPE_OBJECT_KEY, "key9" },
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
71 { JSON_TYPE_STRING, "foo\\\"\b\f\n\r\t\001\xef\xbf\xbf" },
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
72 { JSON_TYPE_OBJECT_KEY, "key10" },
15439
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
73 { TYPE_STREAM, "foo\\\"\b\f\n\r\t\001\xef\xbf\xbf" },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
74 { JSON_TYPE_OBJECT_KEY, "key11" },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
75 { JSON_TYPE_ARRAY, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
76 { JSON_TYPE_ARRAY_END, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
77 { JSON_TYPE_OBJECT_KEY, "key12" },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
78 { JSON_TYPE_ARRAY, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
79 { JSON_TYPE_STRING, "foo" },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
80 { JSON_TYPE_NUMBER, "5.24" },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
81 { JSON_TYPE_ARRAY, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
82 { JSON_TYPE_TRUE, "true" },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
83 { JSON_TYPE_ARRAY_END, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
84 { JSON_TYPE_OBJECT, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
85 { JSON_TYPE_OBJECT_KEY, "aobj" },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
86 { JSON_TYPE_ARRAY, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
87 { JSON_TYPE_ARRAY_END, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
88 { JSON_TYPE_OBJECT_END, NULL },
f456fffeec5c JSON parser: Added support for arrays.
Timo Sirainen <tss@iki.fi>
parents: 15438
diff changeset
89 { JSON_TYPE_ARRAY_END, NULL }
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 };
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
92 static int
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
93 stream_read_value(struct istream **input, const char **value_r)
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
94 {
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
95 const unsigned char *data;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
96 size_t size;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
97 ssize_t ret;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
98
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
99 while ((ret = i_stream_read(*input)) > 0) ;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
100 if (ret == 0)
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
101 return 0;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
102 i_assert(ret == -1);
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
103 if ((*input)->stream_errno != 0)
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
104 return -1;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
105
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
106 data = i_stream_get_data(*input, &size);
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
107 *value_r = t_strndup(data, size);
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
108 i_stream_unref(input);
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
109 return 1;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
110 }
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
111
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 static void test_json_parser_success(bool full_size)
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 {
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 struct json_parser *parser;
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
115 struct istream *input, *jsoninput = NULL;
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 enum json_type type;
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 const char *value, *error;
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 unsigned int i, pos, json_input_len = strlen(json_input);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 int ret = 0;
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
121 test_begin(full_size ? "json parser" : "json parser (nonblocking)");
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 input = test_istream_create_data(json_input, json_input_len);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 test_istream_set_allow_eof(input, FALSE);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 parser = json_parser_init(input);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 i = full_size ? json_input_len : 0;
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 for (pos = 0; i <= json_input_len; i++) {
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 test_istream_set_size(input, i);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
130 for (;;) {
16206
83568daabff6 Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 16042
diff changeset
131 value = NULL;
15908
573682b34a76 test-json-parser: Don't access memory out of bounds.
Timo Sirainen <tss@iki.fi>
parents: 15898
diff changeset
132 if (pos < N_ELEMENTS(json_output) &&
573682b34a76 test-json-parser: Don't access memory out of bounds.
Timo Sirainen <tss@iki.fi>
parents: 15898
diff changeset
133 json_output[pos].type == (enum json_type)TYPE_SKIP) {
15438
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
134 json_parse_skip_next(parser);
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
135 pos++;
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
136 continue;
15908
573682b34a76 test-json-parser: Don't access memory out of bounds.
Timo Sirainen <tss@iki.fi>
parents: 15898
diff changeset
137 } else if (pos == N_ELEMENTS(json_output) ||
573682b34a76 test-json-parser: Don't access memory out of bounds.
Timo Sirainen <tss@iki.fi>
parents: 15898
diff changeset
138 json_output[pos].type != (enum json_type)TYPE_STREAM) {
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
139 ret = json_parse_next(parser, &type, &value);
15438
4f7e0be9cc35 JSON parser: Added json_parse_skip_next() to skip over unwanted values.
Timo Sirainen <tss@iki.fi>
parents: 15437
diff changeset
140 } else {
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
141 ret = jsoninput != NULL ? 1 :
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
142 json_parse_next_stream(parser, &jsoninput);
19784
7fbc18735f8d lib: json_parse_next_stream() wrongly returned -1 even when a stream was returned.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19709
diff changeset
143 if (ret > 0 && jsoninput != NULL)
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
144 ret = stream_read_value(&jsoninput, &value);
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
145 type = TYPE_STREAM;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
146 }
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
147 if (ret <= 0)
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
148 break;
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
149
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 i_assert(pos < N_ELEMENTS(json_output));
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 test_assert(json_output[pos].type == type);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 test_assert(null_strcmp(json_output[pos].value, value) == 0);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 pos++;
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 }
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 test_assert(ret == 0);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 }
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 test_assert(pos == N_ELEMENTS(json_output));
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 test_istream_set_allow_eof(input, TRUE);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 test_assert(json_parse_next(parser, &type, &value) == -1);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 i_stream_unref(&input);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 test_assert(json_parser_deinit(&parser, &error) == 0);
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 test_end();
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 }
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165
19709
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
166 static void test_json_parser_skip_array(void)
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
167 {
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
168 static const char *test_input =
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
169 "[ 1, {\"foo\": 1 }, 2, \"bar\", 3, 1.234, 4, [], 5, [[]], 6, true ]";
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
170 struct json_parser *parser;
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
171 struct istream *input;
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
172 enum json_type type;
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
173 const char *value, *error;
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
174 int i;
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
175
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
176 test_begin("json parser skip array");
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
177
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
178 input = test_istream_create_data(test_input, strlen(test_input));
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
179 parser = json_parser_init_flags(input, JSON_PARSER_NO_ROOT_OBJECT);
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
180 test_assert(json_parse_next(parser, &type, &value) > 0 &&
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
181 type == JSON_TYPE_ARRAY);
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
182 for (i = 1; i <= 6; i++) {
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
183 test_assert(json_parse_next(parser, &type, &value) > 0 &&
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
184 type == JSON_TYPE_NUMBER && atoi(value) == i);
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
185 json_parse_skip_next(parser);
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
186 }
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
187 test_assert(json_parse_next(parser, &type, &value) > 0 &&
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
188 type == JSON_TYPE_ARRAY_END);
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
189 test_assert(json_parser_deinit(&parser, &error) == 0);
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
190 i_stream_unref(&input);
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
191 test_end();
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
192 }
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
193
19689
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
194 static int
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
195 test_json_parse_input(const char *test_input, enum json_parser_flags flags)
19687
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
196 {
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
197 struct json_parser *parser;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
198 struct istream *input;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
199 enum json_type type;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
200 const char *value, *error;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
201 int ret = 0;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
202
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
203 input = test_istream_create_data(test_input, strlen(test_input));
19689
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
204 parser = json_parser_init_flags(input, flags);
19687
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
205 while (json_parse_next(parser, &type, &value) > 0)
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
206 ret++;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
207 if (json_parser_deinit(&parser, &error) < 0)
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
208 ret = -1;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
209 i_stream_unref(&input);
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
210 return ret;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
211 }
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
212
19689
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
213 static void test_json_parser_primitive_values(void)
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
214 {
19708
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
215 static struct {
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
216 const char *str;
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
217 int ret;
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
218 } test_inputs[] = {
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
219 { "\"hello\"", 1 },
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
220 { "null", 1 },
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
221 { "1234", 1 },
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
222 { "1234.1234", 1 },
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
223 { "{}", 2 },
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
224 { "[]", 2 },
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
225 { "true", 1 },
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
226 { "false", 1 }
19689
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
227 };
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
228 unsigned int i;
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
229
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
230 test_begin("json_parser (primitives)");
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
231 for (i = 0; i < N_ELEMENTS(test_inputs); i++)
19708
6d45c0bb9b30 lib: If json-parser has JSON_PARSER_NO_ROOT_OBJECT set, return the ending root "]" and "}"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19689
diff changeset
232 test_assert_idx(test_json_parse_input(test_inputs[i].str, JSON_PARSER_NO_ROOT_OBJECT) == test_inputs[i].ret, i);
19689
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
233 test_end();
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
234 }
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
235
19687
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
236 static void test_json_parser_errors(void)
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
237 {
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
238 static const char *test_inputs[] = {
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
239 "{",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
240 "{:}",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
241 "{\"foo\":}",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
242 "{\"foo\" []}",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
243 "{\"foo\": [1}",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
244 "{\"foo\": [1,]}",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
245 "{\"foo\": [1,]}",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
246 "{\"foo\": 1,}",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
247 "{\"foo\": 1.}}",
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
248 "{\"foo\": 1},{}"
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
249 };
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
250 unsigned int i;
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
251
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
252 test_begin("json parser error handling");
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
253 for (i = 0; i < N_ELEMENTS(test_inputs); i++)
19689
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
254 test_assert_idx(test_json_parse_input(test_inputs[i], 0) < 0, i);
19687
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
255 test_end();
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
256 }
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
257
19656
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
258 static void test_json_append_escaped(void)
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
259 {
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
260 string_t *str = t_str_new(32);
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
261
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
262 test_begin("json_append_escaped()");
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
263 json_append_escaped(str, "\b\f\r\n\t\"\\\001\002-\xC3\xA4");
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
264 test_assert(strcmp(str_c(str), "\\b\\f\\r\\n\\t\\\"\\\\\\u0001\\u0002-\xC3\xA4") == 0);
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
265 test_end();
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
266 }
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
267
19657
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
268 static void test_json_append_escaped_data(void)
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
269 {
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
270 static const unsigned char test_input[] =
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
271 "\b\f\r\n\t\"\\\000\001\002-\xC3\xA4";
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
272 string_t *str = t_str_new(32);
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
273
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
274 test_begin("json_append_escaped()");
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
275 json_append_escaped_data(str, test_input, sizeof(test_input)-1);
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
276 test_assert(strcmp(str_c(str), "\\b\\f\\r\\n\\t\\\"\\\\\\u0000\\u0001\\u0002-\xC3\xA4") == 0);
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
277 test_end();
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
278 }
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
279
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 void test_json_parser(void)
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 {
15437
014be18f7130 JSON parser: Added support for reading string value as istream.
Timo Sirainen <tss@iki.fi>
parents: 15436
diff changeset
282 test_json_parser_success(TRUE);
15436
9a31c44c1184 JSON parser fixes
Timo Sirainen <tss@iki.fi>
parents: 15435
diff changeset
283 test_json_parser_success(FALSE);
19709
31389e4b4677 lib: Fixed calling json_parse_skip_next() within arrays
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19708
diff changeset
284 test_json_parser_skip_array();
19689
8bcb62e748b9 lib: JSON parser can now optionally parse input that isn't an object.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19687
diff changeset
285 test_json_parser_primitive_values();
19687
2166e0f25e43 lib: Code cleanup to json-parser - assume less that the root is an object
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19657
diff changeset
286 test_json_parser_errors();
19656
5cc83e9cbfee lib: json_append_escaped() doesn't need to escape the 8bit chars.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
287 test_json_append_escaped();
19657
ea87c511c6c8 lib: Added json_append_escaped_data() to escape non-NUL terminated input.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19656
diff changeset
288 test_json_append_escaped_data();
15435
86572582647e JSON parser supports now nested objects and parsing from non-blocking input stream.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 }