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