1/* BEGIN_HEADER */ 2 3/* This test module exercises the platform_* module. Since, depending on the 4 * underlying operating system, the time routines are not always reliable, 5 * this suite only performs very basic sanity checks of the timing API. 6 */ 7 8#include <limits.h> 9 10#if defined(MBEDTLS_HAVE_TIME) 11#include "mbedtls/platform_time.h" 12 13#if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ 14 defined(__MINGW32__) || defined(_WIN64) 15#include <windows.h> 16#elif _POSIX_C_SOURCE >= 199309L 17#include <time.h> 18#else 19#include <unistd.h> 20#endif 21void sleep_ms(int milliseconds) 22{ 23#if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ 24 defined(__MINGW32__) || defined(_WIN64) 25 Sleep(milliseconds); 26#elif _POSIX_C_SOURCE >= 199309L 27 struct timespec ts; 28 ts.tv_sec = milliseconds / 1000; 29 ts.tv_nsec = (milliseconds % 1000) * 1000000; 30 nanosleep(&ts, NULL); 31#else 32 usleep(milliseconds * 1000); 33#endif 34} 35#endif 36 37/* END_HEADER */ 38 39/* BEGIN_DEPENDENCIES */ 40 41/* END_DEPENDENCIES */ 42 43/* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ 44void time_get_milliseconds() 45{ 46 mbedtls_ms_time_t current = mbedtls_ms_time(); 47 (void) current; 48 /* This goto is added to avoid warnings from the generated code. */ 49 goto exit; 50} 51/* END_CASE */ 52 53/* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ 54void time_get_seconds() 55{ 56 mbedtls_time_t current = mbedtls_time(NULL); 57 (void) current; 58 /* This goto is added to avoid warnings from the generated code. */ 59 goto exit; 60} 61/* END_CASE */ 62 63/* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ 64void time_delay_milliseconds(int delay_ms) 65{ 66 mbedtls_ms_time_t current = mbedtls_ms_time(); 67 mbedtls_ms_time_t elapsed_ms; 68 69 /* 70 * WARNING: DO NOT ENABLE THIS TEST. We keep the code here to document the 71 * reason. 72 * 73 * Windows CI reports random test fail on platform-suite. It might 74 * be caused by this case. 75 */ 76 sleep_ms(delay_ms); 77 78 elapsed_ms = mbedtls_ms_time() - current; 79 TEST_ASSERT(elapsed_ms >= delay_ms && elapsed_ms < 4000 + delay_ms); 80 /* This goto is added to avoid warnings from the generated code. */ 81 goto exit; 82} 83/* END_CASE */ 84 85/* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ 86 87/* 88 * WARNING: DO NOT ENABLE THIS TEST. We keep the code here to document the 89 * reason. 90 * 91 * The test often failed on the CI. See #1517. CI failures cannot be 92 * completely avoided due to out-of-sync clock sources. 93 */ 94void time_delay_seconds(int delay_secs) 95{ 96 mbedtls_time_t current = mbedtls_time(NULL); 97 mbedtls_time_t elapsed_secs; 98 99 sleep_ms(delay_secs * 1000); 100 101 elapsed_secs = mbedtls_time(NULL) - current; 102 103 /* 104 * `mbedtls_time()` was defined as c99 function `time()`, returns the number 105 * of seconds since the Epoch. And it is affected by discontinuous changes 106 * from automatic drift adjustment or time setting system call. The POSIX.1 107 * specification for clock_settime says that discontinuous changes in 108 * CLOCK_REALTIME should not affect `nanosleep()`. 109 * 110 * If discontinuous changes occur during `nanosleep()`, we will get 111 * `elapsed_secs < delay_secs` for backward or `elapsed_secs > delay_secs` 112 * for forward. 113 * 114 * The following tolerance windows cannot be guaranteed. 115 * PLEASE DO NOT ENABLE IT IN CI TEST. 116 */ 117 TEST_ASSERT(elapsed_secs - delay_secs >= -1 && 118 elapsed_secs - delay_secs < 4); 119 /* This goto is added to avoid warnings from the generated code. */ 120 goto exit; 121} 122/* END_CASE */ 123 124/* BEGIN_CASE */ 125void check_mbedtls_calloc_overallocation(intmax_t num, intmax_t size) 126{ 127 unsigned char *buf; 128 buf = mbedtls_calloc((size_t) num, (size_t) size); 129 /* Dummy usage of the pointer to prevent optimizing it */ 130 mbedtls_printf("calloc pointer : %p\n", buf); 131 TEST_ASSERT(buf == NULL); 132 133exit: 134 mbedtls_free(buf); 135} 136/* END_CASE */ 137