#include #include #include #include #include #include #include #include #include #include int __real_trace_path(struct ftl_map *map, struct ftl_page_desc *new_page_desc, uint32_t *page, uint32_t va); static void test_empty_root(void **state) { struct ftl_map map; uint32_t page; int ret; (void)state; map.log2_page_size = ilog2(4 * KIB); map.root = UINT32_MAX; map.flags = 0; ret = __real_trace_path(&map, NULL, &page, 0); assert_int_equal(ret, -2); } static void test_trace1(void **state) { struct ftl_page_desc descs[] = { { .va = 0x7, .subtrees = { [0] = UINT32_MAX, [28] = 43, [29] = UINT32_MAX, }, }, { .va = 0xb, .subtrees = { [0] = UINT32_MAX, [29] = 44, [30] = UINT32_MAX, }, }, { .va = 0xd, .subtrees = { [0] = UINT32_MAX, [30] = 45, [31] = UINT32_MAX, }, }, { .va = 0xe, .subtrees = { [0] = UINT32_MAX, [31] = 46, }, }, { .va = 0xf, .subtrees = { UINT32_MAX, }, }, }; struct ftl_map map; uint32_t page; int ret; (void)state; map.log2_page_size = ilog2(4 * KIB); map.root = 42; map.flags = 0; expect_value(__wrap_read_page_desc, map, &map); expect_value(__wrap_read_page_desc, upage, 42); will_return(__wrap_read_page_desc, descs); will_return(__wrap_read_page_desc, 0); expect_value(__wrap_read_page_desc, map, &map); expect_value(__wrap_read_page_desc, upage, 43); will_return(__wrap_read_page_desc, descs + 1); will_return(__wrap_read_page_desc, 0); expect_value(__wrap_read_page_desc, map, &map); expect_value(__wrap_read_page_desc, upage, 44); will_return(__wrap_read_page_desc, descs + 2); will_return(__wrap_read_page_desc, 0); expect_value(__wrap_read_page_desc, map, &map); expect_value(__wrap_read_page_desc, upage, 45); will_return(__wrap_read_page_desc, descs + 3); will_return(__wrap_read_page_desc, 0); expect_value(__wrap_read_page_desc, map, &map); expect_value(__wrap_read_page_desc, upage, 46); will_return(__wrap_read_page_desc, descs + 3); will_return(__wrap_read_page_desc, 0); ret = __real_trace_path(&map, NULL, &page, 0xf); assert_int_equal(ret, 0); assert_int_equal(page, 46); } int test_trace_path(void) { const struct CMUnitTest tests[] = { { "trace_path: empty root", test_empty_root, NULL, NULL, NULL }, { "trace_path: successful trace", test_trace1, NULL, NULL, NULL }, }; return cmocka_run_group_tests_name("trace_path", tests, NULL, NULL); }