/* BEGIN_HEADER */
#include "polarssl/debug.h"

struct buffer_data
{
    char buf[2000];
    char *ptr;
};

void string_debug(void *data, int level, const char *str)
{
    struct buffer_data *buffer = (struct buffer_data *) data;
    ((void) level);

    memcpy(buffer->ptr, str, strlen(str));
    buffer->ptr += strlen(str);

    /* Detect if debug messages output partial lines and mark them */
    if( *(buffer->ptr - 1) != '\n' )
    {
        *buffer->ptr = '*';
        buffer->ptr++;
    }
}
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:POLARSSL_DEBUG_C:POLARSSL_SSL_TLS_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void debug_print_msg_threshold( int threshold, int level, char *file, int line,
                                char *result_str )
{
    ssl_context ssl;
    struct buffer_data buffer;

    memset( &ssl, 0, sizeof( ssl_context ) );
    memset( buffer.buf, 0, 2000 );
    buffer.ptr = buffer.buf;

    debug_set_log_mode( POLARSSL_DEBUG_LOG_FULL );
    debug_set_threshold( threshold );
    ssl_set_dbg(&ssl, string_debug, &buffer);

    debug_print_msg( &ssl, level, file, line,
                     debug_fmt("Text message, 2 == %d", 2 ) );

    TEST_ASSERT( strcmp( buffer.buf, result_str ) == 0 );
}
/* END_CASE */

/* BEGIN_CASE */
void debug_print_ret( int mode, char *file, int line, char *text, int value,
                      char *result_str )
{
    ssl_context ssl;
    struct buffer_data buffer;

    memset( &ssl, 0, sizeof( ssl_context ) );
    memset( buffer.buf, 0, 2000 );
    buffer.ptr = buffer.buf;

    debug_set_log_mode( mode );
    ssl_set_dbg(&ssl, string_debug, &buffer);

    debug_print_ret( &ssl, 0, file, line, text, value);

    TEST_ASSERT( strcmp( buffer.buf, result_str ) == 0 );
}
/* END_CASE */

/* BEGIN_CASE */
void debug_print_buf( int mode, char *file, int line, char *text,
                      char *data_string, char *result_str )
{
    unsigned char data[10000];
    ssl_context ssl;
    struct buffer_data buffer;
    size_t data_len;

    memset( &data, 0, sizeof( data ) );
    memset( &ssl, 0, sizeof( ssl_context ) );
    memset( buffer.buf, 0, 2000 );
    buffer.ptr = buffer.buf;

    data_len = unhexify( data, data_string );

    debug_set_log_mode( mode );
    ssl_set_dbg(&ssl, string_debug, &buffer);

    debug_print_buf( &ssl, 0, file, line, text, data, data_len );

    TEST_ASSERT( strcmp( buffer.buf, result_str ) == 0 );
}
/* END_CASE */

/* BEGIN_CASE depends_on:POLARSSL_FS_IO:POLARSSL_X509_CRT_PARSE_C */
void debug_print_crt( int mode, char *crt_file, char *file, int line,
                      char *prefix, char *result_str )
{
    x509_crt   crt;
    ssl_context ssl;
    struct buffer_data buffer;

    x509_crt_init( &crt );
    memset( &ssl, 0, sizeof( ssl_context ) );
    memset( buffer.buf, 0, 2000 );
    buffer.ptr = buffer.buf;

    debug_set_log_mode( mode );
    ssl_set_dbg(&ssl, string_debug, &buffer);

    TEST_ASSERT( x509_crt_parse_file( &crt, crt_file ) == 0 );
    debug_print_crt( &ssl, 0, file, line, prefix, &crt);

    TEST_ASSERT( strcmp( buffer.buf, result_str ) == 0 );

exit:
    x509_crt_free( &crt );
}
/* END_CASE */

/* BEGIN_CASE depends_on:POLARSSL_BIGNUM_C */
void debug_print_mpi( int mode, int radix, char *value, char *file, int line,
                      char *prefix, char *result_str )
{
    ssl_context ssl;
    struct buffer_data buffer;
    mpi val;

    mpi_init( &val );

    memset( &ssl, 0, sizeof( ssl_context ) );
    memset( buffer.buf, 0, 2000 );
    buffer.ptr = buffer.buf;

    TEST_ASSERT( mpi_read_string( &val, radix, value ) == 0 );

    debug_set_log_mode( mode );
    ssl_set_dbg(&ssl, string_debug, &buffer);

    debug_print_mpi( &ssl, 0, file, line, prefix, &val);

    TEST_ASSERT( strcmp( buffer.buf, result_str ) == 0 );

exit:
    mpi_free( &val );
}
/* END_CASE */
