xref: /btstack/test/tlv_posix/tlv_test.cpp (revision 1d3bd1e51ca491d6783233c8d7431c44f06daa5a)
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