From 85ec5f13a5fc3327afd24ca08df051dc92040e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20G=C5=82=C4=85b?= Date: Wed, 3 Jul 2024 09:04:49 +0200 Subject: [PATCH] tests: drivers: flash: common: Increase test coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add functional test for flash_erase(). Add negative tests for flash_read() and flas_write(). Add functional test for flash page layout. Signed-off-by: Sebastian Głąb --- tests/drivers/flash/common/src/main.c | 192 ++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) diff --git a/tests/drivers/flash/common/src/main.c b/tests/drivers/flash/common/src/main.c index 048542bf31b6d45..c7d9eca5bca33d2 100644 --- a/tests/drivers/flash/common/src/main.c +++ b/tests/drivers/flash/common/src/main.c @@ -253,5 +253,197 @@ ZTEST(flash_driver, test_flash_flatten) zassert_equal(i, EXPECTED_SIZE, "Expected device to be filled wth 0xaa"); } +ZTEST(flash_driver, test_flash_erase) +{ + int rc; + uint8_t read_buf[EXPECTED_SIZE]; + bool comparison_result; + const struct flash_parameters *fparams = flash_get_parameters(flash_dev); + + erase_value = fparams->erase_value; + + /* Write test data */ + rc = flash_write(flash_dev, + page_info.start_offset, + expected, EXPECTED_SIZE); + zassert_equal(rc, 0, "Cannot write to flash"); + + /* Confirm write operation */ + rc = flash_read(flash_dev, + page_info.start_offset, + read_buf, EXPECTED_SIZE); + zassert_equal(rc, 0, "Cannot read flash"); + + comparison_result = true; + for (int i = 0; i < EXPECTED_SIZE; i++) { + if (read_buf[i] != expected[i]) { + comparison_result = false; + TC_PRINT("i=%d:\tread_buf[i]=%d\texpected[i]=%d\n", + i, read_buf[i], expected[i] + ); + } + } + zassert_true(comparison_result, "Write operation failed"); + /* Cross check - confirm that expected data is pseudo-random */ + zassert_not_equal(read_buf[0], expected[1], + "These values shall be different" + ); + + /* Erase a nb of pages aligned to the EXPECTED_SIZE */ + rc = flash_erase(flash_dev, page_info.start_offset, + (page_info.size * + ((EXPECTED_SIZE + page_info.size - 1) + / page_info.size))); + zassert_equal(rc, 0, "Flash memory not properly erased"); + + /* Confirm erase operation */ + rc = flash_read(flash_dev, + page_info.start_offset, + read_buf, EXPECTED_SIZE); + zassert_equal(rc, 0, "Cannot read flash"); + + comparison_result = true; + for (int i = 0; i < EXPECTED_SIZE; i++) { + if (read_buf[i] != erase_value) { + comparison_result = false; + TC_PRINT("i=%d:\tread_buf[i]=%d\texpected=%d\n", + i, read_buf[i], erase_value + ); + } + } + zassert_true(comparison_result, "Write operation failed"); + /* Cross check - confirm that expected data + * doesn't contain erase_value + */ + zassert_not_equal(expected[0], erase_value, + "These values shall be different" + ); +} + +#if defined(TEST_AREA) +/* Flash memory boundaries are correctly calculated + * only for storage_partition. + */ +ZTEST(flash_driver, test_negative_flash_write) +{ + int rc; + off_t flash_start = DT_REG_ADDR(DT_CHOSEN(zephyr_flash)); + off_t flash_size = DT_REG_SIZE(DT_CHOSEN(zephyr_flash)); + + TC_PRINT("flash_start = 0x%lx\nflash_size = 0x%lx\n", + flash_start, flash_size); + + /* Check error returned when writing to a wrong address (too low) */ + rc = flash_write(flash_dev, + (flash_start - 1), + expected, EXPECTED_SIZE); + zassert_true(rc < 0, "Invalid use of flash_write returned %d", rc); + + /* Check error returned when writing to a wrong address (too high) */ + rc = flash_write(flash_dev, + (flash_start + flash_size), + expected, EXPECTED_SIZE); + zassert_true(rc < 0, "Invalid use of flash_write returned %d", rc); + + /* Check error returned when writing too many data */ + rc = flash_write(flash_dev, + TEST_AREA_OFFSET, + expected, (flash_size - TEST_AREA_OFFSET + 1)); + zassert_true(rc < 0, "Invalid use of flash_write returned %d", rc); + + /* Writing 0 bytes shall succeed */ + rc = flash_write(flash_dev, + TEST_AREA_OFFSET, + expected, 0); + zassert_true(rc == 0, "flash_write 0 bytes returned %d", rc); +} +#else +ZTEST(flash_driver, test_negative_flash_write) +{ + ztest_test_skip(); +} +#endif + +#if defined(TEST_AREA) +/* Flash memory boundaries are correctly calculated + * only for storage_partition. + */ +ZTEST(flash_driver, test_negative_flash_read) +{ + int rc; + off_t flash_start = DT_REG_ADDR(DT_CHOSEN(zephyr_flash)); + off_t flash_size = DT_REG_SIZE(DT_CHOSEN(zephyr_flash)); + uint8_t read_buf[EXPECTED_SIZE]; + + TC_PRINT("flash_start = 0x%lx\nflash_size = 0x%lx\n", + flash_start, flash_size); + + /* Check error returned when reading from a wrong address (too low) */ + rc = flash_read(flash_dev, + (flash_start - 1), + read_buf, EXPECTED_SIZE); + zassert_true(rc < 0, "Invalid use of flash_read returned %d", rc); + + /* Check error returned when reading from a wrong address (too high) */ + rc = flash_read(flash_dev, + (flash_start + flash_size), + read_buf, EXPECTED_SIZE); + zassert_true(rc < 0, "Invalid use of flash_read returned %d", rc); + + /* Check error returned when reading too many data */ + rc = flash_read(flash_dev, + TEST_AREA_OFFSET, + read_buf, (flash_size - TEST_AREA_OFFSET + 1)); + zassert_true(rc < 0, "Invalid use of flash_read returned %d", rc); + + /* Reading 0 bytes shall succeed */ + rc = flash_read(flash_dev, + TEST_AREA_OFFSET, + read_buf, 0); + zassert_true(rc == 0, "flash_read 0 bytes returned %d", rc); +} +#else +ZTEST(flash_driver, test_negative_flash_read) +{ + ztest_test_skip(); +} +#endif + +#if defined(CONFIG_FLASH_PAGE_LAYOUT) +ZTEST(flash_driver, test_flash_page_layout) +{ + int rc; + struct flash_pages_info page_info_off = { 0 }; + struct flash_pages_info page_info_idx = { 0 }; + size_t page_count; + + /* Get page info with flash_get_page_info_by_offs() */ + rc = flash_get_page_info_by_offs(flash_dev, TEST_AREA_OFFSET, + &page_info_off); + zassert_true(rc == 0, "flash_get_page_info_by_offs returned %d", rc); + TC_PRINT("start_offset=0x%lx\tsize=%d\tindex=%d\n", + page_info_off.start_offset, page_info_off.size, page_info_off.index + ); + zassert_true(page_info_off.start_offset >= 0, "start_offset is %d", rc); + zassert_true(page_info_off.size > 0, "size is %d", rc); + zassert_true(page_info_off.index >= 0, "index is %d", rc); + + /* Get info for the same page with flash_get_page_info_by_idx() */ + rc = flash_get_page_info_by_idx(flash_dev, page_info_off.index, &page_info_idx); + zassert_true(rc == 0, "flash_get_page_info_by_offs returned %d", rc); + zassert_equal(page_info_off.start_offset, page_info_idx.start_offset); + zassert_equal(page_info_off.size, page_info_idx.size); + zassert_equal(page_info_off.index, page_info_idx.index); + + page_count = flash_get_page_count(flash_dev); + zassert_true(page_count > 0, "flash_get_page_count returned %d", rc); + zassert_true(page_count >= page_info_off.index); +} +#else +ZTEST(flash_driver, test_flash_page_layout) +{ + ztest_test_skip(); +} +#endif ZTEST_SUITE(flash_driver, NULL, flash_driver_setup, NULL, NULL, NULL);