// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:http_io/http_io.dart';
import 'package:http_io/src/http_headers_impl.dart';
import 'package:test/test.dart';

void testMultiValue() {
  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  expect(headers[HttpHeaders.PRAGMA], isNull);
  headers.add(HttpHeaders.PRAGMA, "pragma1");
  expect(1, equals(headers[HttpHeaders.PRAGMA].length));
  expect(1, equals(headers["pragma"].length));
  expect(1, equals(headers["Pragma"].length));
  expect(1, equals(headers["PRAGMA"].length));
  expect("pragma1", equals(headers.value(HttpHeaders.PRAGMA)));

  headers.add(HttpHeaders.PRAGMA, "pragma2");
  expect(2, equals(headers[HttpHeaders.PRAGMA].length));
  expect(() => headers.value(HttpHeaders.PRAGMA), throwsA(isException));

  headers.add(HttpHeaders.PRAGMA, ["pragma3", "pragma4"]);
  expect(["pragma1", "pragma2", "pragma3", "pragma4"],
      equals(headers[HttpHeaders.PRAGMA]));

  headers.remove(HttpHeaders.PRAGMA, "pragma3");
  expect(3, equals(headers[HttpHeaders.PRAGMA].length));
  expect(
      ["pragma1", "pragma2", "pragma4"], equals(headers[HttpHeaders.PRAGMA]));

  headers.remove(HttpHeaders.PRAGMA, "pragma3");
  expect(3, equals(headers[HttpHeaders.PRAGMA].length));

  headers.set(HttpHeaders.PRAGMA, "pragma5");
  expect(1, equals(headers[HttpHeaders.PRAGMA].length));

  headers.set(HttpHeaders.PRAGMA, ["pragma6", "pragma7"]);
  expect(2, equals(headers[HttpHeaders.PRAGMA].length));

  headers.removeAll(HttpHeaders.PRAGMA);
  expect(headers[HttpHeaders.PRAGMA], isNull);
}

void testDate() {
  DateTime date1 = new DateTime.utc(1999, DateTime.june, 11, 18, 46, 53, 0);
  String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT";
  DateTime date2 = new DateTime.utc(2000, DateTime.august, 16, 12, 34, 56, 0);
  String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT";

  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  expect(headers.date, isNull);
  headers.date = date1;
  expect(date1, headers.date);
  expect(httpDate1, headers.value(HttpHeaders.DATE));
  expect(1, headers[HttpHeaders.DATE].length);
  headers.add(HttpHeaders.DATE, httpDate2);
  expect(1, headers[HttpHeaders.DATE].length);
  expect(date2, headers.date);
  expect(httpDate2, headers.value(HttpHeaders.DATE));
  headers.set(HttpHeaders.DATE, httpDate1);
  expect(1, headers[HttpHeaders.DATE].length);
  expect(date1, headers.date);
  expect(httpDate1, headers.value(HttpHeaders.DATE));

  headers.set(HttpHeaders.DATE, "xxx");
  expect("xxx", headers.value(HttpHeaders.DATE));
  expect(null, headers.date);
}

void testExpires() {
  DateTime date1 = new DateTime.utc(1999, DateTime.june, 11, 18, 46, 53, 0);
  String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT";
  DateTime date2 = new DateTime.utc(2000, DateTime.august, 16, 12, 34, 56, 0);
  String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT";

  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  expect(headers.expires, isNull);
  headers.expires = date1;
  expect(date1, headers.expires);
  expect(httpDate1, headers.value(HttpHeaders.EXPIRES));
  expect(1, headers[HttpHeaders.EXPIRES].length);
  headers.add(HttpHeaders.EXPIRES, httpDate2);
  expect(1, headers[HttpHeaders.EXPIRES].length);
  expect(date2, headers.expires);
  expect(httpDate2, headers.value(HttpHeaders.EXPIRES));
  headers.set(HttpHeaders.EXPIRES, httpDate1);
  expect(1, headers[HttpHeaders.EXPIRES].length);
  expect(date1, headers.expires);
  expect(httpDate1, headers.value(HttpHeaders.EXPIRES));

  headers.set(HttpHeaders.EXPIRES, "xxx");
  expect("xxx", headers.value(HttpHeaders.EXPIRES));
  expect(null, headers.expires);
}

void testIfModifiedSince() {
  DateTime date1 = new DateTime.utc(1999, DateTime.june, 11, 18, 46, 53, 0);
  String httpDate1 = "Fri, 11 Jun 1999 18:46:53 GMT";
  DateTime date2 = new DateTime.utc(2000, DateTime.august, 16, 12, 34, 56, 0);
  String httpDate2 = "Wed, 16 Aug 2000 12:34:56 GMT";

  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  expect(headers.ifModifiedSince, isNull);
  headers.ifModifiedSince = date1;
  expect(date1, headers.ifModifiedSince);
  expect(httpDate1, headers.value(HttpHeaders.IF_MODIFIED_SINCE));
  expect(1, headers[HttpHeaders.IF_MODIFIED_SINCE].length);
  headers.add(HttpHeaders.IF_MODIFIED_SINCE, httpDate2);
  expect(1, headers[HttpHeaders.IF_MODIFIED_SINCE].length);
  expect(date2, headers.ifModifiedSince);
  expect(httpDate2, headers.value(HttpHeaders.IF_MODIFIED_SINCE));
  headers.set(HttpHeaders.IF_MODIFIED_SINCE, httpDate1);
  expect(1, headers[HttpHeaders.IF_MODIFIED_SINCE].length);
  expect(date1, headers.ifModifiedSince);
  expect(httpDate1, headers.value(HttpHeaders.IF_MODIFIED_SINCE));

  headers.set(HttpHeaders.IF_MODIFIED_SINCE, "xxx");
  expect("xxx", headers.value(HttpHeaders.IF_MODIFIED_SINCE));
  expect(null, headers.ifModifiedSince);
}

void testHost() {
  String host = "www.google.com";
  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  expect(headers.host, isNull);
  expect(headers.port, isNull);
  headers.host = host;
  expect(host, headers.value(HttpHeaders.HOST));
  headers.port = 1234;
  expect("$host:1234", headers.value(HttpHeaders.HOST));
  headers.port = HttpClient.DEFAULT_HTTP_PORT;
  expect(host, headers.value(HttpHeaders.HOST));

  headers = new HttpHeadersImpl("1.1");
  headers.add(HttpHeaders.HOST, host);
  expect(host, headers.host);
  expect(HttpClient.DEFAULT_HTTP_PORT, headers.port);
  headers.add(HttpHeaders.HOST, "$host:4567");
  expect(1, headers[HttpHeaders.HOST].length);
  expect(host, headers.host);
  expect(4567, headers.port);

  headers = new HttpHeadersImpl("1.1");
  headers.add(HttpHeaders.HOST, "$host:xxx");
  expect("$host:xxx", headers.value(HttpHeaders.HOST));
  expect(host, headers.host);
  expect(headers.port, isNull);

  headers = new HttpHeadersImpl("1.1");
  headers.add(HttpHeaders.HOST, ":1234");
  expect(":1234", headers.value(HttpHeaders.HOST));
  expect(headers.host, isNull);
  expect(1234, headers.port);
}

void testTransferEncoding() {
  expectChunked(headers) {
    expect(headers['transfer-encoding'], ['chunked']);
    expect(headers.chunkedTransferEncoding, isTrue);
  }

  expectNonChunked(headers) {
    expect(headers['transfer-encoding'], isNull);
    expect(headers.chunkedTransferEncoding, isFalse);
  }

  HttpHeadersImpl headers;

  headers = new HttpHeadersImpl("1.1");
  headers.chunkedTransferEncoding = true;
  expectChunked(headers);
  headers.set('transfer-encoding', ['chunked']);
  expectChunked(headers);

  headers = new HttpHeadersImpl("1.1");
  headers.set('transfer-encoding', ['chunked']);
  expectChunked(headers);
  headers.chunkedTransferEncoding = true;
  expectChunked(headers);

  headers = new HttpHeadersImpl("1.1");
  headers.chunkedTransferEncoding = true;
  headers.chunkedTransferEncoding = false;
  expectNonChunked(headers);

  headers = new HttpHeadersImpl("1.1");
  headers.chunkedTransferEncoding = true;
  headers.remove('transfer-encoding', 'chunked');
  expectNonChunked(headers);

  headers = new HttpHeadersImpl("1.1");
  headers.set('transfer-encoding', ['chunked']);
  headers.chunkedTransferEncoding = false;
  expectNonChunked(headers);

  headers = new HttpHeadersImpl("1.1");
  headers.set('transfer-encoding', ['chunked']);
  headers.remove('transfer-encoding', 'chunked');
  expectNonChunked(headers);
}

void testEnumeration() {
  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  expect(headers[HttpHeaders.PRAGMA], isNull);
  headers.add("My-Header-1", "value 1");
  headers.add("My-Header-2", "value 2");
  headers.add("My-Header-1", "value 3");
  bool myHeader1 = false;
  bool myHeader2 = false;
  int totalValues = 0;
  headers.forEach((String name, List<String> values) {
    totalValues += values.length;
    if (name == "my-header-1") {
      myHeader1 = true;
      expect(values.indexOf("value 1") != -1, isTrue);
      expect(values.indexOf("value 3") != -1, isTrue);
    }
    if (name == "my-header-2") {
      myHeader2 = true;
      expect(values.indexOf("value 2") != -1, isTrue);
    }
  });
  expect(myHeader1, isTrue);
  expect(myHeader2, isTrue);
  expect(3, totalValues);
}

void testHeaderValue() {
  void check(HeaderValue headerValue, String value,
      [Map<String, String> parameters]) {
    expect(value, headerValue.value);
    if (parameters != null) {
      expect(parameters.length, headerValue.parameters.length);
      parameters.forEach((String name, String value) {
        expect(value, headerValue.parameters[name]);
      });
    } else {
      expect(0, headerValue.parameters.length);
    }
  }

  HeaderValue headerValue;
  headerValue =
      HeaderValue.parse("xxx; aaa=bbb; ccc=\"\\\";\\a\"; ddd=\"    \"");
  check(headerValue, "xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": "    "});
  headerValue =
      new HeaderValue("xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": "    "});
  check(headerValue, "xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": "    "});

  headerValue = HeaderValue.parse("attachment; filename=genome.jpeg;"
      "modification-date=\"Wed, 12 February 1997 16:29:51 -0500\"");
  var parameters = {
    "filename": "genome.jpeg",
    "modification-date": "Wed, 12 February 1997 16:29:51 -0500"
  };
  check(headerValue, "attachment", parameters);
  headerValue = new HeaderValue("attachment", parameters);
  check(headerValue, "attachment", parameters);
  headerValue = HeaderValue.parse("  attachment  ;filename=genome.jpeg  ;"
      "modification-date = \"Wed, 12 February 1997 16:29:51 -0500\"");
  check(headerValue, "attachment", parameters);
  headerValue = HeaderValue.parse("xxx; aaa; bbb; ccc");
  check(headerValue, "xxx", {"aaa": null, "bbb": null, "ccc": null});
}

void testContentType() {
  void check(ContentType contentType, String primaryType, String subType,
      [Map<String, String> parameters]) {
    expect(primaryType, contentType.primaryType);
    expect(subType, contentType.subType);
    expect("$primaryType/$subType", contentType.value);
    if (parameters != null) {
      expect(parameters.length, contentType.parameters.length);
      parameters.forEach((String name, String value) {
        expect(value, contentType.parameters[name]);
      });
    } else {
      expect(0, contentType.parameters.length);
    }
  }

  ContentType contentType;
  contentType = new ContentType("", "");
  expect("", contentType.primaryType);
  expect("", contentType.subType);
  expect("/", contentType.value);
  expect(
      () => contentType.parameters["xxx"] = "yyy", throwsA(isUnsupportedError));

  contentType = ContentType.parse("text/html");
  check(contentType, "text", "html");
  expect("text/html", contentType.toString());
  contentType = new ContentType("text", "html", charset: "utf-8");
  check(contentType, "text", "html", {"charset": "utf-8"});
  expect("text/html; charset=utf-8", contentType.toString());
  expect(
      () => contentType.parameters["xxx"] = "yyy", throwsA(isUnsupportedError));

  contentType = new ContentType("text", "html",
      parameters: {"CHARSET": "UTF-8", "xxx": "YYY"});
  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "YYY"});
  String s = contentType.toString();
  bool expectedToString = (s == "text/html; charset=utf-8; xxx=YYY" ||
      s == "text/html; xxx=YYY; charset=utf-8");
  expect(expectedToString, isTrue);
  contentType = ContentType.parse("text/html; CHARSET=UTF-8; xxx=YYY");
  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "YYY"});
  expect(
      () => contentType.parameters["xxx"] = "yyy", throwsA(isUnsupportedError));

  contentType = new ContentType("text", "html",
      charset: "ISO-8859-1", parameters: {"CHARSET": "UTF-8", "xxx": "yyy"});
  check(contentType, "text", "html", {"charset": "iso-8859-1", "xxx": "yyy"});
  s = contentType.toString();
  expectedToString = (s == "text/html; charset=iso-8859-1; xxx=yyy" ||
      s == "text/html; xxx=yyy; charset=iso-8859-1");
  expect(expectedToString, isTrue);

  contentType = ContentType.parse("text/html");
  check(contentType, "text", "html");
  contentType = ContentType.parse(" text/html  ");
  check(contentType, "text", "html");
  contentType = ContentType.parse("text/html; charset=utf-8");
  check(contentType, "text", "html", {"charset": "utf-8"});
  contentType = ContentType.parse("  text/html  ;  charset  =  utf-8  ");
  check(contentType, "text", "html", {"charset": "utf-8"});
  contentType = ContentType.parse("text/html; charset=utf-8; xxx=yyy");
  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
  contentType =
      ContentType.parse("  text/html  ;  charset  =  utf-8  ;  xxx=yyy  ");
  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
  contentType = ContentType.parse('text/html; charset=utf-8; xxx="yyy"');
  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
  contentType =
      ContentType.parse("  text/html  ;  charset  =  utf-8  ;  xxx=yyy  ");
  check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});

  contentType = ContentType.parse("text/html; charset=;");
  check(contentType, "text", "html", {"charset": null});
  contentType = ContentType.parse("text/html; charset;");
  check(contentType, "text", "html", {"charset": null});

  // Test builtin content types.
  check(ContentType.TEXT, "text", "plain", {"charset": "utf-8"});
  check(ContentType.HTML, "text", "html", {"charset": "utf-8"});
  check(ContentType.JSON, "application", "json", {"charset": "utf-8"});
  check(ContentType.BINARY, "application", "octet-stream");
}

void testKnownContentTypes() {
  // Well known content types used by the VM service.
  ContentType.parse('text/html; charset=UTF-8');
  ContentType.parse('application/dart; charset=UTF-8');
  ContentType.parse('application/javascript; charset=UTF-8');
  ContentType.parse('text/css; charset=UTF-8');
  ContentType.parse('image/gif');
  ContentType.parse('image/png');
  ContentType.parse('image/jpeg');
  ContentType.parse('image/jpeg');
  ContentType.parse('image/svg+xml');
  ContentType.parse('text/plain');
}

void testContentTypeCache() {
  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  headers.set(HttpHeaders.CONTENT_TYPE, "text/html");
  expect("text", headers.contentType.primaryType);
  expect("html", headers.contentType.subType);
  expect("text/html", headers.contentType.value);
  headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=utf-8");
  expect("text", headers.contentType.primaryType);
  expect("plain", headers.contentType.subType);
  expect("text/plain", headers.contentType.value);
  headers.removeAll(HttpHeaders.CONTENT_TYPE);
  expect(headers.contentType, isNull);
}

void testCookie() {
  test(String name, String value) {
    void checkCookiesEquals(a, b) {
      expect(a.name, b.name);
      expect(a.value, b.value);
      expect(a.expires, b.expires);
      expect(a.toString(), b.toString());
    }

    void checkCookie(cookie, s) {
      expect(s, cookie.toString());
      var c = new Cookie.fromSetCookieValue(s);
      checkCookiesEquals(cookie, c);
    }

    Cookie cookie;
    cookie = new Cookie(name, value);
    expect("$name=$value; HttpOnly", cookie.toString());
    DateTime date = new DateTime.utc(2014, DateTime.january, 5, 23, 59, 59, 0);
    cookie.expires = date;
    checkCookie(
        cookie,
        "$name=$value"
        "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
        "; HttpOnly");
    cookie.maxAge = 567;
    checkCookie(
        cookie,
        "$name=$value"
        "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
        "; Max-Age=567"
        "; HttpOnly");
    cookie.domain = "example.com";
    checkCookie(
        cookie,
        "$name=$value"
        "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
        "; Max-Age=567"
        "; Domain=example.com"
        "; HttpOnly");
    cookie.path = "/xxx";
    checkCookie(
        cookie,
        "$name=$value"
        "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
        "; Max-Age=567"
        "; Domain=example.com"
        "; Path=/xxx"
        "; HttpOnly");
    cookie.secure = true;
    checkCookie(
        cookie,
        "$name=$value"
        "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
        "; Max-Age=567"
        "; Domain=example.com"
        "; Path=/xxx"
        "; Secure"
        "; HttpOnly");
    cookie.httpOnly = false;
    checkCookie(
        cookie,
        "$name=$value"
        "; Expires=Sun, 05 Jan 2014 23:59:59 GMT"
        "; Max-Age=567"
        "; Domain=example.com"
        "; Path=/xxx"
        "; Secure");
    cookie.expires = null;
    checkCookie(
        cookie,
        "$name=$value"
        "; Max-Age=567"
        "; Domain=example.com"
        "; Path=/xxx"
        "; Secure");
    cookie.maxAge = null;
    checkCookie(
        cookie,
        "$name=$value"
        "; Domain=example.com"
        "; Path=/xxx"
        "; Secure");
    cookie.domain = null;
    checkCookie(
        cookie,
        "$name=$value"
        "; Path=/xxx"
        "; Secure");
    cookie.path = null;
    checkCookie(
        cookie,
        "$name=$value"
        "; Secure");
    cookie.secure = false;
    checkCookie(cookie, "$name=$value");
  }

  test("name", "value");
  test("abc", "def");
  test("ABC", "DEF");
  test("Abc", "Def");
  test("SID", "sJdkjKSJD12343kjKj78");
}

void testInvalidCookie() {
  expect(() => new Cookie.fromSetCookieValue(""), throwsA(isException));
  expect(() => new Cookie.fromSetCookieValue("="), throwsA(isException));
  expect(() => new Cookie.fromSetCookieValue("=xxx"), throwsA(isException));
  expect(() => new Cookie.fromSetCookieValue("xxx"), throwsA(isException));
  expect(() => new Cookie.fromSetCookieValue("xxx=yyy; expires=12 jan 2013"),
      throwsA(isException));
  expect(
      () => new Cookie.fromSetCookieValue("x x = y y"), throwsA(isException));
  expect(() => new Cookie("[4", "y"), throwsA(isException));
  expect(() => new Cookie("4", "y\""), throwsA(isException));

  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  headers.set(
      'Cookie', 'DARTSESSID=d3d6fdd78d51aaaf2924c32e991f4349; undefined');
  expect('DARTSESSID', headers.parseCookies().single.name);
  expect(
      'd3d6fdd78d51aaaf2924c32e991f4349', headers.parseCookies().single.value);
}

void testHeaderLists() {
  HttpHeaders.GENERAL_HEADERS.forEach((x) => null);
  HttpHeaders.ENTITY_HEADERS.forEach((x) => null);
  HttpHeaders.RESPONSE_HEADERS.forEach((x) => null);
  HttpHeaders.REQUEST_HEADERS.forEach((x) => null);
}

void testInvalidFieldName() {
  void test(String field) {
    HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
    expect(() => headers.add(field, "value"), throwsA(isFormatException));
    expect(() => headers.set(field, "value"), throwsA(isFormatException));
    expect(() => headers.remove(field, "value"), throwsA(isFormatException));
    expect(() => headers.removeAll(field), throwsA(isFormatException));
  }

  test('\r');
  test('\n');
  test(',');
  test('test\x00');
}

void testInvalidFieldValue() {
  void test(value, {bool remove: true}) {
    HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
    expect(() => headers.add("field", value), throwsA(isFormatException));
    expect(() => headers.set("field", value), throwsA(isFormatException));
    if (remove) {
      expect(() => headers.remove("field", value), throwsA(isFormatException));
    }
  }

  test('\r');
  test('\n');
  test('test\x00');
  // Test we handle other types correctly.
  test(new StringBuffer('\x00'), remove: false);
}

void testClear() {
  HttpHeadersImpl headers = new HttpHeadersImpl("1.1");
  headers.add("a", "b");
  headers.contentLength = 7;
  headers.chunkedTransferEncoding = true;
  headers.clear();
  expect(headers["a"], isNull);
  expect(headers.contentLength, -1);
  expect(headers.chunkedTransferEncoding, isFalse);
}

main() {
  test('multiValue', testMultiValue);
  test('date', testDate);
  test('expires', testExpires);
  test('ifModifiedSince', testIfModifiedSince);
  test('host', testHost);
  test('transferEncoding', testTransferEncoding);
  test('enumeration', testEnumeration);
  test('headerValue', testHeaderValue);
  test('contentType', testContentType);
  test('knownContentTypes', testKnownContentTypes);
  test('contentTypeCache', testContentTypeCache);
  test('cookie', testCookie);
  test('invalidCookie', testInvalidCookie);
  test('headerLists', testHeaderLists);
  test('invalidFieldName', testInvalidFieldName);
  test('invalidFieldValue', testInvalidFieldValue);
  test('clear', testClear);
}
