1 #include "CppUTest/TestHarness.h" 2 #include "CppUTest/CommandLineTestRunner.h" 3 4 #include "hci_cmd.h" 5 #include "btstack_util.h" 6 7 static uint8_t hci_cmd_buffer[350]; 8 static uint8_t input_buffer[350]; 9 10 static uint16_t create_hci_cmd(const hci_cmd_t *cmd, ...){ 11 va_list argptr; 12 va_start(argptr, cmd); 13 uint16_t len = hci_cmd_create_from_template(hci_cmd_buffer, cmd, argptr); 14 va_end(argptr); 15 return len - 3; 16 } 17 18 const hci_cmd_t cmd_1 = {0x1234, "1"}; 19 const hci_cmd_t cmd_2 = {0x1234, "2"}; 20 const hci_cmd_t cmd_3 = {0x1234, "3"}; 21 const hci_cmd_t cmd_4 = {0x1234, "4"}; 22 const hci_cmd_t cmd_A = {0x1234, "A"}; 23 const hci_cmd_t cmd_B = {0x1234, "B"}; 24 const hci_cmd_t cmd_D = {0x1234, "D"}; 25 const hci_cmd_t cmd_E = {0x1234, "E"}; 26 const hci_cmd_t cmd_H = {0x1234, "H"}; 27 const hci_cmd_t cmd_K = {0x1234, "K"}; 28 const hci_cmd_t cmd_N = {0x1234, "N"}; 29 const hci_cmd_t cmd_P = {0x1234, "P"}; 30 const hci_cmd_t cmd_Q = {0x1234, "Q"}; 31 const hci_cmd_t cmd_JV = {0x1234, "JV"}; 32 const hci_cmd_t cmd_number_12 = {0x1234, "a[12]"}; 33 const hci_cmd_t cmd_bits_12 = {0x1234, "b[12]"}; 34 const hci_cmd_t cmd_INVALID = {0x1234, "!"}; 35 36 TEST_GROUP(HCI_Command){ 37 void setup(void){ 38 } 39 void setup_input_buffer(uint16_t size){ 40 uint16_t i; 41 for (i = 0; i < size; i++){ 42 input_buffer[i] = i + 1; 43 } 44 } 45 46 void setup_input_buffer_with_alphabet(uint16_t size){ 47 uint16_t i; 48 uint8_t a = 0x41; 49 uint8_t z = 0x5A; 50 51 for (i = 0; i < size; i++){ 52 input_buffer[i] = a + i%(z-a); 53 } 54 } 55 void teardown(void){ 56 } 57 }; 58 59 TEST(HCI_Command, format_1){ 60 const uint8_t expected_buffer[] = {0x55}; 61 uint16_t size = create_hci_cmd(&cmd_1, expected_buffer[0]); 62 CHECK_EQUAL(sizeof(expected_buffer), size); 63 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], sizeof(expected_buffer)); 64 } 65 66 TEST(HCI_Command, format_2){ 67 const uint8_t expected_buffer[] = {0x55, 0x66}; 68 uint16_t size = create_hci_cmd(&cmd_2, 0x6655); 69 CHECK_EQUAL(sizeof(expected_buffer), size); 70 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], sizeof(expected_buffer)); 71 } 72 73 TEST(HCI_Command, format_3){ 74 const uint8_t expected_buffer[] = {0x55, 0x66, 0x77}; 75 uint16_t size = create_hci_cmd(&cmd_3, 0x776655); 76 CHECK_EQUAL(sizeof(expected_buffer), size); 77 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], sizeof(expected_buffer)); 78 } 79 80 TEST(HCI_Command, format_4){ 81 const uint8_t expected_buffer[] = {0x55, 0x66, 0x77, 0x88}; 82 uint16_t size = create_hci_cmd(&cmd_4, 0x88776655); 83 CHECK_EQUAL(sizeof(expected_buffer), size); 84 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], sizeof(expected_buffer)); 85 } 86 87 TEST(HCI_Command, format_A){ 88 uint16_t expected_size = 31; 89 setup_input_buffer(expected_size); 90 91 uint16_t size = create_hci_cmd(&cmd_A, input_buffer); 92 CHECK_EQUAL(expected_size, size); 93 MEMCMP_EQUAL(input_buffer, &hci_cmd_buffer[3], expected_size); 94 } 95 96 TEST(HCI_Command, format_B){ 97 uint8_t expected_buffer[6]; 98 uint16_t expected_size = 6; 99 setup_input_buffer(expected_size); 100 reverse_bytes(input_buffer, expected_buffer, expected_size); 101 102 uint16_t size = create_hci_cmd(&cmd_B, input_buffer); 103 CHECK_EQUAL(expected_size, size); 104 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], expected_size); 105 } 106 107 TEST(HCI_Command, format_D){ 108 uint16_t expected_size = 8; 109 setup_input_buffer(expected_size); 110 111 uint16_t size = create_hci_cmd(&cmd_D, input_buffer); 112 CHECK_EQUAL(expected_size, size); 113 MEMCMP_EQUAL(input_buffer, &hci_cmd_buffer[3], expected_size); 114 } 115 116 TEST(HCI_Command, format_E){ 117 uint16_t expected_size = 240; 118 setup_input_buffer(expected_size); 119 120 uint16_t size = create_hci_cmd(&cmd_E, input_buffer); 121 CHECK_EQUAL(expected_size, size); 122 MEMCMP_EQUAL(input_buffer, &hci_cmd_buffer[3], expected_size); 123 } 124 125 TEST(HCI_Command, format_H){ 126 const uint8_t expected_buffer[] = {0x55, 0x66}; 127 uint16_t size = create_hci_cmd(&cmd_H, 0x6655); 128 CHECK_EQUAL(sizeof(expected_buffer), size); 129 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], sizeof(expected_buffer)); 130 } 131 132 TEST(HCI_Command, format_K){ 133 uint8_t expected_buffer[16]; 134 uint16_t expected_size = 16; 135 setup_input_buffer(expected_size); 136 reverse_bytes(input_buffer, expected_buffer, expected_size); 137 138 uint16_t size = create_hci_cmd(&cmd_K, input_buffer); 139 CHECK_EQUAL(expected_size, size); 140 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], expected_size); 141 } 142 143 TEST(HCI_Command, format_N_less_then_248){ 144 uint16_t expected_size = 248; 145 // last (248 - 160) bytes are set to 0 146 memset(input_buffer, 0u, 248u); 147 setup_input_buffer_with_alphabet(160); 148 149 uint16_t size = create_hci_cmd(&cmd_N, input_buffer); 150 CHECK_EQUAL(expected_size, size); 151 MEMCMP_EQUAL(input_buffer, &hci_cmd_buffer[3], expected_size); 152 } 153 154 TEST(HCI_Command, format_N_more_then_248){ 155 uint16_t expected_size = 248; 156 // last (248 - 160) bytes are set to 0 157 setup_input_buffer_with_alphabet(300); 158 159 uint16_t size = create_hci_cmd(&cmd_N, input_buffer); 160 CHECK_EQUAL(expected_size, size); 161 MEMCMP_EQUAL(input_buffer, &hci_cmd_buffer[3], expected_size); 162 } 163 164 TEST(HCI_Command, format_P){ 165 uint16_t expected_size = 16; 166 setup_input_buffer(expected_size); 167 168 uint16_t size = create_hci_cmd(&cmd_P, input_buffer); 169 CHECK_EQUAL(expected_size, size); 170 MEMCMP_EQUAL(input_buffer, &hci_cmd_buffer[3], expected_size); 171 } 172 173 TEST(HCI_Command, format_Q){ 174 uint8_t expected_buffer[32]; 175 uint16_t expected_size = 32; 176 setup_input_buffer(expected_size); 177 reverse_bytes(input_buffer, expected_buffer, expected_size); 178 179 uint16_t size = create_hci_cmd(&cmd_Q, input_buffer); 180 CHECK_EQUAL(expected_size, size); 181 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], expected_size); 182 } 183 184 TEST(HCI_Command, format_JV){ 185 uint8_t expected_buffer[4]; 186 uint16_t expected_size = 4; 187 uint8_t var_len_arg = expected_size - 1; 188 setup_input_buffer(var_len_arg); 189 expected_buffer[0] = var_len_arg; 190 memcpy(&expected_buffer[1], input_buffer, var_len_arg); 191 192 uint16_t size = create_hci_cmd(&cmd_JV, var_len_arg, input_buffer); 193 CHECK_EQUAL(expected_size, size); 194 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], expected_size); 195 } 196 197 TEST(HCI_Command, format_number_12){ 198 uint8_t num_elements = 2; 199 uint8_t expected_buffer[7]; 200 uint16_t expected_size = 7; 201 uint8_t input_a[2] = { 1, 2}; 202 uint16_t input_b[2] = { 3, 4}; 203 expected_buffer[0] = num_elements; 204 expected_buffer[1] = 1; 205 little_endian_store_16(expected_buffer, 2, 3); 206 expected_buffer[4] = 2; 207 little_endian_store_16(expected_buffer, 5, 4); 208 uint16_t size = create_hci_cmd(&cmd_number_12, num_elements, input_a, input_b); 209 CHECK_EQUAL(expected_size, size); 210 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], expected_size); 211 } 212 213 TEST(HCI_Command, format_bits_12){ 214 uint8_t bits_elements = 3; 215 uint8_t expected_buffer[7]; 216 uint16_t expected_size = 7; 217 uint8_t input_a[2] = { 1, 2}; 218 uint16_t input_b[2] = { 3, 4}; 219 expected_buffer[0] = bits_elements; 220 expected_buffer[1] = 1; 221 little_endian_store_16(expected_buffer, 2, 3); 222 expected_buffer[4] = 2; 223 little_endian_store_16(expected_buffer, 5, 4); 224 uint16_t size = create_hci_cmd(&cmd_bits_12, bits_elements, input_a, input_b); 225 CHECK_EQUAL(expected_size, size); 226 MEMCMP_EQUAL(expected_buffer, &hci_cmd_buffer[3], expected_size); 227 } 228 229 TEST(HCI_Command, format_INVALID){ 230 uint16_t expected_size = 0; 231 setup_input_buffer(16); 232 233 uint16_t size = create_hci_cmd(&cmd_INVALID, input_buffer); 234 CHECK_EQUAL(expected_size, size); 235 } 236 237 int main (int argc, const char * argv[]){ 238 return CommandLineTestRunner::RunAllTests(argc, argv); 239 } 240