xref: /btstack/test/embedded/hci_cmd_test.cpp (revision 1d3bd1e51ca491d6783233c8d7431c44f06daa5a)
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