1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _
3*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| |
4*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___
6*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker *
8*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker *
10*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker *
14*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker *
18*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker *
21*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker *
23*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker #include "curlcheck.h"
25*6236dae4SAndroid Build Coastguard Worker
26*6236dae4SAndroid Build Coastguard Worker #include "urldata.h"
27*6236dae4SAndroid Build Coastguard Worker #include "progress.h"
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Worker static int usec_magnitude = 1000000;
30*6236dae4SAndroid Build Coastguard Worker
unit_setup(void)31*6236dae4SAndroid Build Coastguard Worker static bool unit_setup(void)
32*6236dae4SAndroid Build Coastguard Worker {
33*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
34*6236dae4SAndroid Build Coastguard Worker }
35*6236dae4SAndroid Build Coastguard Worker
unit_stop(void)36*6236dae4SAndroid Build Coastguard Worker static void unit_stop(void)
37*6236dae4SAndroid Build Coastguard Worker {
38*6236dae4SAndroid Build Coastguard Worker
39*6236dae4SAndroid Build Coastguard Worker }
40*6236dae4SAndroid Build Coastguard Worker
41*6236dae4SAndroid Build Coastguard Worker /*
42*6236dae4SAndroid Build Coastguard Worker * Invoke Curl_pgrsTime for TIMER_STARTSINGLE to trigger the behavior that
43*6236dae4SAndroid Build Coastguard Worker * manages is_t_startransfer_set, but fake the t_startsingle time for purposes
44*6236dae4SAndroid Build Coastguard Worker * of the test.
45*6236dae4SAndroid Build Coastguard Worker */
fake_t_startsingle_time(struct Curl_easy * data,struct curltime fake_now,int seconds_offset)46*6236dae4SAndroid Build Coastguard Worker static void fake_t_startsingle_time(struct Curl_easy *data,
47*6236dae4SAndroid Build Coastguard Worker struct curltime fake_now,
48*6236dae4SAndroid Build Coastguard Worker int seconds_offset)
49*6236dae4SAndroid Build Coastguard Worker {
50*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(data, TIMER_STARTSINGLE);
51*6236dae4SAndroid Build Coastguard Worker data->progress.t_startsingle.tv_sec = fake_now.tv_sec + seconds_offset;
52*6236dae4SAndroid Build Coastguard Worker data->progress.t_startsingle.tv_usec = fake_now.tv_usec;
53*6236dae4SAndroid Build Coastguard Worker }
54*6236dae4SAndroid Build Coastguard Worker
usec_matches_seconds(timediff_t time_usec,int expected_seconds)55*6236dae4SAndroid Build Coastguard Worker static bool usec_matches_seconds(timediff_t time_usec, int expected_seconds)
56*6236dae4SAndroid Build Coastguard Worker {
57*6236dae4SAndroid Build Coastguard Worker int time_sec = (int)(time_usec / usec_magnitude);
58*6236dae4SAndroid Build Coastguard Worker bool same = (time_sec == expected_seconds);
59*6236dae4SAndroid Build Coastguard Worker fprintf(stderr, "is %d us same as %d seconds? %s\n",
60*6236dae4SAndroid Build Coastguard Worker (int)time_usec, expected_seconds,
61*6236dae4SAndroid Build Coastguard Worker same ? "Yes" : "No");
62*6236dae4SAndroid Build Coastguard Worker return same;
63*6236dae4SAndroid Build Coastguard Worker }
64*6236dae4SAndroid Build Coastguard Worker
expect_timer_seconds(struct Curl_easy * data,int seconds)65*6236dae4SAndroid Build Coastguard Worker static void expect_timer_seconds(struct Curl_easy *data, int seconds)
66*6236dae4SAndroid Build Coastguard Worker {
67*6236dae4SAndroid Build Coastguard Worker char msg[64];
68*6236dae4SAndroid Build Coastguard Worker msnprintf(msg, sizeof(msg), "about %d seconds should have passed", seconds);
69*6236dae4SAndroid Build Coastguard Worker fail_unless(usec_matches_seconds(data->progress.t_nslookup, seconds), msg);
70*6236dae4SAndroid Build Coastguard Worker fail_unless(usec_matches_seconds(data->progress.t_connect, seconds), msg);
71*6236dae4SAndroid Build Coastguard Worker fail_unless(usec_matches_seconds(data->progress.t_appconnect, seconds), msg);
72*6236dae4SAndroid Build Coastguard Worker fail_unless(usec_matches_seconds(data->progress.t_pretransfer, seconds),
73*6236dae4SAndroid Build Coastguard Worker msg);
74*6236dae4SAndroid Build Coastguard Worker fail_unless(usec_matches_seconds(data->progress.t_starttransfer, seconds),
75*6236dae4SAndroid Build Coastguard Worker msg);
76*6236dae4SAndroid Build Coastguard Worker }
77*6236dae4SAndroid Build Coastguard Worker
78*6236dae4SAndroid Build Coastguard Worker /* Scenario: simulate a redirect. When a redirect occurs, t_nslookup,
79*6236dae4SAndroid Build Coastguard Worker * t_connect, t_appconnect, t_pretransfer, and t_starttransfer are additive.
80*6236dae4SAndroid Build Coastguard Worker * E.g., if t_starttransfer took 2 seconds initially and took another 1
81*6236dae4SAndroid Build Coastguard Worker * second for the redirect request, then the resulting t_starttransfer should
82*6236dae4SAndroid Build Coastguard Worker * be 3 seconds. */
83*6236dae4SAndroid Build Coastguard Worker UNITTEST_START
84*6236dae4SAndroid Build Coastguard Worker struct Curl_easy data;
85*6236dae4SAndroid Build Coastguard Worker struct curltime now = Curl_now();
86*6236dae4SAndroid Build Coastguard Worker
87*6236dae4SAndroid Build Coastguard Worker data.progress.t_nslookup = 0;
88*6236dae4SAndroid Build Coastguard Worker data.progress.t_connect = 0;
89*6236dae4SAndroid Build Coastguard Worker data.progress.t_appconnect = 0;
90*6236dae4SAndroid Build Coastguard Worker data.progress.t_pretransfer = 0;
91*6236dae4SAndroid Build Coastguard Worker data.progress.t_starttransfer = 0;
92*6236dae4SAndroid Build Coastguard Worker data.progress.t_redirect = 0;
93*6236dae4SAndroid Build Coastguard Worker data.progress.start.tv_sec = now.tv_sec - 2;
94*6236dae4SAndroid Build Coastguard Worker data.progress.start.tv_usec = now.tv_usec;
95*6236dae4SAndroid Build Coastguard Worker fake_t_startsingle_time(&data, now, -2);
96*6236dae4SAndroid Build Coastguard Worker
97*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_NAMELOOKUP);
98*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_CONNECT);
99*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_APPCONNECT);
100*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_PRETRANSFER);
101*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
102*6236dae4SAndroid Build Coastguard Worker
103*6236dae4SAndroid Build Coastguard Worker expect_timer_seconds(&data, 2);
104*6236dae4SAndroid Build Coastguard Worker
105*6236dae4SAndroid Build Coastguard Worker /* now simulate the redirect */
106*6236dae4SAndroid Build Coastguard Worker data.progress.t_redirect = data.progress.t_starttransfer + 1;
107*6236dae4SAndroid Build Coastguard Worker fake_t_startsingle_time(&data, now, -1);
108*6236dae4SAndroid Build Coastguard Worker
109*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_NAMELOOKUP);
110*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_CONNECT);
111*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_APPCONNECT);
112*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_PRETRANSFER);
113*6236dae4SAndroid Build Coastguard Worker /* ensure t_starttransfer is only set on the first invocation by attempting
114*6236dae4SAndroid Build Coastguard Worker * to set it twice */
115*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
116*6236dae4SAndroid Build Coastguard Worker Curl_pgrsTime(&data, TIMER_STARTTRANSFER);
117*6236dae4SAndroid Build Coastguard Worker
118*6236dae4SAndroid Build Coastguard Worker expect_timer_seconds(&data, 3);
119*6236dae4SAndroid Build Coastguard Worker UNITTEST_STOP
120