@@ -212,7 +212,7 @@ void test_multi_threads()
212
212
TEST_ASSERT_EQUAL (0 , err);
213
213
}
214
214
215
- void test_get_erase_value ()
215
+ void test_erase_functionality ()
216
216
{
217
217
utest_printf (" \n Test BlockDevice::get_erase_value()..\n " );
218
218
@@ -251,36 +251,60 @@ void test_get_erase_value()
251
251
start_address -= start_address % erase_size; // align with erase_block
252
252
utest_printf (" start_address=0x%016" PRIx64 " \n " , start_address);
253
253
254
- // Allocate buffer for read test data
254
+ // Allocate buffer for write test data
255
255
uint8_t *data_buf = (uint8_t *)malloc (data_buf_size);
256
256
TEST_SKIP_UNLESS_MESSAGE (data_buf, " Not enough memory for test.\n " );
257
257
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
+
258
267
// Write random data to selected region to make sure data is not accidentally set to "erased" value.
259
268
// With this pre-write, the test case will fail even if block_device->erase() is broken.
260
269
for (bd_size_t i = 0 ; i < data_buf_size; i++) {
261
270
data_buf[i] = (uint8_t ) rand ();
262
271
}
272
+
263
273
utest_printf (" writing given memory region\n " );
264
274
err = block_device->program ((const void *)data_buf, start_address, data_buf_size);
265
275
TEST_ASSERT_EQUAL (0 , err);
266
276
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
+
267
289
// Erase given memory region
268
- utest_printf (" erasing given memory region\n " );
290
+ utest_printf (" erasing written memory region\n " );
269
291
err = block_device->erase (start_address, data_buf_size);
270
292
TEST_ASSERT_EQUAL (0 , err);
271
293
272
294
// Read erased memory region
273
295
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);
275
298
TEST_ASSERT_EQUAL (0 , err);
276
299
277
300
// Verify erased memory region
278
301
utest_printf (" verifying erased memory region\n " );
279
302
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]);
281
304
}
282
305
283
306
free (data_buf);
307
+ free (out_data_buf);
284
308
285
309
// BlockDevice deinitialization
286
310
err = block_device->deinit ();
@@ -359,6 +383,11 @@ void test_contiguous_erase_write_read()
359
383
}
360
384
utest_printf (" write_read_buf_size=%" PRIu64 " \n " , (uint64_t )write_read_buf_size);
361
385
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
+
362
391
// Pre-fill the to-be-erased region. By pre-filling the region,
363
392
// we can be sure the test will not pass if the erase doesn't work.
364
393
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()
371
400
TEST_ASSERT_EQUAL (0 , err);
372
401
}
373
402
374
- // Erase the whole region first
403
+ // Erase the whole region again
375
404
utest_printf (" erasing memory, from 0x%" PRIx64 " of size 0x%" PRIx64 " \n " , start_address, contiguous_erase_size);
376
405
err = block_device->erase (start_address, contiguous_erase_size);
377
406
TEST_ASSERT_EQUAL (0 , err);
@@ -517,10 +546,10 @@ utest::v1::status_t test_setup(const size_t number_of_cases)
517
546
}
518
547
519
548
Case cases[] = {
549
+ Case (" Testing BlockDevice erase functionality" , test_erase_functionality, greentea_failure_handler),
520
550
Case (" Testing read write random blocks" , test_random_program_read_erase, greentea_failure_handler),
521
551
Case (" Testing multi threads erase program read" , test_multi_threads, greentea_failure_handler),
522
552
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),
524
553
Case (" Testing program read small data sizes" , test_program_read_small_data_sizes, greentea_failure_handler),
525
554
Case (" Testing get type functionality" , test_get_type_functionality, greentea_failure_handler)
526
555
};
0 commit comments