1/*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at https://curl.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 * SPDX-License-Identifier: curl 22 * 23 ***************************************************************************/ 24#include "curlcheck.h" 25 26#include "urldata.h" 27#include "connect.h" 28#include "memdebug.h" /* LAST include file */ 29 30static struct Curl_easy *data; 31 32static CURLcode unit_setup(void) 33{ 34 CURLcode res = CURLE_OK; 35 36 global_init(CURL_GLOBAL_ALL); 37 data = curl_easy_init(); 38 if(!data) { 39 curl_global_cleanup(); 40 return CURLE_OUT_OF_MEMORY; 41 } 42 return res; 43} 44 45static void unit_stop(void) 46{ 47 curl_easy_cleanup(data); 48 curl_global_cleanup(); 49} 50 51/* BASE is just a define to make us fool around with decently large number so 52 that we aren't zero-based */ 53#define BASE 1000000 54 55/* macro to set the pretended current time */ 56#define NOW(x,y) now.tv_sec = x; now.tv_usec = y 57/* macro to set the millisecond based timeouts to use */ 58#define TIMEOUTS(x,y) data->set.timeout = x; data->set.connecttimeout = y 59 60/* 61 * To test: 62 * 63 * 00/10/01/11 timeouts set 64 * 0/1 during connect 65 * T various values on the timeouts 66 * N various values of now 67 */ 68 69struct timetest { 70 int now_s; 71 int now_us; 72 int timeout_ms; 73 int connecttimeout_ms; 74 bool connecting; 75 timediff_t result; 76 const char *comment; 77}; 78 79UNITTEST_START 80{ 81 struct curltime now; 82 unsigned int i; 83 84 const struct timetest run[] = { 85 /* both timeouts set, not connecting */ 86 {BASE + 4, 0, 10000, 8000, FALSE, 6000, "6 seconds should be left"}, 87 {BASE + 4, 990000, 10000, 8000, FALSE, 5010, "5010 ms should be left"}, 88 {BASE + 10, 0, 10000, 8000, FALSE, -1, "timeout is -1, expired"}, 89 {BASE + 12, 0, 10000, 8000, FALSE, -2000, "-2000, overdue 2 seconds"}, 90 91 /* both timeouts set, connecting */ 92 {BASE + 4, 0, 10000, 8000, TRUE, 4000, "4 seconds should be left"}, 93 {BASE + 4, 990000, 10000, 8000, TRUE, 3010, "3010 ms should be left"}, 94 {BASE + 8, 0, 10000, 8000, TRUE, -1, "timeout is -1, expired"}, 95 {BASE + 10, 0, 10000, 8000, TRUE, -2000, "-2000, overdue 2 seconds"}, 96 97 /* no connect timeout set, not connecting */ 98 {BASE + 4, 0, 10000, 0, FALSE, 6000, "6 seconds should be left"}, 99 {BASE + 4, 990000, 10000, 0, FALSE, 5010, "5010 ms should be left"}, 100 {BASE + 10, 0, 10000, 0, FALSE, -1, "timeout is -1, expired"}, 101 {BASE + 12, 0, 10000, 0, FALSE, -2000, "-2000, overdue 2 seconds"}, 102 103 /* no connect timeout set, connecting */ 104 {BASE + 4, 0, 10000, 0, TRUE, 6000, "6 seconds should be left"}, 105 {BASE + 4, 990000, 10000, 0, TRUE, 5010, "5010 ms should be left"}, 106 {BASE + 10, 0, 10000, 0, TRUE, -1, "timeout is -1, expired"}, 107 {BASE + 12, 0, 10000, 0, TRUE, -2000, "-2000, overdue 2 seconds"}, 108 109 /* only connect timeout set, not connecting */ 110 {BASE + 4, 0, 0, 10000, FALSE, 0, "no timeout active"}, 111 {BASE + 4, 990000, 0, 10000, FALSE, 0, "no timeout active"}, 112 {BASE + 10, 0, 0, 10000, FALSE, 0, "no timeout active"}, 113 {BASE + 12, 0, 0, 10000, FALSE, 0, "no timeout active"}, 114 115 /* only connect timeout set, connecting */ 116 {BASE + 4, 0, 0, 10000, TRUE, 6000, "6 seconds should be left"}, 117 {BASE + 4, 990000, 0, 10000, TRUE, 5010, "5010 ms should be left"}, 118 {BASE + 10, 0, 0, 10000, TRUE, -1, "timeout is -1, expired"}, 119 {BASE + 12, 0, 0, 10000, TRUE, -2000, "-2000, overdue 2 seconds"}, 120 121 /* no timeout set, not connecting */ 122 {BASE + 4, 0, 0, 0, FALSE, 0, "no timeout active"}, 123 {BASE + 4, 990000, 0, 0, FALSE, 0, "no timeout active"}, 124 {BASE + 10, 0, 0, 0, FALSE, 0, "no timeout active"}, 125 {BASE + 12, 0, 0, 0, FALSE, 0, "no timeout active"}, 126 127 /* no timeout set, connecting */ 128 {BASE + 4, 0, 0, 0, TRUE, 296000, "no timeout active"}, 129 {BASE + 4, 990000, 0, 0, TRUE, 295010, "no timeout active"}, 130 {BASE + 10, 0, 0, 0, TRUE, 290000, "no timeout active"}, 131 {BASE + 12, 0, 0, 0, TRUE, 288000, "no timeout active"}, 132 133 /* both timeouts set, connecting, connect timeout the longer one */ 134 {BASE + 4, 0, 10000, 12000, TRUE, 6000, "6 seconds should be left"}, 135 136 }; 137 138 /* this is the pretended start time of the transfer */ 139 data->progress.t_startsingle.tv_sec = BASE; 140 data->progress.t_startsingle.tv_usec = 0; 141 data->progress.t_startop.tv_sec = BASE; 142 data->progress.t_startop.tv_usec = 0; 143 144 for(i = 0; i < sizeof(run)/sizeof(run[0]); i++) { 145 timediff_t timeout; 146 NOW(run[i].now_s, run[i].now_us); 147 TIMEOUTS(run[i].timeout_ms, run[i].connecttimeout_ms); 148 timeout = Curl_timeleft(data, &now, run[i].connecting); 149 if(timeout != run[i].result) 150 fail(run[i].comment); 151 } 152} 153UNITTEST_STOP 154