Skip to content

Commit 5a9db72

Browse files
author
offirko
committed
general_block_device test fixed to always erase prior to first program
1 parent 41ecde9 commit 5a9db72

File tree

1 file changed

+36
-7
lines changed
  • features/storage/TESTS/blockdevice/general_block_device

1 file changed

+36
-7
lines changed

features/storage/TESTS/blockdevice/general_block_device/main.cpp

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ void test_multi_threads()
212212
TEST_ASSERT_EQUAL(0, err);
213213
}
214214

215-
void test_get_erase_value()
215+
void test_erase_functionality()
216216
{
217217
utest_printf("\nTest BlockDevice::get_erase_value()..\n");
218218

@@ -251,36 +251,60 @@ void test_get_erase_value()
251251
start_address -= start_address % erase_size; // align with erase_block
252252
utest_printf("start_address=0x%016" PRIx64 "\n", start_address);
253253

254-
// Allocate buffer for read test data
254+
// Allocate buffer for write test data
255255
uint8_t *data_buf = (uint8_t *)malloc(data_buf_size);
256256
TEST_SKIP_UNLESS_MESSAGE(data_buf, "Not enough memory for test.\n");
257257

258+
// Allocate buffer for read test data
259+
uint8_t *out_data_buf = (uint8_t *)malloc(data_buf_size);
260+
TEST_SKIP_UNLESS_MESSAGE(out_data_buf, "Not enough memory for test.\n");
261+
262+
// First must Erase given memory region
263+
utest_printf("erasing given memory region\n");
264+
err = block_device->erase(start_address, data_buf_size);
265+
TEST_ASSERT_EQUAL(0, err);
266+
258267
// Write random data to selected region to make sure data is not accidentally set to "erased" value.
259268
// With this pre-write, the test case will fail even if block_device->erase() is broken.
260269
for (bd_size_t i = 0; i < data_buf_size; i++) {
261270
data_buf[i] = (uint8_t) rand();
262271
}
272+
263273
utest_printf("writing given memory region\n");
264274
err = block_device->program((const void *)data_buf, start_address, data_buf_size);
265275
TEST_ASSERT_EQUAL(0, err);
266276

277+
// Read written memory region to verify it contains information
278+
memset(out_data_buf, 0, data_buf_size);
279+
utest_printf("reading written memory region\n");
280+
err = block_device->read((void *)out_data_buf, start_address, data_buf_size);
281+
TEST_ASSERT_EQUAL(0, err);
282+
283+
// Verify erased memory region
284+
utest_printf("verifying written memory region\n");
285+
for (bd_size_t i = 0; i < data_buf_size; i++) {
286+
TEST_ASSERT_EQUAL(out_data_buf[i], data_buf[i]);
287+
}
288+
267289
// Erase given memory region
268-
utest_printf("erasing given memory region\n");
290+
utest_printf("erasing written memory region\n");
269291
err = block_device->erase(start_address, data_buf_size);
270292
TEST_ASSERT_EQUAL(0, err);
271293

272294
// Read erased memory region
273295
utest_printf("reading erased memory region\n");
274-
err = block_device->read((void *)data_buf, start_address, data_buf_size);
296+
memset(out_data_buf, 0, data_buf_size);
297+
err = block_device->read((void *)out_data_buf, start_address, data_buf_size);
275298
TEST_ASSERT_EQUAL(0, err);
276299

277300
// Verify erased memory region
278301
utest_printf("verifying erased memory region\n");
279302
for (bd_size_t i = 0; i < data_buf_size; i++) {
280-
TEST_ASSERT_EQUAL(erase_value, data_buf[i]);
303+
TEST_ASSERT_EQUAL(erase_value, out_data_buf[i]);
281304
}
282305

283306
free(data_buf);
307+
free(out_data_buf);
284308

285309
// BlockDevice deinitialization
286310
err = block_device->deinit();
@@ -359,6 +383,11 @@ void test_contiguous_erase_write_read()
359383
}
360384
utest_printf("write_read_buf_size=%" PRIu64 "\n", (uint64_t)write_read_buf_size);
361385

386+
// Must Erase the whole region first
387+
utest_printf("erasing memory, from 0x%" PRIx64 " of size 0x%" PRIx64 "\n", start_address, contiguous_erase_size);
388+
err = block_device->erase(start_address, contiguous_erase_size);
389+
TEST_ASSERT_EQUAL(0, err);
390+
362391
// Pre-fill the to-be-erased region. By pre-filling the region,
363392
// we can be sure the test will not pass if the erase doesn't work.
364393
for (bd_size_t offset = 0; start_address + offset < stop_address; offset += write_read_buf_size) {
@@ -371,7 +400,7 @@ void test_contiguous_erase_write_read()
371400
TEST_ASSERT_EQUAL(0, err);
372401
}
373402

374-
// Erase the whole region first
403+
// Erase the whole region again
375404
utest_printf("erasing memory, from 0x%" PRIx64 " of size 0x%" PRIx64 "\n", start_address, contiguous_erase_size);
376405
err = block_device->erase(start_address, contiguous_erase_size);
377406
TEST_ASSERT_EQUAL(0, err);
@@ -517,10 +546,10 @@ utest::v1::status_t test_setup(const size_t number_of_cases)
517546
}
518547

519548
Case cases[] = {
549+
Case("Testing BlockDevice erase functionality", test_erase_functionality, greentea_failure_handler),
520550
Case("Testing read write random blocks", test_random_program_read_erase, greentea_failure_handler),
521551
Case("Testing multi threads erase program read", test_multi_threads, greentea_failure_handler),
522552
Case("Testing contiguous erase, write and read", test_contiguous_erase_write_read, greentea_failure_handler),
523-
Case("Testing BlockDevice::get_erase_value()", test_get_erase_value, greentea_failure_handler),
524553
Case("Testing program read small data sizes", test_program_read_small_data_sizes, greentea_failure_handler),
525554
Case("Testing get type functionality", test_get_type_functionality, greentea_failure_handler)
526555
};

0 commit comments

Comments
 (0)