1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel (at) 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.haxx.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 ***************************************************************************/ 22 #include "curlcheck.h" 23 24 #include "urldata.h" 25 #include "connect.h" 26 #include "memdebug.h" /* LAST include file */ 27 28 static struct Curl_easy *data; 29 30 static CURLcode unit_setup(void) 31 { 32 int res = CURLE_OK; 33 34 global_init(CURL_GLOBAL_ALL); 35 data = curl_easy_init(); 36 if(!data) 37 return CURLE_OUT_OF_MEMORY; 38 return res; 39 } 40 41 static void unit_stop(void) 42 { 43 curl_easy_cleanup(data); 44 curl_global_cleanup(); 45 } 46 47 /* BASE is just a define to make us fool around with decently large number so 48 that we aren't zero-based */ 49 #define BASE 1000000 50 51 /* macro to set the pretended current time */ 52 #define NOW(x,y) now.tv_sec = x; now.tv_usec = y 53 /* macro to set the millisecond based timeouts to use */ 54 #define TIMEOUTS(x,y) data->set.timeout = x; data->set.connecttimeout = y 55 56 /* 57 * To test: 58 * 59 * 00/10/01/11 timeouts set 60 * 0/1 during connect 61 * T various values on the timeouts 62 * N various values of now 63 */ 64 65 struct timetest { 66 int now_s; 67 int now_us; 68 int timeout_ms; 69 int connecttimeout_ms; 70 bool connecting; 71 time_t result; 72 const char *comment; 73 }; 74 75 UNITTEST_START 76 { 77 struct curltime now; 78 unsigned int i; 79 80 const struct timetest run[] = { 81 /* both timeouts set, not connecting */ 82 {BASE + 4, 0, 10000, 8000, FALSE, 6000, "6 seconds should be left"}, 83 {BASE + 4, 990000, 10000, 8000, FALSE, 5010, "5010 ms should be left"}, 84 {BASE + 10, 0, 10000, 8000, FALSE, -1, "timeout is -1, expired"}, 85 {BASE + 12, 0, 10000, 8000, FALSE, -2000, "-2000, overdue 2 seconds"}, 86 87 /* both timeouts set, connecting */ 88 {BASE + 4, 0, 10000, 8000, TRUE, 4000, "4 seconds should be left"}, 89 {BASE + 4, 990000, 10000, 8000, TRUE, 3010, "3010 ms should be left"}, 90 {BASE + 8, 0, 10000, 8000, TRUE, -1, "timeout is -1, expired"}, 91 {BASE + 10, 0, 10000, 8000, TRUE, -2000, "-2000, overdue 2 seconds"}, 92 93 /* no connect timeout set, not connecting */ 94 {BASE + 4, 0, 10000, 0, FALSE, 6000, "6 seconds should be left"}, 95 {BASE + 4, 990000, 10000, 0, FALSE, 5010, "5010 ms should be left"}, 96 {BASE + 10, 0, 10000, 0, FALSE, -1, "timeout is -1, expired"}, 97 {BASE + 12, 0, 10000, 0, FALSE, -2000, "-2000, overdue 2 seconds"}, 98 99 /* no connect timeout set, connecting */ 100 {BASE + 4, 0, 10000, 0, FALSE, 6000, "6 seconds should be left"}, 101 {BASE + 4, 990000, 10000, 0, FALSE, 5010, "5010 ms should be left"}, 102 {BASE + 10, 0, 10000, 0, FALSE, -1, "timeout is -1, expired"}, 103 {BASE + 12, 0, 10000, 0, FALSE, -2000, "-2000, overdue 2 seconds"}, 104 105 /* only connect timeout set, not connecting */ 106 {BASE + 4, 0, 0, 10000, FALSE, 0, "no timeout active"}, 107 {BASE + 4, 990000, 0, 10000, FALSE, 0, "no timeout active"}, 108 {BASE + 10, 0, 0, 10000, FALSE, 0, "no timeout active"}, 109 {BASE + 12, 0, 0, 10000, FALSE, 0, "no timeout active"}, 110 111 /* only connect timeout set, connecting */ 112 {BASE + 4, 0, 0, 10000, TRUE, 6000, "6 seconds should be left"}, 113 {BASE + 4, 990000, 0, 10000, TRUE, 5010, "5010 ms should be left"}, 114 {BASE + 10, 0, 0, 10000, TRUE, -1, "timeout is -1, expired"}, 115 {BASE + 12, 0, 0, 10000, TRUE, -2000, "-2000, overdue 2 seconds"}, 116 117 /* no timeout set, not connecting */ 118 {BASE + 4, 0, 0, 0, FALSE, 0, "no timeout active"}, 119 {BASE + 4, 990000, 0, 0, FALSE, 0, "no timeout active"}, 120 {BASE + 10, 0, 0, 0, FALSE, 0, "no timeout active"}, 121 {BASE + 12, 0, 0, 0, FALSE, 0, "no timeout active"}, 122 123 /* no timeout set, connecting */ 124 {BASE + 4, 0, 0, 0, TRUE, 296000, "no timeout active"}, 125 {BASE + 4, 990000, 0, 0, TRUE, 295010, "no timeout active"}, 126 {BASE + 10, 0, 0, 0, TRUE, 290000, "no timeout active"}, 127 {BASE + 12, 0, 0, 0, TRUE, 288000, "no timeout active"}, 128 129 /* both timeouts set, connecting, connect timeout the longer one */ 130 {BASE + 4, 0, 10000, 12000, TRUE, 6000, "6 seconds should be left"}, 131 132 }; 133 134 /* this is the pretended start time of the transfer */ 135 data->progress.t_startsingle.tv_sec = BASE; 136 data->progress.t_startsingle.tv_usec = 0; 137 data->progress.t_startop.tv_sec = BASE; 138 data->progress.t_startop.tv_usec = 0; 139 140 for(i = 0; i < sizeof(run)/sizeof(run[0]); i++) { 141 time_t timeout; 142 NOW(run[i].now_s, run[i].now_us); 143 TIMEOUTS(run[i].timeout_ms, run[i].connecttimeout_ms); 144 timeout = Curl_timeleft(data, &now, run[i].connecting); 145 if(timeout != run[i].result) 146 fail(run[i].comment); 147 } 148 } 149 UNITTEST_STOP 150