Mercurial > dovecot > core-2.2
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 |
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 | 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 | 69 { JSON_TYPE_OBJECT_END, NULL }, |
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 | 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 | 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 } |