1 /* 2 * This file provides testing tools for the streaming decoder. The intended 3 * usage is as follows: 1) SE API wrapper is initialized 2) Client builds 4 * (ordered) series of expectations 3) The decoder is executed 4) SE checks all 5 * assertions 5) Go to 2) if desired 6 */ 7 8 #ifndef STREAM_EXPECTATIONS_H_ 9 #define STREAM_EXPECTATIONS_H_ 10 11 #include <setjmp.h> 12 #include <stdarg.h> 13 #include <stddef.h> 14 15 #include <cmocka.h> 16 17 #include <stdint.h> 18 #include "cbor.h" 19 20 // TODO: This setup is overengineered, we currently use one assertion at a time 21 // TOOD: We never ensure that the queue is empty 22 #define MAX_QUEUE_ITEMS 30 23 24 enum test_expectation { 25 UINT8_EQ, 26 UINT16_EQ, 27 UINT32_EQ, 28 UINT64_EQ, 29 30 NEGINT8_EQ, 31 NEGINT16_EQ, 32 NEGINT32_EQ, 33 NEGINT64_EQ, 34 35 BSTRING_MEM_EQ, /* Matches length and memory address for definite byte strings 36 */ 37 BSTRING_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 /* Tested function */ 78 // TODO: This looks overengineered, we only ever use one (?) in the testsuite 79 typedef struct cbor_decoder_result decoder_t(cbor_data, size_t, 80 const struct cbor_callbacks *, 81 void *); 82 void set_decoder(decoder_t *); 83 struct cbor_decoder_result decode(cbor_data, size_t); 84 85 /* Test setup */ 86 int clear_stream_assertions(void **); 87 88 /* Assertions builders */ 89 void assert_uint8_eq(uint8_t); 90 void assert_uint16_eq(uint16_t); 91 void assert_uint32_eq(uint32_t); 92 void assert_uint64_eq(uint64_t); 93 94 void assert_negint8_eq(uint8_t); 95 void assert_negint16_eq(uint16_t); 96 void assert_negint32_eq(uint32_t); 97 void assert_negint64_eq(uint64_t); 98 99 void assert_bstring_mem_eq(cbor_data, size_t); 100 void assert_bstring_indef_start(); 101 102 void assert_array_start(size_t); 103 void assert_indef_array_start(); 104 105 void assert_map_start(size_t); 106 void assert_indef_map_start(); 107 108 void assert_tag_eq(uint64_t); 109 110 void assert_half(float); 111 void assert_float(float); 112 void assert_double(double); 113 114 void assert_bool(bool); 115 void assert_nil(); /* assert_null already exists */ 116 void assert_undef(); 117 118 void assert_indef_break(); 119 120 /* Assertions verifying callbacks */ 121 void uint8_callback(void *, uint8_t); 122 void uint16_callback(void *, uint16_t); 123 void uint32_callback(void *, uint32_t); 124 void uint64_callback(void *, uint64_t); 125 126 void negint8_callback(void *, uint8_t); 127 void negint16_callback(void *, uint16_t); 128 void negint32_callback(void *, uint32_t); 129 void negint64_callback(void *, uint64_t); 130 131 void byte_string_callback(void *, cbor_data, size_t); 132 void byte_string_start_callback(void *); 133 134 void array_start_callback(void *, size_t); 135 void indef_array_start_callback(void *); 136 137 void map_start_callback(void *, size_t); 138 void indef_map_start_callback(void *); 139 140 void tag_callback(void *, uint64_t); 141 142 void half_callback(void *, float); 143 void float_callback(void *, float); 144 void double_callback(void *, double); 145 void indef_break_callback(void *); 146 147 void bool_callback(void *, bool); 148 void null_callback(void *); 149 void undef_callback(void *); 150 151 #endif 152