3
3
#include <assert.h>
4
4
#include <stddef.h>
5
5
6
- #define JSONB_MAX_DEPTH 4
7
- #define JSONB_DEBUG
6
+ #define JSONB_MAX_DEPTH 1028
8
7
#include "json-build.h"
9
8
10
9
#include "greatest.h"
@@ -16,33 +15,34 @@ check_valid_singles(void)
16
15
jsonb b ;
17
16
18
17
jsonb_init (& b );
19
- ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
20
- ASSERT ( jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
18
+ ASSERTm ( buf , JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
19
+ ASSERTm ( buf , JSONB_END == jsonb_pop_array (& b , buf , sizeof (buf )));
21
20
ASSERT_STR_EQ ("[]" , buf );
22
21
23
22
jsonb_init (& b );
24
- ASSERT ( jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
25
- ASSERT ( jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
23
+ ASSERTm ( buf , JSONB_OK == jsonb_push_object (& b , buf , sizeof (buf )));
24
+ ASSERTm ( buf , JSONB_END == jsonb_pop_object (& b , buf , sizeof (buf )));
26
25
ASSERT_STR_EQ ("{}" , buf );
27
26
28
27
jsonb_init (& b );
29
- ASSERT ( jsonb_push_bool (& b , buf , sizeof (buf ), 0 ) >= 0 );
28
+ ASSERTm ( buf , JSONB_END == jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
30
29
ASSERT_STR_EQ ("false" , buf );
31
30
32
31
jsonb_init (& b );
33
- ASSERT ( jsonb_push_bool (& b , buf , sizeof (buf ), 1 ) >= 0 );
32
+ ASSERTm ( buf , JSONB_END == jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
34
33
ASSERT_STR_EQ ("true" , buf );
35
34
36
35
jsonb_init (& b );
37
- ASSERT ( jsonb_push_number (& b , buf , sizeof (buf ), 10 ) >= 0 );
36
+ ASSERTm ( buf , JSONB_END == jsonb_push_number (& b , buf , sizeof (buf ), 10 ));
38
37
ASSERT_STR_EQ ("10" , buf );
39
38
40
39
jsonb_init (& b );
41
- ASSERT (jsonb_push_string (& b , buf , sizeof (buf ), "hi" , 2 ) >= 0 );
40
+ ASSERTm (buf ,
41
+ JSONB_END == jsonb_push_string (& b , buf , sizeof (buf ), "hi" , 2 ));
42
42
ASSERT_STR_EQ ("\"hi\"" , buf );
43
43
44
44
jsonb_init (& b );
45
- ASSERT ( jsonb_push_null (& b , buf , sizeof (buf )) >= 0 );
45
+ ASSERTm ( buf , JSONB_END == jsonb_push_null (& b , buf , sizeof (buf )));
46
46
ASSERT_STR_EQ ("null" , buf );
47
47
48
48
PASS ();
@@ -55,16 +55,17 @@ check_valid_array(void)
55
55
jsonb b ;
56
56
57
57
jsonb_init (& b );
58
- ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
58
+ ASSERTm ( buf , JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
59
59
{
60
- ASSERT (jsonb_push_bool (& b , buf , sizeof (buf ), 1 ) >= 0 );
61
- ASSERT (jsonb_push_bool (& b , buf , sizeof (buf ), 0 ) >= 0 );
62
- ASSERT (jsonb_push_null (& b , buf , sizeof (buf )) >= 0 );
63
- ASSERT (jsonb_push_number (& b , buf , sizeof (buf ), 10 ) >= 0 );
64
- ASSERT (jsonb_push_string (& b , buf , sizeof (buf ), "foo" , 3 ) >= 0 );
65
- ASSERT (jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
66
- ASSERT (jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
67
- ASSERT (jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
60
+ ASSERTm (buf , JSONB_OK == jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
61
+ ASSERTm (buf , JSONB_OK == jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
62
+ ASSERTm (buf , JSONB_OK == jsonb_push_null (& b , buf , sizeof (buf )));
63
+ ASSERTm (buf , JSONB_OK == jsonb_push_number (& b , buf , sizeof (buf ), 10 ));
64
+ ASSERTm (buf ,
65
+ JSONB_OK == jsonb_push_string (& b , buf , sizeof (buf ), "foo" , 3 ));
66
+ ASSERTm (buf , JSONB_OK == jsonb_push_object (& b , buf , sizeof (buf )));
67
+ ASSERTm (buf , JSONB_OK == jsonb_pop_object (& b , buf , sizeof (buf )));
68
+ ASSERTm (buf , JSONB_END == jsonb_pop_array (& b , buf , sizeof (buf )));
68
69
}
69
70
70
71
ASSERT_STR_EQ ("[true,false,null,10,\"foo\",{}]" , buf );
@@ -79,22 +80,23 @@ check_valid_object(void)
79
80
jsonb b ;
80
81
81
82
jsonb_init (& b );
82
- ASSERT ( jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
83
+ ASSERTm ( buf , JSONB_OK == jsonb_push_object (& b , buf , sizeof (buf )));
83
84
{
84
- ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ) >= 0 );
85
- ASSERT (jsonb_push_bool (& b , buf , sizeof (buf ), 1 ) >= 0 );
86
- ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "b" , 1 ) >= 0 );
87
- ASSERT (jsonb_push_bool (& b , buf , sizeof (buf ), 0 ) >= 0 );
88
- ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "c" , 1 ) >= 0 );
89
- ASSERT (jsonb_push_null (& b , buf , sizeof (buf )) >= 0 );
90
- ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "d" , 1 ) >= 0 );
91
- ASSERT (jsonb_push_number (& b , buf , sizeof (buf ), 10 ) >= 0 );
92
- ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "e" , 1 ) >= 0 );
93
- ASSERT (jsonb_push_string (& b , buf , sizeof (buf ), "foo" , 3 ) >= 0 );
94
- ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "f" , 1 ) >= 0 );
95
- ASSERT (jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
96
- ASSERT (jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
97
- ASSERT (jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
85
+ ASSERTm (buf , JSONB_OK == jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ));
86
+ ASSERTm (buf , JSONB_OK == jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
87
+ ASSERTm (buf , JSONB_OK == jsonb_push_key (& b , buf , sizeof (buf ), "b" , 1 ));
88
+ ASSERTm (buf , JSONB_OK == jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
89
+ ASSERTm (buf , JSONB_OK == jsonb_push_key (& b , buf , sizeof (buf ), "c" , 1 ));
90
+ ASSERTm (buf , JSONB_OK == jsonb_push_null (& b , buf , sizeof (buf )));
91
+ ASSERTm (buf , JSONB_OK == jsonb_push_key (& b , buf , sizeof (buf ), "d" , 1 ));
92
+ ASSERTm (buf , JSONB_OK == jsonb_push_number (& b , buf , sizeof (buf ), 10 ));
93
+ ASSERTm (buf , JSONB_OK == jsonb_push_key (& b , buf , sizeof (buf ), "e" , 1 ));
94
+ ASSERTm (buf ,
95
+ JSONB_OK == jsonb_push_string (& b , buf , sizeof (buf ), "foo" , 3 ));
96
+ ASSERTm (buf , JSONB_OK == jsonb_push_key (& b , buf , sizeof (buf ), "f" , 1 ));
97
+ ASSERTm (buf , JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
98
+ ASSERTm (buf , JSONB_OK == jsonb_pop_array (& b , buf , sizeof (buf )));
99
+ ASSERTm (buf , JSONB_END == jsonb_pop_object (& b , buf , sizeof (buf )));
98
100
}
99
101
100
102
ASSERT_STR_EQ (
@@ -114,60 +116,82 @@ SUITE(valid_output)
114
116
TEST
115
117
check_deep_nesting_array (void )
116
118
{
117
- char buf [2048 ];
119
+ char buf [JSONB_MAX_DEPTH * sizeof ( "[]" ) ];
118
120
jsonb b ;
119
121
int i ;
120
122
121
123
jsonb_init (& b );
122
124
for (i = 0 ; i < JSONB_MAX_DEPTH ; ++ i )
123
- ASSERT (jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
124
- for (i = 0 ; i < JSONB_MAX_DEPTH ; ++ i )
125
- ASSERT (jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
125
+ ASSERTm (buf , JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
126
+ for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i )
127
+ ASSERTm (buf , JSONB_OK == jsonb_pop_array (& b , buf , sizeof (buf )));
128
+ ASSERTm (buf , JSONB_END == jsonb_pop_array (& b , buf , sizeof (buf )));
129
+
126
130
PASS ();
127
131
}
128
132
129
133
TEST
130
134
check_deep_nesting_object (void )
131
135
{
132
- char buf [4096 ];
136
+ char buf [JSONB_MAX_DEPTH * ( sizeof ( "{}" ) + sizeof ( "\"a\":" )) ];
133
137
jsonb b ;
134
138
int i ;
135
139
136
140
jsonb_init (& b );
137
141
for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i ) {
138
- ASSERT (jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
139
- ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ) >= 0 );
140
- }
141
- ASSERT (jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
142
- for (i = 0 ; i < JSONB_MAX_DEPTH ; ++ i ) {
143
- ASSERT (jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
142
+ ASSERTm (buf , JSONB_OK == jsonb_push_object (& b , buf , sizeof (buf )));
143
+ ASSERTm (buf , JSONB_OK == jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ));
144
144
}
145
+ ASSERTm (buf , JSONB_OK == jsonb_push_object (& b , buf , sizeof (buf )));
146
+ for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i )
147
+ ASSERTm (buf , JSONB_OK == jsonb_pop_object (& b , buf , sizeof (buf )));
148
+ ASSERTm (buf , JSONB_END == jsonb_pop_object (& b , buf , sizeof (buf )));
149
+
145
150
PASS ();
146
151
}
147
152
148
153
TEST
149
154
check_deep_nesting_object_and_array (void )
150
155
{
151
- char buf [8192 ];
156
+ char buf [JSONB_MAX_DEPTH * ( sizeof ( "[{}]" ) + sizeof ( "\"a\":" )) ];
152
157
jsonb b ;
153
158
int i ;
154
159
155
160
jsonb_init (& b );
156
161
for (i = 0 ; i < JSONB_MAX_DEPTH ; ++ i ) {
157
162
if (i % 2 == 0 ) {
158
- ASSERT (jsonb_push_object (& b , buf , sizeof (buf )) >= 0 );
159
- ASSERT (jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ) >= 0 );
163
+ ASSERTm (buf , JSONB_OK == jsonb_push_object (& b , buf , sizeof (buf )));
164
+ ASSERTm (buf ,
165
+ JSONB_OK == jsonb_push_key (& b , buf , sizeof (buf ), "a" , 1 ));
160
166
}
161
167
else {
162
- ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
168
+ ASSERTm ( buf , JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
163
169
}
164
170
}
165
- for (i = 0 ; i < JSONB_MAX_DEPTH ; ++ i ) {
166
- if (i % 2 == 0 )
167
- ASSERT (jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
168
- else
169
- ASSERT (jsonb_pop_object (& b , buf , sizeof (buf )) >= 0 );
171
+
172
+ if (JSONB_MAX_DEPTH % 2 != 0 ) {
173
+ ASSERTm (buf , jsonb_push_null (& b , buf , sizeof (buf )) == JSONB_OK );
174
+ for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i ) {
175
+ if (i % 2 == 0 )
176
+ ASSERTm (buf ,
177
+ JSONB_OK == jsonb_pop_object (& b , buf , sizeof (buf )));
178
+ else
179
+ ASSERTm (buf ,
180
+ JSONB_OK == jsonb_pop_array (& b , buf , sizeof (buf )));
181
+ }
182
+ }
183
+ else {
184
+ for (i = 0 ; i < JSONB_MAX_DEPTH - 1 ; ++ i ) {
185
+ if (i % 2 == 0 )
186
+ ASSERTm (buf ,
187
+ JSONB_OK == jsonb_pop_array (& b , buf , sizeof (buf )));
188
+ else
189
+ ASSERTm (buf ,
190
+ JSONB_OK == jsonb_pop_object (& b , buf , sizeof (buf )));
191
+ }
170
192
}
193
+ ASSERTm (buf , JSONB_END == jsonb_pop_object (& b , buf , sizeof (buf )));
194
+
171
195
PASS ();
172
196
}
173
197
@@ -194,14 +218,15 @@ check_string_escaping(void)
194
218
jsonb b ;
195
219
196
220
jsonb_init (& b );
197
- ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
221
+ ASSERTm ( buf , JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
198
222
for (i = 0 ; i < sizeof (strs ) / sizeof (char * ); ++ i ) {
199
223
size_t len = strlen (strs [i ]);
200
224
size_t prev_pos = b .pos ;
201
- ASSERT (jsonb_push_string (& b , buf , sizeof (buf ), strs [i ], len ) >= 0 );
225
+ ASSERTm (buf ,
226
+ jsonb_push_string (& b , buf , sizeof (buf ), strs [i ], len ) >= 0 );
202
227
ASSERT_STR_EQ (expect [i ], buf + prev_pos );
203
228
}
204
- ASSERT ( jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
229
+ ASSERTm ( buf , JSONB_END == jsonb_pop_array (& b , buf , sizeof (buf )));
205
230
206
231
PASS ();
207
232
}
@@ -219,25 +244,28 @@ check_invalid_top_level_tokens_in_sequence(void)
219
244
220
245
jsonb_init (& b );
221
246
jsonb_push_bool (& b , buf , sizeof (buf ), 1 );
222
- ASSERT (JSONB_ERROR_INPUT == jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
247
+ ASSERTm (buf ,
248
+ JSONB_ERROR_INPUT == jsonb_push_bool (& b , buf , sizeof (buf ), 0 ));
223
249
224
250
jsonb_init (& b );
225
251
jsonb_push_array (& b , buf , sizeof (buf ));
226
252
jsonb_pop_array (& b , buf , sizeof (buf ));
227
- ASSERT ( JSONB_ERROR_INPUT == jsonb_push_array (& b , buf , sizeof (buf )));
253
+ ASSERTm ( buf , JSONB_ERROR_INPUT == jsonb_push_array (& b , buf , sizeof (buf )));
228
254
229
255
jsonb_init (& b );
230
256
jsonb_push_array (& b , buf , sizeof (buf ));
231
257
jsonb_pop_array (& b , buf , sizeof (buf ));
232
- ASSERT (JSONB_ERROR_INPUT == jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
258
+ ASSERTm (buf ,
259
+ JSONB_ERROR_INPUT == jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
233
260
234
261
jsonb_init (& b );
235
262
jsonb_push_bool (& b , buf , sizeof (buf ), 1 );
236
- ASSERT ( JSONB_ERROR_INPUT == jsonb_push_array (& b , buf , sizeof (buf )));
263
+ ASSERTm ( buf , JSONB_ERROR_INPUT == jsonb_push_array (& b , buf , sizeof (buf )));
237
264
238
265
jsonb_init (& b );
239
266
jsonb_push_bool (& b , buf , sizeof (buf ), 1 );
240
- ASSERT (JSONB_ERROR_INPUT == jsonb_push_string (& b , buf , sizeof (buf ), "" , 0 ));
267
+ ASSERTm (buf , JSONB_ERROR_INPUT
268
+ == jsonb_push_string (& b , buf , sizeof (buf ), "" , 0 ));
241
269
242
270
PASS ();
243
271
}
@@ -249,46 +277,63 @@ check_not_enough_buffer_memory(void)
249
277
jsonb b ;
250
278
251
279
jsonb_init (& b );
252
- ASSERT ( JSONB_ERROR_NOMEM == jsonb_push_bool (& b , buf , 0 , 1 ));
253
- ASSERT ( JSONB_END == jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
280
+ ASSERTm ( buf , JSONB_ERROR_NOMEM == jsonb_push_bool (& b , buf , 0 , 1 ));
281
+ ASSERTm ( buf , JSONB_END == jsonb_push_bool (& b , buf , sizeof (buf ), 1 ));
254
282
255
283
PASS ();
256
284
}
257
285
258
286
TEST
259
287
check_out_of_bounds_access (void )
260
288
{
261
- char buf [1024 ];
289
+ char buf [JSONB_MAX_DEPTH * sizeof ( "[" ) ];
262
290
jsonb b ;
263
291
264
292
jsonb_init (& b );
265
293
while (1 ) {
266
- if (JSONB_ERROR_STACK == jsonb_push_array (& b , buf , sizeof (buf )))
267
- break ;
294
+ if (JSONB_ERROR_STACK == jsonb_push_array (& b , buf , sizeof (buf ))) break ;
268
295
}
269
296
270
297
PASS ();
271
298
}
272
299
273
300
TEST
274
- check_no_operation_after_done (void )
301
+ check_single_no_operation_after_done (void )
275
302
{
276
303
char buf [1024 ];
277
304
jsonb b ;
278
305
279
306
jsonb_init (& b );
280
- ASSERT (JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
281
- ASSERT (JSONB_END == jsonb_pop_array (& b , buf , sizeof (buf )));
282
- ASSERT (JSONB_ERROR_INPUT == jsonb_push_array (& b , buf , sizeof (buf )));
307
+ ASSERTm (buf , JSONB_END == jsonb_push_null (& b , buf , sizeof (buf )));
308
+ ASSERTm (buf , JSONB_ERROR_INPUT == jsonb_push_null (& b , buf , sizeof (buf )));
309
+
310
+ PASS ();
311
+ }
312
+
313
+ TEST
314
+ check_array_no_operation_after_done (void )
315
+ {
316
+ char buf [1024 ];
317
+ jsonb b ;
283
318
284
319
jsonb_init (& b );
285
- ASSERT (JSONB_OK == jsonb_push_object (& b , buf , sizeof (buf )));
286
- ASSERT (JSONB_END == jsonb_pop_object (& b , buf , sizeof (buf )));
287
- ASSERT (JSONB_ERROR_INPUT == jsonb_push_object (& b , buf , sizeof (buf )));
320
+ ASSERTm (buf , JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
321
+ ASSERTm (buf , JSONB_END == jsonb_pop_array (& b , buf , sizeof (buf )));
322
+ ASSERTm (buf , JSONB_ERROR_INPUT == jsonb_push_array (& b , buf , sizeof (buf )));
323
+
324
+ PASS ();
325
+ }
326
+
327
+ TEST
328
+ check_object_no_operation_after_done (void )
329
+ {
330
+ char buf [1024 ];
331
+ jsonb b ;
288
332
289
333
jsonb_init (& b );
290
- ASSERT (JSONB_END == jsonb_push_null (& b , buf , sizeof (buf )));
291
- ASSERT (JSONB_ERROR_INPUT == jsonb_push_null (& b , buf , sizeof (buf )));
334
+ ASSERTm (buf , JSONB_OK == jsonb_push_object (& b , buf , sizeof (buf )));
335
+ ASSERTm (buf , JSONB_END == jsonb_pop_object (& b , buf , sizeof (buf )));
336
+ ASSERTm (buf , JSONB_ERROR_INPUT == jsonb_push_object (& b , buf , sizeof (buf )));
292
337
293
338
PASS ();
294
339
}
@@ -298,7 +343,9 @@ SUITE(force_error)
298
343
RUN_TEST (check_invalid_top_level_tokens_in_sequence );
299
344
RUN_TEST (check_not_enough_buffer_memory );
300
345
RUN_TEST (check_out_of_bounds_access );
301
- RUN_TEST (check_no_operation_after_done );
346
+ RUN_TEST (check_single_no_operation_after_done );
347
+ RUN_TEST (check_array_no_operation_after_done );
348
+ RUN_TEST (check_object_no_operation_after_done );
302
349
}
303
350
304
351
GREATEST_MAIN_DEFS ();
0 commit comments