xref: /btstack/test/embedded/btstack_util_test.cpp (revision 4902524cc6a45a01cfead054f48b6584dbb1f1cc)
1*4902524cSMatthias Ringwald #include "CppUTest/TestHarness.h"
2*4902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
3*4902524cSMatthias Ringwald 
4*4902524cSMatthias Ringwald #include "btstack_memory.h"
5*4902524cSMatthias Ringwald #include "btstack_debug.h"
6*4902524cSMatthias Ringwald 
7*4902524cSMatthias Ringwald TEST_GROUP(BTstackUtil){
8*4902524cSMatthias Ringwald     void setup(void){
9*4902524cSMatthias Ringwald     }
10*4902524cSMatthias Ringwald     void teardown(void){
11*4902524cSMatthias Ringwald     }
12*4902524cSMatthias Ringwald };
13*4902524cSMatthias Ringwald 
14*4902524cSMatthias Ringwald TEST(BTstackUtil, btstack_next_cid_ignoring_zero){
15*4902524cSMatthias Ringwald     CHECK_EQUAL(1, btstack_next_cid_ignoring_zero(0));
16*4902524cSMatthias Ringwald     CHECK_EQUAL(5, btstack_next_cid_ignoring_zero(4));
17*4902524cSMatthias Ringwald     CHECK_EQUAL(1, btstack_next_cid_ignoring_zero(0xFFFF));
18*4902524cSMatthias Ringwald }
19*4902524cSMatthias Ringwald 
20*4902524cSMatthias Ringwald TEST(BTstackUtil, bd_addr_cmp){
21*4902524cSMatthias Ringwald     bd_addr_t a = {0};
22*4902524cSMatthias Ringwald     bd_addr_t b = {0};
23*4902524cSMatthias Ringwald     CHECK_EQUAL(0, bd_addr_cmp(a, b));
24*4902524cSMatthias Ringwald 
25*4902524cSMatthias Ringwald     bd_addr_t a1 = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03};
26*4902524cSMatthias Ringwald     bd_addr_t b1 = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03};
27*4902524cSMatthias Ringwald     CHECK_EQUAL(0, bd_addr_cmp(a1, b1));
28*4902524cSMatthias Ringwald }
29*4902524cSMatthias Ringwald 
30*4902524cSMatthias Ringwald TEST(BTstackUtil, bd_addr_copy){
31*4902524cSMatthias Ringwald     bd_addr_t a = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03};
32*4902524cSMatthias Ringwald     bd_addr_t b = {0};
33*4902524cSMatthias Ringwald     CHECK(0 != bd_addr_cmp(a, b));
34*4902524cSMatthias Ringwald 
35*4902524cSMatthias Ringwald     bd_addr_copy(a,b);
36*4902524cSMatthias Ringwald     CHECK_EQUAL(0, bd_addr_cmp(a, b));
37*4902524cSMatthias Ringwald }
38*4902524cSMatthias Ringwald 
39*4902524cSMatthias Ringwald TEST(BTstackUtil, little_endian_read){
40*4902524cSMatthias Ringwald     const uint8_t buffer[] = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03};
41*4902524cSMatthias Ringwald     uint32_t value;
42*4902524cSMatthias Ringwald 
43*4902524cSMatthias Ringwald     value = little_endian_read_16(buffer, 0);
44*4902524cSMatthias Ringwald     CHECK_EQUAL(0xECBC, value);
45*4902524cSMatthias Ringwald 
46*4902524cSMatthias Ringwald     value = little_endian_read_24(buffer, 0);
47*4902524cSMatthias Ringwald     CHECK_EQUAL(0x5DECBC, value);
48*4902524cSMatthias Ringwald 
49*4902524cSMatthias Ringwald     value = little_endian_read_32(buffer, 0);
50*4902524cSMatthias Ringwald     CHECK_EQUAL(0xE65DECBC, value);
51*4902524cSMatthias Ringwald }
52*4902524cSMatthias Ringwald 
53*4902524cSMatthias Ringwald TEST(BTstackUtil, little_endian_store){
54*4902524cSMatthias Ringwald     uint8_t buffer[6];
55*4902524cSMatthias Ringwald     uint32_t expected_value = 0xE65DECBC;
56*4902524cSMatthias Ringwald     uint32_t value;
57*4902524cSMatthias Ringwald 
58*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
59*4902524cSMatthias Ringwald     little_endian_store_16(buffer, 0, expected_value);
60*4902524cSMatthias Ringwald     value = little_endian_read_16(buffer, 0);
61*4902524cSMatthias Ringwald     CHECK_EQUAL(0xECBC, value);
62*4902524cSMatthias Ringwald 
63*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
64*4902524cSMatthias Ringwald     little_endian_store_24(buffer, 0, expected_value);
65*4902524cSMatthias Ringwald     value = little_endian_read_24(buffer, 0);
66*4902524cSMatthias Ringwald     CHECK_EQUAL(0x5DECBC, value);
67*4902524cSMatthias Ringwald 
68*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
69*4902524cSMatthias Ringwald     little_endian_store_32(buffer, 0, expected_value);
70*4902524cSMatthias Ringwald     value = little_endian_read_32(buffer, 0);
71*4902524cSMatthias Ringwald     CHECK_EQUAL(0xE65DECBC, value);
72*4902524cSMatthias Ringwald }
73*4902524cSMatthias Ringwald 
74*4902524cSMatthias Ringwald TEST(BTstackUtil, big_endian_read){
75*4902524cSMatthias Ringwald     const uint8_t buffer[] = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03};
76*4902524cSMatthias Ringwald     uint32_t value;
77*4902524cSMatthias Ringwald 
78*4902524cSMatthias Ringwald     value = big_endian_read_16(buffer, 0);
79*4902524cSMatthias Ringwald     CHECK_EQUAL(0xBCEC, value);
80*4902524cSMatthias Ringwald 
81*4902524cSMatthias Ringwald     value = big_endian_read_24(buffer, 0);
82*4902524cSMatthias Ringwald     CHECK_EQUAL(0xBCEC5D, value);
83*4902524cSMatthias Ringwald 
84*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
85*4902524cSMatthias Ringwald     CHECK_EQUAL(0xBCEC5DE6, value);
86*4902524cSMatthias Ringwald }
87*4902524cSMatthias Ringwald 
88*4902524cSMatthias Ringwald TEST(BTstackUtil, big_endian_store){
89*4902524cSMatthias Ringwald     uint8_t buffer[6];
90*4902524cSMatthias Ringwald     uint32_t expected_value = 0xE65DECBC;
91*4902524cSMatthias Ringwald     uint32_t value;
92*4902524cSMatthias Ringwald 
93*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
94*4902524cSMatthias Ringwald     big_endian_store_16(buffer, 0, expected_value);
95*4902524cSMatthias Ringwald     value = big_endian_read_16(buffer, 0);
96*4902524cSMatthias Ringwald     CHECK_EQUAL(0xECBC, value);
97*4902524cSMatthias Ringwald 
98*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
99*4902524cSMatthias Ringwald     big_endian_store_24(buffer, 0, expected_value);
100*4902524cSMatthias Ringwald     value = big_endian_read_24(buffer, 0);
101*4902524cSMatthias Ringwald     CHECK_EQUAL(0x5DECBC, value);
102*4902524cSMatthias Ringwald 
103*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
104*4902524cSMatthias Ringwald     big_endian_store_32(buffer, 0, expected_value);
105*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
106*4902524cSMatthias Ringwald     CHECK_EQUAL(0xE65DECBC, value);
107*4902524cSMatthias Ringwald }
108*4902524cSMatthias Ringwald 
109*4902524cSMatthias Ringwald TEST(BTstackUtil, reverse_bytes){
110*4902524cSMatthias Ringwald     uint8_t src[32];
111*4902524cSMatthias Ringwald     uint8_t buffer[32];
112*4902524cSMatthias Ringwald     uint32_t value;
113*4902524cSMatthias Ringwald 
114*4902524cSMatthias Ringwald     int i;
115*4902524cSMatthias Ringwald     for (i = 0; i < sizeof(src); i++){
116*4902524cSMatthias Ringwald         src[i] = i + 1;
117*4902524cSMatthias Ringwald     }
118*4902524cSMatthias Ringwald 
119*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
120*4902524cSMatthias Ringwald     reverse_bytes(src, buffer, sizeof(buffer));
121*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
122*4902524cSMatthias Ringwald     CHECK_EQUAL(0x201F1E1D, value);
123*4902524cSMatthias Ringwald 
124*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
125*4902524cSMatthias Ringwald     reverse_24(src, buffer);
126*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
127*4902524cSMatthias Ringwald     CHECK_EQUAL(0x03020100, value);
128*4902524cSMatthias Ringwald 
129*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
130*4902524cSMatthias Ringwald     reverse_48(src, buffer);
131*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
132*4902524cSMatthias Ringwald     CHECK_EQUAL(0x06050403, value);
133*4902524cSMatthias Ringwald 
134*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
135*4902524cSMatthias Ringwald     reverse_56(src, buffer);
136*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
137*4902524cSMatthias Ringwald     CHECK_EQUAL(0x07060504, value);
138*4902524cSMatthias Ringwald 
139*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
140*4902524cSMatthias Ringwald     reverse_64(src, buffer);
141*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
142*4902524cSMatthias Ringwald     CHECK_EQUAL(0x08070605, value);
143*4902524cSMatthias Ringwald 
144*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
145*4902524cSMatthias Ringwald     reverse_128(src, buffer);
146*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
147*4902524cSMatthias Ringwald     CHECK_EQUAL(0x100F0E0D, value);
148*4902524cSMatthias Ringwald 
149*4902524cSMatthias Ringwald     memset(buffer, 0, sizeof(buffer));
150*4902524cSMatthias Ringwald     reverse_256(src, buffer);
151*4902524cSMatthias Ringwald     value = big_endian_read_32(buffer, 0);
152*4902524cSMatthias Ringwald     CHECK_EQUAL(0x201F1E1D, value);
153*4902524cSMatthias Ringwald }
154*4902524cSMatthias Ringwald 
155*4902524cSMatthias Ringwald TEST(BTstackUtil, reverse_bd_addr){
156*4902524cSMatthias Ringwald     bd_addr_t src = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03};
157*4902524cSMatthias Ringwald     bd_addr_t dest = {0};
158*4902524cSMatthias Ringwald     reverse_bd_addr(src, dest);
159*4902524cSMatthias Ringwald 
160*4902524cSMatthias Ringwald     uint32_t value = big_endian_read_32(dest, 0);
161*4902524cSMatthias Ringwald     CHECK_EQUAL(0x0315E65D, value);
162*4902524cSMatthias Ringwald }
163*4902524cSMatthias Ringwald 
164*4902524cSMatthias Ringwald TEST(BTstackUtil, btstack_min_max){
165*4902524cSMatthias Ringwald     uint32_t a = 30;
166*4902524cSMatthias Ringwald     uint32_t b = 100;
167*4902524cSMatthias Ringwald 
168*4902524cSMatthias Ringwald     CHECK_EQUAL(a, btstack_min(a,b));
169*4902524cSMatthias Ringwald     CHECK_EQUAL(a, btstack_min(b,a));
170*4902524cSMatthias Ringwald 
171*4902524cSMatthias Ringwald     CHECK_EQUAL(b, btstack_max(a,b));
172*4902524cSMatthias Ringwald     CHECK_EQUAL(b, btstack_max(b,a));
173*4902524cSMatthias Ringwald }
174*4902524cSMatthias Ringwald 
175*4902524cSMatthias Ringwald TEST(BTstackUtil, char_for_nibble){
176*4902524cSMatthias Ringwald     CHECK_EQUAL('A', char_for_nibble(10));
177*4902524cSMatthias Ringwald     CHECK_EQUAL('?', char_for_nibble(20));
178*4902524cSMatthias Ringwald     // CHECK_EQUAL('?', char_for_nibble(-5));
179*4902524cSMatthias Ringwald }
180*4902524cSMatthias Ringwald 
181*4902524cSMatthias Ringwald TEST(BTstackUtil, nibble_for_char){
182*4902524cSMatthias Ringwald     CHECK_EQUAL(0, nibble_for_char('0'));
183*4902524cSMatthias Ringwald     CHECK_EQUAL(5, nibble_for_char('5'));
184*4902524cSMatthias Ringwald     CHECK_EQUAL(9, nibble_for_char('9'));
185*4902524cSMatthias Ringwald 
186*4902524cSMatthias Ringwald     CHECK_EQUAL(10, nibble_for_char('a'));
187*4902524cSMatthias Ringwald     CHECK_EQUAL(12, nibble_for_char('c'));
188*4902524cSMatthias Ringwald     CHECK_EQUAL(15, nibble_for_char('f'));
189*4902524cSMatthias Ringwald 
190*4902524cSMatthias Ringwald     CHECK_EQUAL(10, nibble_for_char('A'));
191*4902524cSMatthias Ringwald     CHECK_EQUAL(12, nibble_for_char('C'));
192*4902524cSMatthias Ringwald     CHECK_EQUAL(15, nibble_for_char('F'));
193*4902524cSMatthias Ringwald 
194*4902524cSMatthias Ringwald     CHECK_EQUAL(-1, nibble_for_char('-'));
195*4902524cSMatthias Ringwald }
196*4902524cSMatthias Ringwald 
197*4902524cSMatthias Ringwald TEST(BTstackUtil, logging){
198*4902524cSMatthias Ringwald     uint8_t data[6 * 16 + 5] = {0x54, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x69, 0x6e, 0x66, 0x6f};
199*4902524cSMatthias Ringwald #ifdef ENABLE_LOG_DEBUG
200*4902524cSMatthias Ringwald     log_debug_hexdump(data, sizeof(data));
201*4902524cSMatthias Ringwald #endif
202*4902524cSMatthias Ringwald 
203*4902524cSMatthias Ringwald #ifdef ENABLE_LOG_INFO
204*4902524cSMatthias Ringwald     log_info_hexdump(data, sizeof(data));
205*4902524cSMatthias Ringwald     sm_key_t key = {0x54, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x01, 0x014, 0xFF};
206*4902524cSMatthias Ringwald     log_info_key("test key", key);
207*4902524cSMatthias Ringwald #endif
208*4902524cSMatthias Ringwald }
209*4902524cSMatthias Ringwald 
210*4902524cSMatthias Ringwald TEST(BTstackUtil, uuids){
211*4902524cSMatthias Ringwald     uint32_t shortUUID = 0x44445555;
212*4902524cSMatthias Ringwald     uint8_t uuid[16];
213*4902524cSMatthias Ringwald     uint8_t uuid128[] = {0x44, 0x44, 0x55, 0x55, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
214*4902524cSMatthias Ringwald 
215*4902524cSMatthias Ringwald     memset(uuid, 0, sizeof(uuid));
216*4902524cSMatthias Ringwald     uuid_add_bluetooth_prefix(uuid, shortUUID);
217*4902524cSMatthias Ringwald     MEMCMP_EQUAL(uuid128, uuid, sizeof(uuid));
218*4902524cSMatthias Ringwald 
219*4902524cSMatthias Ringwald     CHECK_EQUAL(1, uuid_has_bluetooth_prefix(uuid128));
220*4902524cSMatthias Ringwald 
221*4902524cSMatthias Ringwald     uuid128[5] = 0xff;
222*4902524cSMatthias Ringwald     CHECK(1 != uuid_has_bluetooth_prefix(uuid128));
223*4902524cSMatthias Ringwald 
224*4902524cSMatthias Ringwald     char * uuid128_str = uuid128_to_str(uuid128);
225*4902524cSMatthias Ringwald     STRCMP_EQUAL("44445555-00FF-1000-8000-00805F9B34FB", uuid128_str);
226*4902524cSMatthias Ringwald }
227*4902524cSMatthias Ringwald 
228*4902524cSMatthias Ringwald TEST(BTstackUtil, bd_addr_utils){
229*4902524cSMatthias Ringwald     const bd_addr_t addr = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03};
230*4902524cSMatthias Ringwald     char * device_addr_string = (char *)"BC:EC:5D:E6:15:03";
231*4902524cSMatthias Ringwald 
232*4902524cSMatthias Ringwald     char * addr_str = bd_addr_to_str(addr);
233*4902524cSMatthias Ringwald     STRCMP_EQUAL(device_addr_string, addr_str);
234*4902524cSMatthias Ringwald 
235*4902524cSMatthias Ringwald     uint8_t device_name[50];
236*4902524cSMatthias Ringwald     strcpy((char *)device_name, "Device name 00:00:00:00:00:00");
237*4902524cSMatthias Ringwald     btstack_replace_bd_addr_placeholder(device_name, strlen((const char*) device_name), addr);
238*4902524cSMatthias Ringwald     STRCMP_EQUAL("Device name BC:EC:5D:E6:15:03", (const char *) device_name);
239*4902524cSMatthias Ringwald 
240*4902524cSMatthias Ringwald     bd_addr_t device_addr;
241*4902524cSMatthias Ringwald     CHECK_EQUAL(1, sscanf_bd_addr(device_addr_string, device_addr));
242*4902524cSMatthias Ringwald     MEMCMP_EQUAL(addr, device_addr, sizeof(addr));
243*4902524cSMatthias Ringwald 
244*4902524cSMatthias Ringwald     CHECK_EQUAL(1, sscanf_bd_addr("BC EC 5D E6 15 03", device_addr));
245*4902524cSMatthias Ringwald     CHECK_EQUAL(1, sscanf_bd_addr("BC-EC-5D-E6-15-03", device_addr));
246*4902524cSMatthias Ringwald 
247*4902524cSMatthias Ringwald     CHECK_EQUAL(0, sscanf_bd_addr("", device_addr));
248*4902524cSMatthias Ringwald     CHECK_EQUAL(0, sscanf_bd_addr("GG-EC-5D-E6-15-03", device_addr));
249*4902524cSMatthias Ringwald     CHECK_EQUAL(0, sscanf_bd_addr("8G-EC-5D-E6-15-03", device_addr));
250*4902524cSMatthias Ringwald     CHECK_EQUAL(0, sscanf_bd_addr("BCxECx5DxE6:15:03", device_addr));
251*4902524cSMatthias Ringwald 
252*4902524cSMatthias Ringwald }
253*4902524cSMatthias Ringwald 
254*4902524cSMatthias Ringwald TEST(BTstackUtil, atoi){
255*4902524cSMatthias Ringwald     CHECK_EQUAL(102, btstack_atoi("102"));
256*4902524cSMatthias Ringwald     CHECK_EQUAL(0, btstack_atoi("-102"));
257*4902524cSMatthias Ringwald     CHECK_EQUAL(1, btstack_atoi("1st"));
258*4902524cSMatthias Ringwald     CHECK_EQUAL(1, btstack_atoi("1st2"));
259*4902524cSMatthias Ringwald }
260*4902524cSMatthias Ringwald 
261*4902524cSMatthias Ringwald TEST(BTstackUtil, string_len_for_uint32){
262*4902524cSMatthias Ringwald     CHECK_EQUAL(1, string_len_for_uint32(9));
263*4902524cSMatthias Ringwald     CHECK_EQUAL(2, string_len_for_uint32(19));
264*4902524cSMatthias Ringwald     CHECK_EQUAL(3, string_len_for_uint32(109));
265*4902524cSMatthias Ringwald     CHECK_EQUAL(4, string_len_for_uint32(1009));
266*4902524cSMatthias Ringwald     CHECK_EQUAL(5, string_len_for_uint32(10009));
267*4902524cSMatthias Ringwald     CHECK_EQUAL(6, string_len_for_uint32(100009));
268*4902524cSMatthias Ringwald     CHECK_EQUAL(7, string_len_for_uint32(1000009));
269*4902524cSMatthias Ringwald     CHECK_EQUAL(8, string_len_for_uint32(10000009));
270*4902524cSMatthias Ringwald     CHECK_EQUAL(9, string_len_for_uint32(100000009));
271*4902524cSMatthias Ringwald     CHECK_EQUAL(10, string_len_for_uint32(1000000000));
272*4902524cSMatthias Ringwald }
273*4902524cSMatthias Ringwald 
274*4902524cSMatthias Ringwald TEST(BTstackUtil, count_set_bits_uint32){
275*4902524cSMatthias Ringwald     CHECK_EQUAL(4, count_set_bits_uint32(0x0F));
276*4902524cSMatthias Ringwald }
277*4902524cSMatthias Ringwald 
278*4902524cSMatthias Ringwald TEST(BTstackUtil, crc8){
279*4902524cSMatthias Ringwald     uint8_t data[] = {1,2,3,4,5,6,7,8,9};
280*4902524cSMatthias Ringwald     CHECK_EQUAL(84, btstack_crc8_calc(data, sizeof(data)));
281*4902524cSMatthias Ringwald 
282*4902524cSMatthias Ringwald     CHECK_EQUAL(0, btstack_crc8_check(data, sizeof(data), 84));
283*4902524cSMatthias Ringwald     CHECK_EQUAL(1, btstack_crc8_check(data, sizeof(data), 74));
284*4902524cSMatthias Ringwald }
285*4902524cSMatthias Ringwald 
286*4902524cSMatthias Ringwald 
287*4902524cSMatthias Ringwald int main (int argc, const char * argv[]){
288*4902524cSMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
289*4902524cSMatthias Ringwald }
290