mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Merge pull request #7465 from davidsaada/david_tests_not_enough_memory
Skip a few tests if not enough memory can be allocated for thempull/7495/head
						commit
						d5f70f0d21
					
				| 
						 | 
				
			
			@ -199,6 +199,7 @@ void test_error_logging()
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#define NUM_TEST_THREADS 5
 | 
			
		||||
#define THREAD_STACK_SIZE 512
 | 
			
		||||
 | 
			
		||||
//Error logger threads
 | 
			
		||||
void err_thread_func(mbed_error_status_t *error_status)
 | 
			
		||||
| 
						 | 
				
			
			@ -211,16 +212,20 @@ void err_thread_func(mbed_error_status_t *error_status)
 | 
			
		|||
 */
 | 
			
		||||
void test_error_logging_multithread()
 | 
			
		||||
{
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[NUM_TEST_THREADS * THREAD_STACK_SIZE];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    mbed_error_ctx error_ctx = {0};
 | 
			
		||||
    int i=0;
 | 
			
		||||
    int i;
 | 
			
		||||
    Thread *errThread[NUM_TEST_THREADS];
 | 
			
		||||
    mbed_error_status_t error_status[NUM_TEST_THREADS] = { 
 | 
			
		||||
                                        MBED_ERROR_INVALID_ARGUMENT, MBED_ERROR_INVALID_DATA_DETECTED, MBED_ERROR_INVALID_FORMAT, MBED_ERROR_INVALID_SIZE, MBED_ERROR_INVALID_OPERATION
 | 
			
		||||
    };
 | 
			
		||||
    
 | 
			
		||||
        
 | 
			
		||||
    for(; i<NUM_TEST_THREADS; i++) {
 | 
			
		||||
        errThread[i] = new Thread(osPriorityNormal1, 512, NULL, NULL);
 | 
			
		||||
    for(i=0; i<NUM_TEST_THREADS; i++) {
 | 
			
		||||
        errThread[i] = new Thread(osPriorityNormal1, THREAD_STACK_SIZE, NULL, NULL);
 | 
			
		||||
        errThread[i]->start(callback(err_thread_func, &error_status[i]));
 | 
			
		||||
    }
 | 
			
		||||
    wait(2.0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,10 @@ static const bd_size_t num_blocks = 4;
 | 
			
		|||
 | 
			
		||||
void functionality_test()
 | 
			
		||||
{
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[num_blocks * heap_erase_size + heap_prog_size];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    HeapBlockDevice heap_bd(num_blocks * heap_erase_size, heap_read_size, heap_prog_size, heap_erase_size);
 | 
			
		||||
    BufferedBlockDevice bd(&heap_bd);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,8 +41,10 @@ void functionality_test()
 | 
			
		|||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    uint8_t *read_buf, *write_buf;
 | 
			
		||||
    read_buf = new uint8_t[heap_prog_size];
 | 
			
		||||
    write_buf = new uint8_t[heap_prog_size];
 | 
			
		||||
    read_buf = new (std::nothrow) uint8_t[heap_prog_size];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(read_buf, "Not enough memory for test");
 | 
			
		||||
    write_buf = new (std::nothrow) uint8_t[heap_prog_size];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(write_buf, "Not enough memory for test");
 | 
			
		||||
 | 
			
		||||
    TEST_ASSERT_EQUAL(1, bd.get_read_size());
 | 
			
		||||
    TEST_ASSERT_EQUAL(1, bd.get_program_size());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,6 +46,10 @@ const struct {
 | 
			
		|||
 | 
			
		||||
// Simple test that read/writes random set of blocks
 | 
			
		||||
void test_read_write() {
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[TEST_BLOCK_DEVICE_SIZE];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    HeapBlockDevice bd(TEST_BLOCK_DEVICE_SIZE, TEST_BLOCK_SIZE);
 | 
			
		||||
 | 
			
		||||
    int err = bd.init();
 | 
			
		||||
| 
						 | 
				
			
			@ -63,12 +67,18 @@ void test_read_write() {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bd_size_t block_size = bd.get_erase_size();
 | 
			
		||||
    uint8_t *write_block = new uint8_t[block_size];
 | 
			
		||||
    uint8_t *read_block = new uint8_t[block_size];
 | 
			
		||||
    uint8_t *error_mask = new uint8_t[TEST_ERROR_MASK];
 | 
			
		||||
    unsigned addrwidth = ceil(log(float(bd.size()-1)) / log(float(16)))+1;
 | 
			
		||||
 | 
			
		||||
    bd_size_t block_size = bd.get_erase_size();
 | 
			
		||||
    uint8_t *write_block = new (std::nothrow) uint8_t[block_size];
 | 
			
		||||
    uint8_t *read_block = new (std::nothrow) uint8_t[block_size];
 | 
			
		||||
    uint8_t *error_mask = new (std::nothrow) uint8_t[TEST_ERROR_MASK];
 | 
			
		||||
    if (!write_block || !read_block || !error_mask) {
 | 
			
		||||
        printf("Not enough memory for test");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    for (int b = 0; b < TEST_BLOCK_COUNT; b++) {
 | 
			
		||||
        // Find a random block
 | 
			
		||||
        bd_addr_t block = (rand()*block_size) % bd.size();
 | 
			
		||||
| 
						 | 
				
			
			@ -135,6 +145,12 @@ void test_read_write() {
 | 
			
		|||
    
 | 
			
		||||
    err = bd.deinit();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
    delete[] error_mask;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,10 @@ HeapBlockDevice bd(BLOCK_COUNT*BLOCK_SIZE, BLOCK_SIZE);
 | 
			
		|||
// Testing formatting of master boot record
 | 
			
		||||
void test_mbr_format()
 | 
			
		||||
{
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[BLOCK_COUNT * BLOCK_SIZE];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    // Create two partitions splitting device in ~half
 | 
			
		||||
    int err = MBRBlockDevice::partition(&bd, 1, 0x83, 0, (BLOCK_COUNT/2)*BLOCK_SIZE);
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +72,10 @@ void test_mbr_format()
 | 
			
		|||
// Testing mbr attributes
 | 
			
		||||
void test_mbr_attr()
 | 
			
		||||
{
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[BLOCK_COUNT * BLOCK_SIZE];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    // Load partitions
 | 
			
		||||
    MBRBlockDevice part1(&bd, 1);
 | 
			
		||||
    int err = part1.init();
 | 
			
		||||
| 
						 | 
				
			
			@ -123,9 +131,15 @@ void test_mbr_attr()
 | 
			
		|||
// Testing mbr read write
 | 
			
		||||
void test_mbr_read_write()
 | 
			
		||||
{
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[BLOCK_COUNT * BLOCK_SIZE];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    // Load partitions
 | 
			
		||||
    MBRBlockDevice part1(&bd, 1);
 | 
			
		||||
    int err = part1.init();
 | 
			
		||||
    err = part1.init();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    MBRBlockDevice part2(&bd, 2);
 | 
			
		||||
| 
						 | 
				
			
			@ -133,8 +147,12 @@ void test_mbr_read_write()
 | 
			
		|||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    // Test reading/writing the partitions
 | 
			
		||||
    uint8_t *write_block = new uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *read_block = new uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *write_block = new (std::nothrow) uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *read_block = new (std::nothrow) uint8_t[BLOCK_SIZE];
 | 
			
		||||
    if (!write_block || !read_block) {
 | 
			
		||||
        printf("Not enough memory for test");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Fill with random sequence
 | 
			
		||||
    srand(1);
 | 
			
		||||
| 
						 | 
				
			
			@ -200,15 +218,16 @@ void test_mbr_read_write()
 | 
			
		|||
        TEST_ASSERT_EQUAL(0xff & rand(), read_block[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Clean up
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
 | 
			
		||||
    err = part1.deinit();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    err = part2.deinit();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    // Clean up
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,20 +37,32 @@ using namespace utest::v1;
 | 
			
		|||
 | 
			
		||||
// Simple test which read/writes blocks on a sliced block device
 | 
			
		||||
void test_slicing() {
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[BLOCK_COUNT * BLOCK_SIZE];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    HeapBlockDevice bd(BLOCK_COUNT*BLOCK_SIZE, BLOCK_SIZE);
 | 
			
		||||
    uint8_t *write_block = new uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *read_block = new uint8_t[BLOCK_SIZE];
 | 
			
		||||
 | 
			
		||||
    SlicingBlockDevice slice1(&bd, 0, (BLOCK_COUNT/2)*BLOCK_SIZE);
 | 
			
		||||
    SlicingBlockDevice slice2(&bd, -(BLOCK_COUNT/2)*BLOCK_SIZE);
 | 
			
		||||
 | 
			
		||||
    // Test with first slice of block device
 | 
			
		||||
    SlicingBlockDevice slice1(&bd, 0, (BLOCK_COUNT/2)*BLOCK_SIZE);
 | 
			
		||||
 | 
			
		||||
    int err = slice1.init();
 | 
			
		||||
    err = slice1.init();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    TEST_ASSERT_EQUAL(BLOCK_SIZE, slice1.get_program_size());
 | 
			
		||||
    TEST_ASSERT_EQUAL(BLOCK_SIZE, slice1.get_erase_size(BLOCK_SIZE));
 | 
			
		||||
    TEST_ASSERT_EQUAL((BLOCK_COUNT/2)*BLOCK_SIZE, slice1.size());
 | 
			
		||||
 | 
			
		||||
    uint8_t *write_block = new (std::nothrow) uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *read_block = new (std::nothrow) uint8_t[BLOCK_SIZE];
 | 
			
		||||
    if (!write_block || !read_block) {
 | 
			
		||||
        printf("Not enough memory for test");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Fill with random sequence
 | 
			
		||||
    srand(1);
 | 
			
		||||
    for (int i = 0; i < BLOCK_SIZE; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -85,8 +97,6 @@ void test_slicing() {
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
    // Test with second slice of block device
 | 
			
		||||
    SlicingBlockDevice slice2(&bd, -(BLOCK_COUNT/2)*BLOCK_SIZE);
 | 
			
		||||
 | 
			
		||||
    err = slice2.init();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -122,24 +132,38 @@ void test_slicing() {
 | 
			
		|||
        TEST_ASSERT_EQUAL(0xff & rand(), read_block[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
    err = slice2.deinit();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Simple test which read/writes blocks on a chain of block devices
 | 
			
		||||
void test_chaining() {
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[BLOCK_COUNT * BLOCK_SIZE];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    HeapBlockDevice bd1((BLOCK_COUNT/2)*BLOCK_SIZE, BLOCK_SIZE);
 | 
			
		||||
    HeapBlockDevice bd2((BLOCK_COUNT/2)*BLOCK_SIZE, BLOCK_SIZE);
 | 
			
		||||
    uint8_t *write_block = new uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *read_block = new uint8_t[BLOCK_SIZE];
 | 
			
		||||
 | 
			
		||||
    // Test with chain of block device
 | 
			
		||||
    BlockDevice *bds[] = {&bd1, &bd2};
 | 
			
		||||
    ChainingBlockDevice chain(bds);
 | 
			
		||||
 | 
			
		||||
    int err = chain.init();
 | 
			
		||||
    uint8_t *write_block = new (std::nothrow) uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *read_block = new (std::nothrow) uint8_t[BLOCK_SIZE];
 | 
			
		||||
 | 
			
		||||
    if (!write_block || !read_block) {
 | 
			
		||||
        printf("Not enough memory for test");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    err = chain.init();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    TEST_ASSERT_EQUAL(BLOCK_SIZE, chain.get_program_size());
 | 
			
		||||
| 
						 | 
				
			
			@ -178,27 +202,41 @@ void test_chaining() {
 | 
			
		|||
        TEST_ASSERT_EQUAL(0xff & rand(), read_block[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
    err = chain.deinit();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Simple test which read/writes blocks on a chain of block devices
 | 
			
		||||
void test_profiling() {
 | 
			
		||||
    HeapBlockDevice bd(BLOCK_COUNT*BLOCK_SIZE, BLOCK_SIZE);
 | 
			
		||||
    uint8_t *write_block = new uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *read_block = new uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *dummy = new (std::nothrow) uint8_t[BLOCK_COUNT * BLOCK_SIZE];
 | 
			
		||||
    TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory for test");
 | 
			
		||||
    delete[] dummy;
 | 
			
		||||
 | 
			
		||||
    int err;
 | 
			
		||||
    bd_size_t read_count, program_count, erase_count;
 | 
			
		||||
 | 
			
		||||
    HeapBlockDevice bd(BLOCK_COUNT*BLOCK_SIZE, BLOCK_SIZE);
 | 
			
		||||
    // Test under profiling
 | 
			
		||||
    ProfilingBlockDevice profiler(&bd);
 | 
			
		||||
 | 
			
		||||
    int err = profiler.init();
 | 
			
		||||
    err = profiler.init();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    TEST_ASSERT_EQUAL(BLOCK_SIZE, profiler.get_erase_size());
 | 
			
		||||
    TEST_ASSERT_EQUAL(BLOCK_COUNT*BLOCK_SIZE, profiler.size());
 | 
			
		||||
 | 
			
		||||
    uint8_t *write_block = new (std::nothrow) uint8_t[BLOCK_SIZE];
 | 
			
		||||
    uint8_t *read_block = new (std::nothrow) uint8_t[BLOCK_SIZE];
 | 
			
		||||
 | 
			
		||||
    if (!write_block || !read_block) {
 | 
			
		||||
        printf("Not enough memory for test");
 | 
			
		||||
        goto end;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Fill with random sequence
 | 
			
		||||
    srand(1);
 | 
			
		||||
    for (int i = 0; i < BLOCK_SIZE; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -231,18 +269,20 @@ void test_profiling() {
 | 
			
		|||
        TEST_ASSERT_EQUAL(0xff & rand(), read_block[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
    err = profiler.deinit();
 | 
			
		||||
    TEST_ASSERT_EQUAL(0, err);
 | 
			
		||||
 | 
			
		||||
    // Check that profiled operations match expectations
 | 
			
		||||
    bd_size_t read_count = profiler.get_read_count();
 | 
			
		||||
    read_count = profiler.get_read_count();
 | 
			
		||||
    TEST_ASSERT_EQUAL(BLOCK_SIZE, read_count);
 | 
			
		||||
    bd_size_t program_count = profiler.get_program_count();
 | 
			
		||||
    program_count = profiler.get_program_count();
 | 
			
		||||
    TEST_ASSERT_EQUAL(BLOCK_SIZE, program_count);
 | 
			
		||||
    bd_size_t erase_count = profiler.get_erase_count();
 | 
			
		||||
    erase_count = profiler.get_erase_count();
 | 
			
		||||
    TEST_ASSERT_EQUAL(BLOCK_SIZE, erase_count);
 | 
			
		||||
 | 
			
		||||
end:
 | 
			
		||||
    delete[] write_block;
 | 
			
		||||
    delete[] read_block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue