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
create_hci_cmd(const hci_cmd_t * cmd,...)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
TEST_GROUP(HCI_Command)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
TEST(HCI_Command,format_1)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
TEST(HCI_Command,format_2)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
TEST(HCI_Command,format_3)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
TEST(HCI_Command,format_4)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
TEST(HCI_Command,format_A)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
TEST(HCI_Command,format_B)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
TEST(HCI_Command,format_D)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
TEST(HCI_Command,format_E)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
TEST(HCI_Command,format_H)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
TEST(HCI_Command,format_K)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
TEST(HCI_Command,format_N_less_then_248)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
TEST(HCI_Command,format_N_more_then_248)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
TEST(HCI_Command,format_P)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
TEST(HCI_Command,format_Q)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
TEST(HCI_Command,format_JV)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
TEST(HCI_Command,format_number_12)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
TEST(HCI_Command,format_bits_12)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
TEST(HCI_Command,format_INVALID)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
main(int argc,const char * argv[])237 int main (int argc, const char * argv[]){
238 return CommandLineTestRunner::RunAllTests(argc, argv);
239 }
240