113498266Sopenharmony_ci/***************************************************************************
213498266Sopenharmony_ci *                                  _   _ ____  _
313498266Sopenharmony_ci *  Project                     ___| | | |  _ \| |
413498266Sopenharmony_ci *                             / __| | | | |_) | |
513498266Sopenharmony_ci *                            | (__| |_| |  _ <| |___
613498266Sopenharmony_ci *                             \___|\___/|_| \_\_____|
713498266Sopenharmony_ci *
813498266Sopenharmony_ci * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
913498266Sopenharmony_ci *
1013498266Sopenharmony_ci * This software is licensed as described in the file COPYING, which
1113498266Sopenharmony_ci * you should have received as part of this distribution. The terms
1213498266Sopenharmony_ci * are also available at https://curl.se/docs/copyright.html.
1313498266Sopenharmony_ci *
1413498266Sopenharmony_ci * You may opt to use, copy, modify, merge, publish, distribute and/or sell
1513498266Sopenharmony_ci * copies of the Software, and permit persons to whom the Software is
1613498266Sopenharmony_ci * furnished to do so, under the terms of the COPYING file.
1713498266Sopenharmony_ci *
1813498266Sopenharmony_ci * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
1913498266Sopenharmony_ci * KIND, either express or implied.
2013498266Sopenharmony_ci *
2113498266Sopenharmony_ci * SPDX-License-Identifier: curl
2213498266Sopenharmony_ci *
2313498266Sopenharmony_ci ***************************************************************************/
2413498266Sopenharmony_ci#include "curlcheck.h"
2513498266Sopenharmony_ci#include "curl_get_line.h"
2613498266Sopenharmony_ci
2713498266Sopenharmony_ci#if !defined(CURL_DISABLE_COOKIES) || !defined(CURL_DISABLE_ALTSVC) ||  \
2813498266Sopenharmony_ci  !defined(CURL_DISABLE_HSTS) || !defined(CURL_DISABLE_NETRC)
2913498266Sopenharmony_ci
3013498266Sopenharmony_ci/* The test XML does not supply a way to write files without newlines
3113498266Sopenharmony_ci * so we write our own
3213498266Sopenharmony_ci */
3313498266Sopenharmony_ci
3413498266Sopenharmony_ci#define C64 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
3513498266Sopenharmony_ci#define C256 C64 C64 C64 C64
3613498266Sopenharmony_ci#define C1024 C256 C256 C256 C256
3713498266Sopenharmony_ci#define C4096 C1024 C1024 C1024 C1024
3813498266Sopenharmony_ci
3913498266Sopenharmony_cistatic CURLcode unit_setup(void)
4013498266Sopenharmony_ci{
4113498266Sopenharmony_ci  return CURLE_OK;
4213498266Sopenharmony_ci}
4313498266Sopenharmony_ci
4413498266Sopenharmony_cistatic CURLcode unit_stop(void)
4513498266Sopenharmony_ci{
4613498266Sopenharmony_ci  return CURLE_OK;
4713498266Sopenharmony_ci}
4813498266Sopenharmony_ci
4913498266Sopenharmony_ci#ifdef __GNUC__
5013498266Sopenharmony_ci#pragma GCC diagnostic push
5113498266Sopenharmony_ci#pragma GCC diagnostic ignored "-Woverlength-strings"
5213498266Sopenharmony_ci#endif
5313498266Sopenharmony_ci
5413498266Sopenharmony_ci#define NUMTESTS 6
5513498266Sopenharmony_cistatic const char *filecontents[] = {
5613498266Sopenharmony_ci  /* Both should be read */
5713498266Sopenharmony_ci  "LINE1\n"
5813498266Sopenharmony_ci  "LINE2 NEWLINE\n",
5913498266Sopenharmony_ci
6013498266Sopenharmony_ci  /* Both should be read */
6113498266Sopenharmony_ci  "LINE1\n"
6213498266Sopenharmony_ci  "LINE2 NONEWLINE",
6313498266Sopenharmony_ci
6413498266Sopenharmony_ci  /* Only first should be read */
6513498266Sopenharmony_ci  "LINE1\n"
6613498266Sopenharmony_ci  C4096,
6713498266Sopenharmony_ci
6813498266Sopenharmony_ci  /* First line should be read */
6913498266Sopenharmony_ci  "LINE1\n"
7013498266Sopenharmony_ci  C4096 "SOME EXTRA TEXT",
7113498266Sopenharmony_ci
7213498266Sopenharmony_ci  /* First and third line should be read */
7313498266Sopenharmony_ci  "LINE1\n"
7413498266Sopenharmony_ci  C4096 "SOME EXTRA TEXT\n"
7513498266Sopenharmony_ci  "LINE3\n",
7613498266Sopenharmony_ci
7713498266Sopenharmony_ci  "LINE1\x1aTEST"
7813498266Sopenharmony_ci};
7913498266Sopenharmony_ci
8013498266Sopenharmony_ci#ifdef __GNUC__
8113498266Sopenharmony_ci#pragma GCC diagnostic warning "-Woverlength-strings"
8213498266Sopenharmony_ci#endif
8313498266Sopenharmony_ci
8413498266Sopenharmony_ci
8513498266Sopenharmony_ciUNITTEST_START
8613498266Sopenharmony_ci  size_t i;
8713498266Sopenharmony_ci  for(i = 0; i < NUMTESTS; i++) {
8813498266Sopenharmony_ci    FILE *fp;
8913498266Sopenharmony_ci    char buf[4096];
9013498266Sopenharmony_ci    int len = 4096;
9113498266Sopenharmony_ci    char *line;
9213498266Sopenharmony_ci
9313498266Sopenharmony_ci    fp = fopen(arg, "wb");
9413498266Sopenharmony_ci    abort_unless(fp != NULL, "Cannot open testfile");
9513498266Sopenharmony_ci    fwrite(filecontents[i], 1, strlen(filecontents[i]), fp);
9613498266Sopenharmony_ci    fclose(fp);
9713498266Sopenharmony_ci
9813498266Sopenharmony_ci    fp = fopen(arg, "rb");
9913498266Sopenharmony_ci    abort_unless(fp != NULL, "Cannot open testfile");
10013498266Sopenharmony_ci
10113498266Sopenharmony_ci    fprintf(stderr, "Test %zd...", i);
10213498266Sopenharmony_ci    switch(i) {
10313498266Sopenharmony_ci      case 0:
10413498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
10513498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE1\n", line),
10613498266Sopenharmony_ci          "First line failed (1)");
10713498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
10813498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE2 NEWLINE\n", line),
10913498266Sopenharmony_ci          "Second line failed (1)");
11013498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
11113498266Sopenharmony_ci        abort_unless(line == NULL, "Missed EOF (1)");
11213498266Sopenharmony_ci        break;
11313498266Sopenharmony_ci      case 1:
11413498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
11513498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE1\n", line),
11613498266Sopenharmony_ci          "First line failed (2)");
11713498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
11813498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE2 NONEWLINE\n", line),
11913498266Sopenharmony_ci          "Second line failed (2)");
12013498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
12113498266Sopenharmony_ci        abort_unless(line == NULL, "Missed EOF (2)");
12213498266Sopenharmony_ci        break;
12313498266Sopenharmony_ci      case 2:
12413498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
12513498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE1\n", line),
12613498266Sopenharmony_ci          "First line failed (3)");
12713498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
12813498266Sopenharmony_ci        fail_unless(line == NULL,
12913498266Sopenharmony_ci          "Did not detect max read on EOF (3)");
13013498266Sopenharmony_ci        break;
13113498266Sopenharmony_ci      case 3:
13213498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
13313498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE1\n", line),
13413498266Sopenharmony_ci          "First line failed (4)");
13513498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
13613498266Sopenharmony_ci        fail_unless(line == NULL,
13713498266Sopenharmony_ci          "Did not ignore partial on EOF (4)");
13813498266Sopenharmony_ci        break;
13913498266Sopenharmony_ci      case 4:
14013498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
14113498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE1\n", line),
14213498266Sopenharmony_ci          "First line failed (5)");
14313498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
14413498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE3\n", line),
14513498266Sopenharmony_ci          "Third line failed (5)");
14613498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
14713498266Sopenharmony_ci        abort_unless(line == NULL, "Missed EOF (5)");
14813498266Sopenharmony_ci        break;
14913498266Sopenharmony_ci      case 5:
15013498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
15113498266Sopenharmony_ci        fail_unless(line && !strcmp("LINE1\x1aTEST\n", line),
15213498266Sopenharmony_ci          "Missed/Misinterpreted ^Z (6)");
15313498266Sopenharmony_ci        line = Curl_get_line(buf, len, fp);
15413498266Sopenharmony_ci        abort_unless(line == NULL, "Missed EOF (6)");
15513498266Sopenharmony_ci        break;
15613498266Sopenharmony_ci      default:
15713498266Sopenharmony_ci        abort_unless(1, "Unknown case");
15813498266Sopenharmony_ci        break;
15913498266Sopenharmony_ci    }
16013498266Sopenharmony_ci    fclose(fp);
16113498266Sopenharmony_ci    fprintf(stderr, "OK\n");
16213498266Sopenharmony_ci  }
16313498266Sopenharmony_ciUNITTEST_STOP
16413498266Sopenharmony_ci
16513498266Sopenharmony_ci#ifdef __GNUC__
16613498266Sopenharmony_ci#pragma GCC diagnostic pop
16713498266Sopenharmony_ci#endif
16813498266Sopenharmony_ci
16913498266Sopenharmony_ci#else
17013498266Sopenharmony_cistatic CURLcode unit_setup(void)
17113498266Sopenharmony_ci{
17213498266Sopenharmony_ci  return CURLE_OK;
17313498266Sopenharmony_ci}
17413498266Sopenharmony_cistatic void unit_stop(void)
17513498266Sopenharmony_ci{
17613498266Sopenharmony_ci}
17713498266Sopenharmony_ciUNITTEST_START
17813498266Sopenharmony_ciUNITTEST_STOP
17913498266Sopenharmony_ci
18013498266Sopenharmony_ci#endif
181