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