xref: /freebsd/crypto/openssl/test/json_test.c (revision e7be843b4a162e68651d3911f0357ed464915629)
1*e7be843bSPierre Pronchery /*
2*e7be843bSPierre Pronchery  * Copyright 2022-2025 The OpenSSL Project Authors. All Rights Reserved.
3*e7be843bSPierre Pronchery  *
4*e7be843bSPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*e7be843bSPierre Pronchery  * this file except in compliance with the License.  You can obtain a copy
6*e7be843bSPierre Pronchery  * in the file LICENSE in the source distribution or at
7*e7be843bSPierre Pronchery  * https://www.openssl.org/source/license.html
8*e7be843bSPierre Pronchery  */
9*e7be843bSPierre Pronchery 
10*e7be843bSPierre Pronchery #include <stdio.h>
11*e7be843bSPierre Pronchery #include <string.h>
12*e7be843bSPierre Pronchery 
13*e7be843bSPierre Pronchery #include "testutil.h"
14*e7be843bSPierre Pronchery #include "internal/json_enc.h"
15*e7be843bSPierre Pronchery 
16*e7be843bSPierre Pronchery struct helper {
17*e7be843bSPierre Pronchery     OSSL_JSON_ENC   j;
18*e7be843bSPierre Pronchery     int             init;
19*e7be843bSPierre Pronchery     uint32_t        flags;
20*e7be843bSPierre Pronchery     BIO             *mem_bio;
21*e7be843bSPierre Pronchery };
22*e7be843bSPierre Pronchery 
helper_ensure(struct helper * h)23*e7be843bSPierre Pronchery static int helper_ensure(struct helper *h)
24*e7be843bSPierre Pronchery {
25*e7be843bSPierre Pronchery     if (h->init)
26*e7be843bSPierre Pronchery         return 1;
27*e7be843bSPierre Pronchery 
28*e7be843bSPierre Pronchery     if (!TEST_ptr(h->mem_bio = BIO_new(BIO_s_mem())))
29*e7be843bSPierre Pronchery         return 0;
30*e7be843bSPierre Pronchery 
31*e7be843bSPierre Pronchery     if (!ossl_json_init(&h->j, h->mem_bio, h->flags)) {
32*e7be843bSPierre Pronchery         BIO_free_all(h->mem_bio);
33*e7be843bSPierre Pronchery         h->mem_bio = NULL;
34*e7be843bSPierre Pronchery         return 0;
35*e7be843bSPierre Pronchery     }
36*e7be843bSPierre Pronchery 
37*e7be843bSPierre Pronchery     h->init = 1;
38*e7be843bSPierre Pronchery     return 1;
39*e7be843bSPierre Pronchery }
40*e7be843bSPierre Pronchery 
helper_cleanup(struct helper * h)41*e7be843bSPierre Pronchery static void helper_cleanup(struct helper *h)
42*e7be843bSPierre Pronchery {
43*e7be843bSPierre Pronchery     BIO_free_all(h->mem_bio);
44*e7be843bSPierre Pronchery     h->mem_bio = NULL;
45*e7be843bSPierre Pronchery 
46*e7be843bSPierre Pronchery     if (h->init) {
47*e7be843bSPierre Pronchery         ossl_json_cleanup(&h->j);
48*e7be843bSPierre Pronchery         h->init = 0;
49*e7be843bSPierre Pronchery     }
50*e7be843bSPierre Pronchery }
51*e7be843bSPierre Pronchery 
helper_set_flags(struct helper * h,uint32_t flags)52*e7be843bSPierre Pronchery static void helper_set_flags(struct helper *h, uint32_t flags)
53*e7be843bSPierre Pronchery {
54*e7be843bSPierre Pronchery     helper_cleanup(h);
55*e7be843bSPierre Pronchery     h->flags = flags;
56*e7be843bSPierre Pronchery }
57*e7be843bSPierre Pronchery 
58*e7be843bSPierre Pronchery struct script_word {
59*e7be843bSPierre Pronchery     void        *p;
60*e7be843bSPierre Pronchery     uint64_t    u64;
61*e7be843bSPierre Pronchery     int64_t     i64;
62*e7be843bSPierre Pronchery     double      d;
63*e7be843bSPierre Pronchery     void        (*fp)(void);
64*e7be843bSPierre Pronchery };
65*e7be843bSPierre Pronchery 
66*e7be843bSPierre Pronchery #define OP_P(x)     { (x) },
67*e7be843bSPierre Pronchery #define OP_U64(x)   { NULL, (x) },
68*e7be843bSPierre Pronchery #define OP_I64(x)   { NULL, 0, (x) },
69*e7be843bSPierre Pronchery #define OP_D(x)     { NULL, 0, 0, (x) },
70*e7be843bSPierre Pronchery #define OP_FP(x)    { NULL, 0, 0, 0, (void (*)(void))(x) },
71*e7be843bSPierre Pronchery 
72*e7be843bSPierre Pronchery struct script_info {
73*e7be843bSPierre Pronchery     const char                  *name, *title;
74*e7be843bSPierre Pronchery     const struct script_word    *words;
75*e7be843bSPierre Pronchery     size_t                      num_words;
76*e7be843bSPierre Pronchery     const char                  *expected_output;
77*e7be843bSPierre Pronchery     size_t                      expected_output_len;
78*e7be843bSPierre Pronchery };
79*e7be843bSPierre Pronchery 
80*e7be843bSPierre Pronchery typedef const struct script_info *(*info_func)(void);
81*e7be843bSPierre Pronchery 
82*e7be843bSPierre Pronchery enum {
83*e7be843bSPierre Pronchery     OPK_END,
84*e7be843bSPierre Pronchery     OPK_CALL,           /* (OSSL_JSON_ENC *) */
85*e7be843bSPierre Pronchery     OPK_CALL_P,         /* (OSSL_JSON_ENC *, const void *) */
86*e7be843bSPierre Pronchery     OPK_CALL_I,         /* (OSSL_JSON_ENC *, int) */
87*e7be843bSPierre Pronchery     OPK_CALL_U64,       /* (OSSL_JSON_ENC *, uint64_t) */
88*e7be843bSPierre Pronchery     OPK_CALL_I64,       /* (OSSL_JSON_ENC *, int64_t) */
89*e7be843bSPierre Pronchery     OPK_CALL_D,         /* (OSSL_JSON_ENC *, double) */
90*e7be843bSPierre Pronchery     OPK_CALL_PZ,        /* (OSSL_JSON_ENC *, const void *, size_t) */
91*e7be843bSPierre Pronchery     OPK_ASSERT_ERROR,   /* (OSSL_JSON_ENC *, int expect_error) */
92*e7be843bSPierre Pronchery     OPK_INIT_FLAGS      /* (uint32_t flags) */
93*e7be843bSPierre Pronchery };
94*e7be843bSPierre Pronchery 
95*e7be843bSPierre Pronchery typedef void (*fp_type)(OSSL_JSON_ENC *);
96*e7be843bSPierre Pronchery typedef void (*fp_p_type)(OSSL_JSON_ENC *, const void *);
97*e7be843bSPierre Pronchery typedef void (*fp_i_type)(OSSL_JSON_ENC *, int);
98*e7be843bSPierre Pronchery typedef void (*fp_u64_type)(OSSL_JSON_ENC *, uint64_t);
99*e7be843bSPierre Pronchery typedef void (*fp_i64_type)(OSSL_JSON_ENC *, int64_t);
100*e7be843bSPierre Pronchery typedef void (*fp_d_type)(OSSL_JSON_ENC *, double);
101*e7be843bSPierre Pronchery typedef void (*fp_pz_type)(OSSL_JSON_ENC *, const void *, size_t);
102*e7be843bSPierre Pronchery 
103*e7be843bSPierre Pronchery #define OP_END()              OP_U64(OPK_END)
104*e7be843bSPierre Pronchery #define OP_CALL(f)            OP_U64(OPK_CALL)     OP_FP(f)
105*e7be843bSPierre Pronchery #define OP_CALL_P(f, x)       OP_U64(OPK_CALL_P)   OP_FP(f) OP_P  (x)
106*e7be843bSPierre Pronchery #define OP_CALL_I(f, x)       OP_U64(OPK_CALL_I)   OP_FP(f) OP_I64(x)
107*e7be843bSPierre Pronchery #define OP_CALL_U64(f, x)     OP_U64(OPK_CALL_U64) OP_FP(f) OP_U64(x)
108*e7be843bSPierre Pronchery #define OP_CALL_I64(f, x)     OP_U64(OPK_CALL_I64) OP_FP(f) OP_I64(x)
109*e7be843bSPierre Pronchery #define OP_CALL_D(f, x)       OP_U64(OPK_CALL_D)   OP_FP(f) OP_D  (x)
110*e7be843bSPierre Pronchery #define OP_CALL_PZ(f, x, xl)  OP_U64(OPK_CALL_PZ)  OP_FP(f) OP_P  (x) OP_U64(xl)
111*e7be843bSPierre Pronchery #define OP_ASSERT_ERROR(err)  OP_U64(OPK_ASSERT_ERROR) OP_U64(err)
112*e7be843bSPierre Pronchery #define OP_INIT_FLAGS(flags)  OP_U64(OPK_INIT_FLAGS)   OP_U64(flags)
113*e7be843bSPierre Pronchery 
114*e7be843bSPierre Pronchery #define OPJ_BEGIN_O()         OP_CALL(ossl_json_object_begin)
115*e7be843bSPierre Pronchery #define OPJ_END_O()           OP_CALL(ossl_json_object_end)
116*e7be843bSPierre Pronchery #define OPJ_BEGIN_A()         OP_CALL(ossl_json_array_begin)
117*e7be843bSPierre Pronchery #define OPJ_END_A()           OP_CALL(ossl_json_array_end)
118*e7be843bSPierre Pronchery #define OPJ_NULL()            OP_CALL(ossl_json_null)
119*e7be843bSPierre Pronchery #define OPJ_BOOL(x)           OP_CALL_I(ossl_json_bool, (x))
120*e7be843bSPierre Pronchery #define OPJ_U64(x)            OP_CALL_U64(ossl_json_u64, (x))
121*e7be843bSPierre Pronchery #define OPJ_I64(x)            OP_CALL_I64(ossl_json_i64, (x))
122*e7be843bSPierre Pronchery #define OPJ_KEY(x)            OP_CALL_P(ossl_json_key, (x))
123*e7be843bSPierre Pronchery #define OPJ_STR(x)            OP_CALL_P(ossl_json_str, (x))
124*e7be843bSPierre Pronchery #define OPJ_STR_LEN(x, xl)    OP_CALL_PZ(ossl_json_str_len, (x), (xl))
125*e7be843bSPierre Pronchery #define OPJ_STR_HEX(x, xl)    OP_CALL_PZ(ossl_json_str_hex, (x), (xl))
126*e7be843bSPierre Pronchery 
127*e7be843bSPierre Pronchery #define BEGIN_SCRIPT(name, title, flags)                                       \
128*e7be843bSPierre Pronchery     static const struct script_info *get_script_##name(void)                   \
129*e7be843bSPierre Pronchery     {                                                                          \
130*e7be843bSPierre Pronchery         static const char script_name[] = #name;                               \
131*e7be843bSPierre Pronchery         static const char script_title[] = #title;                             \
132*e7be843bSPierre Pronchery                                                                                \
133*e7be843bSPierre Pronchery         static const struct script_word script_words[] = {                     \
134*e7be843bSPierre Pronchery             OP_INIT_FLAGS(flags)
135*e7be843bSPierre Pronchery 
136*e7be843bSPierre Pronchery #define END_SCRIPT_EXPECTING(s, slen)                                          \
137*e7be843bSPierre Pronchery             OP_END()                                                           \
138*e7be843bSPierre Pronchery         };                                                                     \
139*e7be843bSPierre Pronchery         static const struct script_info script_info = {                        \
140*e7be843bSPierre Pronchery             script_name, script_title, script_words, OSSL_NELEM(script_words), \
141*e7be843bSPierre Pronchery             (s), (slen)                                                        \
142*e7be843bSPierre Pronchery         };                                                                     \
143*e7be843bSPierre Pronchery         return &script_info;                                                   \
144*e7be843bSPierre Pronchery     }
145*e7be843bSPierre Pronchery 
146*e7be843bSPierre Pronchery #ifdef OPENSSL_SYS_VMS
147*e7be843bSPierre Pronchery /*
148*e7be843bSPierre Pronchery  * The VMS C compiler recognises \u in strings, and emits a warning, which
149*e7be843bSPierre Pronchery  * stops the build.  Because we think we know what we're doing, we change that
150*e7be843bSPierre Pronchery  * particular message to be merely informational.
151*e7be843bSPierre Pronchery  */
152*e7be843bSPierre Pronchery # pragma message informational UCNNOMAP
153*e7be843bSPierre Pronchery #endif
154*e7be843bSPierre Pronchery 
155*e7be843bSPierre Pronchery #define END_SCRIPT_EXPECTING_S(s)   END_SCRIPT_EXPECTING(s, SIZE_MAX)
156*e7be843bSPierre Pronchery #define END_SCRIPT_EXPECTING_Q(s)   END_SCRIPT_EXPECTING(#s, sizeof(#s) - 1)
157*e7be843bSPierre Pronchery 
158*e7be843bSPierre Pronchery #define SCRIPT(name) get_script_##name,
159*e7be843bSPierre Pronchery 
160*e7be843bSPierre Pronchery BEGIN_SCRIPT(null, "serialize a single null", 0)
161*e7be843bSPierre Pronchery     OPJ_NULL()
162*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(null)
163*e7be843bSPierre Pronchery 
164*e7be843bSPierre Pronchery BEGIN_SCRIPT(obj_empty, "serialize an empty object", 0)
165*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
166*e7be843bSPierre Pronchery     OPJ_END_O()
167*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q({})
168*e7be843bSPierre Pronchery 
169*e7be843bSPierre Pronchery BEGIN_SCRIPT(array_empty, "serialize an empty array", 0)
170*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
171*e7be843bSPierre Pronchery     OPJ_END_A()
172*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q([])
173*e7be843bSPierre Pronchery 
174*e7be843bSPierre Pronchery BEGIN_SCRIPT(bool_false, "serialize false", 0)
175*e7be843bSPierre Pronchery     OPJ_BOOL(0)
176*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(false)
177*e7be843bSPierre Pronchery 
178*e7be843bSPierre Pronchery BEGIN_SCRIPT(bool_true, "serialize true", 0)
179*e7be843bSPierre Pronchery     OPJ_BOOL(1)
180*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(true)
181*e7be843bSPierre Pronchery 
182*e7be843bSPierre Pronchery BEGIN_SCRIPT(u64_0, "serialize u64(0)", 0)
183*e7be843bSPierre Pronchery     OPJ_U64(0)
184*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(0)
185*e7be843bSPierre Pronchery 
186*e7be843bSPierre Pronchery BEGIN_SCRIPT(u64_1, "serialize u64(1)", 0)
187*e7be843bSPierre Pronchery     OPJ_U64(1)
188*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(1)
189*e7be843bSPierre Pronchery 
190*e7be843bSPierre Pronchery BEGIN_SCRIPT(u64_10, "serialize u64(10)", 0)
191*e7be843bSPierre Pronchery     OPJ_U64(10)
192*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(10)
193*e7be843bSPierre Pronchery 
194*e7be843bSPierre Pronchery BEGIN_SCRIPT(u64_12345, "serialize u64(12345)", 0)
195*e7be843bSPierre Pronchery     OPJ_U64(12345)
196*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(12345)
197*e7be843bSPierre Pronchery 
198*e7be843bSPierre Pronchery BEGIN_SCRIPT(u64_18446744073709551615, "serialize u64(18446744073709551615)", 0)
199*e7be843bSPierre Pronchery     OPJ_U64(18446744073709551615ULL)
200*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(18446744073709551615)
201*e7be843bSPierre Pronchery 
202*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_0, "serialize i64(0)", 0)
203*e7be843bSPierre Pronchery     OPJ_I64(0)
204*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(0)
205*e7be843bSPierre Pronchery 
206*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_1, "serialize i64(1)", 0)
207*e7be843bSPierre Pronchery     OPJ_I64(1)
208*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(1)
209*e7be843bSPierre Pronchery 
210*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_2, "serialize i64(2)", 0)
211*e7be843bSPierre Pronchery     OPJ_I64(2)
212*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(2)
213*e7be843bSPierre Pronchery 
214*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_10, "serialize i64(10)", 0)
215*e7be843bSPierre Pronchery     OPJ_I64(10)
216*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(10)
217*e7be843bSPierre Pronchery 
218*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_12345, "serialize i64(12345)", 0)
219*e7be843bSPierre Pronchery     OPJ_I64(12345)
220*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(12345)
221*e7be843bSPierre Pronchery 
222*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_9223372036854775807, "serialize i64(9223372036854775807)", 0)
223*e7be843bSPierre Pronchery     OPJ_I64(9223372036854775807LL)
224*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(9223372036854775807)
225*e7be843bSPierre Pronchery 
226*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_m1, "serialize i64(-1)", 0)
227*e7be843bSPierre Pronchery     OPJ_I64(-1)
228*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(-1)
229*e7be843bSPierre Pronchery 
230*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_m2, "serialize i64(-2)", 0)
231*e7be843bSPierre Pronchery     OPJ_I64(-2)
232*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(-2)
233*e7be843bSPierre Pronchery 
234*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_m10, "serialize i64(-10)", 0)
235*e7be843bSPierre Pronchery     OPJ_I64(-10)
236*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(-10)
237*e7be843bSPierre Pronchery 
238*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_m12345, "serialize i64(-12345)", 0)
239*e7be843bSPierre Pronchery     OPJ_I64(-12345)
240*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(-12345)
241*e7be843bSPierre Pronchery 
242*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_m9223372036854775807, "serialize i64(-9223372036854775807)", 0)
243*e7be843bSPierre Pronchery     OPJ_I64(-9223372036854775807LL)
244*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(-9223372036854775807)
245*e7be843bSPierre Pronchery 
246*e7be843bSPierre Pronchery BEGIN_SCRIPT(i64_m9223372036854775808, "serialize i64(-9223372036854775808)", 0)
247*e7be843bSPierre Pronchery     OPJ_I64(-9223372036854775807LL - 1LL)
248*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q(-9223372036854775808)
249*e7be843bSPierre Pronchery 
250*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_empty, "serialize \"\"", 0)
251*e7be843bSPierre Pronchery     OPJ_STR("")
252*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("")
253*e7be843bSPierre Pronchery 
254*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_a, "serialize \"a\"", 0)
255*e7be843bSPierre Pronchery     OPJ_STR("a")
256*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("a")
257*e7be843bSPierre Pronchery 
258*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_abc, "serialize \"abc\"", 0)
259*e7be843bSPierre Pronchery     OPJ_STR("abc")
260*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("abc")
261*e7be843bSPierre Pronchery 
262*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_quote, "serialize with quote", 0)
263*e7be843bSPierre Pronchery     OPJ_STR("abc\"def")
264*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("abc\"def")
265*e7be843bSPierre Pronchery 
266*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_quote2, "serialize with quote", 0)
267*e7be843bSPierre Pronchery     OPJ_STR("abc\"\"def")
268*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("abc\"\"def")
269*e7be843bSPierre Pronchery 
270*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_escape, "serialize with various escapes", 0)
271*e7be843bSPierre Pronchery     OPJ_STR("abc\"\"de'f\r\n\t\b\f\\\x01\v\x7f\\")
272*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("abc\"\"de'f\r\n\t\b\f\\\u0001\u000b\u007f\\")
273*e7be843bSPierre Pronchery 
274*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_len, "length-signalled string", 0)
275*e7be843bSPierre Pronchery     OPJ_STR_LEN("abcdef", 6)
276*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("abcdef")
277*e7be843bSPierre Pronchery 
278*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_len0, "0-length-signalled string", 0)
279*e7be843bSPierre Pronchery     OPJ_STR_LEN("", 0)
280*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("")
281*e7be843bSPierre Pronchery 
282*e7be843bSPierre Pronchery BEGIN_SCRIPT(str_len_nul, "string with NUL", 0)
283*e7be843bSPierre Pronchery     OPJ_STR_LEN("x\0y", 3)
284*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("x\u0000y")
285*e7be843bSPierre Pronchery 
286*e7be843bSPierre Pronchery BEGIN_SCRIPT(hex_data0, "zero-length hex data", 0)
287*e7be843bSPierre Pronchery     OPJ_STR_HEX("", 0)
288*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("")
289*e7be843bSPierre Pronchery 
290*e7be843bSPierre Pronchery BEGIN_SCRIPT(hex_data, "hex data", 0)
291*e7be843bSPierre Pronchery     OPJ_STR_HEX("\x00\x01\x5a\xfb\xff", 5)
292*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q("00015afbff")
293*e7be843bSPierre Pronchery 
294*e7be843bSPierre Pronchery BEGIN_SCRIPT(array_nest1, "serialize nested empty arrays", 0)
295*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
296*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
297*e7be843bSPierre Pronchery     OPJ_END_A()
298*e7be843bSPierre Pronchery     OPJ_END_A()
299*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q([[]])
300*e7be843bSPierre Pronchery 
301*e7be843bSPierre Pronchery BEGIN_SCRIPT(array_nest2, "serialize nested empty arrays", 0)
302*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
303*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
304*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
305*e7be843bSPierre Pronchery     OPJ_END_A()
306*e7be843bSPierre Pronchery     OPJ_END_A()
307*e7be843bSPierre Pronchery     OPJ_END_A()
308*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_Q([[[]]])
309*e7be843bSPierre Pronchery 
310*e7be843bSPierre Pronchery BEGIN_SCRIPT(array_nest3, "serialize nested empty arrays", 0)
311*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
312*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
313*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
314*e7be843bSPierre Pronchery     OPJ_END_A()
315*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
316*e7be843bSPierre Pronchery     OPJ_END_A()
317*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
318*e7be843bSPierre Pronchery     OPJ_END_A()
319*e7be843bSPierre Pronchery     OPJ_END_A()
320*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
321*e7be843bSPierre Pronchery     OPJ_END_A()
322*e7be843bSPierre Pronchery     OPJ_END_A()
323*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("[[[],[],[]],[]]")
324*e7be843bSPierre Pronchery 
325*e7be843bSPierre Pronchery BEGIN_SCRIPT(array_nest4, "deep nested arrays", 0)
326*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
327*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
328*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
329*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
330*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
331*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
332*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
333*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
334*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
335*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
336*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
337*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
338*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
339*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
340*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
341*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
342*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
343*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
344*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
345*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
346*e7be843bSPierre Pronchery     OPJ_END_A()
347*e7be843bSPierre Pronchery     OPJ_END_A()
348*e7be843bSPierre Pronchery     OPJ_END_A()
349*e7be843bSPierre Pronchery     OPJ_END_A()
350*e7be843bSPierre Pronchery     OPJ_END_A()
351*e7be843bSPierre Pronchery     OPJ_END_A()
352*e7be843bSPierre Pronchery     OPJ_END_A()
353*e7be843bSPierre Pronchery     OPJ_END_A()
354*e7be843bSPierre Pronchery     OPJ_END_A()
355*e7be843bSPierre Pronchery     OPJ_END_A()
356*e7be843bSPierre Pronchery     OPJ_END_A()
357*e7be843bSPierre Pronchery     OPJ_END_A()
358*e7be843bSPierre Pronchery     OPJ_END_A()
359*e7be843bSPierre Pronchery     OPJ_END_A()
360*e7be843bSPierre Pronchery     OPJ_END_A()
361*e7be843bSPierre Pronchery     OPJ_END_A()
362*e7be843bSPierre Pronchery     OPJ_END_A()
363*e7be843bSPierre Pronchery     OPJ_END_A()
364*e7be843bSPierre Pronchery     OPJ_END_A()
365*e7be843bSPierre Pronchery     OPJ_NULL()
366*e7be843bSPierre Pronchery     OPJ_END_A()
367*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]],null]")
368*e7be843bSPierre Pronchery 
369*e7be843bSPierre Pronchery BEGIN_SCRIPT(obj_nontrivial1, "serialize nontrivial object", 0)
370*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
371*e7be843bSPierre Pronchery     OPJ_KEY("")
372*e7be843bSPierre Pronchery     OPJ_NULL()
373*e7be843bSPierre Pronchery     OPJ_END_O()
374*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("{\"\":null}")
375*e7be843bSPierre Pronchery 
376*e7be843bSPierre Pronchery BEGIN_SCRIPT(obj_nontrivial2, "serialize nontrivial object", 0)
377*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
378*e7be843bSPierre Pronchery     OPJ_KEY("")
379*e7be843bSPierre Pronchery     OPJ_NULL()
380*e7be843bSPierre Pronchery     OPJ_KEY("x")
381*e7be843bSPierre Pronchery     OPJ_NULL()
382*e7be843bSPierre Pronchery     OPJ_END_O()
383*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("{\"\":null,\"x\":null}")
384*e7be843bSPierre Pronchery 
385*e7be843bSPierre Pronchery BEGIN_SCRIPT(obj_nest1, "serialize nested objects", 0)
386*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
387*e7be843bSPierre Pronchery     OPJ_KEY("")
388*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
389*e7be843bSPierre Pronchery     OPJ_KEY("x")
390*e7be843bSPierre Pronchery     OPJ_U64(42)
391*e7be843bSPierre Pronchery     OPJ_END_O()
392*e7be843bSPierre Pronchery     OPJ_KEY("x")
393*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
394*e7be843bSPierre Pronchery     OPJ_U64(42)
395*e7be843bSPierre Pronchery     OPJ_U64(101)
396*e7be843bSPierre Pronchery     OPJ_END_A()
397*e7be843bSPierre Pronchery     OPJ_KEY("y")
398*e7be843bSPierre Pronchery     OPJ_NULL()
399*e7be843bSPierre Pronchery     OPJ_KEY("z")
400*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
401*e7be843bSPierre Pronchery     OPJ_KEY("z0")
402*e7be843bSPierre Pronchery     OPJ_I64(-1)
403*e7be843bSPierre Pronchery     OPJ_KEY("z1")
404*e7be843bSPierre Pronchery     OPJ_I64(-2)
405*e7be843bSPierre Pronchery     OPJ_END_O()
406*e7be843bSPierre Pronchery     OPJ_END_O()
407*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("{\"\":{\"x\":42},\"x\":[42,101],\"y\":null,\"z\":{\"z0\":-1,\"z1\":-2}}")
408*e7be843bSPierre Pronchery 
409*e7be843bSPierre Pronchery BEGIN_SCRIPT(err_obj_no_key, "error test: object item without key", 0)
410*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
411*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(0)
412*e7be843bSPierre Pronchery     OPJ_NULL()
413*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(1)
414*e7be843bSPierre Pronchery     OPJ_END_O()
415*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(1)
416*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("{")
417*e7be843bSPierre Pronchery 
418*e7be843bSPierre Pronchery BEGIN_SCRIPT(err_obj_multi_key, "error test: object item with repeated key", 0)
419*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
420*e7be843bSPierre Pronchery     OPJ_KEY("x")
421*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(0)
422*e7be843bSPierre Pronchery     OPJ_KEY("y")
423*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(1)
424*e7be843bSPierre Pronchery     OPJ_NULL()
425*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(1)
426*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("{\"x\":")
427*e7be843bSPierre Pronchery 
428*e7be843bSPierre Pronchery BEGIN_SCRIPT(err_obj_no_value, "error test: object item with no value", 0)
429*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
430*e7be843bSPierre Pronchery     OPJ_KEY("x")
431*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(0)
432*e7be843bSPierre Pronchery     OPJ_END_O()
433*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(1)
434*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("{\"x\":")
435*e7be843bSPierre Pronchery 
436*e7be843bSPierre Pronchery BEGIN_SCRIPT(err_utf8, "error test: only basic ASCII supported", 0)
437*e7be843bSPierre Pronchery     OPJ_STR("\x80")
438*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(0)
439*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("\"\\u0080\"")
440*e7be843bSPierre Pronchery 
441*e7be843bSPierre Pronchery BEGIN_SCRIPT(utf8_2, "test: valid UTF-8 2byte supported", 0)
442*e7be843bSPierre Pronchery     OPJ_STR("low=\xc2\x80, high=\xdf\xbf")
443*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(0)
444*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("\"low=\xc2\x80, high=\xdf\xbf\"")
445*e7be843bSPierre Pronchery 
446*e7be843bSPierre Pronchery BEGIN_SCRIPT(utf8_3, "test: valid UTF-8 3byte supported", 0)
447*e7be843bSPierre Pronchery     OPJ_STR("low=\xe0\xa0\x80, high=\xef\xbf\xbf")
448*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(0)
449*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("\"low=\xe0\xa0\x80, high=\xef\xbf\xbf\"")
450*e7be843bSPierre Pronchery 
451*e7be843bSPierre Pronchery BEGIN_SCRIPT(utf8_4, "test: valid UTF-8 4byte supported", 0)
452*e7be843bSPierre Pronchery     OPJ_STR("low=\xf0\x90\xbf\xbf, high=\xf4\x8f\xbf\xbf")
453*e7be843bSPierre Pronchery     OP_ASSERT_ERROR(0)
454*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("\"low=\xf0\x90\xbf\xbf, high=\xf4\x8f\xbf\xbf\"")
455*e7be843bSPierre Pronchery 
456*e7be843bSPierre Pronchery BEGIN_SCRIPT(ijson_int, "I-JSON: large integer", OSSL_JSON_FLAG_IJSON)
457*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
458*e7be843bSPierre Pronchery     OPJ_U64(1)
459*e7be843bSPierre Pronchery     OPJ_I64(-1)
460*e7be843bSPierre Pronchery     OPJ_U64(9007199254740991)
461*e7be843bSPierre Pronchery     OPJ_U64(9007199254740992)
462*e7be843bSPierre Pronchery     OPJ_I64(-9007199254740991)
463*e7be843bSPierre Pronchery     OPJ_I64(-9007199254740992)
464*e7be843bSPierre Pronchery     OPJ_END_A()
465*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("[1,-1,9007199254740991,\"9007199254740992\",-9007199254740991,\"-9007199254740992\"]")
466*e7be843bSPierre Pronchery 
467*e7be843bSPierre Pronchery BEGIN_SCRIPT(multi_item, "multiple top level items", 0)
468*e7be843bSPierre Pronchery     OPJ_NULL()
469*e7be843bSPierre Pronchery     OPJ_NULL()
470*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
471*e7be843bSPierre Pronchery     OPJ_END_A()
472*e7be843bSPierre Pronchery     OPJ_BEGIN_A()
473*e7be843bSPierre Pronchery     OPJ_END_A()
474*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("nullnull[][]")
475*e7be843bSPierre Pronchery 
476*e7be843bSPierre Pronchery BEGIN_SCRIPT(seq, "JSON-SEQ", OSSL_JSON_FLAG_SEQ)
477*e7be843bSPierre Pronchery     OPJ_NULL()
478*e7be843bSPierre Pronchery     OPJ_NULL()
479*e7be843bSPierre Pronchery     OPJ_NULL()
480*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
481*e7be843bSPierre Pronchery     OPJ_KEY("x")
482*e7be843bSPierre Pronchery     OPJ_U64(1)
483*e7be843bSPierre Pronchery     OPJ_KEY("y")
484*e7be843bSPierre Pronchery     OPJ_BEGIN_O()
485*e7be843bSPierre Pronchery     OPJ_END_O()
486*e7be843bSPierre Pronchery     OPJ_END_O()
487*e7be843bSPierre Pronchery END_SCRIPT_EXPECTING_S("\x1Enull\n" "\x1Enull\n" "\x1Enull\n" "\x1E{\"x\":1,\"y\":{}}\n")
488*e7be843bSPierre Pronchery 
489*e7be843bSPierre Pronchery static const info_func scripts[] = {
490*e7be843bSPierre Pronchery     SCRIPT(null)
491*e7be843bSPierre Pronchery     SCRIPT(obj_empty)
492*e7be843bSPierre Pronchery     SCRIPT(array_empty)
493*e7be843bSPierre Pronchery     SCRIPT(bool_false)
494*e7be843bSPierre Pronchery     SCRIPT(bool_true)
495*e7be843bSPierre Pronchery     SCRIPT(u64_0)
496*e7be843bSPierre Pronchery     SCRIPT(u64_1)
497*e7be843bSPierre Pronchery     SCRIPT(u64_10)
498*e7be843bSPierre Pronchery     SCRIPT(u64_12345)
499*e7be843bSPierre Pronchery     SCRIPT(u64_18446744073709551615)
500*e7be843bSPierre Pronchery     SCRIPT(i64_0)
501*e7be843bSPierre Pronchery     SCRIPT(i64_1)
502*e7be843bSPierre Pronchery     SCRIPT(i64_2)
503*e7be843bSPierre Pronchery     SCRIPT(i64_10)
504*e7be843bSPierre Pronchery     SCRIPT(i64_12345)
505*e7be843bSPierre Pronchery     SCRIPT(i64_9223372036854775807)
506*e7be843bSPierre Pronchery     SCRIPT(i64_m1)
507*e7be843bSPierre Pronchery     SCRIPT(i64_m2)
508*e7be843bSPierre Pronchery     SCRIPT(i64_m10)
509*e7be843bSPierre Pronchery     SCRIPT(i64_m12345)
510*e7be843bSPierre Pronchery     SCRIPT(i64_m9223372036854775807)
511*e7be843bSPierre Pronchery     SCRIPT(i64_m9223372036854775808)
512*e7be843bSPierre Pronchery     SCRIPT(str_empty)
513*e7be843bSPierre Pronchery     SCRIPT(str_a)
514*e7be843bSPierre Pronchery     SCRIPT(str_abc)
515*e7be843bSPierre Pronchery     SCRIPT(str_quote)
516*e7be843bSPierre Pronchery     SCRIPT(str_quote2)
517*e7be843bSPierre Pronchery     SCRIPT(str_escape)
518*e7be843bSPierre Pronchery     SCRIPT(str_len)
519*e7be843bSPierre Pronchery     SCRIPT(str_len0)
520*e7be843bSPierre Pronchery     SCRIPT(str_len_nul)
521*e7be843bSPierre Pronchery     SCRIPT(hex_data0)
522*e7be843bSPierre Pronchery     SCRIPT(hex_data)
523*e7be843bSPierre Pronchery     SCRIPT(array_nest1)
524*e7be843bSPierre Pronchery     SCRIPT(array_nest2)
525*e7be843bSPierre Pronchery     SCRIPT(array_nest3)
526*e7be843bSPierre Pronchery     SCRIPT(array_nest4)
527*e7be843bSPierre Pronchery     SCRIPT(obj_nontrivial1)
528*e7be843bSPierre Pronchery     SCRIPT(obj_nontrivial2)
529*e7be843bSPierre Pronchery     SCRIPT(obj_nest1)
530*e7be843bSPierre Pronchery     SCRIPT(err_obj_no_key)
531*e7be843bSPierre Pronchery     SCRIPT(err_obj_multi_key)
532*e7be843bSPierre Pronchery     SCRIPT(err_obj_no_value)
533*e7be843bSPierre Pronchery     SCRIPT(err_utf8)
534*e7be843bSPierre Pronchery     SCRIPT(utf8_2)
535*e7be843bSPierre Pronchery     SCRIPT(utf8_3)
536*e7be843bSPierre Pronchery     SCRIPT(utf8_4)
537*e7be843bSPierre Pronchery     SCRIPT(ijson_int)
538*e7be843bSPierre Pronchery     SCRIPT(multi_item)
539*e7be843bSPierre Pronchery     SCRIPT(seq)
540*e7be843bSPierre Pronchery };
541*e7be843bSPierre Pronchery 
542*e7be843bSPierre Pronchery /* Test runner. */
run_script(const struct script_info * info)543*e7be843bSPierre Pronchery static int run_script(const struct script_info *info)
544*e7be843bSPierre Pronchery {
545*e7be843bSPierre Pronchery     int ok = 0, asserted = -1;
546*e7be843bSPierre Pronchery     const struct script_word *words = info->words;
547*e7be843bSPierre Pronchery     size_t wp = 0;
548*e7be843bSPierre Pronchery     struct script_word w;
549*e7be843bSPierre Pronchery     struct helper h = {0};
550*e7be843bSPierre Pronchery     BUF_MEM *bufp = NULL;
551*e7be843bSPierre Pronchery 
552*e7be843bSPierre Pronchery     TEST_info("running script '%s' (%s)", info->name, info->title);
553*e7be843bSPierre Pronchery 
554*e7be843bSPierre Pronchery #define GET_WORD()  (w = words[wp++])
555*e7be843bSPierre Pronchery #define GET_U64()   (GET_WORD().u64)
556*e7be843bSPierre Pronchery #define GET_I64()   (GET_WORD().i64)
557*e7be843bSPierre Pronchery #define GET_FP()    (GET_WORD().fp)
558*e7be843bSPierre Pronchery #define GET_P()     (GET_WORD().p)
559*e7be843bSPierre Pronchery 
560*e7be843bSPierre Pronchery     for (;;)
561*e7be843bSPierre Pronchery         switch (GET_U64()) {
562*e7be843bSPierre Pronchery         case OPK_END:
563*e7be843bSPierre Pronchery             goto stop;
564*e7be843bSPierre Pronchery         case OPK_INIT_FLAGS:
565*e7be843bSPierre Pronchery             helper_set_flags(&h, (uint32_t)GET_U64());
566*e7be843bSPierre Pronchery             break;
567*e7be843bSPierre Pronchery         case OPK_CALL:
568*e7be843bSPierre Pronchery         {
569*e7be843bSPierre Pronchery             fp_type f = (fp_type)GET_FP();
570*e7be843bSPierre Pronchery 
571*e7be843bSPierre Pronchery             if (!TEST_true(helper_ensure(&h)))
572*e7be843bSPierre Pronchery                 goto err;
573*e7be843bSPierre Pronchery 
574*e7be843bSPierre Pronchery             f(&h.j);
575*e7be843bSPierre Pronchery             break;
576*e7be843bSPierre Pronchery         }
577*e7be843bSPierre Pronchery         case OPK_CALL_I:
578*e7be843bSPierre Pronchery         {
579*e7be843bSPierre Pronchery             fp_i_type f = (fp_i_type)GET_FP();
580*e7be843bSPierre Pronchery 
581*e7be843bSPierre Pronchery             if (!TEST_true(helper_ensure(&h)))
582*e7be843bSPierre Pronchery                 goto err;
583*e7be843bSPierre Pronchery 
584*e7be843bSPierre Pronchery             f(&h.j, (int)GET_I64());
585*e7be843bSPierre Pronchery             break;
586*e7be843bSPierre Pronchery         }
587*e7be843bSPierre Pronchery         case OPK_CALL_U64:
588*e7be843bSPierre Pronchery         {
589*e7be843bSPierre Pronchery             fp_u64_type f = (fp_u64_type)GET_FP();
590*e7be843bSPierre Pronchery 
591*e7be843bSPierre Pronchery             if (!TEST_true(helper_ensure(&h)))
592*e7be843bSPierre Pronchery                 goto err;
593*e7be843bSPierre Pronchery 
594*e7be843bSPierre Pronchery             f(&h.j, GET_U64());
595*e7be843bSPierre Pronchery             break;
596*e7be843bSPierre Pronchery         }
597*e7be843bSPierre Pronchery         case OPK_CALL_I64:
598*e7be843bSPierre Pronchery         {
599*e7be843bSPierre Pronchery             fp_i64_type f = (fp_i64_type)GET_FP();
600*e7be843bSPierre Pronchery 
601*e7be843bSPierre Pronchery             if (!TEST_true(helper_ensure(&h)))
602*e7be843bSPierre Pronchery                 goto err;
603*e7be843bSPierre Pronchery 
604*e7be843bSPierre Pronchery             f(&h.j, GET_I64());
605*e7be843bSPierre Pronchery             break;
606*e7be843bSPierre Pronchery         }
607*e7be843bSPierre Pronchery         case OPK_CALL_P:
608*e7be843bSPierre Pronchery         {
609*e7be843bSPierre Pronchery             fp_p_type f = (fp_p_type)GET_FP();
610*e7be843bSPierre Pronchery 
611*e7be843bSPierre Pronchery             if (!TEST_true(helper_ensure(&h)))
612*e7be843bSPierre Pronchery                 goto err;
613*e7be843bSPierre Pronchery 
614*e7be843bSPierre Pronchery             f(&h.j, GET_P());
615*e7be843bSPierre Pronchery             break;
616*e7be843bSPierre Pronchery         }
617*e7be843bSPierre Pronchery         case OPK_CALL_PZ:
618*e7be843bSPierre Pronchery         {
619*e7be843bSPierre Pronchery             fp_pz_type f = (fp_pz_type)GET_FP();
620*e7be843bSPierre Pronchery             void *p;
621*e7be843bSPierre Pronchery             uint64_t u64;
622*e7be843bSPierre Pronchery 
623*e7be843bSPierre Pronchery             if (!TEST_true(helper_ensure(&h)))
624*e7be843bSPierre Pronchery                 goto err;
625*e7be843bSPierre Pronchery 
626*e7be843bSPierre Pronchery             p   = GET_P();
627*e7be843bSPierre Pronchery             u64 = GET_U64();
628*e7be843bSPierre Pronchery             f(&h.j, p, (size_t)u64);
629*e7be843bSPierre Pronchery             break;
630*e7be843bSPierre Pronchery         }
631*e7be843bSPierre Pronchery         case OPK_ASSERT_ERROR:
632*e7be843bSPierre Pronchery         {
633*e7be843bSPierre Pronchery             if (!TEST_true(helper_ensure(&h)))
634*e7be843bSPierre Pronchery                 goto err;
635*e7be843bSPierre Pronchery 
636*e7be843bSPierre Pronchery             asserted = (int)GET_U64();
637*e7be843bSPierre Pronchery             if (!TEST_int_eq(ossl_json_in_error(&h.j), asserted))
638*e7be843bSPierre Pronchery                 goto err;
639*e7be843bSPierre Pronchery 
640*e7be843bSPierre Pronchery             break;
641*e7be843bSPierre Pronchery         }
642*e7be843bSPierre Pronchery #define OP_ASSERT_ERROR(err)  OP_U64(OPK_ASSERT_ERROR) OP_U64(err)
643*e7be843bSPierre Pronchery 
644*e7be843bSPierre Pronchery         default:
645*e7be843bSPierre Pronchery             TEST_error("unknown opcode");
646*e7be843bSPierre Pronchery             goto err;
647*e7be843bSPierre Pronchery         }
648*e7be843bSPierre Pronchery stop:
649*e7be843bSPierre Pronchery 
650*e7be843bSPierre Pronchery     if (!TEST_true(helper_ensure(&h)))
651*e7be843bSPierre Pronchery         goto err;
652*e7be843bSPierre Pronchery 
653*e7be843bSPierre Pronchery     if (!TEST_true(ossl_json_flush(&h.j)))
654*e7be843bSPierre Pronchery         goto err;
655*e7be843bSPierre Pronchery 
656*e7be843bSPierre Pronchery     /* Implicit error check if not done explicitly. */
657*e7be843bSPierre Pronchery     if (asserted < 0 && !TEST_false(ossl_json_in_error(&h.j)))
658*e7be843bSPierre Pronchery         goto err;
659*e7be843bSPierre Pronchery 
660*e7be843bSPierre Pronchery     if (!TEST_true(BIO_get_mem_ptr(h.mem_bio, &bufp)))
661*e7be843bSPierre Pronchery         goto err;
662*e7be843bSPierre Pronchery 
663*e7be843bSPierre Pronchery     if (!TEST_mem_eq(bufp->data, bufp->length,
664*e7be843bSPierre Pronchery                      info->expected_output,
665*e7be843bSPierre Pronchery                      info->expected_output_len == SIZE_MAX
666*e7be843bSPierre Pronchery                         ? strlen(info->expected_output)
667*e7be843bSPierre Pronchery                         : info->expected_output_len))
668*e7be843bSPierre Pronchery         goto err;
669*e7be843bSPierre Pronchery 
670*e7be843bSPierre Pronchery     ok = 1;
671*e7be843bSPierre Pronchery err:
672*e7be843bSPierre Pronchery     if (!ok)
673*e7be843bSPierre Pronchery         TEST_error("script '%s' failed", info->name);
674*e7be843bSPierre Pronchery 
675*e7be843bSPierre Pronchery     helper_cleanup(&h);
676*e7be843bSPierre Pronchery     return ok;
677*e7be843bSPierre Pronchery }
678*e7be843bSPierre Pronchery 
test_json_enc(void)679*e7be843bSPierre Pronchery static int test_json_enc(void)
680*e7be843bSPierre Pronchery {
681*e7be843bSPierre Pronchery     int ok = 1;
682*e7be843bSPierre Pronchery     size_t i;
683*e7be843bSPierre Pronchery 
684*e7be843bSPierre Pronchery     for (i = 0; i < OSSL_NELEM(scripts); ++i)
685*e7be843bSPierre Pronchery         if (!TEST_true(run_script(scripts[i]())))
686*e7be843bSPierre Pronchery             ok = 0;
687*e7be843bSPierre Pronchery 
688*e7be843bSPierre Pronchery     return ok;
689*e7be843bSPierre Pronchery }
690*e7be843bSPierre Pronchery 
setup_tests(void)691*e7be843bSPierre Pronchery int setup_tests(void)
692*e7be843bSPierre Pronchery {
693*e7be843bSPierre Pronchery     ADD_TEST(test_json_enc);
694*e7be843bSPierre Pronchery     return 1;
695*e7be843bSPierre Pronchery }
696