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 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 */ 17 struct test_assertion current(void) { 18 return assertions_queue[current_expectation]; 19 } 20 21 /* Assertions builders and matcher callbacks */ 22 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 125 void assert_bstring_indef_start(void) { 126 assertions_queue[queue_size++] = 127 (struct test_assertion){.expectation = BSTRING_INDEF_START}; 128 } 129 130 void byte_string_start_callback(void *_CBOR_UNUSED(_context)) { 131 assert_true(current().expectation == BSTRING_INDEF_START); 132 current_expectation++; 133 } 134 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 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 149 void assert_string_indef_start(void) { 150 assertions_queue[queue_size++] = 151 (struct test_assertion){.expectation = STRING_INDEF_START}; 152 } 153 154 void string_start_callback(void *_CBOR_UNUSED(_context)) { 155 assert_true(current().expectation == STRING_INDEF_START); 156 current_expectation++; 157 } 158 159 void assert_indef_break(void) { 160 assertions_queue[queue_size++] = 161 (struct test_assertion){.expectation = INDEF_BREAK}; 162 } 163 164 void indef_break_callback(void *_CBOR_UNUSED(_context)) { 165 assert_true(current().expectation == INDEF_BREAK); 166 current_expectation++; 167 } 168 169 void assert_array_start(size_t length) { 170 assertions_queue[queue_size++] = 171 (struct test_assertion){ARRAY_START, {.length = length}}; 172 } 173 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 180 void assert_indef_array_start(void) { 181 assertions_queue[queue_size++] = 182 (struct test_assertion){.expectation = ARRAY_INDEF_START}; 183 } 184 185 void indef_array_start_callback(void *_CBOR_UNUSED(_context)) { 186 assert_true(current().expectation == ARRAY_INDEF_START); 187 current_expectation++; 188 } 189 190 void assert_map_start(size_t length) { 191 assertions_queue[queue_size++] = 192 (struct test_assertion){MAP_START, {.length = length}}; 193 } 194 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 201 void assert_indef_map_start(void) { 202 assertions_queue[queue_size++] = 203 (struct test_assertion){.expectation = MAP_INDEF_START}; 204 } 205 206 void indef_map_start_callback(void *_CBOR_UNUSED(_context)) { 207 assert_true(current().expectation == MAP_INDEF_START); 208 current_expectation++; 209 } 210 211 void assert_tag_eq(uint64_t value) { 212 assertions_queue[queue_size++] = 213 (struct test_assertion){TAG_EQ, {.int64 = value}}; 214 } 215 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 222 void assert_half(float value) { 223 assertions_queue[queue_size++] = 224 (struct test_assertion){HALF_EQ, {.float2 = value}}; 225 } 226 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 233 void assert_float(float value) { 234 assertions_queue[queue_size++] = 235 (struct test_assertion){FLOAT_EQ, {.float4 = value}}; 236 } 237 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 244 void assert_double(double value) { 245 assertions_queue[queue_size++] = 246 (struct test_assertion){DOUBLE_EQ, {.float8 = value}}; 247 } 248 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 255 void assert_bool(bool value) { 256 assertions_queue[queue_size++] = 257 (struct test_assertion){BOOL_EQ, {.boolean = value}}; 258 } 259 260 void assert_nil(void) { 261 assertions_queue[queue_size++] = (struct test_assertion){.expectation = NIL}; 262 } 263 264 void assert_undef(void) { 265 assertions_queue[queue_size++] = 266 (struct test_assertion){.expectation = UNDEF}; 267 } 268 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 275 void null_callback(void *_CBOR_UNUSED(_context)) { 276 assert_true(current().expectation == NIL); 277 current_expectation++; 278 } 279 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 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