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
TEST_GROUP(BSTACK_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
TEST(BSTACK_TLV,TestMissingTag)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
TEST(BSTACK_TLV,TestWriteRead)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
TEST(BSTACK_TLV,TestWriteWriteRead)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
TEST(BSTACK_TLV,TestWriteABARead)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
TEST(BSTACK_TLV,TestWriteDeleteRead)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
TEST(BSTACK_TLV,TestMigrate)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
TEST(BSTACK_TLV,TestMigrate2)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
TEST(BSTACK_TLV,TestWriteResetRead)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
TEST(BSTACK_TLV,TestWriteDeleteResetReadDeleteRead)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
main(int argc,const char * argv[])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