14902524cSMatthias Ringwald #include "CppUTest/TestHarness.h" 24902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h" 34902524cSMatthias Ringwald 44902524cSMatthias Ringwald #include "btstack_debug.h" 51d3bd1e5SMatthias Ringwald #include "btstack_util.h" 64902524cSMatthias Ringwald 74902524cSMatthias Ringwald TEST_GROUP(BTstackUtil){ 84902524cSMatthias Ringwald void setup(void){ 94902524cSMatthias Ringwald } 104902524cSMatthias Ringwald void teardown(void){ 114902524cSMatthias Ringwald } 124902524cSMatthias Ringwald }; 134902524cSMatthias Ringwald 144902524cSMatthias Ringwald TEST(BTstackUtil, btstack_next_cid_ignoring_zero){ 154902524cSMatthias Ringwald CHECK_EQUAL(1, btstack_next_cid_ignoring_zero(0)); 164902524cSMatthias Ringwald CHECK_EQUAL(5, btstack_next_cid_ignoring_zero(4)); 174902524cSMatthias Ringwald CHECK_EQUAL(1, btstack_next_cid_ignoring_zero(0xFFFF)); 184902524cSMatthias Ringwald } 194902524cSMatthias Ringwald 204902524cSMatthias Ringwald TEST(BTstackUtil, bd_addr_cmp){ 214902524cSMatthias Ringwald bd_addr_t a = {0}; 224902524cSMatthias Ringwald bd_addr_t b = {0}; 234902524cSMatthias Ringwald CHECK_EQUAL(0, bd_addr_cmp(a, b)); 244902524cSMatthias Ringwald 254902524cSMatthias Ringwald bd_addr_t a1 = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03}; 264902524cSMatthias Ringwald bd_addr_t b1 = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03}; 274902524cSMatthias Ringwald CHECK_EQUAL(0, bd_addr_cmp(a1, b1)); 284902524cSMatthias Ringwald } 294902524cSMatthias Ringwald 304902524cSMatthias Ringwald TEST(BTstackUtil, bd_addr_copy){ 314902524cSMatthias Ringwald bd_addr_t a = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03}; 324902524cSMatthias Ringwald bd_addr_t b = {0}; 334902524cSMatthias Ringwald CHECK(0 != bd_addr_cmp(a, b)); 344902524cSMatthias Ringwald 354902524cSMatthias Ringwald bd_addr_copy(a,b); 364902524cSMatthias Ringwald CHECK_EQUAL(0, bd_addr_cmp(a, b)); 374902524cSMatthias Ringwald } 384902524cSMatthias Ringwald 394902524cSMatthias Ringwald TEST(BTstackUtil, little_endian_read){ 404902524cSMatthias Ringwald const uint8_t buffer[] = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03}; 414902524cSMatthias Ringwald uint32_t value; 424902524cSMatthias Ringwald 434902524cSMatthias Ringwald value = little_endian_read_16(buffer, 0); 444902524cSMatthias Ringwald CHECK_EQUAL(0xECBC, value); 454902524cSMatthias Ringwald 464902524cSMatthias Ringwald value = little_endian_read_24(buffer, 0); 474902524cSMatthias Ringwald CHECK_EQUAL(0x5DECBC, value); 484902524cSMatthias Ringwald 494902524cSMatthias Ringwald value = little_endian_read_32(buffer, 0); 504902524cSMatthias Ringwald CHECK_EQUAL(0xE65DECBC, value); 514902524cSMatthias Ringwald } 524902524cSMatthias Ringwald 534902524cSMatthias Ringwald TEST(BTstackUtil, little_endian_store){ 544902524cSMatthias Ringwald uint8_t buffer[6]; 554902524cSMatthias Ringwald uint32_t expected_value = 0xE65DECBC; 564902524cSMatthias Ringwald uint32_t value; 574902524cSMatthias Ringwald 584902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 594902524cSMatthias Ringwald little_endian_store_16(buffer, 0, expected_value); 604902524cSMatthias Ringwald value = little_endian_read_16(buffer, 0); 614902524cSMatthias Ringwald CHECK_EQUAL(0xECBC, value); 624902524cSMatthias Ringwald 634902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 644902524cSMatthias Ringwald little_endian_store_24(buffer, 0, expected_value); 654902524cSMatthias Ringwald value = little_endian_read_24(buffer, 0); 664902524cSMatthias Ringwald CHECK_EQUAL(0x5DECBC, value); 674902524cSMatthias Ringwald 684902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 694902524cSMatthias Ringwald little_endian_store_32(buffer, 0, expected_value); 704902524cSMatthias Ringwald value = little_endian_read_32(buffer, 0); 714902524cSMatthias Ringwald CHECK_EQUAL(0xE65DECBC, value); 724902524cSMatthias Ringwald } 734902524cSMatthias Ringwald 744902524cSMatthias Ringwald TEST(BTstackUtil, big_endian_read){ 754902524cSMatthias Ringwald const uint8_t buffer[] = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03}; 764902524cSMatthias Ringwald uint32_t value; 774902524cSMatthias Ringwald 784902524cSMatthias Ringwald value = big_endian_read_16(buffer, 0); 794902524cSMatthias Ringwald CHECK_EQUAL(0xBCEC, value); 804902524cSMatthias Ringwald 814902524cSMatthias Ringwald value = big_endian_read_24(buffer, 0); 824902524cSMatthias Ringwald CHECK_EQUAL(0xBCEC5D, value); 834902524cSMatthias Ringwald 844902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 854902524cSMatthias Ringwald CHECK_EQUAL(0xBCEC5DE6, value); 864902524cSMatthias Ringwald } 874902524cSMatthias Ringwald 884902524cSMatthias Ringwald TEST(BTstackUtil, big_endian_store){ 894902524cSMatthias Ringwald uint8_t buffer[6]; 904902524cSMatthias Ringwald uint32_t expected_value = 0xE65DECBC; 914902524cSMatthias Ringwald uint32_t value; 924902524cSMatthias Ringwald 934902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 944902524cSMatthias Ringwald big_endian_store_16(buffer, 0, expected_value); 954902524cSMatthias Ringwald value = big_endian_read_16(buffer, 0); 964902524cSMatthias Ringwald CHECK_EQUAL(0xECBC, value); 974902524cSMatthias Ringwald 984902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 994902524cSMatthias Ringwald big_endian_store_24(buffer, 0, expected_value); 1004902524cSMatthias Ringwald value = big_endian_read_24(buffer, 0); 1014902524cSMatthias Ringwald CHECK_EQUAL(0x5DECBC, value); 1024902524cSMatthias Ringwald 1034902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 1044902524cSMatthias Ringwald big_endian_store_32(buffer, 0, expected_value); 1054902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 1064902524cSMatthias Ringwald CHECK_EQUAL(0xE65DECBC, value); 1074902524cSMatthias Ringwald } 1084902524cSMatthias Ringwald 1094902524cSMatthias Ringwald TEST(BTstackUtil, reverse_bytes){ 1104902524cSMatthias Ringwald uint8_t src[32]; 1114902524cSMatthias Ringwald uint8_t buffer[32]; 1124902524cSMatthias Ringwald uint32_t value; 1134902524cSMatthias Ringwald 1144902524cSMatthias Ringwald int i; 1154902524cSMatthias Ringwald for (i = 0; i < sizeof(src); i++){ 1164902524cSMatthias Ringwald src[i] = i + 1; 1174902524cSMatthias Ringwald } 1184902524cSMatthias Ringwald 1194902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 1204902524cSMatthias Ringwald reverse_bytes(src, buffer, sizeof(buffer)); 1214902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 1224902524cSMatthias Ringwald CHECK_EQUAL(0x201F1E1D, value); 1234902524cSMatthias Ringwald 1244902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 1254902524cSMatthias Ringwald reverse_24(src, buffer); 1264902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 1274902524cSMatthias Ringwald CHECK_EQUAL(0x03020100, value); 1284902524cSMatthias Ringwald 1294902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 1304902524cSMatthias Ringwald reverse_48(src, buffer); 1314902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 1324902524cSMatthias Ringwald CHECK_EQUAL(0x06050403, value); 1334902524cSMatthias Ringwald 1344902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 1354902524cSMatthias Ringwald reverse_56(src, buffer); 1364902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 1374902524cSMatthias Ringwald CHECK_EQUAL(0x07060504, value); 1384902524cSMatthias Ringwald 1394902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 1404902524cSMatthias Ringwald reverse_64(src, buffer); 1414902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 1424902524cSMatthias Ringwald CHECK_EQUAL(0x08070605, value); 1434902524cSMatthias Ringwald 1444902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 1454902524cSMatthias Ringwald reverse_128(src, buffer); 1464902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 1474902524cSMatthias Ringwald CHECK_EQUAL(0x100F0E0D, value); 1484902524cSMatthias Ringwald 1494902524cSMatthias Ringwald memset(buffer, 0, sizeof(buffer)); 1504902524cSMatthias Ringwald reverse_256(src, buffer); 1514902524cSMatthias Ringwald value = big_endian_read_32(buffer, 0); 1524902524cSMatthias Ringwald CHECK_EQUAL(0x201F1E1D, value); 1534902524cSMatthias Ringwald } 1544902524cSMatthias Ringwald 1554902524cSMatthias Ringwald TEST(BTstackUtil, reverse_bd_addr){ 1564902524cSMatthias Ringwald bd_addr_t src = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03}; 1574902524cSMatthias Ringwald bd_addr_t dest = {0}; 1584902524cSMatthias Ringwald reverse_bd_addr(src, dest); 1594902524cSMatthias Ringwald 1604902524cSMatthias Ringwald uint32_t value = big_endian_read_32(dest, 0); 1614902524cSMatthias Ringwald CHECK_EQUAL(0x0315E65D, value); 1624902524cSMatthias Ringwald } 1634902524cSMatthias Ringwald 1644902524cSMatthias Ringwald TEST(BTstackUtil, btstack_min_max){ 1654902524cSMatthias Ringwald uint32_t a = 30; 1664902524cSMatthias Ringwald uint32_t b = 100; 1674902524cSMatthias Ringwald 1684902524cSMatthias Ringwald CHECK_EQUAL(a, btstack_min(a,b)); 1694902524cSMatthias Ringwald CHECK_EQUAL(a, btstack_min(b,a)); 1704902524cSMatthias Ringwald 1714902524cSMatthias Ringwald CHECK_EQUAL(b, btstack_max(a,b)); 1724902524cSMatthias Ringwald CHECK_EQUAL(b, btstack_max(b,a)); 1734902524cSMatthias Ringwald } 1744902524cSMatthias Ringwald 1754902524cSMatthias Ringwald TEST(BTstackUtil, char_for_nibble){ 1764902524cSMatthias Ringwald CHECK_EQUAL('A', char_for_nibble(10)); 1774902524cSMatthias Ringwald CHECK_EQUAL('?', char_for_nibble(20)); 1784902524cSMatthias Ringwald // CHECK_EQUAL('?', char_for_nibble(-5)); 1794902524cSMatthias Ringwald } 1804902524cSMatthias Ringwald 1814902524cSMatthias Ringwald TEST(BTstackUtil, nibble_for_char){ 1824902524cSMatthias Ringwald CHECK_EQUAL(0, nibble_for_char('0')); 1834902524cSMatthias Ringwald CHECK_EQUAL(5, nibble_for_char('5')); 1844902524cSMatthias Ringwald CHECK_EQUAL(9, nibble_for_char('9')); 1854902524cSMatthias Ringwald 1864902524cSMatthias Ringwald CHECK_EQUAL(10, nibble_for_char('a')); 1874902524cSMatthias Ringwald CHECK_EQUAL(12, nibble_for_char('c')); 1884902524cSMatthias Ringwald CHECK_EQUAL(15, nibble_for_char('f')); 1894902524cSMatthias Ringwald 1904902524cSMatthias Ringwald CHECK_EQUAL(10, nibble_for_char('A')); 1914902524cSMatthias Ringwald CHECK_EQUAL(12, nibble_for_char('C')); 1924902524cSMatthias Ringwald CHECK_EQUAL(15, nibble_for_char('F')); 1934902524cSMatthias Ringwald 1944902524cSMatthias Ringwald CHECK_EQUAL(-1, nibble_for_char('-')); 1954902524cSMatthias Ringwald } 1964902524cSMatthias Ringwald 1974902524cSMatthias Ringwald TEST(BTstackUtil, logging){ 1984902524cSMatthias Ringwald uint8_t data[6 * 16 + 5] = {0x54, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x69, 0x6e, 0x66, 0x6f}; 1994902524cSMatthias Ringwald #ifdef ENABLE_LOG_DEBUG 2004902524cSMatthias Ringwald log_debug_hexdump(data, sizeof(data)); 2014902524cSMatthias Ringwald #endif 2024902524cSMatthias Ringwald 2034902524cSMatthias Ringwald #ifdef ENABLE_LOG_INFO 2044902524cSMatthias Ringwald log_info_hexdump(data, sizeof(data)); 2054902524cSMatthias Ringwald sm_key_t key = {0x54, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x01, 0x014, 0xFF}; 2064902524cSMatthias Ringwald log_info_key("test key", key); 2074902524cSMatthias Ringwald #endif 2084902524cSMatthias Ringwald } 2094902524cSMatthias Ringwald 2104902524cSMatthias Ringwald TEST(BTstackUtil, uuids){ 2114902524cSMatthias Ringwald uint32_t shortUUID = 0x44445555; 2124902524cSMatthias Ringwald uint8_t uuid[16]; 2134902524cSMatthias Ringwald uint8_t uuid128[] = {0x44, 0x44, 0x55, 0x55, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 2144902524cSMatthias Ringwald 2154902524cSMatthias Ringwald memset(uuid, 0, sizeof(uuid)); 2164902524cSMatthias Ringwald uuid_add_bluetooth_prefix(uuid, shortUUID); 2174902524cSMatthias Ringwald MEMCMP_EQUAL(uuid128, uuid, sizeof(uuid)); 2184902524cSMatthias Ringwald 2194902524cSMatthias Ringwald CHECK_EQUAL(1, uuid_has_bluetooth_prefix(uuid128)); 2204902524cSMatthias Ringwald 2214902524cSMatthias Ringwald uuid128[5] = 0xff; 2224902524cSMatthias Ringwald CHECK(1 != uuid_has_bluetooth_prefix(uuid128)); 2234902524cSMatthias Ringwald 2244902524cSMatthias Ringwald char * uuid128_str = uuid128_to_str(uuid128); 2254902524cSMatthias Ringwald STRCMP_EQUAL("44445555-00FF-1000-8000-00805F9B34FB", uuid128_str); 2264902524cSMatthias Ringwald } 2274902524cSMatthias Ringwald 2284902524cSMatthias Ringwald TEST(BTstackUtil, bd_addr_utils){ 2294902524cSMatthias Ringwald const bd_addr_t addr = {0xBC, 0xEC, 0x5D, 0xE6, 0x15, 0x03}; 2304902524cSMatthias Ringwald char * device_addr_string = (char *)"BC:EC:5D:E6:15:03"; 2314902524cSMatthias Ringwald 2324902524cSMatthias Ringwald char * addr_str = bd_addr_to_str(addr); 2334902524cSMatthias Ringwald STRCMP_EQUAL(device_addr_string, addr_str); 2344902524cSMatthias Ringwald 2354902524cSMatthias Ringwald uint8_t device_name[50]; 2364902524cSMatthias Ringwald strcpy((char *)device_name, "Device name 00:00:00:00:00:00"); 2374902524cSMatthias Ringwald btstack_replace_bd_addr_placeholder(device_name, strlen((const char*) device_name), addr); 2384902524cSMatthias Ringwald STRCMP_EQUAL("Device name BC:EC:5D:E6:15:03", (const char *) device_name); 2394902524cSMatthias Ringwald 2404902524cSMatthias Ringwald bd_addr_t device_addr; 2414902524cSMatthias Ringwald CHECK_EQUAL(1, sscanf_bd_addr(device_addr_string, device_addr)); 2424902524cSMatthias Ringwald MEMCMP_EQUAL(addr, device_addr, sizeof(addr)); 2434902524cSMatthias Ringwald 2444902524cSMatthias Ringwald CHECK_EQUAL(1, sscanf_bd_addr("BC EC 5D E6 15 03", device_addr)); 2454902524cSMatthias Ringwald CHECK_EQUAL(1, sscanf_bd_addr("BC-EC-5D-E6-15-03", device_addr)); 2464902524cSMatthias Ringwald 2474902524cSMatthias Ringwald CHECK_EQUAL(0, sscanf_bd_addr("", device_addr)); 2484902524cSMatthias Ringwald CHECK_EQUAL(0, sscanf_bd_addr("GG-EC-5D-E6-15-03", device_addr)); 2494902524cSMatthias Ringwald CHECK_EQUAL(0, sscanf_bd_addr("8G-EC-5D-E6-15-03", device_addr)); 2504902524cSMatthias Ringwald CHECK_EQUAL(0, sscanf_bd_addr("BCxECx5DxE6:15:03", device_addr)); 2514902524cSMatthias Ringwald 2524902524cSMatthias Ringwald } 2534902524cSMatthias Ringwald 2544902524cSMatthias Ringwald TEST(BTstackUtil, atoi){ 2554902524cSMatthias Ringwald CHECK_EQUAL(102, btstack_atoi("102")); 2564902524cSMatthias Ringwald CHECK_EQUAL(0, btstack_atoi("-102")); 2574902524cSMatthias Ringwald CHECK_EQUAL(1, btstack_atoi("1st")); 2584902524cSMatthias Ringwald CHECK_EQUAL(1, btstack_atoi("1st2")); 2594902524cSMatthias Ringwald } 2604902524cSMatthias Ringwald 2614902524cSMatthias Ringwald TEST(BTstackUtil, string_len_for_uint32){ 2624902524cSMatthias Ringwald CHECK_EQUAL(1, string_len_for_uint32(9)); 2634902524cSMatthias Ringwald CHECK_EQUAL(2, string_len_for_uint32(19)); 2644902524cSMatthias Ringwald CHECK_EQUAL(3, string_len_for_uint32(109)); 2654902524cSMatthias Ringwald CHECK_EQUAL(4, string_len_for_uint32(1009)); 2664902524cSMatthias Ringwald CHECK_EQUAL(5, string_len_for_uint32(10009)); 2674902524cSMatthias Ringwald CHECK_EQUAL(6, string_len_for_uint32(100009)); 2684902524cSMatthias Ringwald CHECK_EQUAL(7, string_len_for_uint32(1000009)); 2694902524cSMatthias Ringwald CHECK_EQUAL(8, string_len_for_uint32(10000009)); 2704902524cSMatthias Ringwald CHECK_EQUAL(9, string_len_for_uint32(100000009)); 2714902524cSMatthias Ringwald CHECK_EQUAL(10, string_len_for_uint32(1000000000)); 2724902524cSMatthias Ringwald } 2734902524cSMatthias Ringwald 2744902524cSMatthias Ringwald TEST(BTstackUtil, count_set_bits_uint32){ 2754902524cSMatthias Ringwald CHECK_EQUAL(4, count_set_bits_uint32(0x0F)); 2764902524cSMatthias Ringwald } 2774902524cSMatthias Ringwald 2784902524cSMatthias Ringwald TEST(BTstackUtil, crc8){ 2794902524cSMatthias Ringwald uint8_t data[] = {1,2,3,4,5,6,7,8,9}; 2804902524cSMatthias Ringwald CHECK_EQUAL(84, btstack_crc8_calc(data, sizeof(data))); 2814902524cSMatthias Ringwald 2824902524cSMatthias Ringwald CHECK_EQUAL(0, btstack_crc8_check(data, sizeof(data), 84)); 2834902524cSMatthias Ringwald CHECK_EQUAL(1, btstack_crc8_check(data, sizeof(data), 74)); 2844902524cSMatthias Ringwald } 2854902524cSMatthias Ringwald 286*1179ff0cSMatthias Ringwald TEST(BTstackUtil, strcat){ 287*1179ff0cSMatthias Ringwald char summaries[3][7 * 8 + 1]; 288*1179ff0cSMatthias Ringwald CHECK_EQUAL((7*8+1), sizeof(summaries[0])); 289*1179ff0cSMatthias Ringwald summaries[0][0] = 0; 290*1179ff0cSMatthias Ringwald char item_text[10]; 291*1179ff0cSMatthias Ringwald sprintf(item_text, "%04x:%02d ", 1 ,2); 292*1179ff0cSMatthias Ringwald btstack_strcat(summaries[0], sizeof(summaries[0]), item_text); 293*1179ff0cSMatthias Ringwald sprintf(item_text, "%04x:%02d ", 3 ,4); 294*1179ff0cSMatthias Ringwald btstack_strcat(summaries[0], sizeof(summaries[0]), item_text); 295*1179ff0cSMatthias Ringwald STRCMP_EQUAL("0001:02 0003:04 ", summaries[0]); 296*1179ff0cSMatthias Ringwald } 2974902524cSMatthias Ringwald 2984902524cSMatthias Ringwald int main (int argc, const char * argv[]){ 2994902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 3004902524cSMatthias Ringwald } 301