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