1 2 #include "CppUTest/TestHarness.h" 3 #include "CppUTest/CommandLineTestRunner.h" 4 5 #include "btstack_tlv.h" 6 #include "btstack_tlv_posix.h" 7 #include "hci_dump.h" 8 #include "hci_dump_posix_fs.h" 9 #include "btstack_util.h" 10 #include "btstack_config.h" 11 #include "btstack_debug.h" 12 #include <unistd.h> 13 14 #define TEST_DB "/tmp/test.tlv" 15 16 #define TAG(a,b,c,d) ( ((a)<<24) | ((b)<<16) | ((c)<<8) | (d) ) 17 18 /// TLV 19 TEST_GROUP(BSTACK_TLV){ 20 const btstack_tlv_t * btstack_tlv_impl; 21 btstack_tlv_posix_t btstack_tlv_context; 22 void setup(void){ 23 log_info("setup"); 24 // delete old file 25 unlink(TEST_DB); 26 // open db 27 btstack_tlv_impl = btstack_tlv_posix_init_instance(&btstack_tlv_context, TEST_DB); 28 } 29 void reopen_db(void){ 30 log_info("reopen"); 31 // close file 32 fclose(btstack_tlv_context.file); 33 // reopen 34 btstack_tlv_posix_deinit(&btstack_tlv_context); 35 btstack_tlv_impl = btstack_tlv_posix_init_instance(&btstack_tlv_context, TEST_DB); 36 } 37 void teardown(void){ 38 log_info("teardown"); 39 // close file 40 fclose(btstack_tlv_context.file); 41 btstack_tlv_posix_deinit(&btstack_tlv_context); 42 } 43 }; 44 45 TEST(BSTACK_TLV, TestMissingTag){ 46 uint32_t tag = TAG('a','b','c','d'); 47 int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0); 48 CHECK_EQUAL(size, 0); 49 } 50 51 TEST(BSTACK_TLV, TestWriteRead){ 52 uint32_t tag = TAG('a','b','c','d'); 53 uint8_t data = 7; 54 uint8_t buffer = data; 55 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1); 56 int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0); 57 CHECK_EQUAL(size, 1); 58 btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, &buffer, 1); 59 CHECK_EQUAL(buffer, data); 60 } 61 62 TEST(BSTACK_TLV, TestWriteWriteRead){ 63 uint32_t tag = TAG('a','b','c','d'); 64 uint8_t data = 7; 65 uint8_t buffer = data; 66 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1); 67 data++; 68 buffer = data; 69 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1); 70 int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0); 71 CHECK_EQUAL(size, 1); 72 btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, &buffer, 1); 73 CHECK_EQUAL(buffer, data); 74 } 75 76 TEST(BSTACK_TLV, TestWriteABARead){ 77 uint32_t tag_a = TAG('a','a','a','a'); 78 uint32_t tag_b = TAG('b','b','b','b');; 79 uint8_t data = 7; 80 uint8_t buffer = data; 81 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag_a, &buffer, 1); 82 data++; 83 buffer = data; 84 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag_b, &buffer, 1); 85 data++; 86 buffer = data; 87 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag_a, &buffer, 1); 88 int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag_a, NULL, 0); 89 CHECK_EQUAL(size, 1); 90 btstack_tlv_impl->get_tag(&btstack_tlv_context, tag_a, &buffer, 1); 91 CHECK_EQUAL(buffer, data); 92 } 93 94 TEST(BSTACK_TLV, TestWriteDeleteRead){ 95 uint32_t tag = TAG('a','b','c','d'); 96 uint8_t data = 7; 97 uint8_t buffer = data; 98 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1); 99 data++; 100 buffer = data; 101 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1); 102 btstack_tlv_impl->delete_tag(&btstack_tlv_context, tag); 103 int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0); 104 CHECK_EQUAL(size, 0); 105 } 106 107 TEST(BSTACK_TLV, TestMigrate){ 108 uint32_t tag = TAG('a','b','c','d'); 109 uint8_t data[8]; 110 memcpy(data, "01234567", 8); 111 112 // entry 8 + data 8 = 16. 113 int i; 114 for (i=0;i<8;i++){ 115 data[0] = '0' + i; 116 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &data[0], 8); 117 } 118 119 reopen_db(); 120 121 uint8_t buffer[8]; 122 btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, &buffer[0], 1); 123 CHECK_EQUAL(buffer[0], data[0]); 124 } 125 126 TEST(BSTACK_TLV, TestMigrate2){ 127 uint32_t tag1 = 0x11223344; 128 uint32_t tag2 = 0x44556677; 129 uint8_t data1[8]; 130 memcpy(data1, "01234567", 8); 131 uint8_t data2[8]; 132 memcpy(data2, "abcdefgh", 8); 133 134 // entry 8 + data 8 = 16. 135 int i; 136 for (i=0;i<8;i++){ 137 data1[0] = '0' + i; 138 data2[0] = 'a' + i; 139 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag1, data1, 8); 140 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag2, data2, 8); 141 } 142 143 reopen_db(); 144 145 uint8_t buffer[8]; 146 btstack_tlv_impl->get_tag(&btstack_tlv_context, tag1, &buffer[0], 1); 147 CHECK_EQUAL(buffer[0], data1[0]); 148 btstack_tlv_impl->get_tag(&btstack_tlv_context, tag2, &buffer[0], 1); 149 CHECK_EQUAL(buffer[0], data2[0]); 150 } 151 152 TEST(BSTACK_TLV, TestWriteResetRead){ 153 uint32_t tag = TAG('a','b','c','d'); 154 uint8_t data = 7; 155 uint8_t buffer = data; 156 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1); 157 158 reopen_db(); 159 160 int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0); 161 CHECK_EQUAL(size, 1); 162 btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, &buffer, 1); 163 CHECK_EQUAL(buffer, data); 164 } 165 166 TEST(BSTACK_TLV, TestWriteDeleteResetReadDeleteRead){ 167 uint32_t tag = TAG('a','b','c','d'); 168 uint8_t data = 7; 169 uint8_t buffer = data; 170 int size; 171 172 btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1); 173 btstack_tlv_impl->delete_tag(&btstack_tlv_context, tag); 174 175 reopen_db(); 176 177 size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0); 178 CHECK_EQUAL(size, 0); 179 180 // assert that it's really gone and not just shadowed by delete tag 181 btstack_tlv_impl->delete_tag(&btstack_tlv_context, tag); 182 183 size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0); 184 CHECK_EQUAL(size, 0); 185 } 186 187 188 int main (int argc, const char * argv[]){ 189 // log into file using HCI_DUMP_PACKETLOGGER format 190 const char * log_path = "hci_dump.pklg"; 191 hci_dump_posix_fs_open(log_path, HCI_DUMP_PACKETLOGGER); 192 hci_dump_init(hci_dump_posix_fs_get_instance()); 193 printf("Packet Log: %s\n", log_path); 194 195 return CommandLineTestRunner::RunAllTests(argc, argv); 196 } 197