14902524cSMatthias Ringwald
24902524cSMatthias Ringwald #include "CppUTest/TestHarness.h"
34902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
44902524cSMatthias Ringwald
54902524cSMatthias Ringwald #include "hal_flash_bank.h"
64902524cSMatthias Ringwald #include "hal_flash_bank_memory.h"
74902524cSMatthias Ringwald #include "btstack_tlv.h"
84902524cSMatthias Ringwald #include "btstack_tlv_flash_bank.h"
94902524cSMatthias Ringwald #include "hci_dump.h"
104902524cSMatthias Ringwald #include "hci_dump_posix_fs.h"
114902524cSMatthias Ringwald #include "classic/btstack_link_key_db.h"
124902524cSMatthias Ringwald #include "classic/btstack_link_key_db_tlv.h"
134902524cSMatthias Ringwald #include "btstack_util.h"
144902524cSMatthias Ringwald #include "btstack_config.h"
154902524cSMatthias Ringwald #include "btstack_debug.h"
164902524cSMatthias Ringwald
174902524cSMatthias Ringwald #ifdef ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD
180d37e420SMatthias Ringwald // Provide additional bytes for 3 x delete fields of 4 bytes (in both banks)
190d37e420SMatthias Ringwald // note: only valid for alignments: 1,2 and 4
204902524cSMatthias Ringwald #define HAL_FLASH_BANK_MEMORY_STORAGE_SIZE (256 + 24)
210d37e420SMatthias Ringwald #define TAG_OVERHEAD 12
224902524cSMatthias Ringwald #else
234902524cSMatthias Ringwald #define HAL_FLASH_BANK_MEMORY_STORAGE_SIZE (256)
24a469758cSMatthias Ringwald #define TAG_OVERHEAD 8
254902524cSMatthias Ringwald #endif
26a469758cSMatthias Ringwald #define HAL_FLASH_BANK_MEMORY_BANK_SIZE (HAL_FLASH_BANK_MEMORY_STORAGE_SIZE / 2)
27a469758cSMatthias Ringwald
28a469758cSMatthias Ringwald
29a469758cSMatthias Ringwald
304902524cSMatthias Ringwald static uint8_t hal_flash_bank_memory_storage[HAL_FLASH_BANK_MEMORY_STORAGE_SIZE];
314902524cSMatthias Ringwald
CHECK_EQUAL_ARRAY(uint8_t * expected,uint8_t * actual,int size)324902524cSMatthias Ringwald static void CHECK_EQUAL_ARRAY(uint8_t * expected, uint8_t * actual, int size){
334902524cSMatthias Ringwald int i;
344902524cSMatthias Ringwald for (i=0; i<size; i++){
354902524cSMatthias Ringwald if (expected[i] != actual[i]) {
364902524cSMatthias Ringwald printf("offset %u wrong\n", i);
374902524cSMatthias Ringwald printf("expected: "); printf_hexdump(expected, size);
384902524cSMatthias Ringwald printf("actual: "); printf_hexdump(actual, size);
394902524cSMatthias Ringwald }
404902524cSMatthias Ringwald BYTES_EQUAL(expected[i], actual[i]);
414902524cSMatthias Ringwald }
424902524cSMatthias Ringwald }
434902524cSMatthias Ringwald
TEST_GROUP(HAL_FLASH_bank)444902524cSMatthias Ringwald TEST_GROUP(HAL_FLASH_bank){
454902524cSMatthias Ringwald const hal_flash_bank_t * hal_flash_bank_impl;
464902524cSMatthias Ringwald hal_flash_bank_memory_t hal_flash_bank_context;
474902524cSMatthias Ringwald void setup(void){
484902524cSMatthias Ringwald hal_flash_bank_impl = hal_flash_bank_memory_init_instance(&hal_flash_bank_context, hal_flash_bank_memory_storage, HAL_FLASH_BANK_MEMORY_STORAGE_SIZE);
494902524cSMatthias Ringwald hal_flash_bank_impl->erase(&hal_flash_bank_context, 0);
504902524cSMatthias Ringwald hal_flash_bank_impl->erase(&hal_flash_bank_context, 1);
514902524cSMatthias Ringwald }
524902524cSMatthias Ringwald };
534902524cSMatthias Ringwald
TEST(HAL_FLASH_bank,TestErased)544902524cSMatthias Ringwald TEST(HAL_FLASH_bank, TestErased){
554902524cSMatthias Ringwald uint8_t buffer;
564902524cSMatthias Ringwald int offsets[] = { 0, 10, 100};
574902524cSMatthias Ringwald int i;
584902524cSMatthias Ringwald for (i=0;i<sizeof(offsets)/sizeof(int);i++){
594902524cSMatthias Ringwald int bank;
604902524cSMatthias Ringwald for (bank=0;bank<2;bank++){
614902524cSMatthias Ringwald hal_flash_bank_impl->read(&hal_flash_bank_context, bank, offsets[i], &buffer, 1);
624902524cSMatthias Ringwald CHECK_EQUAL(buffer, 0xff);
634902524cSMatthias Ringwald }
644902524cSMatthias Ringwald }
654902524cSMatthias Ringwald }
664902524cSMatthias Ringwald
TEST(HAL_FLASH_bank,TestWrite)674902524cSMatthias Ringwald TEST(HAL_FLASH_bank, TestWrite){
684902524cSMatthias Ringwald uint8_t buffer;
694902524cSMatthias Ringwald int offsets[] = { 0, 10, 100};
704902524cSMatthias Ringwald int i;
714902524cSMatthias Ringwald for (i=0;i<sizeof(offsets)/sizeof(int);i++){
724902524cSMatthias Ringwald int bank;
734902524cSMatthias Ringwald for (bank=0;bank<2;bank++){
744902524cSMatthias Ringwald buffer = i;
754902524cSMatthias Ringwald hal_flash_bank_impl->write(&hal_flash_bank_context, bank, offsets[i], &buffer, 1);
764902524cSMatthias Ringwald }
774902524cSMatthias Ringwald }
784902524cSMatthias Ringwald for (i=0;i<sizeof(offsets)/sizeof(int);i++){
794902524cSMatthias Ringwald int bank;
804902524cSMatthias Ringwald for (bank=0;bank<2;bank++){
814902524cSMatthias Ringwald hal_flash_bank_impl->read(&hal_flash_bank_context, bank, offsets[i], &buffer, 1);
824902524cSMatthias Ringwald CHECK_EQUAL(buffer, i);
834902524cSMatthias Ringwald }
844902524cSMatthias Ringwald }
854902524cSMatthias Ringwald }
864902524cSMatthias Ringwald
874902524cSMatthias Ringwald #if 0
884902524cSMatthias Ringwald // prints error and exits tests. maybe all functions need to return ok
894902524cSMatthias Ringwald TEST(HAL_FLASH_bank, TestWriteTwice){
904902524cSMatthias Ringwald uint8_t buffer = 5;
914902524cSMatthias Ringwald hal_flash_bank_impl->write(&hal_flash_bank_context, 0, 5, &buffer, 1);
924902524cSMatthias Ringwald hal_flash_bank_impl->write(&hal_flash_bank_context, 0, 5, &buffer, 1);
934902524cSMatthias Ringwald }
944902524cSMatthias Ringwald #endif
954902524cSMatthias Ringwald
TEST(HAL_FLASH_bank,TestWriteErase)964902524cSMatthias Ringwald TEST(HAL_FLASH_bank, TestWriteErase){
974902524cSMatthias Ringwald uint32_t offset = 7;
984902524cSMatthias Ringwald uint8_t value = 9;
994902524cSMatthias Ringwald uint8_t buffer = value;
1004902524cSMatthias Ringwald hal_flash_bank_impl->write(&hal_flash_bank_context, 0, offset, &buffer, 1);
1014902524cSMatthias Ringwald hal_flash_bank_impl->read(&hal_flash_bank_context, 0, offset, &buffer, 1);
1024902524cSMatthias Ringwald CHECK_EQUAL(buffer, value);
1034902524cSMatthias Ringwald hal_flash_bank_impl->erase(&hal_flash_bank_context, 0);
1044902524cSMatthias Ringwald hal_flash_bank_impl->read(&hal_flash_bank_context, 0, offset, &buffer, 1);
1054902524cSMatthias Ringwald CHECK_EQUAL(buffer, 0xff);
1064902524cSMatthias Ringwald }
1074902524cSMatthias Ringwald
1084902524cSMatthias Ringwald /// TLV
TEST_GROUP(BSTACK_TLV)1094902524cSMatthias Ringwald TEST_GROUP(BSTACK_TLV){
1104902524cSMatthias Ringwald
1114902524cSMatthias Ringwald const hal_flash_bank_t * hal_flash_bank_impl;
1124902524cSMatthias Ringwald hal_flash_bank_memory_t hal_flash_bank_context;
1134902524cSMatthias Ringwald
1144902524cSMatthias Ringwald const btstack_tlv_t * btstack_tlv_impl;
1154902524cSMatthias Ringwald btstack_tlv_flash_bank_t btstack_tlv_context;
1164902524cSMatthias Ringwald
1174902524cSMatthias Ringwald void setup(void){
1184902524cSMatthias Ringwald hal_flash_bank_impl = hal_flash_bank_memory_init_instance(&hal_flash_bank_context, hal_flash_bank_memory_storage, HAL_FLASH_BANK_MEMORY_STORAGE_SIZE);
1194902524cSMatthias Ringwald hal_flash_bank_impl->erase(&hal_flash_bank_context, 0);
1204902524cSMatthias Ringwald hal_flash_bank_impl->erase(&hal_flash_bank_context, 1);
1214902524cSMatthias Ringwald }
1224902524cSMatthias Ringwald };
1234902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestMissingTag)1244902524cSMatthias Ringwald TEST(BSTACK_TLV, TestMissingTag){
1254902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
1264902524cSMatthias Ringwald uint32_t tag = 'abcd';
1274902524cSMatthias Ringwald int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0);
1284902524cSMatthias Ringwald CHECK_EQUAL(size, 0);
1294902524cSMatthias Ringwald }
1304902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestWriteRead)1314902524cSMatthias Ringwald TEST(BSTACK_TLV, TestWriteRead){
1324902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
1334902524cSMatthias Ringwald uint32_t tag = 'abcd';
1344902524cSMatthias Ringwald uint8_t data = 7;
1354902524cSMatthias Ringwald uint8_t buffer = data;
1364902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1);
1374902524cSMatthias Ringwald int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0);
1384902524cSMatthias Ringwald CHECK_EQUAL(size, 1);
1394902524cSMatthias Ringwald btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, &buffer, 1);
1404902524cSMatthias Ringwald CHECK_EQUAL(buffer, data);
1414902524cSMatthias Ringwald }
1424902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestWriteWriteRead)1434902524cSMatthias Ringwald TEST(BSTACK_TLV, TestWriteWriteRead){
1444902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
1454902524cSMatthias Ringwald uint32_t tag = 'abcd';
1464902524cSMatthias Ringwald uint8_t data = 7;
1474902524cSMatthias Ringwald uint8_t buffer = data;
1484902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1);
1494902524cSMatthias Ringwald data++;
1504902524cSMatthias Ringwald buffer = data;
1514902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1);
1524902524cSMatthias Ringwald int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0);
1534902524cSMatthias Ringwald CHECK_EQUAL(size, 1);
1544902524cSMatthias Ringwald btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, &buffer, 1);
1554902524cSMatthias Ringwald CHECK_EQUAL(buffer, data);
1564902524cSMatthias Ringwald }
1574902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestWriteABARead)1584902524cSMatthias Ringwald TEST(BSTACK_TLV, TestWriteABARead){
1594902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
1604902524cSMatthias Ringwald uint32_t tag_a = 'aaaa';
1614902524cSMatthias Ringwald uint32_t tag_b = 'bbbb';
1624902524cSMatthias Ringwald uint8_t data = 7;
1634902524cSMatthias Ringwald uint8_t buffer = data;
1644902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag_a, &buffer, 1);
1654902524cSMatthias Ringwald data++;
1664902524cSMatthias Ringwald buffer = data;
1674902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag_b, &buffer, 1);
1684902524cSMatthias Ringwald data++;
1694902524cSMatthias Ringwald buffer = data;
1704902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag_a, &buffer, 1);
1714902524cSMatthias Ringwald int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag_a, NULL, 0);
1724902524cSMatthias Ringwald CHECK_EQUAL(size, 1);
1734902524cSMatthias Ringwald btstack_tlv_impl->get_tag(&btstack_tlv_context, tag_a, &buffer, 1);
1744902524cSMatthias Ringwald CHECK_EQUAL(buffer, data);
1754902524cSMatthias Ringwald }
1764902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestWriteDeleteRead)1774902524cSMatthias Ringwald TEST(BSTACK_TLV, TestWriteDeleteRead){
1784902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
1794902524cSMatthias Ringwald uint32_t tag = 'abcd';
1804902524cSMatthias Ringwald uint8_t data = 7;
1814902524cSMatthias Ringwald uint8_t buffer = data;
1824902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1);
1834902524cSMatthias Ringwald data++;
1844902524cSMatthias Ringwald buffer = data;
1854902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1);
1864902524cSMatthias Ringwald btstack_tlv_impl->delete_tag(&btstack_tlv_context, tag);
1874902524cSMatthias Ringwald int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0);
1884902524cSMatthias Ringwald CHECK_EQUAL(size, 0);
1894902524cSMatthias Ringwald }
1904902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestMigrate)1914902524cSMatthias Ringwald TEST(BSTACK_TLV, TestMigrate){
1924902524cSMatthias Ringwald
1934902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
1944902524cSMatthias Ringwald
1954902524cSMatthias Ringwald uint32_t tag = 'abcd';
1964902524cSMatthias Ringwald uint8_t data[8];
1974902524cSMatthias Ringwald memcpy(data, "01234567", 8);
1984902524cSMatthias Ringwald
1994902524cSMatthias Ringwald // entry 8 + data 8 = 16.
2004902524cSMatthias Ringwald int i;
2014902524cSMatthias Ringwald for (i=0;i<8;i++){
2024902524cSMatthias Ringwald data[0] = '0' + i;
2034902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &data[0], 8);
2044902524cSMatthias Ringwald }
2054902524cSMatthias Ringwald
2064902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
2074902524cSMatthias Ringwald
2084902524cSMatthias Ringwald uint8_t buffer[8];
2094902524cSMatthias Ringwald btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, &buffer[0], 1);
2104902524cSMatthias Ringwald CHECK_EQUAL(buffer[0], data[0]);
2114902524cSMatthias Ringwald }
2124902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestMigrate2)2134902524cSMatthias Ringwald TEST(BSTACK_TLV, TestMigrate2){
2144902524cSMatthias Ringwald
2154902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
2164902524cSMatthias Ringwald
2174902524cSMatthias Ringwald uint32_t tag1 = 0x11223344;
2184902524cSMatthias Ringwald uint32_t tag2 = 0x44556677;
2194902524cSMatthias Ringwald uint8_t data1[8];
2204902524cSMatthias Ringwald memcpy(data1, "01234567", 8);
2214902524cSMatthias Ringwald uint8_t data2[8];
2224902524cSMatthias Ringwald memcpy(data2, "abcdefgh", 8);
2234902524cSMatthias Ringwald
2244902524cSMatthias Ringwald // entry 8 + data 8 = 16.
2254902524cSMatthias Ringwald int i;
2264902524cSMatthias Ringwald for (i=0;i<8;i++){
2274902524cSMatthias Ringwald data1[0] = '0' + i;
2284902524cSMatthias Ringwald data2[0] = 'a' + i;
2294902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag1, data1, 8);
2304902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag2, data2, 8);
2314902524cSMatthias Ringwald }
2324902524cSMatthias Ringwald
2334902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
2344902524cSMatthias Ringwald
2354902524cSMatthias Ringwald uint8_t buffer[8];
2364902524cSMatthias Ringwald btstack_tlv_impl->get_tag(&btstack_tlv_context, tag1, &buffer[0], 1);
2374902524cSMatthias Ringwald CHECK_EQUAL(buffer[0], data1[0]);
2384902524cSMatthias Ringwald btstack_tlv_impl->get_tag(&btstack_tlv_context, tag2, &buffer[0], 1);
2394902524cSMatthias Ringwald CHECK_EQUAL(buffer[0], data2[0]);
2404902524cSMatthias Ringwald }
2414902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestWriteResetRead)2424902524cSMatthias Ringwald TEST(BSTACK_TLV, TestWriteResetRead){
2434902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
2444902524cSMatthias Ringwald uint32_t tag = 'abcd';
2454902524cSMatthias Ringwald uint8_t data = 7;
2464902524cSMatthias Ringwald uint8_t buffer = data;
2474902524cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, &buffer, 1);
2484902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
2494902524cSMatthias Ringwald int size = btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, NULL, 0);
2504902524cSMatthias Ringwald CHECK_EQUAL(size, 1);
2514902524cSMatthias Ringwald btstack_tlv_impl->get_tag(&btstack_tlv_context, tag, &buffer, 1);
2524902524cSMatthias Ringwald CHECK_EQUAL(buffer, data);
2534902524cSMatthias Ringwald }
2544902524cSMatthias Ringwald
TEST(BSTACK_TLV,TestFullBankNormal)2550d37e420SMatthias Ringwald TEST(BSTACK_TLV, TestFullBankNormal){
256a469758cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
257a469758cSMatthias Ringwald
258a469758cSMatthias Ringwald // fill-up flash bank
259a469758cSMatthias Ringwald uint32_t tag = 'abcd';
260a469758cSMatthias Ringwald uint8_t blob[HAL_FLASH_BANK_MEMORY_BANK_SIZE - 8 - TAG_OVERHEAD];
261a469758cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, (uint8_t *) &blob, sizeof(blob));
262a469758cSMatthias Ringwald CHECK_EQUAL(0, btstack_tlv_context.current_bank);
263a469758cSMatthias Ringwald CHECK_EQUAL(HAL_FLASH_BANK_MEMORY_BANK_SIZE, btstack_tlv_context.write_offset);
264a469758cSMatthias Ringwald
265a469758cSMatthias Ringwald // check
266a469758cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
267a469758cSMatthias Ringwald CHECK_EQUAL(0, btstack_tlv_context.current_bank);
268a469758cSMatthias Ringwald CHECK_EQUAL(HAL_FLASH_BANK_MEMORY_BANK_SIZE, btstack_tlv_context.write_offset);
269a469758cSMatthias Ringwald }
270a469758cSMatthias Ringwald
TEST(BSTACK_TLV,TestAlmostFullBank)271c299d189SMatthias Ringwald TEST(BSTACK_TLV, TestAlmostFullBank){
272c299d189SMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
273c299d189SMatthias Ringwald
274c299d189SMatthias Ringwald // fill-up flash bank without the last byte
275c299d189SMatthias Ringwald uint32_t tag = 'abcd';
276c299d189SMatthias Ringwald uint8_t blob[HAL_FLASH_BANK_MEMORY_BANK_SIZE - 8 - TAG_OVERHEAD - 1];
277c299d189SMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, (uint8_t *) &blob, sizeof(blob));
278c299d189SMatthias Ringwald CHECK_EQUAL(0, btstack_tlv_context.current_bank);
279c299d189SMatthias Ringwald CHECK_EQUAL(HAL_FLASH_BANK_MEMORY_BANK_SIZE-1, btstack_tlv_context.write_offset);
280c299d189SMatthias Ringwald
281c299d189SMatthias Ringwald // check
282c299d189SMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
283c299d189SMatthias Ringwald CHECK_EQUAL(0, btstack_tlv_context.current_bank);
284c299d189SMatthias Ringwald CHECK_EQUAL(HAL_FLASH_BANK_MEMORY_BANK_SIZE-1, btstack_tlv_context.write_offset);
285c299d189SMatthias Ringwald }
286c299d189SMatthias Ringwald
TEST(BSTACK_TLV,TestFullBankPlusMigrate)287a469758cSMatthias Ringwald TEST(BSTACK_TLV, TestFullBankPlusMigrate){
288a469758cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
289a469758cSMatthias Ringwald
290a469758cSMatthias Ringwald // fill-up flash bank
291a469758cSMatthias Ringwald uint32_t tag = 'abcd';
292a469758cSMatthias Ringwald uint8_t blob[((HAL_FLASH_BANK_MEMORY_BANK_SIZE - 8) / 2) - TAG_OVERHEAD];
293a469758cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, (uint8_t *) &blob, sizeof(blob));
294a469758cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, (uint8_t *) &blob, sizeof(blob));
295a469758cSMatthias Ringwald CHECK_EQUAL(0, btstack_tlv_context.current_bank);
296a469758cSMatthias Ringwald CHECK_EQUAL(HAL_FLASH_BANK_MEMORY_BANK_SIZE, btstack_tlv_context.write_offset);
297a469758cSMatthias Ringwald
298a469758cSMatthias Ringwald // check
299a469758cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
300a469758cSMatthias Ringwald CHECK_EQUAL(0, btstack_tlv_context.current_bank);
301a469758cSMatthias Ringwald CHECK_EQUAL(HAL_FLASH_BANK_MEMORY_BANK_SIZE, btstack_tlv_context.write_offset);
302a469758cSMatthias Ringwald
303a469758cSMatthias Ringwald // store one more -> trigger migration
304a469758cSMatthias Ringwald btstack_tlv_impl->store_tag(&btstack_tlv_context, tag, (uint8_t *) &blob, sizeof(blob));
305a469758cSMatthias Ringwald CHECK_EQUAL(1, btstack_tlv_context.current_bank);
306a469758cSMatthias Ringwald CHECK_EQUAL(8 + 2 * (TAG_OVERHEAD + sizeof(blob)), btstack_tlv_context.write_offset);
307a469758cSMatthias Ringwald }
308a469758cSMatthias Ringwald
3094902524cSMatthias Ringwald //
TEST_GROUP(LINK_KEY_DB)3104902524cSMatthias Ringwald TEST_GROUP(LINK_KEY_DB){
3114902524cSMatthias Ringwald const hal_flash_bank_t * hal_flash_bank_impl;
3124902524cSMatthias Ringwald hal_flash_bank_memory_t hal_flash_bank_context;
3134902524cSMatthias Ringwald
3144902524cSMatthias Ringwald const btstack_tlv_t * btstack_tlv_impl;
3154902524cSMatthias Ringwald btstack_tlv_flash_bank_t btstack_tlv_context;
3164902524cSMatthias Ringwald
3174902524cSMatthias Ringwald const btstack_link_key_db_t * btstack_link_key_db;
3184902524cSMatthias Ringwald
3194902524cSMatthias Ringwald bd_addr_t addr1, addr2, addr3;
3204902524cSMatthias Ringwald link_key_t link_key1, link_key2;
3214902524cSMatthias Ringwald link_key_type_t link_key_type;
3224902524cSMatthias Ringwald
3234902524cSMatthias Ringwald void setup(void){
3244902524cSMatthias Ringwald // hal_flash_bank
3254902524cSMatthias Ringwald hal_flash_bank_impl = hal_flash_bank_memory_init_instance(&hal_flash_bank_context, hal_flash_bank_memory_storage, HAL_FLASH_BANK_MEMORY_STORAGE_SIZE);
3264902524cSMatthias Ringwald hal_flash_bank_impl->erase(&hal_flash_bank_context, 0);
3274902524cSMatthias Ringwald hal_flash_bank_impl->erase(&hal_flash_bank_context, 1);
3284902524cSMatthias Ringwald // btstack_tlv
3294902524cSMatthias Ringwald btstack_tlv_impl = btstack_tlv_flash_bank_init_instance(&btstack_tlv_context, hal_flash_bank_impl, &hal_flash_bank_context);
3304902524cSMatthias Ringwald // btstack_link_key_db
3314902524cSMatthias Ringwald btstack_link_key_db = btstack_link_key_db_tlv_get_instance(btstack_tlv_impl, &btstack_tlv_context);
3324902524cSMatthias Ringwald
3334902524cSMatthias Ringwald bd_addr_t addr_1 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x01 };
3344902524cSMatthias Ringwald bd_addr_t addr_2 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x02 };
3354902524cSMatthias Ringwald bd_addr_t addr_3 = {0x00, 0x01, 0x02, 0x03, 0x04, 0x03 };
3364902524cSMatthias Ringwald bd_addr_copy(addr1, addr_1);
3374902524cSMatthias Ringwald bd_addr_copy(addr2, addr_2);
3384902524cSMatthias Ringwald bd_addr_copy(addr3, addr_3);
3394902524cSMatthias Ringwald for (int i=0;i<16;i++) {
3404902524cSMatthias Ringwald link_key1[i] = 'a'+i;
3414902524cSMatthias Ringwald link_key2[i] = 'A'+i;
3424902524cSMatthias Ringwald }
3434902524cSMatthias Ringwald link_key_type = COMBINATION_KEY;
3444902524cSMatthias Ringwald }
3454902524cSMatthias Ringwald };
3464902524cSMatthias Ringwald
TEST(LINK_KEY_DB,SinglePutGetDeleteKey)3474902524cSMatthias Ringwald TEST(LINK_KEY_DB, SinglePutGetDeleteKey){
3484902524cSMatthias Ringwald
3494902524cSMatthias Ringwald link_key_t test_link_key;
3504902524cSMatthias Ringwald link_key_type_t test_link_key_type;
3514902524cSMatthias Ringwald
3524902524cSMatthias Ringwald btstack_link_key_db->delete_link_key(addr1);
3534902524cSMatthias Ringwald CHECK(btstack_link_key_db->get_link_key(addr1, test_link_key, &test_link_key_type) == 0);
3544902524cSMatthias Ringwald
3554902524cSMatthias Ringwald btstack_link_key_db->put_link_key(addr1, link_key1, link_key_type);
3564902524cSMatthias Ringwald CHECK(btstack_link_key_db->get_link_key(addr1, test_link_key, &test_link_key_type) == 1);
3574902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(link_key1, test_link_key, 16);
3584902524cSMatthias Ringwald
3594902524cSMatthias Ringwald btstack_link_key_db->delete_link_key(addr1);
3604902524cSMatthias Ringwald CHECK(btstack_link_key_db->get_link_key(addr1, test_link_key, &test_link_key_type) == 0);
3614902524cSMatthias Ringwald }
3624902524cSMatthias Ringwald
TEST(LINK_KEY_DB,UpdateKey)3634902524cSMatthias Ringwald TEST(LINK_KEY_DB, UpdateKey){
3644902524cSMatthias Ringwald link_key_t test_link_key;
3654902524cSMatthias Ringwald link_key_type_t test_link_key_type;
3664902524cSMatthias Ringwald
3674902524cSMatthias Ringwald btstack_link_key_db->put_link_key(addr1, link_key1, link_key_type);
3684902524cSMatthias Ringwald btstack_link_key_db->put_link_key(addr1, link_key2, link_key_type);
3694902524cSMatthias Ringwald CHECK(btstack_link_key_db->get_link_key(addr1, test_link_key, &test_link_key_type) == 1);
3704902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(link_key2, test_link_key, 16);
3714902524cSMatthias Ringwald }
3724902524cSMatthias Ringwald
TEST(LINK_KEY_DB,NumKeys)3734902524cSMatthias Ringwald TEST(LINK_KEY_DB, NumKeys){
3744902524cSMatthias Ringwald CHECK(NVM_NUM_LINK_KEYS == 2);
3754902524cSMatthias Ringwald }
3764902524cSMatthias Ringwald
TEST(LINK_KEY_DB,KeyReplacement)3774902524cSMatthias Ringwald TEST(LINK_KEY_DB, KeyReplacement){
3784902524cSMatthias Ringwald link_key_t test_link_key;
3794902524cSMatthias Ringwald link_key_type_t test_link_key_type;
3804902524cSMatthias Ringwald
3814902524cSMatthias Ringwald btstack_link_key_db->put_link_key(addr1, link_key1, link_key_type);
3824902524cSMatthias Ringwald btstack_link_key_db->put_link_key(addr2, link_key1, link_key_type);
3834902524cSMatthias Ringwald btstack_link_key_db->put_link_key(addr3, link_key1, link_key_type);
3844902524cSMatthias Ringwald
3854902524cSMatthias Ringwald CHECK(btstack_link_key_db->get_link_key(addr3, test_link_key, &test_link_key_type) == 1);
3864902524cSMatthias Ringwald CHECK(btstack_link_key_db->get_link_key(addr2, test_link_key, &test_link_key_type) == 1);
3874902524cSMatthias Ringwald CHECK(btstack_link_key_db->get_link_key(addr1, test_link_key, &test_link_key_type) == 0);
3884902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(link_key1, test_link_key, 16);
3894902524cSMatthias Ringwald }
3904902524cSMatthias Ringwald
main(int argc,const char * argv[])3914902524cSMatthias Ringwald int main (int argc, const char * argv[]){
3924902524cSMatthias Ringwald // log into file using HCI_DUMP_PACKETLOGGER format
3935bc527feSMatthias Ringwald #ifdef ENABLE_TLV_FLASH_WRITE_ONCE
3945bc527feSMatthias Ringwald const char * pklg_path = "hci_dump_write_once.pklg";
395*2b49e57bSMatthias Ringwald #elif defined(ENABLE_TLV_FLASH_EXPLICIT_DELETE_FIELD)
396*2b49e57bSMatthias Ringwald const char * pklg_path = "hci_dump_delete_field.pklg";
3975bc527feSMatthias Ringwald #else
3984902524cSMatthias Ringwald const char * pklg_path = "hci_dump.pklg";
3995bc527feSMatthias Ringwald #endif
4004902524cSMatthias Ringwald hci_dump_posix_fs_open(pklg_path, HCI_DUMP_PACKETLOGGER);
4014902524cSMatthias Ringwald hci_dump_init(hci_dump_posix_fs_get_instance());
4024902524cSMatthias Ringwald printf("Packet Log: %s\n", pklg_path);
4034902524cSMatthias Ringwald
4044902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv);
4054902524cSMatthias Ringwald }
406