diff --git a/source/ftl/map.c b/source/ftl/map.c index 82eed0d..5c15857 100644 --- a/source/ftl/map.c +++ b/source/ftl/map.c @@ -46,7 +46,7 @@ static int is_group_erased(struct ftl_map *map, uint32_t group) * possible pages on the devices, the page number of the very first user page * is returned instead. */ -static uint32_t next_upage(struct ftl_map *map, uint32_t p) +uint32_t next_upage(struct ftl_map *map, uint32_t p) { size_t log2_pages_per_block = map->log2_pages_per_group + map->log2_groups_per_block; diff --git a/source/tests/Makefile b/source/tests/Makefile index 9f26d06..9bb779e 100644 --- a/source/tests/Makefile +++ b/source/tests/Makefile @@ -1,3 +1,4 @@ test-obj-y += source/tests/main.o test-obj-y += source/tests/ftl/find_block_div.o +test-obj-y += source/tests/ftl/next_upage.o test-obj-y += source/tests/ftl/read_page_desc.o diff --git a/source/tests/ftl/next_upage.c b/source/tests/ftl/next_upage.c new file mode 100644 index 0000000..2a9029c --- /dev/null +++ b/source/tests/ftl/next_upage.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +int next_upage(struct ftl_map *map, uint32_t p); + +static void test_next_upage1(void **state) +{ + struct ftl_map map; + uint32_t ret; + + (void)state; + + map.log2_pages_per_group = ilog2(16); + map.log2_groups_per_block = ilog2(1); + map.nblocks = 4; + + ret = next_upage(&map, 0); + + assert_int_equal(ret, 1); +} + +static void test_next_upage2(void **state) +{ + struct ftl_map map; + uint32_t ret; + + (void)state; + + map.log2_pages_per_group = ilog2(16); + map.log2_groups_per_block = ilog2(1); + map.nblocks = 4; + + ret = next_upage(&map, 14); + + assert_int_equal(ret, 16); +} + +static void test_next_upage3(void **state) +{ + struct ftl_map map; + uint32_t ret; + + (void)state; + + map.log2_pages_per_group = ilog2(16); + map.log2_groups_per_block = ilog2(1); + map.nblocks = 4; + + ret = next_upage(&map, 15); + + assert_int_equal(ret, 16); +} + +static void test_next_upage4(void **state) +{ + struct ftl_map map; + uint32_t ret; + + (void)state; + + map.log2_pages_per_group = ilog2(16); + map.log2_groups_per_block = ilog2(1); + map.nblocks = 4; + + ret = next_upage(&map, 16); + + assert_int_equal(ret, 17); +} + +static void test_next_upage5(void **state) +{ + struct ftl_map map; + uint32_t ret; + + (void)state; + + map.log2_pages_per_group = ilog2(16); + map.log2_groups_per_block = ilog2(1); + map.nblocks = 4; + + ret = next_upage(&map, 62); + + assert_int_equal(ret, 0); +} + +static void test_next_upage6(void **state) +{ + struct ftl_map map; + uint32_t ret; + + (void)state; + + map.log2_pages_per_group = ilog2(16); + map.log2_groups_per_block = ilog2(1); + map.nblocks = 4; + + ret = next_upage(&map, 63); + + assert_int_equal(ret, 0); +} + +int test_next_upage(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_next_upage1), + cmocka_unit_test(test_next_upage2), + cmocka_unit_test(test_next_upage3), + cmocka_unit_test(test_next_upage4), + cmocka_unit_test(test_next_upage5), + cmocka_unit_test(test_next_upage6), + + }; + + return cmocka_run_group_tests_name("next_upage", tests, NULL, NULL); +} diff --git a/source/tests/main.c b/source/tests/main.c index 573e900..34da9fa 100644 --- a/source/tests/main.c +++ b/source/tests/main.c @@ -28,6 +28,7 @@ size_t __wrap_flash_read(struct flash_dev *dev, uint32_t addr, } int test_find_block_div(void); +int test_next_upage(void); int test_read_page_desc(void); int main(void) @@ -35,6 +36,7 @@ int main(void) int count = 0; count += test_find_block_div(); + count += test_next_upage(); count += test_read_page_desc(); return count;