1 #include "stream_expectations.h"
2
3 struct test_assertion assertions_queue[MAX_QUEUE_ITEMS];
4 int queue_size = 0;
5 int current_expectation = 0;
6
clean_up_stream_assertions(void ** state)7 int clean_up_stream_assertions(void **state) {
8 if (queue_size != current_expectation) {
9 return 1; // We have not matched all expectations correctly
10 }
11 queue_size = current_expectation = 0;
12 free(*state);
13 return 0;
14 }
15
16 /* Callbacks */
current(void)17 struct test_assertion current(void) {
18 return assertions_queue[current_expectation];
19 }
20
21 /* Assertions builders and matcher callbacks */
22
assert_uint8_eq(uint8_t actual)23 void assert_uint8_eq(uint8_t actual) {
24 assertions_queue[queue_size++] = (struct test_assertion){
25 UINT8_EQ, (union test_expectation_data){.int8 = actual}};
26 }
27
uint8_callback(void * _CBOR_UNUSED (_context),uint8_t actual)28 void uint8_callback(void *_CBOR_UNUSED(_context), uint8_t actual) {
29 assert_true(current().expectation == UINT8_EQ);
30 assert_true(current().data.int8 == actual);
31 current_expectation++;
32 }
33
assert_uint16_eq(uint16_t actual)34 void assert_uint16_eq(uint16_t actual) {
35 assertions_queue[queue_size++] = (struct test_assertion){
36 UINT16_EQ, (union test_expectation_data){.int16 = actual}};
37 }
38
uint16_callback(void * _CBOR_UNUSED (_context),uint16_t actual)39 void uint16_callback(void *_CBOR_UNUSED(_context), uint16_t actual) {
40 assert_true(current().expectation == UINT16_EQ);
41 assert_true(current().data.int16 == actual);
42 current_expectation++;
43 }
44
assert_uint32_eq(uint32_t actual)45 void assert_uint32_eq(uint32_t actual) {
46 assertions_queue[queue_size++] = (struct test_assertion){
47 UINT32_EQ, (union test_expectation_data){.int32 = actual}};
48 }
49
uint32_callback(void * _CBOR_UNUSED (_context),uint32_t actual)50 void uint32_callback(void *_CBOR_UNUSED(_context), uint32_t actual) {
51 assert_true(current().expectation == UINT32_EQ);
52 assert_true(current().data.int32 == actual);
53 current_expectation++;
54 }
55
assert_uint64_eq(uint64_t actual)56 void assert_uint64_eq(uint64_t actual) {
57 assertions_queue[queue_size++] = (struct test_assertion){
58 UINT64_EQ, (union test_expectation_data){.int64 = actual}};
59 }
60
uint64_callback(void * _CBOR_UNUSED (_context),uint64_t actual)61 void uint64_callback(void *_CBOR_UNUSED(_context), uint64_t actual) {
62 assert_true(current().expectation == UINT64_EQ);
63 assert_true(current().data.int64 == actual);
64 current_expectation++;
65 }
66
assert_negint8_eq(uint8_t actual)67 void assert_negint8_eq(uint8_t actual) {
68 assertions_queue[queue_size++] = (struct test_assertion){
69 NEGINT8_EQ, (union test_expectation_data){.int8 = actual}};
70 }
71
negint8_callback(void * _CBOR_UNUSED (_context),uint8_t actual)72 void negint8_callback(void *_CBOR_UNUSED(_context), uint8_t actual) {
73 assert_true(current().expectation == NEGINT8_EQ);
74 assert_true(current().data.int8 == actual);
75 current_expectation++;
76 }
77
assert_negint16_eq(uint16_t actual)78 void assert_negint16_eq(uint16_t actual) {
79 assertions_queue[queue_size++] = (struct test_assertion){
80 NEGINT16_EQ, (union test_expectation_data){.int16 = actual}};
81 }
82
negint16_callback(void * _CBOR_UNUSED (_context),uint16_t actual)83 void negint16_callback(void *_CBOR_UNUSED(_context), uint16_t actual) {
84 assert_true(current().expectation == NEGINT16_EQ);
85 assert_true(current().data.int16 == actual);
86 current_expectation++;
87 }
88
assert_negint32_eq(uint32_t actual)89 void assert_negint32_eq(uint32_t actual) {
90 assertions_queue[queue_size++] = (struct test_assertion){
91 NEGINT32_EQ, (union test_expectation_data){.int32 = actual}};
92 }
93
negint32_callback(void * _CBOR_UNUSED (_context),uint32_t actual)94 void negint32_callback(void *_CBOR_UNUSED(_context), uint32_t actual) {
95 assert_true(current().expectation == NEGINT32_EQ);
96 assert_true(current().data.int32 == actual);
97 current_expectation++;
98 }
99
assert_negint64_eq(uint64_t actual)100 void assert_negint64_eq(uint64_t actual) {
101 assertions_queue[queue_size++] = (struct test_assertion){
102 NEGINT64_EQ, (union test_expectation_data){.int64 = actual}};
103 }
104
negint64_callback(void * _CBOR_UNUSED (_context),uint64_t actual)105 void negint64_callback(void *_CBOR_UNUSED(_context), uint64_t actual) {
106 assert_true(current().expectation == NEGINT64_EQ);
107 assert_true(current().data.int64 == actual);
108 current_expectation++;
109 }
110
assert_bstring_mem_eq(cbor_data address,size_t length)111 void assert_bstring_mem_eq(cbor_data address, size_t length) {
112 assertions_queue[queue_size++] = (struct test_assertion){
113 BSTRING_MEM_EQ,
114 (union test_expectation_data){.string = {address, length}}};
115 }
116
byte_string_callback(void * _CBOR_UNUSED (_context),cbor_data address,uint64_t length)117 void byte_string_callback(void *_CBOR_UNUSED(_context), cbor_data address,
118 uint64_t length) {
119 assert_true(current().expectation == BSTRING_MEM_EQ);
120 assert_true(current().data.string.address == address);
121 assert_true(current().data.string.length == length);
122 current_expectation++;
123 }
124
assert_bstring_indef_start(void)125 void assert_bstring_indef_start(void) {
126 assertions_queue[queue_size++] =
127 (struct test_assertion){.expectation = BSTRING_INDEF_START};
128 }
129
byte_string_start_callback(void * _CBOR_UNUSED (_context))130 void byte_string_start_callback(void *_CBOR_UNUSED(_context)) {
131 assert_true(current().expectation == BSTRING_INDEF_START);
132 current_expectation++;
133 }
134
assert_string_mem_eq(cbor_data address,size_t length)135 void assert_string_mem_eq(cbor_data address, size_t length) {
136 assertions_queue[queue_size++] = (struct test_assertion){
137 STRING_MEM_EQ,
138 (union test_expectation_data){.string = {address, length}}};
139 }
140
string_callback(void * _CBOR_UNUSED (_context),cbor_data address,uint64_t length)141 void string_callback(void *_CBOR_UNUSED(_context), cbor_data address,
142 uint64_t length) {
143 assert_true(current().expectation == STRING_MEM_EQ);
144 assert_true(current().data.string.address == address);
145 assert_true(current().data.string.length == length);
146 current_expectation++;
147 }
148
assert_string_indef_start(void)149 void assert_string_indef_start(void) {
150 assertions_queue[queue_size++] =
151 (struct test_assertion){.expectation = STRING_INDEF_START};
152 }
153
string_start_callback(void * _CBOR_UNUSED (_context))154 void string_start_callback(void *_CBOR_UNUSED(_context)) {
155 assert_true(current().expectation == STRING_INDEF_START);
156 current_expectation++;
157 }
158
assert_indef_break(void)159 void assert_indef_break(void) {
160 assertions_queue[queue_size++] =
161 (struct test_assertion){.expectation = INDEF_BREAK};
162 }
163
indef_break_callback(void * _CBOR_UNUSED (_context))164 void indef_break_callback(void *_CBOR_UNUSED(_context)) {
165 assert_true(current().expectation == INDEF_BREAK);
166 current_expectation++;
167 }
168
assert_array_start(size_t length)169 void assert_array_start(size_t length) {
170 assertions_queue[queue_size++] =
171 (struct test_assertion){ARRAY_START, {.length = length}};
172 }
173
array_start_callback(void * _CBOR_UNUSED (_context),uint64_t length)174 void array_start_callback(void *_CBOR_UNUSED(_context), uint64_t length) {
175 assert_true(current().expectation == ARRAY_START);
176 assert_true(current().data.length == length);
177 current_expectation++;
178 }
179
assert_indef_array_start(void)180 void assert_indef_array_start(void) {
181 assertions_queue[queue_size++] =
182 (struct test_assertion){.expectation = ARRAY_INDEF_START};
183 }
184
indef_array_start_callback(void * _CBOR_UNUSED (_context))185 void indef_array_start_callback(void *_CBOR_UNUSED(_context)) {
186 assert_true(current().expectation == ARRAY_INDEF_START);
187 current_expectation++;
188 }
189
assert_map_start(size_t length)190 void assert_map_start(size_t length) {
191 assertions_queue[queue_size++] =
192 (struct test_assertion){MAP_START, {.length = length}};
193 }
194
map_start_callback(void * _CBOR_UNUSED (_context),uint64_t length)195 void map_start_callback(void *_CBOR_UNUSED(_context), uint64_t length) {
196 assert_true(current().expectation == MAP_START);
197 assert_true(current().data.length == length);
198 current_expectation++;
199 }
200
assert_indef_map_start(void)201 void assert_indef_map_start(void) {
202 assertions_queue[queue_size++] =
203 (struct test_assertion){.expectation = MAP_INDEF_START};
204 }
205
indef_map_start_callback(void * _CBOR_UNUSED (_context))206 void indef_map_start_callback(void *_CBOR_UNUSED(_context)) {
207 assert_true(current().expectation == MAP_INDEF_START);
208 current_expectation++;
209 }
210
assert_tag_eq(uint64_t value)211 void assert_tag_eq(uint64_t value) {
212 assertions_queue[queue_size++] =
213 (struct test_assertion){TAG_EQ, {.int64 = value}};
214 }
215
tag_callback(void * _CBOR_UNUSED (_context),uint64_t value)216 void tag_callback(void *_CBOR_UNUSED(_context), uint64_t value) {
217 assert_true(current().expectation == TAG_EQ);
218 assert_true(current().data.int64 == value);
219 current_expectation++;
220 }
221
assert_half(float value)222 void assert_half(float value) {
223 assertions_queue[queue_size++] =
224 (struct test_assertion){HALF_EQ, {.float2 = value}};
225 }
226
half_callback(void * _CBOR_UNUSED (_context),float actual)227 void half_callback(void *_CBOR_UNUSED(_context), float actual) {
228 assert_true(current().expectation == HALF_EQ);
229 assert_true(current().data.float2 == actual);
230 current_expectation++;
231 }
232
assert_float(float value)233 void assert_float(float value) {
234 assertions_queue[queue_size++] =
235 (struct test_assertion){FLOAT_EQ, {.float4 = value}};
236 }
237
float_callback(void * _CBOR_UNUSED (_context),float actual)238 void float_callback(void *_CBOR_UNUSED(_context), float actual) {
239 assert_true(current().expectation == FLOAT_EQ);
240 assert_true(current().data.float4 == actual);
241 current_expectation++;
242 }
243
assert_double(double value)244 void assert_double(double value) {
245 assertions_queue[queue_size++] =
246 (struct test_assertion){DOUBLE_EQ, {.float8 = value}};
247 }
248
double_callback(void * _CBOR_UNUSED (_context),double actual)249 void double_callback(void *_CBOR_UNUSED(_context), double actual) {
250 assert_true(current().expectation == DOUBLE_EQ);
251 assert_true(current().data.float8 == actual);
252 current_expectation++;
253 }
254
assert_bool(bool value)255 void assert_bool(bool value) {
256 assertions_queue[queue_size++] =
257 (struct test_assertion){BOOL_EQ, {.boolean = value}};
258 }
259
assert_nil(void)260 void assert_nil(void) {
261 assertions_queue[queue_size++] = (struct test_assertion){.expectation = NIL};
262 }
263
assert_undef(void)264 void assert_undef(void) {
265 assertions_queue[queue_size++] =
266 (struct test_assertion){.expectation = UNDEF};
267 }
268
bool_callback(void * _CBOR_UNUSED (_context),bool actual)269 void bool_callback(void *_CBOR_UNUSED(_context), bool actual) {
270 assert_true(current().expectation == BOOL_EQ);
271 assert_true(current().data.boolean == actual);
272 current_expectation++;
273 }
274
null_callback(void * _CBOR_UNUSED (_context))275 void null_callback(void *_CBOR_UNUSED(_context)) {
276 assert_true(current().expectation == NIL);
277 current_expectation++;
278 }
279
undef_callback(void * _CBOR_UNUSED (_context))280 void undef_callback(void *_CBOR_UNUSED(_context)) {
281 assert_true(current().expectation == UNDEF);
282 current_expectation++;
283 }
284
285 const struct cbor_callbacks asserting_callbacks = {
286 .uint8 = &uint8_callback,
287 .uint16 = &uint16_callback,
288 .uint32 = &uint32_callback,
289 .uint64 = &uint64_callback,
290
291 .negint8 = &negint8_callback,
292 .negint16 = &negint16_callback,
293 .negint32 = &negint32_callback,
294 .negint64 = &negint64_callback,
295
296 .byte_string = &byte_string_callback,
297 .byte_string_start = &byte_string_start_callback,
298
299 .string = &string_callback,
300 .string_start = &string_start_callback,
301
302 .array_start = &array_start_callback,
303 .indef_array_start = &indef_array_start_callback,
304
305 .map_start = &map_start_callback,
306 .indef_map_start = &indef_map_start_callback,
307
308 .tag = &tag_callback,
309
310 .float2 = &half_callback,
311 .float4 = &float_callback,
312 .float8 = &double_callback,
313
314 .undefined = &undef_callback,
315 .boolean = &bool_callback,
316 .null = &null_callback,
317 .indef_break = &indef_break_callback};
318
decode(cbor_data source,size_t source_size)319 struct cbor_decoder_result decode(cbor_data source, size_t source_size) {
320 int last_expectation = current_expectation;
321 struct cbor_decoder_result result =
322 cbor_stream_decode(source, source_size, &asserting_callbacks, NULL);
323 if (result.status == CBOR_DECODER_FINISHED) {
324 // Check that we have matched an expectation from the queue
325 assert_true(last_expectation + 1 == current_expectation);
326 }
327 return result;
328 }
329