Skip to content

Commit

Permalink
tests: drivers: flash: common: Increase test coverage
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
nordic-segl committed Jul 5, 2024
1 parent cac7037 commit 85ec5f1
Showing 1 changed file with 192 additions and 0 deletions.
192 changes: 192 additions & 0 deletions tests/drivers/flash/common/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

0 comments on commit 85ec5f1

Please sign in to comment.