diff --git a/features/storage/TESTS/blockdevice/general_block_device/main.cpp b/features/storage/TESTS/blockdevice/general_block_device/main.cpp index 75db8afa01..6acd399f85 100644 --- a/features/storage/TESTS/blockdevice/general_block_device/main.cpp +++ b/features/storage/TESTS/blockdevice/general_block_device/main.cpp @@ -690,6 +690,40 @@ void test_deinit_bd() block_device = NULL; } +void test_write_deinit_init() +{ + TEST_SKIP_UNLESS_MESSAGE(block_device != NULL, "no block device found."); + // Determine start_address & stop_address + bd_addr_t addr = sectors_addr[rand() % num_of_sectors]; + bd_size_t erase_size = block_device->get_erase_size(addr); + bd_size_t prog_size = block_device->get_program_size(); + uint8_t *prog = (uint8_t *) malloc(prog_size); + TEST_ASSERT_NOT_EQUAL(prog, 0); + uint8_t *buf = (uint8_t *) malloc(prog_size); + TEST_ASSERT_NOT_EQUAL(buf, 0); + + for (int i = 0; i < 3; i++) { + // Generate test pattern + for (int j = 0; j < prog_size; j++) { + prog[j] = (uint8_t)'0' + i + j; + } + + int err; + err = block_device->erase(addr, erase_size); + TEST_ASSERT_EQUAL(err, 0); + err = block_device->program(prog, addr, prog_size); + TEST_ASSERT_EQUAL(err, 0); + err = block_device->deinit(); + TEST_ASSERT_EQUAL(0, err); + err = block_device->init(); + TEST_ASSERT_EQUAL(0, err); + err = block_device->read(buf, addr, prog_size); + TEST_ASSERT_EQUAL(0, memcmp(prog, buf, prog_size)); + } + free(prog); + free(buf); +} + void test_get_type_functionality() { utest_printf("\nTest get blockdevice type..\n"); @@ -727,6 +761,7 @@ typedef struct { template_case_t template_cases[] = { {"Testing Init block device", test_init_bd, greentea_failure_handler}, + {"Testing write -> deinit -> init -> read", test_write_deinit_init, greentea_failure_handler}, {"Testing read write random blocks", test_random_program_read_erase, greentea_failure_handler}, #if defined(MBED_CONF_RTOS_PRESENT) {"Testing multi threads erase program read", test_multi_threads, greentea_failure_handler},