From 3cd862e62dc045c374cc6b8c6aa126fac2c81a78 Mon Sep 17 00:00:00 2001 From: Dominik Ermel Date: Mon, 11 Nov 2024 20:10:03 +0100 Subject: [PATCH] tests/storage/flash_map: Support for no flash_area_open The commit removes flash_area_open usage from tests, where it is not tested and only used to obtain area. The commit adds tests for flash_area_device_is_ready. The commit adds test for flash_area_sectors, which is equivalent of flash_area_get_sectors but takes flash area object instead of flash area index. Signed-off-by: Dominik Ermel --- tests/subsys/storage/flash_map/src/main.c | 100 +++++++++++++++------- 1 file changed, 67 insertions(+), 33 deletions(-) diff --git a/tests/subsys/storage/flash_map/src/main.c b/tests/subsys/storage/flash_map/src/main.c index 1b529bbbfce..9a849485eca 100644 --- a/tests/subsys/storage/flash_map/src/main.c +++ b/tests/subsys/storage/flash_map/src/main.c @@ -32,51 +32,90 @@ ZTEST(flash_map, test_flash_area_disabled_device) zassert_equal(rc, -ENOENT, "Open did not fail"); } +ZTEST(flash_map, test_flash_area_device_is_ready) +{ + const struct flash_area no_dev = { + .fa_dev = NULL, + }; + + zassert_false(flash_area_device_is_ready(NULL)); + zassert_false(flash_area_device_is_ready(&no_dev)); + /* The below just assumes that tests are executed so late that + * all devices are already initialized and ready. + */ + zassert_true(flash_area_device_is_ready( + FIXED_PARTITION(SLOT1_PARTITION))); +} + +static void layout_match(const struct device *flash_dev, uint32_t sec_cnt) +{ + off_t off = 0; + int i; + + /* For each reported sector, check if it corresponds to real page on device */ + for (i = 0; i < sec_cnt; ++i) { + struct flash_pages_info fpi; + + zassert_ok( + flash_get_page_info_by_offs(flash_dev, SLOT1_PARTITION_OFFSET + off, &fpi)); + /* Offset of page taken directly from device corresponds to offset + * within flash area + */ + zassert_equal(fpi.start_offset, fs_sectors[i].fs_off + SLOT1_PARTITION_OFFSET); + zassert_equal(fpi.size, fs_sectors[i].fs_size); + off += fs_sectors[i].fs_size; + } +} + /** * @brief Test flash_area_get_sectors() */ ZTEST(flash_map, test_flash_area_get_sectors) { const struct flash_area *fa; - uint32_t sec_cnt; - int i; - int rc; - off_t off; - const struct device *flash_dev; const struct device *flash_dev_a = SLOT1_PARTITION_DEV; + uint32_t sec_cnt; + int rc; - rc = flash_area_open(SLOT1_PARTITION_ID, &fa); - zassert_true(rc == 0, "flash_area_open() fail"); + fa = FIXED_PARTITION(SLOT1_PARTITION); - /* First erase the area so it's ready for use. */ - flash_dev = flash_area_get_device(fa); + zassert_true(flash_area_device_is_ready(fa)); + + zassert_true(device_is_ready(flash_dev_a)); /* Device obtained by label should match the one from fa object */ - zassert_equal(flash_dev, flash_dev_a, "Device for slot1_partition do not match"); + zassert_equal(fa->fa_dev, flash_dev_a, "Device for slot1_partition do not match"); + + memset(&fs_sectors[0], 0, sizeof(fs_sectors)); sec_cnt = ARRAY_SIZE(fs_sectors); rc = flash_area_get_sectors(SLOT1_PARTITION_ID, &sec_cnt, fs_sectors); zassert_true(rc == 0, "flash_area_get_sectors failed"); - off = 0; + layout_match(flash_dev_a, sec_cnt); +} - /* For each reported sector, check if it corresponds to real page on device */ - for (i = 0; i < sec_cnt; ++i) { - struct flash_pages_info fpi; +ZTEST(flash_map, test_flash_area_sectors) +{ + const struct flash_area *fa; + uint32_t sec_cnt; + int rc; + const struct device *flash_dev_a = SLOT1_PARTITION_DEV; - zassert_ok(flash_get_page_info_by_offs(flash_dev, - SLOT1_PARTITION_OFFSET + off, - &fpi)); - /* Offset of page taken directly from device corresponds to offset - * within flash area - */ - zassert_equal(fpi.start_offset, - fs_sectors[i].fs_off + SLOT1_PARTITION_OFFSET); - zassert_equal(fpi.size, fs_sectors[i].fs_size); - off += fs_sectors[i].fs_size; - } + fa = FIXED_PARTITION(SLOT1_PARTITION); - flash_area_close(fa); + zassert_true(flash_area_device_is_ready(fa)); + + zassert_true(device_is_ready(flash_dev_a)); + + /* Device obtained by label should match the one from fa object */ + zassert_equal(fa->fa_dev, flash_dev_a, "Device for slot1_partition do not match"); + + sec_cnt = ARRAY_SIZE(fs_sectors); + rc = flash_area_sectors(fa, &sec_cnt, fs_sectors); + zassert_true(rc == 0, "flash_area_get_sectors failed"); + + layout_match(flash_dev_a, sec_cnt); } ZTEST(flash_map, test_flash_area_erased_val) @@ -84,10 +123,8 @@ ZTEST(flash_map, test_flash_area_erased_val) const struct flash_parameters *param; const struct flash_area *fa; uint8_t val; - int rc; - rc = flash_area_open(SLOT1_PARTITION_ID, &fa); - zassert_true(rc == 0, "flash_area_open() fail"); + fa = FIXED_PARTITION(SLOT1_PARTITION); val = flash_area_erased_val(fa); @@ -95,8 +132,6 @@ ZTEST(flash_map, test_flash_area_erased_val) zassert_equal(param->erase_value, val, "value different than the flash erase value"); - - flash_area_close(fa); } ZTEST(flash_map, test_fixed_partition_node_macros) @@ -118,8 +153,7 @@ ZTEST(flash_map, test_flash_area_erase_and_flatten) const struct flash_area *fa; const struct device *flash_dev; - rc = flash_area_open(SLOT1_PARTITION_ID, &fa); - zassert_true(rc == 0, "flash_area_open() fail"); + fa = FIXED_PARTITION(SLOT1_PARTITION); /* First erase the area so it's ready for use. */ flash_dev = flash_area_get_device(fa);