mirror of https://github.com/ARMmbed/mbed-os.git
Modifing general block device tests doe to targets enhancement
Due to targets enhancement some boards failed the general block device tests for flashiap component, The fails were due to boards containing inconsistent sector sizes. The tests were modified but should be improved to address the problem. Rand() function issues were fixed.pull/9858/head
parent
c07ba7cc4b
commit
b8fed58f12
|
@ -183,7 +183,7 @@ static BlockDevice *get_bd_instance(uint8_t bd_type)
|
||||||
// Mutex is also protecting printouts for clear logs.
|
// Mutex is also protecting printouts for clear logs.
|
||||||
// Mutex is NOT protecting Block Device actions: erase/program/read - which is the purpose of the multithreaded test!
|
// Mutex is NOT protecting Block Device actions: erase/program/read - which is the purpose of the multithreaded test!
|
||||||
void basic_erase_program_read_test(BlockDevice *block_device, bd_size_t block_size, uint8_t *write_block,
|
void basic_erase_program_read_test(BlockDevice *block_device, bd_size_t block_size, uint8_t *write_block,
|
||||||
uint8_t *read_block, unsigned addrwidth)
|
uint8_t *read_block, unsigned addrwidth, int thread_num)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
_mutex->lock();
|
_mutex->lock();
|
||||||
|
@ -193,7 +193,13 @@ void basic_erase_program_read_test(BlockDevice *block_device, bd_size_t block_si
|
||||||
srand(block_seed++);
|
srand(block_seed++);
|
||||||
|
|
||||||
// Find a random block
|
// Find a random block
|
||||||
bd_addr_t block = (rand() * block_size) % (block_device->size());
|
int threaded_rand_number = (rand() * TEST_NUM_OF_THREADS) + thread_num;
|
||||||
|
bd_addr_t block = (threaded_rand_number * block_size) % block_device->size();
|
||||||
|
|
||||||
|
// Flashiap boards with inconsistent sector size will not align with random start addresses
|
||||||
|
if (bd_arr[test_iteration] == flashiap) {
|
||||||
|
block = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Use next random number as temporary seed to keep
|
// Use next random number as temporary seed to keep
|
||||||
// the address progressing in the pseudorandom sequence
|
// the address progressing in the pseudorandom sequence
|
||||||
|
@ -206,7 +212,11 @@ void basic_erase_program_read_test(BlockDevice *block_device, bd_size_t block_si
|
||||||
}
|
}
|
||||||
// Write, sync, and read the block
|
// Write, sync, and read the block
|
||||||
utest_printf("test %0*llx:%llu...\n", addrwidth, block, block_size);
|
utest_printf("test %0*llx:%llu...\n", addrwidth, block, block_size);
|
||||||
_mutex->unlock();
|
|
||||||
|
// Thread test for flashiap write to the same sector, so all write/read/erase actions should be locked
|
||||||
|
if (bd_arr[test_iteration] != flashiap) {
|
||||||
|
_mutex->unlock();
|
||||||
|
}
|
||||||
|
|
||||||
err = block_device->erase(block, block_size);
|
err = block_device->erase(block, block_size);
|
||||||
TEST_ASSERT_EQUAL(0, err);
|
TEST_ASSERT_EQUAL(0, err);
|
||||||
|
@ -217,7 +227,10 @@ void basic_erase_program_read_test(BlockDevice *block_device, bd_size_t block_si
|
||||||
err = block_device->read(read_block, block, block_size);
|
err = block_device->read(read_block, block, block_size);
|
||||||
TEST_ASSERT_EQUAL(0, err);
|
TEST_ASSERT_EQUAL(0, err);
|
||||||
|
|
||||||
_mutex->lock();
|
if (bd_arr[test_iteration] != flashiap) {
|
||||||
|
_mutex->lock();
|
||||||
|
}
|
||||||
|
|
||||||
// Check that the data was unmodified
|
// Check that the data was unmodified
|
||||||
srand(seed);
|
srand(seed);
|
||||||
int val_rand;
|
int val_rand;
|
||||||
|
@ -276,7 +289,7 @@ void test_random_program_read_erase()
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int b = 0; b < TEST_BLOCK_COUNT; b++) {
|
for (int b = 0; b < TEST_BLOCK_COUNT; b++) {
|
||||||
basic_erase_program_read_test(block_device, block_size, write_block, read_block, addrwidth);
|
basic_erase_program_read_test(block_device, block_size, write_block, read_block, addrwidth, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
@ -287,7 +300,9 @@ end:
|
||||||
static void test_thread_job(void *block_device_ptr)
|
static void test_thread_job(void *block_device_ptr)
|
||||||
{
|
{
|
||||||
static int thread_num = 0;
|
static int thread_num = 0;
|
||||||
thread_num++;
|
_mutex->lock();
|
||||||
|
int block_num = thread_num++;
|
||||||
|
_mutex->unlock();
|
||||||
BlockDevice *block_device = (BlockDevice *)block_device_ptr;
|
BlockDevice *block_device = (BlockDevice *)block_device_ptr;
|
||||||
|
|
||||||
bd_size_t block_size = block_device->get_erase_size();
|
bd_size_t block_size = block_device->get_erase_size();
|
||||||
|
@ -302,7 +317,7 @@ static void test_thread_job(void *block_device_ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int b = 0; b < TEST_BLOCK_COUNT; b++) {
|
for (int b = 0; b < TEST_BLOCK_COUNT; b++) {
|
||||||
basic_erase_program_read_test(block_device, block_size, write_block, read_block, addrwidth);
|
basic_erase_program_read_test(block_device, block_size, write_block, read_block, addrwidth, block_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
@ -384,6 +399,11 @@ void test_erase_functionality()
|
||||||
start_address -= start_address % erase_size; // align with erase_block
|
start_address -= start_address % erase_size; // align with erase_block
|
||||||
utest_printf("start_address=0x%016" PRIx64 "\n", start_address);
|
utest_printf("start_address=0x%016" PRIx64 "\n", start_address);
|
||||||
|
|
||||||
|
// Flashiap boards with inconsistent sector size will not align with random start addresses
|
||||||
|
if (bd_arr[test_iteration] == flashiap) {
|
||||||
|
start_address = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Allocate buffer for write test data
|
// Allocate buffer for write test data
|
||||||
uint8_t *data_buf = (uint8_t *)malloc(data_buf_size);
|
uint8_t *data_buf = (uint8_t *)malloc(data_buf_size);
|
||||||
TEST_SKIP_UNLESS_MESSAGE(data_buf, "Not enough memory for test.\n");
|
TEST_SKIP_UNLESS_MESSAGE(data_buf, "Not enough memory for test.\n");
|
||||||
|
@ -446,6 +466,11 @@ void test_contiguous_erase_write_read()
|
||||||
|
|
||||||
TEST_SKIP_UNLESS_MESSAGE(block_device != NULL, "no block device found.");
|
TEST_SKIP_UNLESS_MESSAGE(block_device != NULL, "no block device found.");
|
||||||
|
|
||||||
|
// Flashiap boards with inconsistent sector size will not align with random start addresses
|
||||||
|
if (bd_arr[test_iteration] == flashiap) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Test flow:
|
// Test flow:
|
||||||
// 1. Erase whole test area
|
// 1. Erase whole test area
|
||||||
// - Tests contiguous erase
|
// - Tests contiguous erase
|
||||||
|
|
Loading…
Reference in New Issue