xref: /aosp_15_r20/external/cn-cbor/test/cbor_test.c (revision 254b1274ba1d768fbd68f5671e61c44001b5d4a8)
1*254b1274SAndroid Build Coastguard Worker /*
2*254b1274SAndroid Build Coastguard Worker  * Copyright (c) 2015 SPUDlib authors.  See LICENSE file.
3*254b1274SAndroid Build Coastguard Worker  */
4*254b1274SAndroid Build Coastguard Worker #include <stdlib.h>
5*254b1274SAndroid Build Coastguard Worker #include <stdint.h>
6*254b1274SAndroid Build Coastguard Worker #include <stdbool.h>
7*254b1274SAndroid Build Coastguard Worker #include <stdio.h>
8*254b1274SAndroid Build Coastguard Worker #include <assert.h>
9*254b1274SAndroid Build Coastguard Worker #include <string.h>
10*254b1274SAndroid Build Coastguard Worker 
11*254b1274SAndroid Build Coastguard Worker #include "cn-cbor/cn-cbor.h"
12*254b1274SAndroid Build Coastguard Worker 
13*254b1274SAndroid Build Coastguard Worker #define CTEST_MAIN
14*254b1274SAndroid Build Coastguard Worker #include "ctest.h"
15*254b1274SAndroid Build Coastguard Worker 
main(int argc,const char * argv[])16*254b1274SAndroid Build Coastguard Worker int main(int argc, const char *argv[])
17*254b1274SAndroid Build Coastguard Worker {
18*254b1274SAndroid Build Coastguard Worker     return ctest_main(argc, argv);
19*254b1274SAndroid Build Coastguard Worker }
20*254b1274SAndroid Build Coastguard Worker 
21*254b1274SAndroid Build Coastguard Worker #ifdef USE_CBOR_CONTEXT
22*254b1274SAndroid Build Coastguard Worker #define CONTEXT_NULL , NULL
23*254b1274SAndroid Build Coastguard Worker #define CONTEXT_NULL_COMMA NULL,
24*254b1274SAndroid Build Coastguard Worker #else
25*254b1274SAndroid Build Coastguard Worker #define CONTEXT_NULL
26*254b1274SAndroid Build Coastguard Worker #define CONTEXT_NULL_COMMA
27*254b1274SAndroid Build Coastguard Worker #endif
28*254b1274SAndroid Build Coastguard Worker 
29*254b1274SAndroid Build Coastguard Worker typedef struct _buffer {
30*254b1274SAndroid Build Coastguard Worker     size_t sz;
31*254b1274SAndroid Build Coastguard Worker     unsigned char *ptr;
32*254b1274SAndroid Build Coastguard Worker } buffer;
33*254b1274SAndroid Build Coastguard Worker 
parse_hex(char * inp,buffer * b)34*254b1274SAndroid Build Coastguard Worker static bool parse_hex(char *inp, buffer *b)
35*254b1274SAndroid Build Coastguard Worker {
36*254b1274SAndroid Build Coastguard Worker     int len = strlen(inp);
37*254b1274SAndroid Build Coastguard Worker     size_t i;
38*254b1274SAndroid Build Coastguard Worker     if (len%2 != 0) {
39*254b1274SAndroid Build Coastguard Worker         b->sz = -1;
40*254b1274SAndroid Build Coastguard Worker         b->ptr = NULL;
41*254b1274SAndroid Build Coastguard Worker         return false;
42*254b1274SAndroid Build Coastguard Worker     }
43*254b1274SAndroid Build Coastguard Worker     b->sz  = len / 2;
44*254b1274SAndroid Build Coastguard Worker     b->ptr = malloc(b->sz);
45*254b1274SAndroid Build Coastguard Worker     for (i=0; i<b->sz; i++) {
46*254b1274SAndroid Build Coastguard Worker         sscanf(inp+(2*i), "%02hhx", &b->ptr[i]);
47*254b1274SAndroid Build Coastguard Worker     }
48*254b1274SAndroid Build Coastguard Worker     return true;
49*254b1274SAndroid Build Coastguard Worker }
50*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,error)51*254b1274SAndroid Build Coastguard Worker CTEST(cbor, error)
52*254b1274SAndroid Build Coastguard Worker {
53*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_NO_ERROR], "CN_CBOR_NO_ERROR");
54*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_OUT_OF_DATA], "CN_CBOR_ERR_OUT_OF_DATA");
55*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_NOT_ALL_DATA_CONSUMED], "CN_CBOR_ERR_NOT_ALL_DATA_CONSUMED");
56*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_ODD_SIZE_INDEF_MAP], "CN_CBOR_ERR_ODD_SIZE_INDEF_MAP");
57*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_BREAK_OUTSIDE_INDEF], "CN_CBOR_ERR_BREAK_OUTSIDE_INDEF");
58*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_MT_UNDEF_FOR_INDEF], "CN_CBOR_ERR_MT_UNDEF_FOR_INDEF");
59*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_RESERVED_AI], "CN_CBOR_ERR_RESERVED_AI");
60*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_WRONG_NESTING_IN_INDEF_STRING], "CN_CBOR_ERR_WRONG_NESTING_IN_INDEF_STRING");
61*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_INVALID_PARAMETER], "CN_CBOR_ERR_INVALID_PARAMETER");
62*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_OUT_OF_MEMORY], "CN_CBOR_ERR_OUT_OF_MEMORY");
63*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(cn_cbor_error_str[CN_CBOR_ERR_FLOAT_NOT_SUPPORTED], "CN_CBOR_ERR_FLOAT_NOT_SUPPORTED");
64*254b1274SAndroid Build Coastguard Worker }
65*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,parse)66*254b1274SAndroid Build Coastguard Worker CTEST(cbor, parse)
67*254b1274SAndroid Build Coastguard Worker {
68*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
69*254b1274SAndroid Build Coastguard Worker     char *tests[] = {
70*254b1274SAndroid Build Coastguard Worker         "00",         // 0
71*254b1274SAndroid Build Coastguard Worker         "01",         // 1
72*254b1274SAndroid Build Coastguard Worker         "17",         // 23
73*254b1274SAndroid Build Coastguard Worker         "1818",       // 24
74*254b1274SAndroid Build Coastguard Worker         "190100",     // 256
75*254b1274SAndroid Build Coastguard Worker         "1a00010000", // 65536
76*254b1274SAndroid Build Coastguard Worker         "1b0000000100000000", // 4294967296
77*254b1274SAndroid Build Coastguard Worker         "20",         // -1
78*254b1274SAndroid Build Coastguard Worker         "37",         // -24
79*254b1274SAndroid Build Coastguard Worker         "3818",       // -25
80*254b1274SAndroid Build Coastguard Worker         "390100",     // -257
81*254b1274SAndroid Build Coastguard Worker         "3a00010000", // -65537
82*254b1274SAndroid Build Coastguard Worker         "3b0000000100000000", // -4294967297
83*254b1274SAndroid Build Coastguard Worker         "4161",     // h"a"
84*254b1274SAndroid Build Coastguard Worker         "6161",     // "a"
85*254b1274SAndroid Build Coastguard Worker         "80",       // []
86*254b1274SAndroid Build Coastguard Worker         "8100",     // [0]
87*254b1274SAndroid Build Coastguard Worker         "820102",   // [1,2]
88*254b1274SAndroid Build Coastguard Worker         "818100",   // [[0]]
89*254b1274SAndroid Build Coastguard Worker         "a1616100",	// {"a":0}
90*254b1274SAndroid Build Coastguard Worker         "d8184100", // tag
91*254b1274SAndroid Build Coastguard Worker         "f4",	      // false
92*254b1274SAndroid Build Coastguard Worker         "f5",	      // true
93*254b1274SAndroid Build Coastguard Worker         "f6",	      // null
94*254b1274SAndroid Build Coastguard Worker         "f7",	      // undefined
95*254b1274SAndroid Build Coastguard Worker         "f8ff",     // simple(255)
96*254b1274SAndroid Build Coastguard Worker #ifndef CBOR_NO_FLOAT
97*254b1274SAndroid Build Coastguard Worker         "f93c00",     // 1.0
98*254b1274SAndroid Build Coastguard Worker         "f9bc00",     // -1.0
99*254b1274SAndroid Build Coastguard Worker         "f903ff",     // 6.097555160522461e-05
100*254b1274SAndroid Build Coastguard Worker         "f90400",     // 6.103515625e-05
101*254b1274SAndroid Build Coastguard Worker         "f907ff",     // 0.00012201070785522461
102*254b1274SAndroid Build Coastguard Worker         "f90800",     // 0.0001220703125
103*254b1274SAndroid Build Coastguard Worker         "fa47800000", // 65536.0
104*254b1274SAndroid Build Coastguard Worker         "fb3ff199999999999a",     // 1.1
105*254b1274SAndroid Build Coastguard Worker         "f97e00",   // NaN
106*254b1274SAndroid Build Coastguard Worker #endif /* CBOR_NO_FLOAT */
107*254b1274SAndroid Build Coastguard Worker         "5f42010243030405ff",     // (_ h'0102', h'030405')
108*254b1274SAndroid Build Coastguard Worker         "7f61616161ff",           // (_ "a", "a")
109*254b1274SAndroid Build Coastguard Worker         "9fff",                   // [_ ]
110*254b1274SAndroid Build Coastguard Worker         "9f9f9fffffff",           // [_ [_ [_ ]]]
111*254b1274SAndroid Build Coastguard Worker         "9f009f00ff00ff",         // [_ 0, [_ 0], 0]
112*254b1274SAndroid Build Coastguard Worker         "bf61610161629f0203ffff", // {_ "a": 1, "b": [_ 2, 3]}
113*254b1274SAndroid Build Coastguard Worker     };
114*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb;
115*254b1274SAndroid Build Coastguard Worker     buffer b;
116*254b1274SAndroid Build Coastguard Worker     size_t i;
117*254b1274SAndroid Build Coastguard Worker     unsigned char encoded[1024];
118*254b1274SAndroid Build Coastguard Worker     ssize_t enc_sz;
119*254b1274SAndroid Build Coastguard Worker 
120*254b1274SAndroid Build Coastguard Worker     for (i=0; i<sizeof(tests)/sizeof(char*); i++) {
121*254b1274SAndroid Build Coastguard Worker         ASSERT_TRUE(parse_hex(tests[i], &b));
122*254b1274SAndroid Build Coastguard Worker         err.err = CN_CBOR_NO_ERROR;
123*254b1274SAndroid Build Coastguard Worker         cb = cn_cbor_decode(b.ptr, b.sz CONTEXT_NULL, &err);
124*254b1274SAndroid Build Coastguard Worker         //CTEST_LOG("%s: %s", tests[i], cn_cbor_error_str[err.err]);
125*254b1274SAndroid Build Coastguard Worker         ASSERT_EQUAL(err.err, CN_CBOR_NO_ERROR);
126*254b1274SAndroid Build Coastguard Worker         ASSERT_NOT_NULL(cb);
127*254b1274SAndroid Build Coastguard Worker 
128*254b1274SAndroid Build Coastguard Worker         enc_sz = cn_cbor_encoder_write(encoded, 0, sizeof(encoded), cb);
129*254b1274SAndroid Build Coastguard Worker         ASSERT_DATA(b.ptr, b.sz, encoded, enc_sz);
130*254b1274SAndroid Build Coastguard Worker         free(b.ptr);
131*254b1274SAndroid Build Coastguard Worker         cn_cbor_free(cb CONTEXT_NULL);
132*254b1274SAndroid Build Coastguard Worker     }
133*254b1274SAndroid Build Coastguard Worker }
134*254b1274SAndroid Build Coastguard Worker 
135*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,parse_normalize)136*254b1274SAndroid Build Coastguard Worker CTEST(cbor, parse_normalize)
137*254b1274SAndroid Build Coastguard Worker {
138*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
139*254b1274SAndroid Build Coastguard Worker     char *basic_tests[] = {
140*254b1274SAndroid Build Coastguard Worker       "00", "00",                       // 0
141*254b1274SAndroid Build Coastguard Worker       "1800", "00",
142*254b1274SAndroid Build Coastguard Worker       "1818", "1818",
143*254b1274SAndroid Build Coastguard Worker       "190000", "00",
144*254b1274SAndroid Build Coastguard Worker       "190018", "1818",
145*254b1274SAndroid Build Coastguard Worker       "1a00000000", "00",
146*254b1274SAndroid Build Coastguard Worker       "1b0000000000000000", "00",
147*254b1274SAndroid Build Coastguard Worker       "20", "20",                       // -1
148*254b1274SAndroid Build Coastguard Worker       "3800", "20",
149*254b1274SAndroid Build Coastguard Worker       "c600", "c600",                   // 6(0) (undefined tag)
150*254b1274SAndroid Build Coastguard Worker       "d80600", "c600",
151*254b1274SAndroid Build Coastguard Worker       "d9000600", "c600",
152*254b1274SAndroid Build Coastguard Worker     };
153*254b1274SAndroid Build Coastguard Worker     char *float_tests[] = {
154*254b1274SAndroid Build Coastguard Worker       "fb3ff0000000000000", "f93c00",   // 1.0
155*254b1274SAndroid Build Coastguard Worker       "fbbff0000000000000", "f9bc00",   // -1.0
156*254b1274SAndroid Build Coastguard Worker       "fb40f86a0000000000", "fa47c35000", // 100000.0
157*254b1274SAndroid Build Coastguard Worker       "fb7ff8000000000000", "f97e00",   // NaN
158*254b1274SAndroid Build Coastguard Worker       "fb3e70000000000000", "f90001",   // 5.960464477539063e-08
159*254b1274SAndroid Build Coastguard Worker       "fb3e78000000000000", "fa33c00000", //  8.940696716308594e-08
160*254b1274SAndroid Build Coastguard Worker       "fb3e80000000000000", "f90002",   // 1.1920928955078125e-07
161*254b1274SAndroid Build Coastguard Worker     };
162*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb;
163*254b1274SAndroid Build Coastguard Worker     buffer b, b2;
164*254b1274SAndroid Build Coastguard Worker     size_t i;
165*254b1274SAndroid Build Coastguard Worker     unsigned char encoded[1024];
166*254b1274SAndroid Build Coastguard Worker     ssize_t enc_sz;
167*254b1274SAndroid Build Coastguard Worker 
168*254b1274SAndroid Build Coastguard Worker     for (i=0; i<sizeof(basic_tests)/sizeof(char*); i+=2) {
169*254b1274SAndroid Build Coastguard Worker         ASSERT_TRUE(parse_hex(basic_tests[i], &b));
170*254b1274SAndroid Build Coastguard Worker         ASSERT_TRUE(parse_hex(basic_tests[i+1], &b2));
171*254b1274SAndroid Build Coastguard Worker         err.err = CN_CBOR_NO_ERROR;
172*254b1274SAndroid Build Coastguard Worker         cb = cn_cbor_decode(b.ptr, b.sz CONTEXT_NULL, &err);
173*254b1274SAndroid Build Coastguard Worker         CTEST_LOG("%s: %s", basic_tests[i], cn_cbor_error_str[err.err]);
174*254b1274SAndroid Build Coastguard Worker         ASSERT_EQUAL(err.err, CN_CBOR_NO_ERROR);
175*254b1274SAndroid Build Coastguard Worker         ASSERT_NOT_NULL(cb);
176*254b1274SAndroid Build Coastguard Worker 
177*254b1274SAndroid Build Coastguard Worker         enc_sz = cn_cbor_encoder_write(encoded, 0, sizeof(encoded), cb);
178*254b1274SAndroid Build Coastguard Worker         ASSERT_DATA(b2.ptr, b2.sz, encoded, enc_sz);
179*254b1274SAndroid Build Coastguard Worker         free(b.ptr);
180*254b1274SAndroid Build Coastguard Worker         free(b2.ptr);
181*254b1274SAndroid Build Coastguard Worker         cn_cbor_free(cb CONTEXT_NULL);
182*254b1274SAndroid Build Coastguard Worker     }
183*254b1274SAndroid Build Coastguard Worker 
184*254b1274SAndroid Build Coastguard Worker     for (i=0; i<sizeof(float_tests)/sizeof(char*); i+=2) {
185*254b1274SAndroid Build Coastguard Worker         ASSERT_TRUE(parse_hex(float_tests[i], &b));
186*254b1274SAndroid Build Coastguard Worker         ASSERT_TRUE(parse_hex(float_tests[i+1], &b2));
187*254b1274SAndroid Build Coastguard Worker         err.err = CN_CBOR_NO_ERROR;
188*254b1274SAndroid Build Coastguard Worker         cb = cn_cbor_decode(b.ptr, b.sz CONTEXT_NULL, &err);
189*254b1274SAndroid Build Coastguard Worker         CTEST_LOG("%s: %s", float_tests[i], cn_cbor_error_str[err.err]);
190*254b1274SAndroid Build Coastguard Worker #ifndef CBOR_NO_FLOAT
191*254b1274SAndroid Build Coastguard Worker         ASSERT_EQUAL(err.err, CN_CBOR_NO_ERROR);
192*254b1274SAndroid Build Coastguard Worker         ASSERT_NOT_NULL(cb);
193*254b1274SAndroid Build Coastguard Worker #else /* CBOR_NO_FLOAT */
194*254b1274SAndroid Build Coastguard Worker         ASSERT_EQUAL(err.err, CN_CBOR_ERR_FLOAT_NOT_SUPPORTED);
195*254b1274SAndroid Build Coastguard Worker         ASSERT_NULL(cb);
196*254b1274SAndroid Build Coastguard Worker #endif /* CBOR_NO_FLOAT */
197*254b1274SAndroid Build Coastguard Worker 
198*254b1274SAndroid Build Coastguard Worker         /* enc_sz = cn_cbor_encoder_write(encoded, 0, sizeof(encoded), cb); */
199*254b1274SAndroid Build Coastguard Worker         /* ASSERT_DATA(b2.ptr, b2.sz, encoded, enc_sz); */
200*254b1274SAndroid Build Coastguard Worker         free(b.ptr);
201*254b1274SAndroid Build Coastguard Worker         free(b2.ptr);
202*254b1274SAndroid Build Coastguard Worker         cn_cbor_free(cb CONTEXT_NULL);
203*254b1274SAndroid Build Coastguard Worker     }
204*254b1274SAndroid Build Coastguard Worker }
205*254b1274SAndroid Build Coastguard Worker 
206*254b1274SAndroid Build Coastguard Worker typedef struct _cbor_failure
207*254b1274SAndroid Build Coastguard Worker {
208*254b1274SAndroid Build Coastguard Worker     char *hex;
209*254b1274SAndroid Build Coastguard Worker     cn_cbor_error err;
210*254b1274SAndroid Build Coastguard Worker } cbor_failure;
211*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,fail)212*254b1274SAndroid Build Coastguard Worker CTEST(cbor, fail)
213*254b1274SAndroid Build Coastguard Worker {
214*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
215*254b1274SAndroid Build Coastguard Worker     cbor_failure tests[] = {
216*254b1274SAndroid Build Coastguard Worker         {"81", CN_CBOR_ERR_OUT_OF_DATA},
217*254b1274SAndroid Build Coastguard Worker         {"0000", CN_CBOR_ERR_NOT_ALL_DATA_CONSUMED},
218*254b1274SAndroid Build Coastguard Worker         {"bf00ff", CN_CBOR_ERR_ODD_SIZE_INDEF_MAP},
219*254b1274SAndroid Build Coastguard Worker         {"ff", CN_CBOR_ERR_BREAK_OUTSIDE_INDEF},
220*254b1274SAndroid Build Coastguard Worker         {"1f", CN_CBOR_ERR_MT_UNDEF_FOR_INDEF},
221*254b1274SAndroid Build Coastguard Worker         {"1c", CN_CBOR_ERR_RESERVED_AI},
222*254b1274SAndroid Build Coastguard Worker         {"7f4100", CN_CBOR_ERR_WRONG_NESTING_IN_INDEF_STRING},
223*254b1274SAndroid Build Coastguard Worker     };
224*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb;
225*254b1274SAndroid Build Coastguard Worker     buffer b;
226*254b1274SAndroid Build Coastguard Worker     size_t i;
227*254b1274SAndroid Build Coastguard Worker     uint8_t buf[10];
228*254b1274SAndroid Build Coastguard Worker     cn_cbor inv = {CN_CBOR_INVALID, 0, {0}, 0, NULL, NULL, NULL, NULL};
229*254b1274SAndroid Build Coastguard Worker 
230*254b1274SAndroid Build Coastguard Worker     ASSERT_EQUAL(-1, cn_cbor_encoder_write(buf, 0, sizeof(buf), &inv));
231*254b1274SAndroid Build Coastguard Worker 
232*254b1274SAndroid Build Coastguard Worker     for (i=0; i<sizeof(tests)/sizeof(cbor_failure); i++) {
233*254b1274SAndroid Build Coastguard Worker         ASSERT_TRUE(parse_hex(tests[i].hex, &b));
234*254b1274SAndroid Build Coastguard Worker         cb = cn_cbor_decode(b.ptr, b.sz CONTEXT_NULL, &err);
235*254b1274SAndroid Build Coastguard Worker         ASSERT_NULL(cb);
236*254b1274SAndroid Build Coastguard Worker         ASSERT_EQUAL(err.err, tests[i].err);
237*254b1274SAndroid Build Coastguard Worker 
238*254b1274SAndroid Build Coastguard Worker         free(b.ptr);
239*254b1274SAndroid Build Coastguard Worker         cn_cbor_free(cb CONTEXT_NULL);
240*254b1274SAndroid Build Coastguard Worker     }
241*254b1274SAndroid Build Coastguard Worker }
242*254b1274SAndroid Build Coastguard Worker 
243*254b1274SAndroid Build Coastguard Worker // Decoder loses float size information
CTEST(cbor,float)244*254b1274SAndroid Build Coastguard Worker CTEST(cbor, float)
245*254b1274SAndroid Build Coastguard Worker {
246*254b1274SAndroid Build Coastguard Worker #ifndef CBOR_NO_FLOAT
247*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
248*254b1274SAndroid Build Coastguard Worker     char *tests[] = {
249*254b1274SAndroid Build Coastguard Worker         "f90001", // 5.960464477539063e-08
250*254b1274SAndroid Build Coastguard Worker         "f9c400", // -4.0
251*254b1274SAndroid Build Coastguard Worker         "fa47c35000", // 100000.0
252*254b1274SAndroid Build Coastguard Worker         "f97e00", // Half NaN, half beast
253*254b1274SAndroid Build Coastguard Worker         "f9fc00", // -Inf
254*254b1274SAndroid Build Coastguard Worker         "f97c00", // Inf
255*254b1274SAndroid Build Coastguard Worker     };
256*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb;
257*254b1274SAndroid Build Coastguard Worker     buffer b;
258*254b1274SAndroid Build Coastguard Worker     size_t i;
259*254b1274SAndroid Build Coastguard Worker     unsigned char encoded[1024];
260*254b1274SAndroid Build Coastguard Worker     ssize_t enc_sz;
261*254b1274SAndroid Build Coastguard Worker 
262*254b1274SAndroid Build Coastguard Worker     for (i=0; i<sizeof(tests)/sizeof(char*); i++) {
263*254b1274SAndroid Build Coastguard Worker         ASSERT_TRUE(parse_hex(tests[i], &b));
264*254b1274SAndroid Build Coastguard Worker         cb = cn_cbor_decode(b.ptr, b.sz CONTEXT_NULL, &err);
265*254b1274SAndroid Build Coastguard Worker         ASSERT_NOT_NULL(cb);
266*254b1274SAndroid Build Coastguard Worker 
267*254b1274SAndroid Build Coastguard Worker         enc_sz = cn_cbor_encoder_write(encoded, 0, sizeof(encoded), cb);
268*254b1274SAndroid Build Coastguard Worker         ASSERT_DATA(b.ptr, b.sz, encoded, enc_sz);
269*254b1274SAndroid Build Coastguard Worker 
270*254b1274SAndroid Build Coastguard Worker         free(b.ptr);
271*254b1274SAndroid Build Coastguard Worker         cn_cbor_free(cb CONTEXT_NULL);
272*254b1274SAndroid Build Coastguard Worker     }
273*254b1274SAndroid Build Coastguard Worker #endif /* CBOR_NO_FLOAT */
274*254b1274SAndroid Build Coastguard Worker }
275*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,getset)276*254b1274SAndroid Build Coastguard Worker CTEST(cbor, getset)
277*254b1274SAndroid Build Coastguard Worker {
278*254b1274SAndroid Build Coastguard Worker     buffer b;
279*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb;
280*254b1274SAndroid Build Coastguard Worker     cn_cbor *val;
281*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
282*254b1274SAndroid Build Coastguard Worker 
283*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(parse_hex("a40000436363630262626201616100", &b));
284*254b1274SAndroid Build Coastguard Worker     cb = cn_cbor_decode(b.ptr, b.sz CONTEXT_NULL, &err);
285*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(cb);
286*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_string(cb, "a");
287*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
288*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_string(cb, "bb");
289*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
290*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_string(cb, "ccc");
291*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
292*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_string(cb, "b");
293*254b1274SAndroid Build Coastguard Worker     ASSERT_NULL(val);
294*254b1274SAndroid Build Coastguard Worker     free(b.ptr);
295*254b1274SAndroid Build Coastguard Worker     cn_cbor_free(cb CONTEXT_NULL);
296*254b1274SAndroid Build Coastguard Worker 
297*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(parse_hex("a3616100006161206162", &b));
298*254b1274SAndroid Build Coastguard Worker     cb = cn_cbor_decode(b.ptr, b.sz CONTEXT_NULL, &err);
299*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(cb);
300*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_int(cb, 0);
301*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
302*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_int(cb, -1);
303*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
304*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_int(cb, 1);
305*254b1274SAndroid Build Coastguard Worker     ASSERT_NULL(val);
306*254b1274SAndroid Build Coastguard Worker     free(b.ptr);
307*254b1274SAndroid Build Coastguard Worker     cn_cbor_free(cb CONTEXT_NULL);
308*254b1274SAndroid Build Coastguard Worker 
309*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(parse_hex("8100", &b));
310*254b1274SAndroid Build Coastguard Worker     cb = cn_cbor_decode(b.ptr, b.sz CONTEXT_NULL, &err);
311*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(cb);
312*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_index(cb, 0);
313*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
314*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_index(cb, 1);
315*254b1274SAndroid Build Coastguard Worker     ASSERT_NULL(val);
316*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_index(cb, -1);
317*254b1274SAndroid Build Coastguard Worker     ASSERT_NULL(val);
318*254b1274SAndroid Build Coastguard Worker     free(b.ptr);
319*254b1274SAndroid Build Coastguard Worker     cn_cbor_free(cb CONTEXT_NULL);
320*254b1274SAndroid Build Coastguard Worker }
321*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,create)322*254b1274SAndroid Build Coastguard Worker CTEST(cbor, create)
323*254b1274SAndroid Build Coastguard Worker {
324*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
325*254b1274SAndroid Build Coastguard Worker     const cn_cbor* val;
326*254b1274SAndroid Build Coastguard Worker     const char* data = "abc";
327*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb_map = cn_cbor_map_create(CONTEXT_NULL_COMMA &err);
328*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb_int;
329*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb_data;
330*254b1274SAndroid Build Coastguard Worker #ifndef CBOR_NO_FLOAT
331*254b1274SAndroid Build Coastguard Worker     cn_cbor *cb_dbl;
332*254b1274SAndroid Build Coastguard Worker #endif
333*254b1274SAndroid Build Coastguard Worker 
334*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(cb_map);
335*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
336*254b1274SAndroid Build Coastguard Worker 
337*254b1274SAndroid Build Coastguard Worker     cb_int = cn_cbor_int_create(256 CONTEXT_NULL, &err);
338*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(cb_int);
339*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
340*254b1274SAndroid Build Coastguard Worker 
341*254b1274SAndroid Build Coastguard Worker     cb_data = cn_cbor_data_create((const uint8_t*)data, 4 CONTEXT_NULL, &err);
342*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(cb_data);
343*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
344*254b1274SAndroid Build Coastguard Worker 
345*254b1274SAndroid Build Coastguard Worker #ifndef CBOR_NO_FLOAT
346*254b1274SAndroid Build Coastguard Worker     cb_dbl = cn_cbor_double_create(3.14159 CONTEXT_NULL, &err);
347*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(cb_dbl);
348*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
349*254b1274SAndroid Build Coastguard Worker #endif
350*254b1274SAndroid Build Coastguard Worker 
351*254b1274SAndroid Build Coastguard Worker     cn_cbor_mapput_int(cb_map, 5, cb_int CONTEXT_NULL, &err);
352*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
353*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(cb_map->length == 2);
354*254b1274SAndroid Build Coastguard Worker 
355*254b1274SAndroid Build Coastguard Worker     cn_cbor_mapput_int(cb_map, -7, cb_data CONTEXT_NULL, &err);
356*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
357*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(cb_map->length == 4);
358*254b1274SAndroid Build Coastguard Worker 
359*254b1274SAndroid Build Coastguard Worker     cn_cbor_mapput_string(cb_map, "foo",
360*254b1274SAndroid Build Coastguard Worker                           cn_cbor_string_create(data CONTEXT_NULL, &err)
361*254b1274SAndroid Build Coastguard Worker                           CONTEXT_NULL, &err);
362*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
363*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(cb_map->length == 6);
364*254b1274SAndroid Build Coastguard Worker 
365*254b1274SAndroid Build Coastguard Worker     cn_cbor_map_put(cb_map,
366*254b1274SAndroid Build Coastguard Worker                     cn_cbor_string_create("bar" CONTEXT_NULL, &err),
367*254b1274SAndroid Build Coastguard Worker                     cn_cbor_string_create("qux" CONTEXT_NULL, &err),
368*254b1274SAndroid Build Coastguard Worker                     &err);
369*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
370*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(cb_map->length == 8);
371*254b1274SAndroid Build Coastguard Worker 
372*254b1274SAndroid Build Coastguard Worker #ifndef CBOR_NO_FLOAT
373*254b1274SAndroid Build Coastguard Worker     cn_cbor_mapput_int(cb_map, 42, cb_dbl CONTEXT_NULL, &err);
374*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
375*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(cb_map->length == 10);
376*254b1274SAndroid Build Coastguard Worker #endif
377*254b1274SAndroid Build Coastguard Worker 
378*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_int(cb_map, 5);
379*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
380*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(val->v.sint == 256);
381*254b1274SAndroid Build Coastguard Worker 
382*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_int(cb_map, -7);
383*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
384*254b1274SAndroid Build Coastguard Worker     ASSERT_STR(val->v.str, "abc");
385*254b1274SAndroid Build Coastguard Worker 
386*254b1274SAndroid Build Coastguard Worker #ifndef CBOR_NO_FLOAT
387*254b1274SAndroid Build Coastguard Worker     val = cn_cbor_mapget_int(cb_map, 42);
388*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(val);
389*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(val->v.dbl > 3.14 && val->v.dbl < 3.15);
390*254b1274SAndroid Build Coastguard Worker #endif
391*254b1274SAndroid Build Coastguard Worker 
392*254b1274SAndroid Build Coastguard Worker     cn_cbor_free(cb_map CONTEXT_NULL);
393*254b1274SAndroid Build Coastguard Worker }
394*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,map_errors)395*254b1274SAndroid Build Coastguard Worker CTEST(cbor, map_errors)
396*254b1274SAndroid Build Coastguard Worker {
397*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
398*254b1274SAndroid Build Coastguard Worker     cn_cbor *ci;
399*254b1274SAndroid Build Coastguard Worker     ci = cn_cbor_int_create(65536, CONTEXT_NULL_COMMA &err);
400*254b1274SAndroid Build Coastguard Worker     cn_cbor_mapput_int(ci, -5, NULL, CONTEXT_NULL_COMMA &err);
401*254b1274SAndroid Build Coastguard Worker     ASSERT_EQUAL(err.err, CN_CBOR_ERR_INVALID_PARAMETER);
402*254b1274SAndroid Build Coastguard Worker     cn_cbor_mapput_string(ci, "foo", NULL, CONTEXT_NULL_COMMA &err);
403*254b1274SAndroid Build Coastguard Worker     ASSERT_EQUAL(err.err, CN_CBOR_ERR_INVALID_PARAMETER);
404*254b1274SAndroid Build Coastguard Worker     cn_cbor_map_put(ci, NULL, NULL, &err);
405*254b1274SAndroid Build Coastguard Worker }
406*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,array)407*254b1274SAndroid Build Coastguard Worker CTEST(cbor, array)
408*254b1274SAndroid Build Coastguard Worker {
409*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
410*254b1274SAndroid Build Coastguard Worker     cn_cbor *a = cn_cbor_array_create(CONTEXT_NULL_COMMA &err);
411*254b1274SAndroid Build Coastguard Worker     ASSERT_NOT_NULL(a);
412*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
413*254b1274SAndroid Build Coastguard Worker     ASSERT_EQUAL(a->length, 0);
414*254b1274SAndroid Build Coastguard Worker 
415*254b1274SAndroid Build Coastguard Worker     cn_cbor_array_append(a, cn_cbor_int_create(256, CONTEXT_NULL_COMMA &err), &err);
416*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
417*254b1274SAndroid Build Coastguard Worker     ASSERT_EQUAL(a->length, 1);
418*254b1274SAndroid Build Coastguard Worker 
419*254b1274SAndroid Build Coastguard Worker     cn_cbor_array_append(a, cn_cbor_string_create("five", CONTEXT_NULL_COMMA &err), &err);
420*254b1274SAndroid Build Coastguard Worker     ASSERT_TRUE(err.err == CN_CBOR_NO_ERROR);
421*254b1274SAndroid Build Coastguard Worker     ASSERT_EQUAL(a->length, 2);
422*254b1274SAndroid Build Coastguard Worker }
423*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,array_errors)424*254b1274SAndroid Build Coastguard Worker CTEST(cbor, array_errors)
425*254b1274SAndroid Build Coastguard Worker {
426*254b1274SAndroid Build Coastguard Worker     cn_cbor_errback err;
427*254b1274SAndroid Build Coastguard Worker     cn_cbor *ci = cn_cbor_int_create(12, CONTEXT_NULL_COMMA &err);
428*254b1274SAndroid Build Coastguard Worker     cn_cbor_array_append(NULL, ci, &err);
429*254b1274SAndroid Build Coastguard Worker     ASSERT_EQUAL(err.err, CN_CBOR_ERR_INVALID_PARAMETER);
430*254b1274SAndroid Build Coastguard Worker     cn_cbor_array_append(ci, NULL, &err);
431*254b1274SAndroid Build Coastguard Worker     ASSERT_EQUAL(err.err, CN_CBOR_ERR_INVALID_PARAMETER);
432*254b1274SAndroid Build Coastguard Worker }
433*254b1274SAndroid Build Coastguard Worker 
CTEST(cbor,create_encode)434*254b1274SAndroid Build Coastguard Worker CTEST(cbor, create_encode)
435*254b1274SAndroid Build Coastguard Worker {
436*254b1274SAndroid Build Coastguard Worker   cn_cbor *map;
437*254b1274SAndroid Build Coastguard Worker   cn_cbor *cdata;
438*254b1274SAndroid Build Coastguard Worker   char data[] = "data";
439*254b1274SAndroid Build Coastguard Worker   unsigned char encoded[1024];
440*254b1274SAndroid Build Coastguard Worker   ssize_t enc_sz;
441*254b1274SAndroid Build Coastguard Worker 
442*254b1274SAndroid Build Coastguard Worker   map = cn_cbor_map_create(CONTEXT_NULL_COMMA NULL);
443*254b1274SAndroid Build Coastguard Worker   ASSERT_NOT_NULL(map);
444*254b1274SAndroid Build Coastguard Worker 
445*254b1274SAndroid Build Coastguard Worker   cdata = cn_cbor_data_create((uint8_t*)data, sizeof(data)-1, CONTEXT_NULL_COMMA NULL);
446*254b1274SAndroid Build Coastguard Worker   ASSERT_NOT_NULL(cdata);
447*254b1274SAndroid Build Coastguard Worker 
448*254b1274SAndroid Build Coastguard Worker   ASSERT_TRUE(cn_cbor_mapput_int(map, 0, cdata, CONTEXT_NULL_COMMA NULL));
449*254b1274SAndroid Build Coastguard Worker   enc_sz = cn_cbor_encoder_write(encoded, 0, sizeof(encoded), map);
450*254b1274SAndroid Build Coastguard Worker   ASSERT_EQUAL(7, enc_sz);
451*254b1274SAndroid Build Coastguard Worker }
452