xref: /aosp_15_r20/external/curl/tests/unit/unit1399.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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