|  | /* BEGIN_HEADER */ | 
|  |  | 
|  | /* This test module exercises the timing module. Since, depending on the | 
|  | * underlying operating system, the timing routines are not always reliable, | 
|  | * this suite only performs very basic sanity checks of the timing API. | 
|  | */ | 
|  |  | 
|  | #include <limits.h> | 
|  |  | 
|  | #include "mbedtls/timing.h" | 
|  |  | 
|  | /* END_HEADER */ | 
|  |  | 
|  | /* BEGIN_DEPENDENCIES | 
|  | * depends_on:MBEDTLS_TIMING_C | 
|  | * END_DEPENDENCIES | 
|  | */ | 
|  |  | 
|  | /* BEGIN_CASE */ | 
|  | void timing_get_timer() | 
|  | { | 
|  | struct mbedtls_timing_hr_time time; | 
|  |  | 
|  | memset(&time, 0, sizeof(time)); | 
|  |  | 
|  | (void) mbedtls_timing_get_timer(&time, 1); | 
|  |  | 
|  | /* Check that a non-zero time was written back */ | 
|  | int all_zero = 1; | 
|  | for (size_t i = 0; i < sizeof(time); i++) { | 
|  | all_zero &= ((unsigned char *) &time)[i] == 0; | 
|  | } | 
|  | TEST_ASSERT(!all_zero); | 
|  |  | 
|  | (void) mbedtls_timing_get_timer(&time, 0); | 
|  |  | 
|  | /* This goto is added to avoid warnings from the generated code. */ | 
|  | goto exit; | 
|  | } | 
|  | /* END_CASE */ | 
|  |  | 
|  | /* BEGIN_CASE */ | 
|  | void timing_delay(int fin_ms) | 
|  | { | 
|  | mbedtls_timing_delay_context ctx; | 
|  | int result; | 
|  | if (fin_ms == 0) { | 
|  | mbedtls_timing_set_delay(&ctx, 0, 0); | 
|  | result = mbedtls_timing_get_delay(&ctx); | 
|  | TEST_ASSERT(result == -1); | 
|  | } else { | 
|  | mbedtls_timing_set_delay(&ctx, fin_ms / 2, fin_ms); | 
|  | result = mbedtls_timing_get_delay(&ctx); | 
|  | TEST_ASSERT(result >= 0 && result <= 2); | 
|  | } | 
|  | } | 
|  | /* END_CASE */ |