1 /***************************************************************************
2 * _ _ ____ _
3 * Project ___| | | | _ \| |
4 * / __| | | | |_) | |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
7 *
8 * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
9 *
10 * This software is licensed as described in the file COPYING, which
11 * you should have received as part of this distribution. The terms
12 * are also available at https://curl.se/docs/copyright.html.
13 *
14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 * copies of the Software, and permit persons to whom the Software is
16 * furnished to do so, under the terms of the COPYING file.
17 *
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
20 *
21 * SPDX-License-Identifier: curl
22 *
23 ***************************************************************************/
24 #include "curlcheck.h"
25 #include "curl_get_line.h"
26 #include "memdebug.h"
27
28 #if !defined(CURL_DISABLE_COOKIES) || !defined(CURL_DISABLE_ALTSVC) || \
29 !defined(CURL_DISABLE_HSTS) || !defined(CURL_DISABLE_NETRC)
30
31 /* The test XML does not supply a way to write files without newlines
32 * so we write our own
33 */
34
35 #define C64 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
36 #define C256 C64 C64 C64 C64
37 #define C1024 C256 C256 C256 C256
38 #define C4096 C1024 C1024 C1024 C1024
39
unit_setup(void)40 static CURLcode unit_setup(void)
41 {
42 return CURLE_OK;
43 }
44
unit_stop(void)45 static CURLcode unit_stop(void)
46 {
47 return CURLE_OK;
48 }
49
50 #if defined(__GNUC__) || defined(__clang__)
51 #pragma GCC diagnostic push
52 #pragma GCC diagnostic ignored "-Woverlength-strings"
53 #endif
54
55 #define NUMTESTS 6
56 static const char *filecontents[] = {
57 /* Both should be read */
58 "LINE1\n"
59 "LINE2 NEWLINE\n",
60
61 /* Both should be read */
62 "LINE1\n"
63 "LINE2 NONEWLINE",
64
65 /* Only first should be read */
66 "LINE1\n"
67 C4096,
68
69 /* First line should be read */
70 "LINE1\n"
71 C4096 "SOME EXTRA TEXT",
72
73 /* Only first should be read */
74 "LINE1\n"
75 C4096 "SOME EXTRA TEXT\n"
76 "LINE3\n",
77
78 "LINE1\x1aTEST"
79 };
80
81 #if defined(__GNUC__) || defined(__clang__)
82 #pragma GCC diagnostic warning "-Woverlength-strings"
83 #endif
84
85
86 UNITTEST_START
87 size_t i;
88 int rc = 0;
89 for(i = 0; i < NUMTESTS; i++) {
90 FILE *fp;
91 struct dynbuf buf;
92 size_t len = 4096;
93 char *line;
94 Curl_dyn_init(&buf, len);
95
96 fp = fopen(arg, "wb");
97 abort_unless(fp != NULL, "Cannot open testfile");
98 fwrite(filecontents[i], 1, strlen(filecontents[i]), fp);
99 fclose(fp);
100
101 fp = fopen(arg, "rb");
102 abort_unless(fp != NULL, "Cannot open testfile");
103
104 fprintf(stderr, "Test %zd...", i);
105 switch(i) {
106 case 0:
107 rc = Curl_get_line(&buf, fp);
108 line = Curl_dyn_ptr(&buf);
109 fail_unless(line && !strcmp("LINE1\n", line),
110 "First line failed (1)");
111 rc = Curl_get_line(&buf, fp);
112 line = Curl_dyn_ptr(&buf);
113 fail_unless(line && !strcmp("LINE2 NEWLINE\n", line),
114 "Second line failed (1)");
115 rc = Curl_get_line(&buf, fp);
116 abort_unless(!Curl_dyn_len(&buf), "Missed EOF (1)");
117 break;
118 case 1:
119 rc = Curl_get_line(&buf, fp);
120 line = Curl_dyn_ptr(&buf);
121 fail_unless(line && !strcmp("LINE1\n", line),
122 "First line failed (2)");
123 rc = Curl_get_line(&buf, fp);
124 line = Curl_dyn_ptr(&buf);
125 fail_unless(line && !strcmp("LINE2 NONEWLINE\n", line),
126 "Second line failed (2)");
127 rc = Curl_get_line(&buf, fp);
128 abort_unless(!Curl_dyn_len(&buf), "Missed EOF (2)");
129 break;
130 case 2:
131 rc = Curl_get_line(&buf, fp);
132 line = Curl_dyn_ptr(&buf);
133 fail_unless(line && !strcmp("LINE1\n", line),
134 "First line failed (3)");
135 rc = Curl_get_line(&buf, fp);
136 fail_unless(!Curl_dyn_len(&buf),
137 "Did not detect max read on EOF (3)");
138 break;
139 case 3:
140 rc = Curl_get_line(&buf, fp);
141 line = Curl_dyn_ptr(&buf);
142 fail_unless(line && !strcmp("LINE1\n", line),
143 "First line failed (4)");
144 rc = Curl_get_line(&buf, fp);
145 fail_unless(!Curl_dyn_len(&buf),
146 "Did not ignore partial on EOF (4)");
147 break;
148 case 4:
149 rc = Curl_get_line(&buf, fp);
150 line = Curl_dyn_ptr(&buf);
151 fail_unless(line && !strcmp("LINE1\n", line),
152 "First line failed (5)");
153 rc = Curl_get_line(&buf, fp);
154 fail_unless(!Curl_dyn_len(&buf),
155 "Did not bail out on too long line");
156 break;
157 case 5:
158 rc = Curl_get_line(&buf, fp);
159 line = Curl_dyn_ptr(&buf);
160 fail_unless(line && !strcmp("LINE1\x1aTEST\n", line),
161 "Missed/Misinterpreted ^Z (6)");
162 rc = Curl_get_line(&buf, fp);
163 abort_unless(!Curl_dyn_len(&buf), "Missed EOF (6)");
164 break;
165 default:
166 abort_unless(1, "Unknown case");
167 break;
168 }
169 Curl_dyn_free(&buf);
170 fclose(fp);
171 fprintf(stderr, "OK\n");
172 }
173 return (CURLcode)rc;
174 UNITTEST_STOP
175
176 #if defined(__GNUC__) || defined(__clang__)
177 #pragma GCC diagnostic pop
178 #endif
179
180 #else
181 static CURLcode unit_setup(void)
182 {
183 return CURLE_OK;
184 }
185 static void unit_stop(void)
186 {
187 }
188 UNITTEST_START
189 UNITTEST_STOP
190
191 #endif
192