Additional tests to test stack buffer allocator

Adds additional tests to the test suite for
memory_buffer_alloc.c
This commit is contained in:
SimonB 2016-05-02 23:25:02 +01:00 committed by Simon Butcher
parent 295dfa24e7
commit 214f5c0af2
2 changed files with 234 additions and 0 deletions

View file

@ -1,2 +1,18 @@
Memory buffer alloc self test
mbedtls_memory_buffer_alloc_self_test:
Memory buffer alloc - free in middle, alloc at end
memory_buffer_alloc_free_alloc:100:100:100:0:0:1:0:0:200:0
Memory buffer alloc - free in middle, realloc
memory_buffer_alloc_free_alloc:100:100:100:0:0:1:0:0:100:0
Memory buffer alloc - free in middle, merge, realloc
memory_buffer_alloc_free_alloc:100:100:100:100:0:1:1:0:201:0
Memory buffer alloc - free at end, merge, realloc
memory_buffer_alloc_free_alloc:100:64:100:100:0:0:0:1:200:0
Memory buffer alloc - Out of Memory test
memory_buffer_alloc_oom_test:

View file

@ -1,6 +1,7 @@
/* BEGIN_HEADER */
#include "mbedtls/memory_buffer_alloc.h"
#define TEST_SUITE_MEMORY_BUFFER_ALLOC
/* END_HEADER */
/* BEGIN_DEPENDENCIES
@ -8,9 +9,226 @@
* END_DEPENDENCIES
*/
/* BEGIN_SUITE_HELPERS */
static int check_pointer( void *p )
{
if( p == NULL )
return( -1 );
if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 )
return( -1 );
return( 0 );
}
/* END_SUITE_HELPERS */
/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
void mbedtls_memory_buffer_alloc_self_test( )
{
TEST_ASSERT( mbedtls_memory_buffer_alloc_self_test( 0 ) == 0 );
}
/* END_CASE */
/* BEGIN_CASE depends_on:MBEDTLS_MEMORY_DEBUG */
void memory_buffer_alloc_free_alloc( int a_bytes, int b_bytes, int c_bytes,
int d_bytes,
int free_a, int free_b, int free_c,
int free_d,
int e_bytes, int f_bytes )
{
unsigned char buf[1024];
unsigned char *ptr_a = NULL, *ptr_b = NULL, *ptr_c = NULL, *ptr_d = NULL,
*ptr_e = NULL, *ptr_f = NULL;
size_t reported_blocks;
size_t allocated_bytes = 0, reported_bytes;
mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) );
mbedtls_memory_buffer_set_verify( MBEDTLS_MEMORY_VERIFY_ALWAYS );
if( a_bytes > 0 )
{
ptr_a = mbedtls_calloc( a_bytes, sizeof(char) );
TEST_ASSERT( check_pointer( ptr_a ) == 0 );
allocated_bytes += a_bytes * sizeof(char);
}
if( b_bytes > 0 )
{
ptr_b = mbedtls_calloc( b_bytes, sizeof(char) );
TEST_ASSERT( check_pointer( ptr_b ) == 0 );
allocated_bytes += b_bytes * sizeof(char);
}
if( c_bytes > 0 )
{
ptr_c = mbedtls_calloc( c_bytes, sizeof(char) );
TEST_ASSERT( check_pointer( ptr_c ) == 0 );
allocated_bytes += c_bytes * sizeof(char);
}
if( d_bytes > 0 )
{
ptr_d = mbedtls_calloc( d_bytes, sizeof(char) );
TEST_ASSERT( check_pointer( ptr_d ) == 0 );
allocated_bytes += d_bytes * sizeof(char);
}
mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
TEST_ASSERT( reported_bytes == allocated_bytes );
if( free_a )
{
mbedtls_free( ptr_a );
ptr_a = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
allocated_bytes -= a_bytes * sizeof(char);
}
if( free_b )
{
mbedtls_free( ptr_b );
ptr_b = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
allocated_bytes -= b_bytes * sizeof(char);
}
if( free_c )
{
mbedtls_free( ptr_c );
ptr_c = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
allocated_bytes -= c_bytes * sizeof(char);
}
if( free_d )
{
mbedtls_free( ptr_d );
ptr_d = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
allocated_bytes -= d_bytes * sizeof(char);
}
mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
TEST_ASSERT( reported_bytes == allocated_bytes );
if( e_bytes > 0 )
{
ptr_e = mbedtls_calloc( e_bytes, sizeof(char) );
TEST_ASSERT( check_pointer( ptr_e ) == 0 );
}
if( f_bytes > 0 )
{
ptr_f = mbedtls_calloc( f_bytes, sizeof(char) );
TEST_ASSERT( check_pointer( ptr_f ) == 0 );
}
/* Once blocks are reallocated, the block allocated to the memory request
* may be bigger than the request itself, which is indicated by the reported
* bytes, and makes it hard to know what the reported size will be, so
* we don't check the size after blocks have been reallocated. */
if( ptr_a != NULL )
{
mbedtls_free( ptr_a );
ptr_a = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
}
if( ptr_b != NULL )
{
mbedtls_free( ptr_b );
ptr_b = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
}
if( ptr_c != NULL )
{
mbedtls_free( ptr_c );
ptr_c = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
}
if( ptr_d != NULL )
{
mbedtls_free( ptr_d );
ptr_d = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
}
if( ptr_e != NULL )
{
mbedtls_free( ptr_e );
ptr_e = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
}
if( ptr_f != NULL )
{
mbedtls_free( ptr_f );
ptr_f = NULL;
}
mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
TEST_ASSERT( reported_bytes == 0 );
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
exit:
mbedtls_memory_buffer_alloc_free( );
}
/* END_CASE */
/* BEGIN_CASE depends_on:MBEDTLS_MEMORY_DEBUG */
void memory_buffer_alloc_oom_test()
{
unsigned char buf[1024];
unsigned char *ptr_a = NULL, *ptr_b = NULL, *ptr_c = NULL;
size_t reported_blocks, reported_bytes;
(void)ptr_c;
mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) );
mbedtls_memory_buffer_set_verify( MBEDTLS_MEMORY_VERIFY_ALWAYS );
ptr_a = mbedtls_calloc( 432, sizeof(char) );
TEST_ASSERT( check_pointer( ptr_a ) == 0 );
ptr_b = mbedtls_calloc( 432, sizeof(char) );
TEST_ASSERT( check_pointer( ptr_b ) == 0 );
ptr_c = mbedtls_calloc( 431, sizeof(char) );
TEST_ASSERT( ptr_c == NULL );
mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
TEST_ASSERT( reported_bytes == 864 );
mbedtls_free( ptr_a );
ptr_a = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
mbedtls_free( ptr_b );
ptr_b = NULL;
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
mbedtls_memory_buffer_alloc_cur_get( &reported_bytes, &reported_blocks );
TEST_ASSERT( reported_bytes == 0 );
TEST_ASSERT( mbedtls_memory_buffer_alloc_verify() == 0 );
exit:
mbedtls_memory_buffer_alloc_free( );
}
/* END_CASE */