From dab9d2bba980989094a99f98ca16e903d1d639a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E5=A4=A9=E9=BE=99=20=28Armink=29?= Date: Fri, 19 May 2023 20:50:05 +0800 Subject: [PATCH] [kvdb] add db size scale up testcase --- tests/fdb_kvdb_tc.c | 199 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 172 insertions(+), 27 deletions(-) diff --git a/tests/fdb_kvdb_tc.c b/tests/fdb_kvdb_tc.c index 2b96764..35b5ca7 100644 --- a/tests/fdb_kvdb_tc.c +++ b/tests/fdb_kvdb_tc.c @@ -16,14 +16,25 @@ #include #include #include + +#define RT_USING_UTEST + +#if RT_VER_NUM <= 0x40003 +#include +#else +#include #include +#endif #define TEST_TS_PART_NAME "fdb_kvdb1" #define TEST_KV_BLOB_NAME "kv_blob_test" #define TEST_KV_NAME "kv_test" #define TEST_KV_VALUE_LEN 1200 /* only save 3 KVs in a 4096 sector */ -#define TEST_KV_NUM 4 +#define TEST_KV_MAX_NUM 8 #define TEST_KVDB_SECTOR_SIZE 4096 +#define TEST_KVDB_SECTOR_NUM 4 + +#define FDB_ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) #if defined(RT_USING_UTEST) && defined(FDB_USING_KVDB) @@ -39,14 +50,76 @@ static struct fdb_kvdb test_kvdb; static void test_fdb_kvdb_deinit(void); -static void test_fdb_kvdb_init(void) +static rt_err_t dir_delete(const char* path) +{ + DIR* dir = NULL; + struct dirent* dirent = NULL; + char* full_path; + rt_err_t res = RT_EOK; + + if (path == RT_NULL || path[0] == '\0') + return -ENOENT; + + full_path = (char*)rt_malloc(DFS_PATH_MAX); + if (full_path == RT_NULL) + return -ENOMEM; + + dir = opendir(path); + if (dir == RT_NULL) + { + rt_free(full_path); + return -ENOENT; + } + + while (1) + { + dirent = readdir(dir); + if (dirent == RT_NULL) + break; + if (rt_strcmp(".", dirent->d_name) != 0 && + rt_strcmp("..", dirent->d_name) != 0) + { + rt_snprintf(full_path, DFS_PATH_MAX, "%s/%s", path, dirent->d_name); + if (dirent->d_type == DT_REG) + { + if (unlink(full_path) != 0) + { + LOG_W("cannot remove '%s'", full_path); + res = -RT_ERROR; + } + } + else if (dirent->d_type == DT_DIR) + { + if (dir_delete(full_path) != RT_EOK) + { + res = -RT_ERROR; + } + } + } + } + closedir(dir); + rt_free(full_path); + + if (path[rt_strlen(path) - 1] != '/') + { + if (unlink(path) != 0) + { + LOG_W("cannot remove '%s'", path); + res = -RT_ERROR; + } + } + + return res; +} + +static void test_fdb_kvdb_init_by_sector_num(size_t sector_num) { if (access(TEST_TS_PART_NAME, 0) < 0) { mkdir(TEST_TS_PART_NAME, 0); } - uint32_t sec_size = TEST_KVDB_SECTOR_SIZE, db_size = sec_size * 4; + uint32_t sec_size = TEST_KVDB_SECTOR_SIZE, db_size = sec_size * sector_num; rt_bool_t file_mode = true; fdb_kvdb_control(&(test_kvdb), FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size); @@ -56,12 +129,27 @@ static void test_fdb_kvdb_init(void) uassert_true(fdb_kvdb_init(&test_kvdb, "test_kv", TEST_TS_PART_NAME, NULL, NULL) == FDB_NO_ERR); } +static void test_fdb_kvdb_init(void) +{ + test_fdb_kvdb_init_by_sector_num(TEST_KVDB_SECTOR_NUM); +} + +static void test_fdb_kvdb_init_by_8_sectors(void) +{ + test_fdb_kvdb_init_by_sector_num(8); +} + static void test_fdb_kvdb_init_check(void) { /* check the oldest address */ uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 0); } +static void test_fdb_kvdb_deinit(void) +{ + uassert_true(fdb_kvdb_deinit(&test_kvdb) == FDB_NO_ERR); +} + static void test_fdb_create_kv_blob(void) { fdb_err_t result = FDB_NO_ERR; @@ -168,7 +256,6 @@ static void test_fdb_change_kv(void) /* check the oldest address is already right when kvdb reinit */ static void fdb_reboot(void) { - extern void test_fdb_kvdb_deinit(void); test_fdb_kvdb_deinit(); test_fdb_kvdb_init(); } @@ -197,7 +284,7 @@ static void test_fdb_del_kv(void) } } -static int iter_all_kv(fdb_kvdb_t db, struct test_kv *kv_tbl) +static int iter_all_kv(fdb_kvdb_t db, struct test_kv *kv_tbl, size_t len) { struct fdb_kv_iterator iterator; fdb_kv_t cur_kv; @@ -206,7 +293,7 @@ static int iter_all_kv(fdb_kvdb_t db, struct test_kv *kv_tbl) struct fdb_blob fdb_blob; fdb_kv_iterator_init(db, &iterator); - while (fdb_kv_iterate(db, &iterator) == RT_TRUE) + while (fdb_kv_iterate(db, &iterator) == RT_TRUE && index < len) { /* get data len */ cur_kv = &(iterator.curr_kv); @@ -222,15 +309,12 @@ static int iter_all_kv(fdb_kvdb_t db, struct test_kv *kv_tbl) index++; } - uassert_true(index == TEST_KV_NUM); - return index; } -static void test_fdb_by_kvs(const struct test_kv *kv_tbl, size_t len) +static void test_save_fdb_by_kvs(const struct test_kv *kv_tbl, size_t len) { struct fdb_blob blob_obj, * blob = &blob_obj; - static struct test_kv saved_kv_tbl[TEST_KV_NUM] = { 0 }; for (size_t i = 0; i < len; i++) { @@ -239,17 +323,41 @@ static void test_fdb_by_kvs(const struct test_kv *kv_tbl, size_t len) fdb_kv_set_blob(&test_kvdb, kv_tbl[i].name, fdb_blob_make(blob, kv_tbl[i].value, TEST_KV_VALUE_LEN)); } } +} + +static void test_check_fdb_by_kvs(const struct test_kv *kv_tbl, size_t len) +{ + static struct test_kv saved_kv_tbl[TEST_KV_MAX_NUM] = { 0 }; - iter_all_kv(&test_kvdb, saved_kv_tbl); + iter_all_kv(&test_kvdb, saved_kv_tbl, FDB_ARRAY_SIZE(saved_kv_tbl)); - for (size_t i = 0; i < len; i++) + for (size_t i = 0, j = 0; i < len; i++) { - uassert_str_equal(saved_kv_tbl[i].name, kv_tbl[i].name); - uassert_str_equal(saved_kv_tbl[i].value, kv_tbl[i].value); - uassert_true(RT_ALIGN_DOWN(saved_kv_tbl[i].addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * kv_tbl[i].addr); + for (j = 0; j < FDB_ARRAY_SIZE(saved_kv_tbl); j++) + { + if (rt_strcmp(saved_kv_tbl[j].name, kv_tbl[i].name) == 0) + break; + } + if (j < FDB_ARRAY_SIZE(saved_kv_tbl)) + { + uassert_str_equal(saved_kv_tbl[j].name, kv_tbl[i].name); + uassert_str_equal(saved_kv_tbl[j].value, kv_tbl[i].value); + uassert_true(RT_ALIGN_DOWN(saved_kv_tbl[j].addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * kv_tbl[i].addr); + } + else + { + /* kv not found */ + uassert_true(0); + } } } +static void test_fdb_by_kvs(const struct test_kv *kv_tbl, size_t len) +{ + test_save_fdb_by_kvs(kv_tbl, len); + test_check_fdb_by_kvs(kv_tbl, len); +} + static void test_fdb_gc(void) { fdb_kv_set_default(&test_kvdb); @@ -277,14 +385,14 @@ static void test_fdb_gc(void) * | | | | | * +---------------------------------------------------------+ */ - const struct test_kv kv_tbl[] = { + static const struct test_kv kv_tbl[] = { {"kv0", "0", 0, 0, 1}, {"kv1", "1", 0, 0, 1}, {"kv2", "2", 0, 0, 1}, {"kv3", "3", 1, 0, 1}, }; - test_fdb_by_kvs(kv_tbl, sizeof(kv_tbl) / sizeof(kv_tbl[0])); + test_fdb_by_kvs(kv_tbl, FDB_ARRAY_SIZE(kv_tbl)); uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 0); fdb_reboot(); uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 0); @@ -313,14 +421,14 @@ static void test_fdb_gc(void) * | | | | | * +--------------+-------------+--------------+-------------+ */ - const struct test_kv kv_tbl[] = { + static const struct test_kv kv_tbl[] = { {"kv1", "1", 0, 0, 0}, {"kv2", "2", 0, 0, 0}, {"kv0", "00", 1, 0, 1}, {"kv3", "33", 1, 0, 1}, }; - test_fdb_by_kvs(kv_tbl, sizeof(kv_tbl) / sizeof(kv_tbl[0])); + test_fdb_by_kvs(kv_tbl, FDB_ARRAY_SIZE(kv_tbl)); uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 0); fdb_reboot(); uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 0); @@ -393,14 +501,14 @@ static void test_fdb_gc(void) * +--------------+-------------+--------------+-------------+ * */ - const struct test_kv kv_tbl[] = { + static const struct test_kv kv_tbl[] = { {"kv0", "000", 2, 0, 1}, {"kv1", "111", 2, 0, 1}, {"kv2", "222", 2, 0, 1}, {"kv3", "333", 3, 0, 1}, }; - test_fdb_by_kvs(kv_tbl, sizeof(kv_tbl) / sizeof(kv_tbl[0])); + test_fdb_by_kvs(kv_tbl, FDB_ARRAY_SIZE(kv_tbl)); uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 1); fdb_reboot(); uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 1); @@ -493,14 +601,14 @@ static void test_fdb_gc(void) * | | | | | * +--------------+-------------+--------------+-------------+ */ - const struct test_kv kv_tbl[] = { + static const struct test_kv kv_tbl[] = { {"kv0", "0000", 3, 0, 1}, {"kv1", "1111", 3, 0, 1}, {"kv2", "2222", 0, 0, 1}, {"kv3", "3333", 0, 0, 1}, }; - test_fdb_by_kvs(kv_tbl, sizeof(kv_tbl) / sizeof(kv_tbl[0])); + test_fdb_by_kvs(kv_tbl, FDB_ARRAY_SIZE(kv_tbl)); uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 2); fdb_reboot(); uassert_true(RT_ALIGN_DOWN(test_kvdb.parent.oldest_addr, TEST_KVDB_SECTOR_SIZE) == TEST_KVDB_SECTOR_SIZE * 2); @@ -508,18 +616,54 @@ static void test_fdb_gc(void) } } -static void test_fdb_kvdb_set_default(void) +static void test_fdb_scale_up(void) { - uassert_true(fdb_kv_set_default(&test_kvdb) == FDB_NO_ERR); + fdb_kv_set_default(&test_kvdb); + + static const struct test_kv old_kv_tbl[] = { + {"kv0", "0", 0, 0, 1}, + {"kv1", "1", 0, 0, 1}, + {"kv2", "2", 0, 0, 1}, + {"kv3", "3", 1, 0, 1}, + }; + /* save some data */ + test_save_fdb_by_kvs(old_kv_tbl, FDB_ARRAY_SIZE(old_kv_tbl)); + + /* reboot, scale up from 4 sectors to 8 sectors */ + test_fdb_kvdb_deinit(); + test_fdb_kvdb_init_by_8_sectors(); + + /* check old data */ + test_check_fdb_by_kvs(old_kv_tbl, FDB_ARRAY_SIZE(old_kv_tbl)); + + /* save some new data */ + static const struct test_kv new_kv_tbl[] = { + {"kv4", "4", 4, 0, 1}, + {"kv5", "5", 4, 0, 1}, + {"kv6", "6", 4, 0, 1}, + {"kv7", "7", 5, 0, 1}, + }; + /* kv4: sector1, kv5: sector1, kv6: sector2, kv7: sector2 */ + test_save_fdb_by_kvs(new_kv_tbl, FDB_ARRAY_SIZE(new_kv_tbl)); + /* kv4: sector2, kv5: sector3, kv6: sector3, kv7: sector3 */ + test_save_fdb_by_kvs(new_kv_tbl, FDB_ARRAY_SIZE(new_kv_tbl)); + /* kv4: sector4, kv5: sector4, kv6: sector4, kv7: sector5 */ + test_save_fdb_by_kvs(new_kv_tbl, FDB_ARRAY_SIZE(new_kv_tbl)); + /* check new data */ + test_check_fdb_by_kvs(new_kv_tbl, FDB_ARRAY_SIZE(new_kv_tbl)); + /* check old data */ + test_check_fdb_by_kvs(old_kv_tbl, FDB_ARRAY_SIZE(old_kv_tbl)); } -static void test_fdb_kvdb_deinit(void) +static void test_fdb_kvdb_set_default(void) { - uassert_true(fdb_kvdb_deinit(&test_kvdb) == FDB_NO_ERR); + uassert_true(fdb_kv_set_default(&test_kvdb) == FDB_NO_ERR); } + static rt_err_t utest_tc_init(void) { + dir_delete(TEST_TS_PART_NAME); return RT_EOK; } @@ -545,6 +689,7 @@ static void testcase(void) UTEST_UNIT_RUN(test_fdb_change_kv); UTEST_UNIT_RUN(test_fdb_del_kv); UTEST_UNIT_RUN(test_fdb_gc); + UTEST_UNIT_RUN(test_fdb_scale_up); UTEST_UNIT_RUN(test_fdb_kvdb_set_default); UTEST_UNIT_RUN(test_fdb_kvdb_deinit); }