1 #ifndef STREAM_EXPECTATIONS_H_ 2 #define STREAM_EXPECTATIONS_H_ 3 4 #include "assertions.h" 5 #include "cbor.h" 6 7 #define MAX_QUEUE_ITEMS 30 8 9 // Utilities to test `cbor_stream_decode`. See `cbor_stream_decode_test.cc`. 10 // 11 // Usage: 12 // - The `assert_` helpers build a queue of `test_assertion`s 13 // (`assertions_queue` in the implementation file), specifying 14 // - Which callback is expected (`test_expectation`) 15 // - And what is the expected argument value (if applicable, 16 // `test_expectation_data`) 17 // - `decode` will invoke `cbor_stream_decode` (test subject) 18 // - `cbor_stream_decode` will invoke one of the `_callback` functions, which 19 // will check the passed data against the `assertions_queue` 20 21 enum test_expectation { 22 UINT8_EQ, 23 UINT16_EQ, 24 UINT32_EQ, 25 UINT64_EQ, 26 27 NEGINT8_EQ, 28 NEGINT16_EQ, 29 NEGINT32_EQ, 30 NEGINT64_EQ, 31 32 // Matches length and memory address for definite strings 33 BSTRING_MEM_EQ, 34 BSTRING_INDEF_START, 35 36 STRING_MEM_EQ, 37 STRING_INDEF_START, 38 39 ARRAY_START, /* Definite arrays only */ 40 ARRAY_INDEF_START, 41 42 MAP_START, /* Definite maps only */ 43 MAP_INDEF_START, 44 45 TAG_EQ, 46 47 HALF_EQ, 48 FLOAT_EQ, 49 DOUBLE_EQ, 50 BOOL_EQ, 51 NIL, 52 UNDEF, 53 INDEF_BREAK /* Expect "Break" */ 54 }; 55 56 union test_expectation_data { 57 uint8_t int8; 58 uint16_t int16; 59 uint32_t int32; 60 uint64_t int64; 61 struct string { 62 cbor_data address; 63 size_t length; 64 } string; 65 size_t length; 66 float float2; 67 float float4; 68 double float8; 69 bool boolean; 70 }; 71 72 struct test_assertion { 73 enum test_expectation expectation; 74 union test_expectation_data data; 75 }; 76 77 /* Test harness -- calls `cbor_stream_decode` and checks assertions */ 78 struct cbor_decoder_result decode(cbor_data, size_t); 79 80 /* Verify all assertions were applied and clean up */ 81 int clean_up_stream_assertions(void **); 82 83 /* Assertions builders */ 84 void assert_uint8_eq(uint8_t); 85 void assert_uint16_eq(uint16_t); 86 void assert_uint32_eq(uint32_t); 87 void assert_uint64_eq(uint64_t); 88 89 void assert_negint8_eq(uint8_t); 90 void assert_negint16_eq(uint16_t); 91 void assert_negint32_eq(uint32_t); 92 void assert_negint64_eq(uint64_t); 93 94 void assert_bstring_mem_eq(cbor_data, size_t); 95 void assert_bstring_indef_start(void); 96 97 void assert_string_mem_eq(cbor_data, size_t); 98 void assert_string_indef_start(void); 99 100 void assert_array_start(size_t); 101 void assert_indef_array_start(void); 102 103 void assert_map_start(size_t); 104 void assert_indef_map_start(void); 105 106 void assert_tag_eq(uint64_t); 107 108 void assert_half(float); 109 void assert_float(float); 110 void assert_double(double); 111 112 void assert_bool(bool); 113 void assert_nil(void); /* assert_null already exists */ 114 void assert_undef(void); 115 116 void assert_indef_break(void); 117 118 /* Assertions verifying callbacks */ 119 void uint8_callback(void *, uint8_t); 120 void uint16_callback(void *, uint16_t); 121 void uint32_callback(void *, uint32_t); 122 void uint64_callback(void *, uint64_t); 123 124 void negint8_callback(void *, uint8_t); 125 void negint16_callback(void *, uint16_t); 126 void negint32_callback(void *, uint32_t); 127 void negint64_callback(void *, uint64_t); 128 129 void byte_string_callback(void *, cbor_data, uint64_t); 130 void byte_string_start_callback(void *); 131 132 void string_callback(void *, cbor_data, uint64_t); 133 void string_start_callback(void *); 134 135 void array_start_callback(void *, uint64_t); 136 void indef_array_start_callback(void *); 137 138 void map_start_callback(void *, uint64_t); 139 void indef_map_start_callback(void *); 140 141 void tag_callback(void *, uint64_t); 142 143 void half_callback(void *, float); 144 void float_callback(void *, float); 145 void double_callback(void *, double); 146 void indef_break_callback(void *); 147 148 void bool_callback(void *, bool); 149 void null_callback(void *); 150 void undef_callback(void *); 151 152 #endif 153