33#include <assert.h>
44#include <stddef.h>
55
6- #define JSONB_MAX_DEPTH 4
7- #define JSONB_DEBUG
6+ #define JSONB_MAX_DEPTH 1028
87#include "json-build.h"
98
109#include "greatest.h"
@@ -16,33 +15,34 @@ check_valid_singles(void)
1615 jsonb b ;
1716
1817 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 )));
2120 ASSERT_STR_EQ ("[]" , buf );
2221
2322 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 )));
2625 ASSERT_STR_EQ ("{}" , buf );
2726
2827 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 ));
3029 ASSERT_STR_EQ ("false" , buf );
3130
3231 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 ));
3433 ASSERT_STR_EQ ("true" , buf );
3534
3635 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 ));
3837 ASSERT_STR_EQ ("10" , buf );
3938
4039 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 ));
4242 ASSERT_STR_EQ ("\"hi\"" , buf );
4343
4444 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 )));
4646 ASSERT_STR_EQ ("null" , buf );
4747
4848 PASS ();
@@ -55,16 +55,17 @@ check_valid_array(void)
5555 jsonb b ;
5656
5757 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 )));
5959 {
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 )));
6869 }
6970
7071 ASSERT_STR_EQ ("[true,false,null,10,\"foo\",{}]" , buf );
@@ -79,22 +80,23 @@ check_valid_object(void)
7980 jsonb b ;
8081
8182 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 )));
8384 {
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 )));
98100 }
99101
100102 ASSERT_STR_EQ (
@@ -114,60 +116,82 @@ SUITE(valid_output)
114116TEST
115117check_deep_nesting_array (void )
116118{
117- char buf [2048 ];
119+ char buf [JSONB_MAX_DEPTH * sizeof ( "[]" ) ];
118120 jsonb b ;
119121 int i ;
120122
121123 jsonb_init (& b );
122124 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+
126130 PASS ();
127131}
128132
129133TEST
130134check_deep_nesting_object (void )
131135{
132- char buf [4096 ];
136+ char buf [JSONB_MAX_DEPTH * ( sizeof ( "{}" ) + sizeof ( "\"a\":" )) ];
133137 jsonb b ;
134138 int i ;
135139
136140 jsonb_init (& b );
137141 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 ));
144144 }
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+
145150 PASS ();
146151}
147152
148153TEST
149154check_deep_nesting_object_and_array (void )
150155{
151- char buf [8192 ];
156+ char buf [JSONB_MAX_DEPTH * ( sizeof ( "[{}]" ) + sizeof ( "\"a\":" )) ];
152157 jsonb b ;
153158 int i ;
154159
155160 jsonb_init (& b );
156161 for (i = 0 ; i < JSONB_MAX_DEPTH ; ++ i ) {
157162 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 ));
160166 }
161167 else {
162- ASSERT ( jsonb_push_array (& b , buf , sizeof (buf )) >= 0 );
168+ ASSERTm ( buf , JSONB_OK == jsonb_push_array (& b , buf , sizeof (buf )));
163169 }
164170 }
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+ }
170192 }
193+ ASSERTm (buf , JSONB_END == jsonb_pop_object (& b , buf , sizeof (buf )));
194+
171195 PASS ();
172196}
173197
@@ -194,14 +218,15 @@ check_string_escaping(void)
194218 jsonb b ;
195219
196220 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 )));
198222 for (i = 0 ; i < sizeof (strs ) / sizeof (char * ); ++ i ) {
199223 size_t len = strlen (strs [i ]);
200224 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 );
202227 ASSERT_STR_EQ (expect [i ], buf + prev_pos );
203228 }
204- ASSERT ( jsonb_pop_array (& b , buf , sizeof (buf )) >= 0 );
229+ ASSERTm ( buf , JSONB_END == jsonb_pop_array (& b , buf , sizeof (buf )));
205230
206231 PASS ();
207232}
@@ -219,25 +244,28 @@ check_invalid_top_level_tokens_in_sequence(void)
219244
220245 jsonb_init (& b );
221246 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 ));
223249
224250 jsonb_init (& b );
225251 jsonb_push_array (& b , buf , sizeof (buf ));
226252 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 )));
228254
229255 jsonb_init (& b );
230256 jsonb_push_array (& b , buf , sizeof (buf ));
231257 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 ));
233260
234261 jsonb_init (& b );
235262 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 )));
237264
238265 jsonb_init (& b );
239266 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 ));
241269
242270 PASS ();
243271}
@@ -249,46 +277,63 @@ check_not_enough_buffer_memory(void)
249277 jsonb b ;
250278
251279 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 ));
254282
255283 PASS ();
256284}
257285
258286TEST
259287check_out_of_bounds_access (void )
260288{
261- char buf [1024 ];
289+ char buf [JSONB_MAX_DEPTH * sizeof ( "[" ) ];
262290 jsonb b ;
263291
264292 jsonb_init (& b );
265293 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 ;
268295 }
269296
270297 PASS ();
271298}
272299
273300TEST
274- check_no_operation_after_done (void )
301+ check_single_no_operation_after_done (void )
275302{
276303 char buf [1024 ];
277304 jsonb b ;
278305
279306 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 ;
283318
284319 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 ;
288332
289333 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 )));
292337
293338 PASS ();
294339}
@@ -298,7 +343,9 @@ SUITE(force_error)
298343 RUN_TEST (check_invalid_top_level_tokens_in_sequence );
299344 RUN_TEST (check_not_enough_buffer_memory );
300345 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 );
302349}
303350
304351GREATEST_MAIN_DEFS ();
0 commit comments