diff options
Diffstat (limited to 'tests/unit')
-rw-r--r-- | tests/unit/Makefile.inc | 3 | ||||
-rw-r--r-- | tests/unit/unit1303.c | 122 |
2 files changed, 124 insertions, 1 deletions
diff --git a/tests/unit/Makefile.inc b/tests/unit/Makefile.inc index e56279049..0db217d86 100644 --- a/tests/unit/Makefile.inc +++ b/tests/unit/Makefile.inc @@ -3,8 +3,9 @@ UNITFILES = curlcheck.h # These are all unit test programs -noinst_PROGRAMS = unit1300 unit1301 unit1302 +noinst_PROGRAMS = unit1300 unit1301 unit1302 unit1303 unit1300_SOURCES = unit1300.c $(UNITFILES) unit1301_SOURCES = unit1301.c $(UNITFILES) unit1302_SOURCES = unit1302.c $(UNITFILES) +unit1303_SOURCES = unit1303.c $(UNITFILES) diff --git a/tests/unit/unit1303.c b/tests/unit/unit1303.c new file mode 100644 index 000000000..01fdda1f9 --- /dev/null +++ b/tests/unit/unit1303.c @@ -0,0 +1,122 @@ +#include <stdlib.h> +#include "curl_config.h" +#include "setup.h" + +#include "urldata.h" +#include "connect.h" +#include "curlcheck.h" +#include "memdebug.h" /* LAST include file */ + +static struct SessionHandle *data; + +static void unit_setup( void ) +{ + data = curl_easy_init(); +} +static void unit_stop( void ) +{ + curl_easy_cleanup(data); +} + +/* BASE is just a define to make us fool around with decently large number so + that we aren't zero-based */ +#define BASE 1000000 + +/* macro to set the pretended current time */ +#define NOW(x,y) now.tv_sec = x; now.tv_usec = y +/* macro to set the millisecond based timeouts to use */ +#define TIMEOUTS(x,y) data->set.timeout = x; data->set.connecttimeout = y + +/* + * To test: + * + * 00/10/01/11 timeouts set + * 0/1 during connect + * T various values on the timeouts + * N various values of now + */ + +struct timetest { + int now_s; + int now_us; + int timeout_ms; + int connecttimeout_ms; + int connecting; + long result; + const char *comment; +}; + +UNITTEST_START + +struct timeval now; +long timeout; +unsigned int i; + +const struct timetest run[] = { + /* both timeouts set, not connecting */ + {BASE + 4, 0, 10000, 8000, FALSE, 6000, "6 seconds should be left"}, + {BASE + 4, 990000, 10000, 8000, FALSE, 5010, "5010 ms should be left"}, + {BASE + 10, 0, 10000, 8000, FALSE, -1, "timeout is -1, expired"}, + {BASE + 12, 0, 10000, 8000, FALSE, -2000, "-2000, overdue 2 seconds"}, + + /* both timeouts set, connecting */ + {BASE + 4, 0, 10000, 8000, TRUE, 4000, "4 seconds should be left"}, + {BASE + 4, 990000, 10000, 8000, TRUE, 3010, "3010 ms should be left"}, + {BASE + 8, 0, 10000, 8000, TRUE, -1, "timeout is -1, expired"}, + {BASE + 10, 0, 10000, 8000, TRUE, -2000, "-2000, overdue 2 seconds"}, + + /* no connect timeout set, not connecting */ + {BASE + 4, 0, 10000, 0, FALSE, 6000, "6 seconds should be left"}, + {BASE + 4, 990000, 10000, 0, FALSE, 5010, "5010 ms should be left"}, + {BASE + 10, 0, 10000, 0, FALSE, -1, "timeout is -1, expired"}, + {BASE + 12, 0, 10000, 0, FALSE, -2000, "-2000, overdue 2 seconds"}, + + /* no connect timeout set, connecting */ + {BASE + 4, 0, 10000, 0, FALSE, 6000, "6 seconds should be left"}, + {BASE + 4, 990000, 10000, 0, FALSE, 5010, "5010 ms should be left"}, + {BASE + 10, 0, 10000, 0, FALSE, -1, "timeout is -1, expired"}, + {BASE + 12, 0, 10000, 0, FALSE, -2000, "-2000, overdue 2 seconds"}, + + /* only connect timeout set, not connecting */ + {BASE + 4, 0, 0, 10000, FALSE, 0, "no timeout active"}, + {BASE + 4, 990000, 0, 10000, FALSE, 0, "no timeout active"}, + {BASE + 10, 0, 0, 10000, FALSE, 0, "no timeout active"}, + {BASE + 12, 0, 0, 10000, FALSE, 0, "no timeout active"}, + + /* only connect timeout set, connecting */ + {BASE + 4, 0, 0, 10000, TRUE, 6000, "6 seconds should be left"}, + {BASE + 4, 990000, 0, 10000, TRUE, 5010, "5010 ms should be left"}, + {BASE + 10, 0, 0, 10000, TRUE, -1, "timeout is -1, expired"}, + {BASE + 12, 0, 0, 10000, TRUE, -2000, "-2000, overdue 2 seconds"}, + + /* no timeout set, not connecting */ + {BASE + 4, 0, 0, 0, FALSE, 0, "no timeout active"}, + {BASE + 4, 990000, 0, 0, FALSE, 0, "no timeout active"}, + {BASE + 10, 0, 0, 0, FALSE, 0, "no timeout active"}, + {BASE + 12, 0, 0, 0, FALSE, 0, "no timeout active"}, + + /* no timeout set, connecting */ + {BASE + 4, 0, 0, 0, TRUE, 296000, "no timeout active"}, + {BASE + 4, 990000, 0, 0, TRUE, 295010, "no timeout active"}, + {BASE + 10, 0, 0, 0, TRUE, 290000, "no timeout active"}, + {BASE + 12, 0, 0, 0, TRUE, 288000, "no timeout active"}, + + /* both timeouts set, connecting, connect timeout the longer one */ + {BASE + 4, 0, 10000, 12000, TRUE, 6000, "6 seconds should be left"}, + +}; + +/* this is the pretended start time of the transfer */ +data->progress.t_startsingle.tv_sec = BASE; +data->progress.t_startsingle.tv_usec = 0; + +for(i=0; i < sizeof(run)/sizeof(run[0]); i++) { + NOW(run[i].now_s, run[i].now_us); + TIMEOUTS(run[i].timeout_ms, run[i].connecttimeout_ms); + timeout = Curl_timeleft(data, &now, run[i].connecting); + if(timeout != run[i].result) + fail(run[i].comment); +} + + +UNITTEST_STOP |