/* BEGIN_HEADER */
#include "mbedtls/version.h"
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_VERSION_C
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void check_compiletime_version(char *version_str)
{
    char build_str[100];
    char build_str_full[100];
    unsigned int build_int;

    memset(build_str, 0, 100);
    memset(build_str_full, 0, 100);

    mbedtls_snprintf(build_str, 100, "%d.%d.%d", MBEDTLS_VERSION_MAJOR,
                     MBEDTLS_VERSION_MINOR, MBEDTLS_VERSION_PATCH);

    mbedtls_snprintf(build_str_full, 100, "mbed TLS %d.%d.%d", MBEDTLS_VERSION_MAJOR,
                     MBEDTLS_VERSION_MINOR, MBEDTLS_VERSION_PATCH);

    build_int = MBEDTLS_VERSION_MAJOR << 24 |
                MBEDTLS_VERSION_MINOR << 16 |
                MBEDTLS_VERSION_PATCH << 8;

    TEST_ASSERT(build_int == MBEDTLS_VERSION_NUMBER);
    TEST_ASSERT(strcmp(build_str, MBEDTLS_VERSION_STRING) == 0);
    TEST_ASSERT(strcmp(build_str_full, MBEDTLS_VERSION_STRING_FULL) == 0);
    TEST_ASSERT(strcmp(version_str, MBEDTLS_VERSION_STRING) == 0);
}
/* END_CASE */

/* BEGIN_CASE */
void check_runtime_version(char *version_str)
{
    char build_str[100];
    char get_str[100];
    char build_str_full[100];
    char get_str_full[100];
    unsigned int get_int;

    memset(build_str, 0, 100);
    memset(get_str, 0, 100);
    memset(build_str_full, 0, 100);
    memset(get_str_full, 0, 100);

    get_int = mbedtls_version_get_number();
    mbedtls_version_get_string(get_str);
    mbedtls_version_get_string_full(get_str_full);

    mbedtls_snprintf(build_str, 100, "%u.%u.%u",
                     (get_int >> 24) & 0xFF,
                     (get_int >> 16) & 0xFF,
                     (get_int >> 8) & 0xFF);
    mbedtls_snprintf(build_str_full, 100, "mbed TLS %s", version_str);

    TEST_ASSERT(strcmp(build_str, version_str) == 0);
    TEST_ASSERT(strcmp(build_str_full, get_str_full) == 0);
    TEST_ASSERT(strcmp(version_str, get_str) == 0);
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_VERSION_FEATURES */
void check_feature(char *feature, int result)
{
    int check = mbedtls_version_check_feature(feature);
    TEST_ASSERT(check == result);
}
/* END_CASE */
