xref: /aosp_15_r20/external/curl/tests/unit/unit3200.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 #include "curl_get_line.h"
26*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
27*6236dae4SAndroid Build Coastguard Worker 
28*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_COOKIES) || !defined(CURL_DISABLE_ALTSVC) ||  \
29*6236dae4SAndroid Build Coastguard Worker   !defined(CURL_DISABLE_HSTS) || !defined(CURL_DISABLE_NETRC)
30*6236dae4SAndroid Build Coastguard Worker 
31*6236dae4SAndroid Build Coastguard Worker /* The test XML does not supply a way to write files without newlines
32*6236dae4SAndroid Build Coastguard Worker  * so we write our own
33*6236dae4SAndroid Build Coastguard Worker  */
34*6236dae4SAndroid Build Coastguard Worker 
35*6236dae4SAndroid Build Coastguard Worker #define C64 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
36*6236dae4SAndroid Build Coastguard Worker #define C256 C64 C64 C64 C64
37*6236dae4SAndroid Build Coastguard Worker #define C1024 C256 C256 C256 C256
38*6236dae4SAndroid Build Coastguard Worker #define C4096 C1024 C1024 C1024 C1024
39*6236dae4SAndroid Build Coastguard Worker 
unit_setup(void)40*6236dae4SAndroid Build Coastguard Worker static CURLcode unit_setup(void)
41*6236dae4SAndroid Build Coastguard Worker {
42*6236dae4SAndroid Build Coastguard Worker   return CURLE_OK;
43*6236dae4SAndroid Build Coastguard Worker }
44*6236dae4SAndroid Build Coastguard Worker 
unit_stop(void)45*6236dae4SAndroid Build Coastguard Worker static CURLcode unit_stop(void)
46*6236dae4SAndroid Build Coastguard Worker {
47*6236dae4SAndroid Build Coastguard Worker   return CURLE_OK;
48*6236dae4SAndroid Build Coastguard Worker }
49*6236dae4SAndroid Build Coastguard Worker 
50*6236dae4SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
51*6236dae4SAndroid Build Coastguard Worker #pragma GCC diagnostic push
52*6236dae4SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Woverlength-strings"
53*6236dae4SAndroid Build Coastguard Worker #endif
54*6236dae4SAndroid Build Coastguard Worker 
55*6236dae4SAndroid Build Coastguard Worker #define NUMTESTS 6
56*6236dae4SAndroid Build Coastguard Worker static const char *filecontents[] = {
57*6236dae4SAndroid Build Coastguard Worker   /* Both should be read */
58*6236dae4SAndroid Build Coastguard Worker   "LINE1\n"
59*6236dae4SAndroid Build Coastguard Worker   "LINE2 NEWLINE\n",
60*6236dae4SAndroid Build Coastguard Worker 
61*6236dae4SAndroid Build Coastguard Worker   /* Both should be read */
62*6236dae4SAndroid Build Coastguard Worker   "LINE1\n"
63*6236dae4SAndroid Build Coastguard Worker   "LINE2 NONEWLINE",
64*6236dae4SAndroid Build Coastguard Worker 
65*6236dae4SAndroid Build Coastguard Worker   /* Only first should be read */
66*6236dae4SAndroid Build Coastguard Worker   "LINE1\n"
67*6236dae4SAndroid Build Coastguard Worker   C4096,
68*6236dae4SAndroid Build Coastguard Worker 
69*6236dae4SAndroid Build Coastguard Worker   /* First line should be read */
70*6236dae4SAndroid Build Coastguard Worker   "LINE1\n"
71*6236dae4SAndroid Build Coastguard Worker   C4096 "SOME EXTRA TEXT",
72*6236dae4SAndroid Build Coastguard Worker 
73*6236dae4SAndroid Build Coastguard Worker   /* Only first should be read */
74*6236dae4SAndroid Build Coastguard Worker   "LINE1\n"
75*6236dae4SAndroid Build Coastguard Worker   C4096 "SOME EXTRA TEXT\n"
76*6236dae4SAndroid Build Coastguard Worker   "LINE3\n",
77*6236dae4SAndroid Build Coastguard Worker 
78*6236dae4SAndroid Build Coastguard Worker   "LINE1\x1aTEST"
79*6236dae4SAndroid Build Coastguard Worker };
80*6236dae4SAndroid Build Coastguard Worker 
81*6236dae4SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
82*6236dae4SAndroid Build Coastguard Worker #pragma GCC diagnostic warning "-Woverlength-strings"
83*6236dae4SAndroid Build Coastguard Worker #endif
84*6236dae4SAndroid Build Coastguard Worker 
85*6236dae4SAndroid Build Coastguard Worker 
86*6236dae4SAndroid Build Coastguard Worker UNITTEST_START
87*6236dae4SAndroid Build Coastguard Worker   size_t i;
88*6236dae4SAndroid Build Coastguard Worker   int rc = 0;
89*6236dae4SAndroid Build Coastguard Worker   for(i = 0; i < NUMTESTS; i++) {
90*6236dae4SAndroid Build Coastguard Worker     FILE *fp;
91*6236dae4SAndroid Build Coastguard Worker     struct dynbuf buf;
92*6236dae4SAndroid Build Coastguard Worker     size_t len = 4096;
93*6236dae4SAndroid Build Coastguard Worker     char *line;
94*6236dae4SAndroid Build Coastguard Worker     Curl_dyn_init(&buf, len);
95*6236dae4SAndroid Build Coastguard Worker 
96*6236dae4SAndroid Build Coastguard Worker     fp = fopen(arg, "wb");
97*6236dae4SAndroid Build Coastguard Worker     abort_unless(fp != NULL, "Cannot open testfile");
98*6236dae4SAndroid Build Coastguard Worker     fwrite(filecontents[i], 1, strlen(filecontents[i]), fp);
99*6236dae4SAndroid Build Coastguard Worker     fclose(fp);
100*6236dae4SAndroid Build Coastguard Worker 
101*6236dae4SAndroid Build Coastguard Worker     fp = fopen(arg, "rb");
102*6236dae4SAndroid Build Coastguard Worker     abort_unless(fp != NULL, "Cannot open testfile");
103*6236dae4SAndroid Build Coastguard Worker 
104*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "Test %zd...", i);
105*6236dae4SAndroid Build Coastguard Worker     switch(i) {
106*6236dae4SAndroid Build Coastguard Worker       case 0:
107*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
108*6236dae4SAndroid Build Coastguard Worker         line = Curl_dyn_ptr(&buf);
109*6236dae4SAndroid Build Coastguard Worker         fail_unless(line && !strcmp("LINE1\n", line),
110*6236dae4SAndroid Build Coastguard Worker                     "First line failed (1)");
111*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
112*6236dae4SAndroid Build Coastguard Worker         line = Curl_dyn_ptr(&buf);
113*6236dae4SAndroid Build Coastguard Worker         fail_unless(line && !strcmp("LINE2 NEWLINE\n", line),
114*6236dae4SAndroid Build Coastguard Worker                     "Second line failed (1)");
115*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
116*6236dae4SAndroid Build Coastguard Worker         abort_unless(!Curl_dyn_len(&buf), "Missed EOF (1)");
117*6236dae4SAndroid Build Coastguard Worker         break;
118*6236dae4SAndroid Build Coastguard Worker       case 1:
119*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
120*6236dae4SAndroid Build Coastguard Worker         line = Curl_dyn_ptr(&buf);
121*6236dae4SAndroid Build Coastguard Worker         fail_unless(line && !strcmp("LINE1\n", line),
122*6236dae4SAndroid Build Coastguard Worker                     "First line failed (2)");
123*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
124*6236dae4SAndroid Build Coastguard Worker         line = Curl_dyn_ptr(&buf);
125*6236dae4SAndroid Build Coastguard Worker         fail_unless(line && !strcmp("LINE2 NONEWLINE\n", line),
126*6236dae4SAndroid Build Coastguard Worker                     "Second line failed (2)");
127*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
128*6236dae4SAndroid Build Coastguard Worker         abort_unless(!Curl_dyn_len(&buf), "Missed EOF (2)");
129*6236dae4SAndroid Build Coastguard Worker         break;
130*6236dae4SAndroid Build Coastguard Worker       case 2:
131*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
132*6236dae4SAndroid Build Coastguard Worker         line = Curl_dyn_ptr(&buf);
133*6236dae4SAndroid Build Coastguard Worker         fail_unless(line && !strcmp("LINE1\n", line),
134*6236dae4SAndroid Build Coastguard Worker                     "First line failed (3)");
135*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
136*6236dae4SAndroid Build Coastguard Worker         fail_unless(!Curl_dyn_len(&buf),
137*6236dae4SAndroid Build Coastguard Worker                     "Did not detect max read on EOF (3)");
138*6236dae4SAndroid Build Coastguard Worker         break;
139*6236dae4SAndroid Build Coastguard Worker       case 3:
140*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
141*6236dae4SAndroid Build Coastguard Worker         line = Curl_dyn_ptr(&buf);
142*6236dae4SAndroid Build Coastguard Worker         fail_unless(line && !strcmp("LINE1\n", line),
143*6236dae4SAndroid Build Coastguard Worker                     "First line failed (4)");
144*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
145*6236dae4SAndroid Build Coastguard Worker         fail_unless(!Curl_dyn_len(&buf),
146*6236dae4SAndroid Build Coastguard Worker                     "Did not ignore partial on EOF (4)");
147*6236dae4SAndroid Build Coastguard Worker         break;
148*6236dae4SAndroid Build Coastguard Worker       case 4:
149*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
150*6236dae4SAndroid Build Coastguard Worker         line = Curl_dyn_ptr(&buf);
151*6236dae4SAndroid Build Coastguard Worker         fail_unless(line && !strcmp("LINE1\n", line),
152*6236dae4SAndroid Build Coastguard Worker                     "First line failed (5)");
153*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
154*6236dae4SAndroid Build Coastguard Worker         fail_unless(!Curl_dyn_len(&buf),
155*6236dae4SAndroid Build Coastguard Worker                     "Did not bail out on too long line");
156*6236dae4SAndroid Build Coastguard Worker         break;
157*6236dae4SAndroid Build Coastguard Worker       case 5:
158*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
159*6236dae4SAndroid Build Coastguard Worker         line = Curl_dyn_ptr(&buf);
160*6236dae4SAndroid Build Coastguard Worker         fail_unless(line && !strcmp("LINE1\x1aTEST\n", line),
161*6236dae4SAndroid Build Coastguard Worker                     "Missed/Misinterpreted ^Z (6)");
162*6236dae4SAndroid Build Coastguard Worker         rc = Curl_get_line(&buf, fp);
163*6236dae4SAndroid Build Coastguard Worker         abort_unless(!Curl_dyn_len(&buf), "Missed EOF (6)");
164*6236dae4SAndroid Build Coastguard Worker         break;
165*6236dae4SAndroid Build Coastguard Worker       default:
166*6236dae4SAndroid Build Coastguard Worker         abort_unless(1, "Unknown case");
167*6236dae4SAndroid Build Coastguard Worker         break;
168*6236dae4SAndroid Build Coastguard Worker     }
169*6236dae4SAndroid Build Coastguard Worker     Curl_dyn_free(&buf);
170*6236dae4SAndroid Build Coastguard Worker     fclose(fp);
171*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "OK\n");
172*6236dae4SAndroid Build Coastguard Worker   }
173*6236dae4SAndroid Build Coastguard Worker   return (CURLcode)rc;
174*6236dae4SAndroid Build Coastguard Worker UNITTEST_STOP
175*6236dae4SAndroid Build Coastguard Worker 
176*6236dae4SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
177*6236dae4SAndroid Build Coastguard Worker #pragma GCC diagnostic pop
178*6236dae4SAndroid Build Coastguard Worker #endif
179*6236dae4SAndroid Build Coastguard Worker 
180*6236dae4SAndroid Build Coastguard Worker #else
181*6236dae4SAndroid Build Coastguard Worker static CURLcode unit_setup(void)
182*6236dae4SAndroid Build Coastguard Worker {
183*6236dae4SAndroid Build Coastguard Worker   return CURLE_OK;
184*6236dae4SAndroid Build Coastguard Worker }
185*6236dae4SAndroid Build Coastguard Worker static void unit_stop(void)
186*6236dae4SAndroid Build Coastguard Worker {
187*6236dae4SAndroid Build Coastguard Worker }
188*6236dae4SAndroid Build Coastguard Worker UNITTEST_START
189*6236dae4SAndroid Build Coastguard Worker UNITTEST_STOP
190*6236dae4SAndroid Build Coastguard Worker 
191*6236dae4SAndroid Build Coastguard Worker #endif
192