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