/* BEGIN_HEADER */
#include "mbedtls/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:MBEDTLS_DEBUG_C:MBEDTLS_SSL_TLS_C
 * END_DEPENDENCIES
 */

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

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

    mbedtls_debug_set_log_mode( MBEDTLS_DEBUG_LOG_FULL );
    mbedtls_debug_set_threshold( threshold );
    mbedtls_ssl_set_dbg(&ssl, string_debug, &buffer);

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

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

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

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

    mbedtls_debug_set_log_mode( mode );
    mbedtls_ssl_set_dbg(&ssl, string_debug, &buffer);

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

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

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

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

    data_len = unhexify( data, data_string );

    mbedtls_debug_set_log_mode( mode );
    mbedtls_ssl_set_dbg(&ssl, string_debug, &buffer);

    mbedtls_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:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C */
void mbedtls_debug_print_crt( int mode, char *crt_file, char *file, int line,
                      char *prefix, char *result_str )
{
    mbedtls_x509_crt   crt;
    mbedtls_ssl_context ssl;
    struct buffer_data buffer;

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

    mbedtls_debug_set_log_mode( mode );
    mbedtls_ssl_set_dbg(&ssl, string_debug, &buffer);

    TEST_ASSERT( mbedtls_x509_crt_parse_file( &crt, crt_file ) == 0 );
    mbedtls_debug_print_crt( &ssl, 0, file, line, prefix, &crt);

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

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

/* BEGIN_CASE depends_on:MBEDTLS_BIGNUM_C */
void mbedtls_debug_print_mpi( int mode, int radix, char *value, char *file, int line,
                      char *prefix, char *result_str )
{
    mbedtls_ssl_context ssl;
    struct buffer_data buffer;
    mbedtls_mpi val;

    mbedtls_mpi_init( &val );

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

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

    mbedtls_debug_set_log_mode( mode );
    mbedtls_ssl_set_dbg(&ssl, string_debug, &buffer);

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

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

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