Skip to content

Commit 9a4e551

Browse files
committed
chore: improve test.c by printing buffer at the point of failure, 'buf' for stack tests should scale with JSONB_MAX_DEPTH
1 parent 8a7a024 commit 9a4e551

File tree

1 file changed

+125
-78
lines changed

1 file changed

+125
-78
lines changed

test/test.c

Lines changed: 125 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
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)
114116
TEST
115117
check_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

129133
TEST
130134
check_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

148153
TEST
149154
check_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

258286
TEST
259287
check_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

273300
TEST
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

304351
GREATEST_MAIN_DEFS();

0 commit comments

Comments
 (0)