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