// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <errno.h>

#include "gtest/gtest.h"
#include "src/lib/fxl/macros.h"
#include "src/lib/url/third_party/mozilla/url_parse.h"
#include "src/lib/url/url_canon.h"
#include "src/lib/url/url_canon_internal.h"
#include "src/lib/url/url_canon_stdstring.h"
#include "src/lib/url/url_test_utils.h"

namespace url {

namespace {

struct ComponentCase {
  const char* input;
  const char* expected;
  Component expected_component;
  bool expected_success;
};

// ComponentCase but with dual 8-bit/16-bit input. Generally, the unit tests
// treat each input as optional, and will only try processing if non-NULL.
// The output is always 8-bit.
struct DualComponentCase {
  const char* input8;
  const char* expected;
  Component expected_component;
  bool expected_success;
};

// Test cases for CanonicalizeIPAddress(). The inputs are identical to
// DualComponentCase, but the output has extra CanonHostInfo fields.
struct IPAddressCase {
  const char* input8;
  const char* expected;
  Component expected_component;

  // CanonHostInfo fields, for verbose output.
  CanonHostInfo::Family expected_family;
  int expected_num_ipv4_components;
  const char* expected_address_hex;  // Two hex chars per IP address byte.
};

std::string BytesToHexString(unsigned char bytes[16], size_t length) {
  EXPECT_TRUE(length == 0 || length == 4 || length == 16)
      << "Bad IP address length: " << length;
  std::string result;
  for (size_t i = 0; i < length; ++i) {
    result.push_back(kHexCharLookup[(bytes[i] >> 4) & 0xf]);
    result.push_back(kHexCharLookup[bytes[i] & 0xf]);
  }
  return result;
}

}  // namespace

TEST(URLCanonTest, DoAppendUTF8) {
  struct UTF8Case {
    unsigned input;
    const char* output;
  } utf_cases[] = {
      // Valid code points.
      {0x24, "\x24"},
      {0xA2, "\xC2\xA2"},
      {0x20AC, "\xE2\x82\xAC"},
      {0x24B62, "\xF0\xA4\xAD\xA2"},
      {0x10FFFF, "\xF4\x8F\xBF\xBF"},
  };
  std::string out_str;
  for (const auto& utf_case : utf_cases) {
    out_str.clear();
    StdStringCanonOutput output(&out_str);
    AppendUTF8Value(utf_case.input, &output);
    output.Complete();
    EXPECT_EQ(utf_case.output, out_str);
  }
}

#if defined(GTEST_HAS_DEATH_TEST)
// TODO(mattm): Can't run this in debug mode for now, since the DCHECK will
// cause the Chromium stack trace dialog to appear and hang the test.
// See http://crbug.com/49580.
#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
#define MAYBE_DoAppendUTF8Invalid DoAppendUTF8Invalid
#else
#define MAYBE_DoAppendUTF8Invalid DISABLED_DoAppendUTF8Invalid
#endif
TEST(URLCanonTest, MAYBE_DoAppendUTF8Invalid) {
  std::string out_str;
  StdStringCanonOutput output(&out_str);
  // Invalid code point (too large).
  ASSERT_DEBUG_DEATH(
      {
        AppendUTF8Value(0x110000, &output);
        output.Complete();
        EXPECT_EQ("", out_str);
      },
      "");
}
#endif  // defined(GTEST_HAS_DEATH_TEST)

TEST(URLCanonTest, UTF) {
  // Low-level test that we handle reading, canonicalization, and writing
  // UTF-8/UTF-16 strings properly.
  struct UTFCase {
    const char* input8;
    bool expected_success;
    const char* output;
  } utf_cases[] = {
      // Valid canonical input should get passed through & escaped.
      {"\xe4\xbd\xa0\xe5\xa5\xbd", true, "%E4%BD%A0%E5%A5%BD"},
      // Test a character that takes > 16 bits (U+10300 = old italic letter A)
      {"\xF0\x90\x8C\x80", true, "%F0%90%8C%80"},
      // Non-shortest-form UTF-8 characters are invalid. The bad character
      // should be replaced with the invalid character (EF BF DB in UTF-8).
      {"\xf0\x84\xbd\xa0\xe5\xa5\xbd", false, "%EF%BF%BD%E5%A5%BD"},
      // Invalid UTF-8 sequences should be marked as invalid (the first
      // sequence is truncated).
      {"\xe4\xa0\xe5\xa5\xbd", false, "%EF%BF%BD%E5%A5%BD"},
      // Character going off the end.
      {"\xe4\xbd\xa0\xe5\xa5", false, "%E4%BD%A0%EF%BF%BD"},
      // ...same with low surrogates with no high surrogate.
      {"\xed\xb0\x80", false, "%EF%BF%BD"},
      // Test a UTF-8 encoded surrogate value is marked as invalid.
      // ED A0 80 = U+D800
      {"\xed\xa0\x80", false, "%EF%BF%BD"},
  };

  std::string out_str;
  for (const auto& utf_case : utf_cases) {
    out_str.clear();
    StdStringCanonOutput output(&out_str);

    size_t input_len = strlen(utf_case.input8);
    bool success = true;
    for (size_t ch = 0; ch < input_len; ch++) {
      success &=
          AppendUTF8EscapedChar(utf_case.input8, &ch, input_len, &output);
    }
    output.Complete();
    EXPECT_EQ(utf_case.expected_success, success);
    EXPECT_EQ(std::string(utf_case.output), out_str);
  }
}

TEST(URLCanonTest, Scheme) {
  // Here, we're mostly testing that unusual characters are handled properly.
  // The canonicalizer doesn't do any parsing or whitespace detection. It will
  // also do its best on error, and will escape funny sequences (these won't be
  // valid schemes and it will return error).
  //
  // Note that the canonicalizer will append a colon to the output to separate
  // out the rest of the URL, which is not present in the input. We check,
  // however, that the output range includes everything but the colon.
  ComponentCase scheme_cases[] = {
      {"http", "http:", Component(0, 4), true},
      {"HTTP", "http:", Component(0, 4), true},
      {" HTTP ", "%20http%20:", Component(0, 10), false},
      {"htt: ", "htt%3A%20:", Component(0, 9), false},
      {"\xe4\xbd\xa0\xe5\xa5\xbdhttp",
       "%E4%BD%A0%E5%A5%BDhttp:", Component(0, 22), false},
      // Don't re-escape something already escaped. Note that it will
      // "canonicalize" the 'A' to 'a', but that's OK.
      {"ht%3Atp", "ht%3atp:", Component(0, 7), false},
  };

  std::string out_str;

  for (const auto& scheme_case : scheme_cases) {
    size_t url_len = strlen(scheme_case.input);
    Component in_comp(0, url_len);
    Component out_comp;

    out_str.clear();
    StdStringCanonOutput output1(&out_str);
    bool success =
        CanonicalizeScheme(scheme_case.input, in_comp, &output1, &out_comp);
    output1.Complete();

    EXPECT_EQ(scheme_case.expected_success, success);
    EXPECT_EQ(std::string(scheme_case.expected), out_str);
    EXPECT_EQ(scheme_case.expected_component.begin, out_comp.begin);
    EXPECT_EQ(scheme_case.expected_component.len(), out_comp.len());
  }

  // Test the case where the scheme is declared nonexistent, it should be
  // converted into an empty scheme.
  Component out_comp;
  out_str.clear();
  StdStringCanonOutput output(&out_str);

  EXPECT_TRUE(CanonicalizeScheme("", Component(false), &output, &out_comp));
  output.Complete();

  EXPECT_EQ(std::string(":"), out_str);
  EXPECT_EQ(0U, out_comp.begin);
  EXPECT_EQ(0U, out_comp.len());
}

TEST(URLCanonTest, Host) {
  IPAddressCase host_cases[] = {
      // Basic canonicalization, uppercase should be converted to lowercase.
      {"GoOgLe.CoM", "google.com", Component(0, 10), CanonHostInfo::NEUTRAL, -1,
       ""},
      // Spaces and some other characters should be escaped.
      {"Goo%20 goo%7C|.com", "goo%20%20goo%7C%7C.com", Component(0, 22),
       CanonHostInfo::NEUTRAL, -1, ""},
      // Exciting different types of spaces!
      {NULL, "goo%20%20goo.com", Component(0, 16), CanonHostInfo::NEUTRAL, -1,
       ""},
      // Other types of space (no-break, zero-width, zero-width-no-break) are
      // name-prepped away to nothing.
      {NULL, "googoo.com", Component(0, 10), CanonHostInfo::NEUTRAL, -1, ""},
      // Ideographic full stop (full-width period for Chinese, etc.) should be
      // treated as a dot.
      {NULL, "www.foo.bar.com", Component(0, 15), CanonHostInfo::NEUTRAL, -1,
       ""},
      // Invalid unicode characters should fail...
      // ...In wide input, ICU will barf and we'll end up with the input as
      //    escaped UTF-8 (the invalid character should be replaced with the
      //    replacement character).
      {"\xef\xb7\x90zyx.com", "%EF%BF%BDzyx.com", Component(0, 16),
       CanonHostInfo::BROKEN, -1, ""},
      // ...This is the same as previous but with with escaped.
      {"%ef%b7%90zyx.com", "%EF%BF%BDzyx.com", Component(0, 16),
       CanonHostInfo::BROKEN, -1, ""},
      // Test name prepping, fullwidth input should be converted to ASCII and
      // NOT
      // IDN-ized. This is "Go" in fullwidth UTF-8/UTF-16.
      {"\xef\xbc\xa7\xef\xbd\x8f.com", "go.com", Component(0, 6),
       CanonHostInfo::NEUTRAL, -1, ""},
      // Test that fullwidth escaped values are properly name-prepped,
      // then converted or rejected.
      // ...%41 in fullwidth = 'A' (also as escaped UTF-8 input)
      {"\xef\xbc\x85\xef\xbc\x94\xef\xbc\x91.com", "a.com", Component(0, 5),
       CanonHostInfo::NEUTRAL, -1, ""},
      {"%ef%bc%85%ef%bc%94%ef%bc%91.com", "a.com", Component(0, 5),
       CanonHostInfo::NEUTRAL, -1, ""},
      // ...%00 in fullwidth should fail (also as escaped UTF-8 input)
      {"\xef\xbc\x85\xef\xbc\x90\xef\xbc\x90.com", "%00.com", Component(0, 7),
       CanonHostInfo::BROKEN, -1, ""},
      {"%ef%bc%85%ef%bc%90%ef%bc%90.com", "%00.com", Component(0, 7),
       CanonHostInfo::BROKEN, -1, ""},
      // Basic IDN support, UTF-8 and UTF-16 input should be converted to IDN
      {"\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd", "xn--6qqa088eba",
       Component(0, 14), CanonHostInfo::NEUTRAL, -1, ""},
      // See http://unicode.org/cldr/utility/idna.jsp for other
      // examples/experiments and http://goo.gl/7yG11o
      // for the full list of characters handled differently by
      // IDNA 2003, UTS 46 (http://unicode.org/reports/tr46/ ) and IDNA 2008.

      // 4 Deviation characters are mapped/ignored in UTS 46 transitional
      // mechansm. UTS 46, table 4 row (g).
      // Sharp-s is mapped to 'ss' in UTS 46 and IDNA 2003.
      // Otherwise, it'd be "xn--fuball-cta.de".
      {"fu\xc3\x9f"
       "ball.de",
       "fussball.de", Component(0, 11), CanonHostInfo::NEUTRAL, -1, ""},
      // Final-sigma (U+03C3) is mapped to regular sigma (U+03C2).
      // Otherwise, it'd be "xn--wxaijb9b".
      {"\xcf\x83\xcf\x8c\xce\xbb\xce\xbf\xcf\x82", "xn--wxaikc6b",
       Component(0, 12), CanonHostInfo::NEUTRAL, -1, ""},
      // ZWNJ (U+200C) and ZWJ (U+200D) are mapped away in UTS 46 transitional
      // handling as well as in IDNA 2003.
      {"a\xe2\x80\x8c"
       "b\xe2\x80\x8d"
       "c",
       "abc", Component(0, 3), CanonHostInfo::NEUTRAL, -1, ""},
      // ZWJ between Devanagari characters is still mapped away in UTS 46
      // transitional handling. IDNA 2008 would give xn--11bo0mv54g.
      {"\xe0\xa4\x95\xe0\xa5\x8d\xe2\x80\x8d\xe0\xa4\x9c", "xn--11bo0m",
       Component(0, 10), CanonHostInfo::NEUTRAL, -1, ""},
      // Fullwidth exclamation mark is disallowed. UTS 46, table 4, row (b)
      // However, we do allow this at the moment because we don't use
      // STD3 rules and canonicalize full-width ASCII to ASCII.
      {"wow\xef\xbc\x81", "wow%21", Component(0, 6), CanonHostInfo::NEUTRAL, -1,
       ""},
      // U+2132 (turned capital F) is disallowed. UTS 46, table 4, row (c)
      // Allowed in IDNA 2003, but the mapping changed after Unicode 3.2
      {"\xe2\x84\xb2oo", "%E2%84%B2oo", Component(0, 11), CanonHostInfo::BROKEN,
       -1, ""},
      // U+2F868 (CJK Comp) is disallowed. UTS 46, table 4, row (d)
      // Allowed in IDNA 2003, but the mapping changed after Unicode 3.2
      {"\xf0\xaf\xa1\xa8\xe5\xa7\xbb.cn", "%F0%AF%A1%A8%E5%A7%BB.cn",
       Component(0, 24), CanonHostInfo::BROKEN, -1, ""},
      // Maps uppercase letters to lower case letters. UTS 46 table 4 row (e)
      {"M\xc3\x9cNCHEN", "xn--mnchen-3ya", Component(0, 14),
       CanonHostInfo::NEUTRAL, -1, ""},
      // Symbol/punctuations are allowed in IDNA 2003/UTS46.
      // Not allowed in IDNA 2008. UTS 46 table 4 row (f).
      {"\xe2\x99\xa5ny.us", "xn--ny-s0x.us", Component(0, 13),
       CanonHostInfo::NEUTRAL, -1, ""},
      // U+11013 is new in Unicode 6.0 and is allowed. UTS 46 table 4, row (h)
      // We used to allow it because we passed through unassigned code points.
      {"\xf0\x91\x80\x93.com", "xn--n00d.com", Component(0, 12),
       CanonHostInfo::NEUTRAL, -1, ""},
      // U+0602 is disallowed in UTS46/IDNA 2008. UTS 46 table 4, row(i)
      // Used to be allowed in INDA 2003.
      {"\xd8\x82.eg", "%D8%82.eg", Component(0, 9), CanonHostInfo::BROKEN, -1,
       ""},
      // U+20B7 is new in Unicode 5.2 (not a part of IDNA 2003 based
      // on Unicode 3.2). We did allow it in the past because we let unassigned
      // code point pass. We continue to allow it even though it's a
      // "punctuation and symbol" blocked in IDNA 2008.
      // UTS 46 table 4, row (j)
      {"\xe2\x82\xb7.com", "xn--wzg.com", Component(0, 11),
       CanonHostInfo::NEUTRAL, -1, ""},
      // Maps uppercase letters to lower case letters.
      // In IDNA 2003, it's allowed without case-folding
      // ( xn--bc-7cb.com ) because it's not defined in Unicode 3.2
      // (added in Unicode 4.1). UTS 46 table 4 row (k)
      {"bc\xc8\xba.com", "xn--bc-is1a.com", Component(0, 15),
       CanonHostInfo::NEUTRAL, -1, ""},
      // BiDi check test
      // "Divehi" in Divehi (Thaana script) ends with BidiClass=NSM.
      // Disallowed in IDNA 2003 but now allowed in UTS 46/IDNA 2008.
      {"\xde\x8b\xde\xa8\xde\x88\xde\xac\xde\x80\xde\xa8", "xn--hqbpi0jcw",
       Component(0, 13), CanonHostInfo::NEUTRAL, -1, ""},
      // Disallowed in both IDNA 2003 and 2008 with BiDi check.
      // Labels starting with a RTL character cannot end with a LTR character.
      {"\xd8\xac\xd8\xa7\xd8\xb1xyz", "%D8%AC%D8%A7%D8%B1xyz", Component(0, 21),
       CanonHostInfo::BROKEN, -1, ""},
      // Labels starting with a RTL character can end with BC=EN (European
      // number). Disallowed in IDNA 2003 but now allowed.
      {"\xd8\xac\xd8\xa7\xd8\xb1"
       "2",
       "xn--2-ymcov", Component(0, 11), CanonHostInfo::NEUTRAL, -1, ""},
      // Labels starting with a RTL character cannot have "L" characters
      // even if it ends with an BC=EN. Disallowed in both IDNA 2003/2008.
      {"\xd8\xac\xd8\xa7\xd8\xb1xy2", "%D8%AC%D8%A7%D8%B1xy2", Component(0, 21),
       CanonHostInfo::BROKEN, -1, ""},
      // Labels starting with a RTL character can end with BC=AN (Arabic number)
      // Disallowed in IDNA 2003, but now allowed.
      {"\xd8\xac\xd8\xa7\xd8\xb1\xd9\xa2", "xn--mgbjq0r", Component(0, 11),
       CanonHostInfo::NEUTRAL, -1, ""},
      // Labels starting with a RTL character cannot have "L" characters
      // even if it ends with an BC=AN (Arabic number).
      // Disallowed in both IDNA 2003/2008.
      {"\xd8\xac\xd8\xa7\xd8\xb1xy\xd9\xa2", "%D8%AC%D8%A7%D8%B1xy%D9%A2",
       Component(0, 26), CanonHostInfo::BROKEN, -1, ""},
      // Labels starting with a RTL character cannot mix BC=EN and BC=AN
      {"\xd8\xac\xd8\xa7\xd8\xb1xy2\xd9\xa2", "%D8%AC%D8%A7%D8%B1xy2%D9%A2",
       Component(0, 27), CanonHostInfo::BROKEN, -1, ""},
      // As of Unicode 6.2, U+20CF is not assigned. We do not allow it.
      {"\xe2\x83\x8f.com", "%E2%83%8F.com", Component(0, 13),
       CanonHostInfo::BROKEN, -1, ""},
      // U+0080 is not allowed.
      {"\xc2\x80.com", "%C2%80.com", Component(0, 10), CanonHostInfo::BROKEN,
       -1, ""},
      // Mixed UTF-8 and escaped UTF-8 (narrow case) and UTF-16 and escaped
      // Mixed UTF-8 and escaped UTF-8 (narrow case) and UTF-16 and escaped
      // UTF-8 (wide case). The output should be equivalent to the true wide
      // character input above).
      {"%E4%BD%A0%E5%A5%BD\xe4\xbd\xa0\xe5\xa5\xbd", "xn--6qqa088eba",
       Component(0, 14), CanonHostInfo::NEUTRAL, -1, ""},
      // Invalid escaped characters should fail and the percents should be
      // escaped.
      {"%zz%66%a", "%25zzf%25a", Component(0, 10), CanonHostInfo::BROKEN, -1,
       ""},
      // If we get an invalid character that has been escaped.
      {"%25", "%25", Component(0, 3), CanonHostInfo::BROKEN, -1, ""},
      {"hello%00", "hello%00", Component(0, 8), CanonHostInfo::BROKEN, -1, ""},
      // Escaped numbers should be treated like IP addresses if they are.
      {"%30%78%63%30%2e%30%32%35%30.01", "192.168.0.1", Component(0, 11),
       CanonHostInfo::IPV4, 3, "C0A80001"},
      {"%30%78%63%30%2e%30%32%35%30.01%2e", "192.168.0.1", Component(0, 11),
       CanonHostInfo::IPV4, 3, "C0A80001"},
      // Invalid escaping should trigger the regular host error handling.
      {"%3g%78%63%30%2e%30%32%35%30%2E.01", "%253gxc0.0250..01",
       Component(0, 17), CanonHostInfo::BROKEN, -1, ""},
      // Something that isn't exactly an IP should get treated as a host and
      // spaces escaped.
      {"192.168.0.1 hello", "192.168.0.1%20hello", Component(0, 19),
       CanonHostInfo::NEUTRAL, -1, ""},
      // Fullwidth and escaped UTF-8 fullwidth should still be treated as IP.
      // These are "0Xc0.0250.01" in fullwidth.
      {"\xef\xbc\x90%Ef%bc\xb8%ef%Bd%83\xef\xbc\x90%EF%BC%"
       "8E\xef\xbc\x90\xef\xbc\x92\xef\xbc\x95\xef\xbc\x90\xef\xbc%"
       "8E\xef\xbc\x90\xef\xbc\x91",
       "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4, 3, "C0A80001"},
      // Broken IP addresses get marked as such.
      {"192.168.0.257", "192.168.0.257", Component(0, 13),
       CanonHostInfo::BROKEN, -1, ""},
      {"[google.com]", "[google.com]", Component(0, 12), CanonHostInfo::BROKEN,
       -1, ""},
      // Cyrillic letter followed by '(' should return punycode for '(' escaped
      // before punycode string was created. I.e.
      // if '(' is escaped after punycode is created we would get xn--%28-8tb
      // (incorrect).
      {"\xd1\x82(", "xn--%28-7ed", Component(0, 11), CanonHostInfo::NEUTRAL, -1,
       ""},
      // Address with all hexidecimal characters with leading number of 1<<32
      // or greater and should return NEUTRAL rather than BROKEN if not all
      // components are numbers.
      {"12345678912345.de", "12345678912345.de", Component(0, 17),
       CanonHostInfo::NEUTRAL, -1, ""},
      {"1.12345678912345.de", "1.12345678912345.de", Component(0, 19),
       CanonHostInfo::NEUTRAL, -1, ""},
      {"12345678912345.12345678912345.de", "12345678912345.12345678912345.de",
       Component(0, 32), CanonHostInfo::NEUTRAL, -1, ""},
      {"1.2.0xB3A73CE5B59.de", "1.2.0xb3a73ce5b59.de", Component(0, 20),
       CanonHostInfo::NEUTRAL, -1, ""},
      {"12345678912345.0xde", "12345678912345.0xde", Component(0, 19),
       CanonHostInfo::BROKEN, -1, ""},
  };

  // CanonicalizeHost() non-verbose.
  std::string out_str;
  for (const auto& host_case : host_cases) {
    if (host_case.input8) {
      size_t host_len = strlen(host_case.input8);
      Component in_comp(0, host_len);
      Component out_comp;

      out_str.clear();
      StdStringCanonOutput output(&out_str);

      bool success =
          CanonicalizeHost(host_case.input8, in_comp, &output, &out_comp);
      output.Complete();

      EXPECT_EQ(host_case.expected_family != CanonHostInfo::BROKEN, success)
          << "for input: " << host_case.input8;
      EXPECT_EQ(std::string(host_case.expected), out_str)
          << "for input: " << host_case.input8;
      EXPECT_EQ(host_case.expected_component.begin, out_comp.begin)
          << "for input: " << host_case.input8;
      EXPECT_EQ(host_case.expected_component.len(), out_comp.len())
          << "for input: " << host_case.input8;
    }
  }

  // CanonicalizeHostVerbose()
  for (const auto& host_case : host_cases) {
    if (host_case.input8) {
      size_t host_len = strlen(host_case.input8);
      Component in_comp(0, host_len);

      out_str.clear();
      StdStringCanonOutput output(&out_str);
      CanonHostInfo host_info;

      CanonicalizeHostVerbose(host_case.input8, in_comp, &output, &host_info);
      output.Complete();

      EXPECT_EQ(host_case.expected_family, host_info.family);
      EXPECT_EQ(std::string(host_case.expected), out_str);
      EXPECT_EQ(host_case.expected_component.begin, host_info.out_host.begin);
      EXPECT_EQ(host_case.expected_component.len(), host_info.out_host.len());
      EXPECT_EQ(std::string(host_case.expected_address_hex),
                BytesToHexString(host_info.address, host_info.AddressLength()));
      if (host_case.expected_family == CanonHostInfo::IPV4) {
        EXPECT_EQ(host_case.expected_num_ipv4_components,
                  host_info.num_ipv4_components);
      }
    }
  }
}

TEST(URLCanonTest, IPv4) {
  IPAddressCase host_cases[] = {
      // Empty is not an IP address.
      {"", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      {".", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      // Regular IP addresses in different bases.
      {"192.168.0.1", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4, 4,
       "C0A80001"},
      {"0300.0250.00.01", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4,
       4, "C0A80001"},
      {"0xC0.0Xa8.0x0.0x1", "192.168.0.1", Component(0, 11),
       CanonHostInfo::IPV4, 4, "C0A80001"},
      // Non-IP addresses due to invalid characters.
      {"192.168.9.com", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      // Invalid characters for the base should be rejected.
      {"19a.168.0.1", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      {"0308.0250.00.01", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      {"0xCG.0xA8.0x0.0x1", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      // If there are not enough components, the last one should fill them out.
      {"192", "0.0.0.192", Component(0, 9), CanonHostInfo::IPV4, 1, "000000C0"},
      {"0xC0a80001", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4, 1,
       "C0A80001"},
      {"030052000001", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4, 1,
       "C0A80001"},
      {"000030052000001", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4,
       1, "C0A80001"},
      {"192.168", "192.0.0.168", Component(0, 11), CanonHostInfo::IPV4, 2,
       "C00000A8"},
      {"192.0x00A80001", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4,
       2, "C0A80001"},
      {"0xc0.052000001", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4,
       2, "C0A80001"},
      {"192.168.1", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4, 3,
       "C0A80001"},
      // Too many components means not an IP address.
      {"192.168.0.0.1", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      // We allow a single trailing dot.
      {"192.168.0.1.", "192.168.0.1", Component(0, 11), CanonHostInfo::IPV4, 4,
       "C0A80001"},
      {"192.168.0.1. hello", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      {"192.168.0.1..", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      // Two dots in a row means not an IP address.
      {"192.168..1", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      // Any numerical overflow should be marked as BROKEN.
      {"0x100.0", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0x100.0.0", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0x100.0.0.0", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0.0x100.0.0", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0.0.0x100.0", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0.0.0.0x100", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0.0.0x10000", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0.0x1000000", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0x100000000", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // Repeat the previous tests, minus 1, to verify boundaries.
      {"0xFF.0", "255.0.0.0", Component(0, 9), CanonHostInfo::IPV4, 2,
       "FF000000"},
      {"0xFF.0.0", "255.0.0.0", Component(0, 9), CanonHostInfo::IPV4, 3,
       "FF000000"},
      {"0xFF.0.0.0", "255.0.0.0", Component(0, 9), CanonHostInfo::IPV4, 4,
       "FF000000"},
      {"0.0xFF.0.0", "0.255.0.0", Component(0, 9), CanonHostInfo::IPV4, 4,
       "00FF0000"},
      {"0.0.0xFF.0", "0.0.255.0", Component(0, 9), CanonHostInfo::IPV4, 4,
       "0000FF00"},
      {"0.0.0.0xFF", "0.0.0.255", Component(0, 9), CanonHostInfo::IPV4, 4,
       "000000FF"},
      {"0.0.0xFFFF", "0.0.255.255", Component(0, 11), CanonHostInfo::IPV4, 3,
       "0000FFFF"},
      {"0.0xFFFFFF", "0.255.255.255", Component(0, 13), CanonHostInfo::IPV4, 2,
       "00FFFFFF"},
      {"0xFFFFFFFF", "255.255.255.255", Component(0, 15), CanonHostInfo::IPV4,
       1, "FFFFFFFF"},
      // Old trunctations tests. They're all "BROKEN" now.
      {"276.256.0xf1a2.077777", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"192.168.0.257", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"192.168.0xa20001", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"192.015052000001", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"0X12C0a80001", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"276.1.2", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // Spaces should be rejected.
      {"192.168.0.1 hello", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      // Very large numbers.
      {"0000000000000300.0x00000000000000fF.00000000000000001", "192.255.0.1",
       Component(0, 11), CanonHostInfo::IPV4, 3, "C0FF0001"},
      {"0000000000000300.0xffffffffFFFFFFFF.3022415481470977", "",
       Component(0, 11), CanonHostInfo::BROKEN, -1, ""},
      // A number has no length limit, but long numbers can still overflow.
      {"00000000000000000001", "0.0.0.1", Component(0, 7), CanonHostInfo::IPV4,
       1, "00000001"},
      {"0000000000000000100000000000000001", "", Component(),
       CanonHostInfo::BROKEN, -1, ""},
      // If a long component is non-numeric, it's a hostname, *not* a broken IP.
      {"0.0.0.000000000000000000z", "", Component(), CanonHostInfo::NEUTRAL, -1,
       ""},
      {"0.0.0.100000000000000000z", "", Component(), CanonHostInfo::NEUTRAL, -1,
       ""},
      // Truncation of all zeros should still result in 0.
      {"0.00.0x.0x0", "0.0.0.0", Component(0, 7), CanonHostInfo::IPV4, 4,
       "00000000"},
  };

  for (const auto& host_case : host_cases) {
    Component component(0, strlen(host_case.input8));

    std::string out_str1;
    StdStringCanonOutput output1(&out_str1);
    CanonHostInfo host_info;
    CanonicalizeIPAddress(host_case.input8, component, &output1, &host_info);
    output1.Complete();

    EXPECT_EQ(host_case.expected_family, host_info.family);
    EXPECT_EQ(std::string(host_case.expected_address_hex),
              BytesToHexString(host_info.address, host_info.AddressLength()));
    if (host_info.family == CanonHostInfo::IPV4) {
      EXPECT_STREQ(host_case.expected, out_str1.c_str());
      EXPECT_EQ(host_case.expected_component.begin, host_info.out_host.begin);
      EXPECT_EQ(host_case.expected_component.len(), host_info.out_host.len());
      EXPECT_EQ(host_case.expected_num_ipv4_components,
                host_info.num_ipv4_components);
    }
  }
}

TEST(URLCanonTest, IPv6) {
  IPAddressCase cases[] = {
      // Empty is not an IP address.
      {"", "", Component(), CanonHostInfo::NEUTRAL, -1, ""},
      // Non-IPs with [:] characters are marked BROKEN.
      {":", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[:", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {":]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[:]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // Regular IP address is invalid without bounding '[' and ']'.
      {"2001:db8::1", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[2001:db8::1", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"2001:db8::1]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // Regular IP addresses.
      {"[::]", "[::]", Component(0, 4), CanonHostInfo::IPV6, -1,
       "00000000000000000000000000000000"},
      {"[::1]", "[::1]", Component(0, 5), CanonHostInfo::IPV6, -1,
       "00000000000000000000000000000001"},
      {"[1::]", "[1::]", Component(0, 5), CanonHostInfo::IPV6, -1,
       "00010000000000000000000000000000"},

      // Leading zeros should be stripped.
      {"[000:01:02:003:004:5:6:007]", "[0:1:2:3:4:5:6:7]", Component(0, 17),
       CanonHostInfo::IPV6, -1, "00000001000200030004000500060007"},

      // Upper case letters should be lowercased.
      {"[A:b:c:DE:fF:0:1:aC]", "[a:b:c:de:ff:0:1:ac]", Component(0, 20),
       CanonHostInfo::IPV6, -1, "000A000B000C00DE00FF0000000100AC"},

      // The same address can be written with different contractions, but should
      // get canonicalized to the same thing.
      {"[1:0:0:2::3:0]", "[1::2:0:0:3:0]", Component(0, 14),
       CanonHostInfo::IPV6, -1, "00010000000000020000000000030000"},
      {"[1::2:0:0:3:0]", "[1::2:0:0:3:0]", Component(0, 14),
       CanonHostInfo::IPV6, -1, "00010000000000020000000000030000"},

      // Addresses with embedded IPv4.
      {"[::192.168.0.1]", "[::c0a8:1]", Component(0, 10), CanonHostInfo::IPV6,
       -1, "000000000000000000000000C0A80001"},
      {"[::ffff:192.168.0.1]", "[::ffff:c0a8:1]", Component(0, 15),
       CanonHostInfo::IPV6, -1, "00000000000000000000FFFFC0A80001"},
      {"[::eeee:192.168.0.1]", "[::eeee:c0a8:1]", Component(0, 15),
       CanonHostInfo::IPV6, -1, "00000000000000000000EEEEC0A80001"},
      {"[2001::192.168.0.1]", "[2001::c0a8:1]", Component(0, 14),
       CanonHostInfo::IPV6, -1, "200100000000000000000000C0A80001"},
      {"[1:2:192.168.0.1:5:6]", "", Component(), CanonHostInfo::BROKEN, -1, ""},

      // IPv4 with last component missing.
      {"[::ffff:192.1.2]", "[::ffff:c001:2]", Component(0, 15),
       CanonHostInfo::IPV6, -1, "00000000000000000000FFFFC0010002"},

      // IPv4 using hex.
      // TODO(eroman): Should this format be disallowed?
      {"[::ffff:0xC0.0Xa8.0x0.0x1]", "[::ffff:c0a8:1]", Component(0, 15),
       CanonHostInfo::IPV6, -1, "00000000000000000000FFFFC0A80001"},

      // There may be zeros surrounding the "::" contraction.
      {"[0:0::0:0:8]", "[::8]", Component(0, 5), CanonHostInfo::IPV6, -1,
       "00000000000000000000000000000008"},

      {"[2001:db8::1]", "[2001:db8::1]", Component(0, 13), CanonHostInfo::IPV6,
       -1, "20010DB8000000000000000000000001"},

      // Can only have one "::" contraction in an IPv6 string literal.
      {"[2001::db8::1]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // No more than 2 consecutive ':'s.
      {"[2001:db8:::1]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[:::]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // Non-IP addresses due to invalid characters.
      {"[2001::.com]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // If there are not enough components, the last one should fill them out.
      // ... omitted at this time ...
      // Too many components means not an IP address. Similarly, with too few
      // if using IPv4 compat or mapped addresses.
      {"[::192.168.0.0.1]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[::ffff:192.168.0.0.1]", "", Component(), CanonHostInfo::BROKEN, -1,
       ""},
      {"[1:2:3:4:5:6:7:8:9]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // Too many bits (even though 8 comonents, the last one holds 32 bits).
      {"[0:0:0:0:0:0:0:192.168.0.1]", "", Component(), CanonHostInfo::BROKEN,
       -1, ""},

      // Too many bits specified -- the contraction would have to be zero-length
      // to not exceed 128 bits.
      {"[1:2:3:4:5:6::192.168.0.1]", "", Component(), CanonHostInfo::BROKEN, -1,
       ""},

      // The contraction is for 16 bits of zero.
      {"[1:2:3:4:5:6::8]", "[1:2:3:4:5:6:0:8]", Component(0, 17),
       CanonHostInfo::IPV6, -1, "00010002000300040005000600000008"},

      // Cannot have a trailing colon.
      {"[1:2:3:4:5:6:7:8:]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[1:2:3:4:5:6:192.168.0.1:]", "", Component(), CanonHostInfo::BROKEN, -1,
       ""},

      // Cannot have negative numbers.
      {"[-1:2:3:4:5:6:7:8]", "", Component(), CanonHostInfo::BROKEN, -1, ""},

      // Scope ID -- the URL may contain an optional ["%" <scope_id>] section.
      // The scope_id should be included in the canonicalized URL, and is an
      // unsigned decimal number.

      // Invalid because no ID was given after the percent.

      // Don't allow scope-id
      {"[1::%1]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[1::%eth0]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[1::%]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[%]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[::%:]", "", Component(), CanonHostInfo::BROKEN, -1, ""},

      // Don't allow leading or trailing colons.
      {"[:0:0::0:0:8]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[0:0::0:0:8:]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      {"[:0:0::0:0:8:]", "", Component(), CanonHostInfo::BROKEN, -1, ""},

      // We allow a single trailing dot.
      // ... omitted at this time ...
      // Two dots in a row means not an IP address.
      {"[::192.168..1]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
      // Any non-first components get truncated to one byte.
      // ... omitted at this time ...
      // Spaces should be rejected.
      {"[::1 hello]", "", Component(), CanonHostInfo::BROKEN, -1, ""},
  };

  for (const auto& test_case : cases) {
    Component component(0, strlen(test_case.input8));

    std::string out_str1;
    StdStringCanonOutput output1(&out_str1);
    CanonHostInfo host_info;
    CanonicalizeIPAddress(test_case.input8, component, &output1, &host_info);
    output1.Complete();

    EXPECT_EQ(test_case.expected_family, host_info.family);
    EXPECT_EQ(std::string(test_case.expected_address_hex),
              BytesToHexString(host_info.address, host_info.AddressLength()))
        << " host " << test_case.input8;
    if (host_info.family == CanonHostInfo::IPV6) {
      EXPECT_STREQ(test_case.expected, out_str1.c_str());
      EXPECT_EQ(test_case.expected_component.begin, host_info.out_host.begin);
      EXPECT_EQ(test_case.expected_component.len(), host_info.out_host.len());
    }
  }
}

TEST(URLCanonTest, IPEmpty) {
  std::string out_str1;
  StdStringCanonOutput output1(&out_str1);
  CanonHostInfo host_info;

  // This tests tests.
  const char spec[] = "192.168.0.1";
  CanonicalizeIPAddress(spec, Component(), &output1, &host_info);
  EXPECT_FALSE(host_info.IsIPAddress());

  CanonicalizeIPAddress(spec, Component(0, 0), &output1, &host_info);
  EXPECT_FALSE(host_info.IsIPAddress());
}

TEST(URLCanonTest, UserInfo) {
  // Note that the canonicalizer should escape and treat empty components as
  // not being there.

  // We actually parse a full input URL so we can get the initial components.
  struct UserComponentCase {
    const char* input;
    const char* expected;
    Component expected_username;
    Component expected_password;
    bool expected_success;
  } user_info_cases[] = {
      {"http://user:pass@host.com/", "user:pass@", Component(0, 4),
       Component(5, 4), true},
      {"http://@host.com/", "", Component(false), Component(false), true},
      {"http://:@host.com/", "", Component(false), Component(false), true},
      {"http://foo:@host.com/", "foo@", Component(0, 3), Component(false),
       true},
      {"http://:foo@host.com/", ":foo@", Component(0, 0), Component(1, 3),
       true},
      {"http://^ :$\t@host.com/", "%5E%20:$%09@", Component(0, 6),
       Component(7, 4), true},
      {"http://user:pass@/", "user:pass@", Component(0, 4), Component(5, 4),
       true},
      {"http://%2540:bar@domain.com/", "%2540:bar@", Component(0, 5),
       Component(6, 3), true},

      // IE7 compatibility: old versions allowed backslashes in usernames, but
      // IE7 does not. We disallow it as well.
      {"ftp://me\\mydomain:pass@foo.com/", "", Component(false),
       Component(false), true},
  };

  for (const auto& user_info_case : user_info_cases) {
    size_t url_len = strlen(user_info_case.input);
    Parsed parsed;
    ParseStandardURL(user_info_case.input, url_len, &parsed);
    Component out_user, out_pass;
    std::string out_str;
    StdStringCanonOutput output1(&out_str);

    bool success = CanonicalizeUserInfo(user_info_case.input, parsed.username,
                                        user_info_case.input, parsed.password,
                                        &output1, &out_user, &out_pass);
    output1.Complete();

    EXPECT_EQ(user_info_case.expected_success, success);
    EXPECT_EQ(std::string(user_info_case.expected), out_str);
    EXPECT_EQ(user_info_case.expected_username.begin, out_user.begin);
    EXPECT_EQ(user_info_case.expected_username.is_valid(), out_user.is_valid());
    if (out_user.is_valid()) {
      EXPECT_EQ(user_info_case.expected_username.len(), out_user.len());
    }
    EXPECT_EQ(user_info_case.expected_password.begin, out_pass.begin);
    EXPECT_EQ(user_info_case.expected_password.is_valid(), out_pass.is_valid());
    if (out_pass.is_valid()) {
      EXPECT_EQ(user_info_case.expected_password.len(), out_pass.len());
    }
  }
}

TEST(URLCanonTest, Port) {
  // We only need to test that the number gets properly put into the output
  // buffer. The parser unit tests will test scanning the number correctly.
  //
  // Note that the CanonicalizePort will always prepend a colon to the output
  // to separate it from the colon that it assumes precedes it.
  struct PortCase {
    const char* input;
    int default_port;
    const char* expected;
    Component expected_component;
    bool expected_success;
  } port_cases[] = {
      // Invalid input should be copied w/ failure.
      {"as df", 80, ":as%20df", Component(1, 7), false},
      {"-2", 80, ":-2", Component(1, 2), false},
      // Default port should be omitted.
      {"80", 80, "", Component(false), true},
      {"8080", 80, ":8080", Component(1, 4), true},
      // PORT_UNSPECIFIED should mean always keep the port.
      {"80", PORT_UNSPECIFIED, ":80", Component(1, 2), true},
  };

  for (const auto& port_case : port_cases) {
    size_t url_len = strlen(port_case.input);
    Component in_comp(0, url_len);
    Component out_comp;
    std::string out_str;
    StdStringCanonOutput output1(&out_str);
    bool success = CanonicalizePort(
        port_case.input, in_comp, port_case.default_port, &output1, &out_comp);
    output1.Complete();

    EXPECT_EQ(port_case.expected_success, success);
    EXPECT_EQ(std::string(port_case.expected), out_str);
    EXPECT_EQ(port_case.expected_component.begin, out_comp.begin);
    EXPECT_EQ(port_case.expected_component.is_valid(), out_comp.is_valid());
    if (out_comp.is_valid()) {
      EXPECT_EQ(port_case.expected_component.len(), out_comp.len());
    }
  }
}

TEST(URLCanonTest, Path) {
  DualComponentCase path_cases[] = {
      // ----- path collapsing tests -----
      {"/././foo", "/foo", Component(0, 4), true},
      {"/./.foo", "/.foo", Component(0, 5), true},
      {"/foo/.", "/foo/", Component(0, 5), true},
      {"/foo/./", "/foo/", Component(0, 5), true},
      // double dots followed by a slash or the end of the string count
      {"/foo/bar/..", "/foo/", Component(0, 5), true},
      {"/foo/bar/../", "/foo/", Component(0, 5), true},
      // don't count double dots when they aren't followed by a slash
      {"/foo/..bar", "/foo/..bar", Component(0, 10), true},
      // some in the middle
      {"/foo/bar/../ton", "/foo/ton", Component(0, 8), true},
      {"/foo/bar/../ton/../../a", "/a", Component(0, 2), true},
      // we should not be able to go above the root
      {"/foo/../../..", "/", Component(0, 1), true},
      {"/foo/../../../ton", "/ton", Component(0, 4), true},
      // escaped dots should be unescaped and treated the same as dots
      {"/foo/%2e", "/foo/", Component(0, 5), true},
      {"/foo/%2e%2", "/foo/.%2", Component(0, 8), true},
      {"/foo/%2e./%2e%2e/.%2e/%2e.bar", "/..bar", Component(0, 6), true},
      // Multiple slashes in a row should be preserved and treated like empty
      // directory names.
      {"////../..", "//", Component(0, 2), true},

      // ----- escaping tests -----
      {"/foo", "/foo", Component(0, 4), true},
      // Valid escape sequence
      {"/%20foo", "/%20foo", Component(0, 7), true},
      // Invalid escape sequence we should pass through unchanged.
      {"/foo%", "/foo%", Component(0, 5), true},
      {"/foo%2", "/foo%2", Component(0, 6), true},
      // Invalid escape sequence: bad characters should be treated the same as
      // the sourrounding text, not as escaped (in this case, UTF-8).
      {"/foo%2zbar", "/foo%2zbar", Component(0, 10), true},
      {"/foo%2\xc2\xa9zbar", "/foo%2%C2%A9zbar", Component(0, 16), true},
      {NULL, "/foo%2%C3%82%C2%A9zbar", Component(0, 22), true},
      // Regular characters that are escaped should be unescaped
      {"/foo%41%7a", "/fooAz", Component(0, 6), true},
      // Funny characters that are unescaped should be escaped
      {"/foo\x09\x91%91", "/foo%09%91%91", Component(0, 13), true},
      {NULL, "/foo%09%C2%91%91", Component(0, 16), true},
      // Invalid characters that are escaped should cause a failure.
      {"/foo%00%51", "/foo%00Q", Component(0, 8), false},
      // Some characters should be passed through unchanged regardless of esc.
      {"/(%28:%3A%29)", "/(%28:%3A%29)", Component(0, 13), true},
      // Characters that are properly escaped should not have the case changed
      // of hex letters.
      {"/%3A%3a%3C%3c", "/%3A%3a%3C%3c", Component(0, 13), true},
      // Funny characters that are unescaped should be escaped
      {"/foo\tbar", "/foo%09bar", Component(0, 10), true},
      // Backslashes should get converted to forward slashes
      {"\\foo\\bar", "/foo/bar", Component(0, 8), true},
      // Hashes found in paths (possibly only when the caller explicitly sets
      // the path on an already-parsed URL) should be escaped.
      {"/foo#bar", "/foo%23bar", Component(0, 10), true},
      // %7f should be allowed and %3D should not be unescaped (these were wrong
      // in a previous version).
      {"/%7Ffp3%3Eju%3Dduvgw%3Dd", "/%7Ffp3%3Eju%3Dduvgw%3Dd", Component(0, 24),
       true},
      // @ should be passed through unchanged (escaped or unescaped).
      {"/@asdf%40", "/@asdf%40", Component(0, 9), true},

      // ----- encoding tests -----
      // Basic conversions
      {"/\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd",
       "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD", Component(0, 37), true},
      // Invalid unicode characters should fail. We only do validation on
      // UTF-16 input, so this doesn't happen on 8-bit.
      {"/\xef\xb7\x90zyx", "/%EF%B7%90zyx", Component(0, 13), true},
      {NULL, "/%EF%BF%BDzyx", Component(0, 13), false},
  };

  for (const auto& path_case : path_cases) {
    if (path_case.input8) {
      size_t len = strlen(path_case.input8);
      Component in_comp(0, len);
      Component out_comp;
      std::string out_str;
      StdStringCanonOutput output(&out_str);
      bool success =
          CanonicalizePath(path_case.input8, in_comp, &output, &out_comp);
      output.Complete();

      EXPECT_EQ(path_case.expected_success, success);
      EXPECT_EQ(path_case.expected_component.begin, out_comp.begin);
      EXPECT_EQ(path_case.expected_component.is_valid(), out_comp.is_valid());
      if (out_comp.is_valid()) {
        EXPECT_EQ(path_case.expected_component.len(), out_comp.len());
      }
      EXPECT_EQ(path_case.expected, out_str);
    }
  }

  // Manual test: embedded NULLs should be escaped and the URL should be marked
  // as invalid.
  const char path_with_null[] = "/ab\0c";
  Component in_comp(0, 5);
  Component out_comp;

  std::string out_str;
  StdStringCanonOutput output(&out_str);
  bool success = CanonicalizePath(path_with_null, in_comp, &output, &out_comp);
  output.Complete();
  EXPECT_FALSE(success);
  EXPECT_EQ("/ab%00c", out_str);
}

TEST(URLCanonTest, Query) {
  struct QueryCase {
    const char* input8;
    const char* expected;
  } query_cases[] = {
      // Regular ASCII case.
      {"foo=bar", "?foo=bar"},
      // Allow question marks in the query without escaping
      {"as?df", "?as?df"},
      // Always escape '#' since it would mark the ref.
      {"as#df", "?as%23df"},
      // Escape some questionable 8-bit characters, but never unescape.
      {"\x02hello\x7f bye", "?%02hello%7F%20bye"},
      {"%40%41123", "?%40%41123"},
      // Chinese input/output
      {"q=\xe4\xbd\xa0\xe5\xa5\xbd", "?q=%E4%BD%A0%E5%A5%BD"},
      // Invalid UTF-8/16 input should be replaced with invalid characters.
      {"q=\xed\xed", "?q=%EF%BF%BD%EF%BF%BD"},
      // Don't allow < or > because sometimes they are used for XSS if the
      // URL is echoed in content. Firefox does this, IE doesn't.
      {"q=<asdf>", "?q=%3Casdf%3E"},
      // Escape double quotemarks in the query.
      {"q=\"asdf\"", "?q=%22asdf%22"},
  };

  for (const auto& query_case : query_cases) {
    Component out_comp;

    if (query_case.input8) {
      size_t len = strlen(query_case.input8);
      Component in_comp(0, len);
      std::string out_str;

      StdStringCanonOutput output(&out_str);
      CanonicalizeQuery(query_case.input8, in_comp, NULL, &output, &out_comp);
      output.Complete();

      EXPECT_EQ(query_case.expected, out_str);
    }
  }

  // Extra test for input with embedded NULL;
  std::string out_str;
  StdStringCanonOutput output(&out_str);
  Component out_comp;
  CanonicalizeQuery("a \x00z\x01", Component(0, 5), NULL, &output, &out_comp);
  output.Complete();
  EXPECT_EQ("?a%20%00z%01", out_str);
}

TEST(URLCanonTest, Ref) {
  // Refs are trivial, it just checks the encoding.
  DualComponentCase ref_cases[] = {
      // Regular one, we shouldn't escape spaces, et al.
      {"hello, world", "#hello, world", Component(1, 12), true},
      // UTF-8/wide input should be preserved
      {"\xc2\xa9", "#\xc2\xa9", Component(1, 2), true},
      // Test a characer that takes > 16 bits (U+10300 = old italic letter A)
      {"\xF0\x90\x8C\x80ss", "#\xF0\x90\x8C\x80ss", Component(1, 6), true},
      // Escaping should be preserved unchanged, even invalid ones
      {"%41%a", "#%41%a", Component(1, 5), true},
      // Invalid UTF-8/16 input should be flagged and the input made valid
      {"\xc2", "#\xef\xbf\xbd", Component(1, 3), true},
      // Test a Unicode invalid character.
      {"a\xef\xb7\x90", "#a\xef\xbf\xbd", Component(1, 4), true},
      // Refs can have # signs and we should preserve them.
      {"asdf#qwer", "#asdf#qwer", Component(1, 9), true},
      {"#asdf", "##asdf", Component(1, 5), true},
  };

  for (const auto& ref_case : ref_cases) {
    size_t len = strlen(ref_case.input8);
    Component in_comp(0, len);
    Component out_comp;

    std::string out_str;
    StdStringCanonOutput output(&out_str);
    CanonicalizeRef(ref_case.input8, in_comp, &output, &out_comp);
    output.Complete();

    EXPECT_EQ(ref_case.expected_component.begin, out_comp.begin);
    EXPECT_EQ(ref_case.expected_component.is_valid(), out_comp.is_valid());
    if (out_comp.is_valid()) {
      EXPECT_EQ(ref_case.expected_component.len(), out_comp.len());
    }
    EXPECT_EQ(ref_case.expected, out_str);
  }

  // Try one with an embedded NULL. It should be stripped.
  const char null_input[5] = "ab\x00z";
  Component null_input_component(0, 4);
  Component out_comp;

  std::string out_str;
  StdStringCanonOutput output(&out_str);
  CanonicalizeRef(null_input, null_input_component, &output, &out_comp);
  output.Complete();

  EXPECT_EQ(1U, out_comp.begin);
  EXPECT_EQ(3U, out_comp.len());
  EXPECT_EQ("#abz", out_str);
}

TEST(URLCanonTest, CanonicalizeStandardURL) {
  // The individual component canonicalize tests should have caught the cases
  // for each of those components. Here, we just need to test that the various
  // parts are included or excluded properly, and have the correct separators.
  struct URLCase {
    const char* input;
    const char* expected;
    bool expected_success;
  } url_cases[] = {
      {"http://www.google.com/foo?bar=baz#",
       "http://www.google.com/foo?bar=baz#", true},
      {"http://[www.google.com]/", "http://[www.google.com]/", false},
      {"ht\ttp:@www.google.com:80/;p?#", "ht%09tp://www.google.com:80/;p?#",
       false},
      {"http:////////user:@google.com:99?foo", "http://user@google.com:99/?foo",
       true},
      {"www.google.com", ":www.google.com/", true},
      {"http://192.0x00A80001", "http://192.168.0.1/", true},
      {"http://www/foo%2Ehtml", "http://www/foo.html", true},
      {"http://user:pass@/", "http://user:pass@/", false},
      {"http://%25DOMAIN:foobar@foodomain.com/",
       "http://%25DOMAIN:foobar@foodomain.com/", true},

      // Backslashes should get converted to forward slashes.
      {"http:\\\\www.google.com\\foo", "http://www.google.com/foo", true},

      // Busted refs shouldn't make the whole thing fail.
      {"http://www.google.com/asdf#\xc2",
       "http://www.google.com/asdf#\xef\xbf\xbd", true},

      // Basic port tests.
      {"http://foo:80/", "http://foo/", true},
      {"http://foo:81/", "http://foo:81/", true},
      {"httpa://foo:80/", "httpa://foo:80/", true},
      {"http://foo:-80/", "http://foo:-80/", false},

      {"https://foo:443/", "https://foo/", true},
      {"https://foo:80/", "https://foo:80/", true},
      {"ftp://foo:21/", "ftp://foo/", true},
      {"ftp://foo:80/", "ftp://foo:80/", true},
      {"gopher://foo:70/", "gopher://foo/", true},
      {"gopher://foo:443/", "gopher://foo:443/", true},
      {"ws://foo:80/", "ws://foo/", true},
      {"ws://foo:81/", "ws://foo:81/", true},
      {"ws://foo:443/", "ws://foo:443/", true},
      {"ws://foo:815/", "ws://foo:815/", true},
      {"wss://foo:80/", "wss://foo:80/", true},
      {"wss://foo:81/", "wss://foo:81/", true},
      {"wss://foo:443/", "wss://foo/", true},
      {"wss://foo:815/", "wss://foo:815/", true},
  };

  for (const auto& url_case : url_cases) {
    size_t url_len = strlen(url_case.input);
    Parsed parsed;
    ParseStandardURL(url_case.input, url_len, &parsed);

    Parsed out_parsed;
    std::string out_str;
    StdStringCanonOutput output(&out_str);
    bool success = CanonicalizeStandardURL(url_case.input, url_len, parsed,
                                           NULL, &output, &out_parsed);
    output.Complete();

    EXPECT_EQ(url_case.expected_success, success);
    EXPECT_EQ(url_case.expected, out_str);
  }
}

TEST(URLCanonTest, CanonicalizeFileURL) {
  struct URLCase {
    const char* input;
    const char* expected;
    bool expected_success;
    Component expected_host;
    Component expected_path;
  } url_cases[] = {
      // Unix-style paths
      {"file:///home/me", "file:///home/me", true, Component(),
       Component(7, 8)},
      // Windowsy ones should get still treated as Unix-style.
      {"file:c:\\foo\\bar.html", "file:///c:/foo/bar.html", true, Component(),
       Component(7, 16)},
      {"file:c|//foo\\bar.html", "file:///c%7C//foo/bar.html", true,
       Component(), Component(7, 19)},
      // file: tests from WebKit (LayoutTests/fast/loader/url-parse-1.html)
      {"//", "file:///", true, Component(), Component(7, 1)},
      {"///", "file:///", true, Component(), Component(7, 1)},
      {"///test", "file:///test", true, Component(), Component(7, 5)},
      {"file://test", "file://test/", true, Component(7, 4), Component(11, 1)},
      {"file://localhost", "file://localhost/", true, Component(7, 9),
       Component(16, 1)},
      {"file://localhost/", "file://localhost/", true, Component(7, 9),
       Component(16, 1)},
      {"file://localhost/test", "file://localhost/test", true, Component(7, 9),
       Component(16, 5)},
  };

  for (const auto& url_case : url_cases) {
    size_t url_len = strlen(url_case.input);
    Parsed parsed;
    ParseFileURL(url_case.input, url_len, &parsed);

    Parsed out_parsed;
    std::string out_str;
    StdStringCanonOutput output(&out_str);
    bool success = CanonicalizeFileURL(url_case.input, url_len, parsed, NULL,
                                       &output, &out_parsed);
    output.Complete();

    EXPECT_EQ(url_case.expected_success, success);
    EXPECT_EQ(url_case.expected, out_str);

    // Make sure the spec was properly identified, the file canonicalizer has
    // different code for writing the spec.
    EXPECT_EQ(0U, out_parsed.scheme.begin);
    EXPECT_EQ(4U, out_parsed.scheme.len());

    EXPECT_EQ(url_case.expected_host.begin, out_parsed.host.begin);
    EXPECT_EQ(url_case.expected_host.is_valid(), out_parsed.host.is_valid());
    if (out_parsed.host.is_valid()) {
      EXPECT_EQ(url_case.expected_host.len(), out_parsed.host.len());
    }

    EXPECT_EQ(url_case.expected_path.begin, out_parsed.path.begin);
    EXPECT_EQ(url_case.expected_path.is_valid(), out_parsed.path.is_valid());
    if (out_parsed.path.is_valid()) {
      EXPECT_EQ(url_case.expected_path.len(), out_parsed.path.len());
    }
  }
}

TEST(URLCanonTest, CanonicalizePathURL) {
  // Path URLs should get canonicalized schemes but nothing else.
  struct PathCase {
    const char* input;
    const char* expected;
  } path_cases[] = {
      {"javascript:", "javascript:"},
      {"JavaScript:Foo", "javascript:Foo"},
      {":\":This /is interesting;?#", ":\":This /is interesting;?#"},
  };

  for (const auto& path_case : path_cases) {
    size_t url_len = strlen(path_case.input);
    Parsed parsed;
    ParsePathURL(path_case.input, url_len, true, &parsed);

    Parsed out_parsed;
    std::string out_str;
    StdStringCanonOutput output(&out_str);
    bool success = CanonicalizePathURL(path_case.input, url_len, parsed,
                                       &output, &out_parsed);
    output.Complete();

    EXPECT_TRUE(success);
    EXPECT_EQ(path_case.expected, out_str);

    EXPECT_EQ(0U, out_parsed.host.begin);
    EXPECT_FALSE(out_parsed.host.is_valid());

    // When we end with a colon at the end, there should be no path.
    if (path_case.input[url_len - 1] == ':') {
      EXPECT_EQ(0U, out_parsed.GetContent().begin);
      EXPECT_FALSE(out_parsed.GetContent().is_valid());
    }
  }
}

TEST(URLCanonTest, CanonicalizeMailtoURL) {
  struct URLCase {
    const char* input;
    size_t url_len_override;  // if != 0, use this instead of strlen
    const char* expected;
    bool expected_success;
    Component expected_path;
    Component expected_query;
  } url_cases[] = {
      {"mailto:addr1", 0, "mailto:addr1", true, Component(7, 5), Component()},
      {"mailto:addr1@foo.com", 0, "mailto:addr1@foo.com", true,
       Component(7, 13), Component()},
      // Trailing whitespace is stripped.
      {"MaIlTo:addr1 \t ", 0, "mailto:addr1", true, Component(7, 5),
       Component()},
      {"MaIlTo:addr1?to=jon", 0, "mailto:addr1?to=jon", true, Component(7, 5),
       Component(13, 6)},
      {"mailto:addr1,addr2", 0, "mailto:addr1,addr2", true, Component(7, 11),
       Component()},
      {"mailto:addr1, addr2", 0, "mailto:addr1, addr2", true, Component(7, 12),
       Component()},
      {"mailto:addr1%2caddr2", 0, "mailto:addr1%2caddr2", true,
       Component(7, 13), Component()},
      {"mailto:\xF0\x90\x8C\x80", 0, "mailto:%F0%90%8C%80", true,
       Component(7, 12), Component()},
      // Null character should be escaped to %00
      {"mailto:addr1\0addr2?foo", 22, "mailto:addr1%00addr2?foo", true,
       Component(7, 13), Component(21, 3)},
      // Invalid -- UTF-8 encoded surrogate value.
      {"mailto:\xed\xa0\x80", 0, "mailto:%EF%BF%BD", false, Component(7, 9),
       Component()},
      {"mailto:addr1?", 0, "mailto:addr1?", true, Component(7, 5),
       Component(13, 0)},
  };

  // Define outside of loop to catch bugs where components aren't reset
  Parsed parsed;
  Parsed out_parsed;

  for (const auto& url_case : url_cases) {
    size_t url_len = strlen(url_case.input);
    if (url_case.url_len_override) {
      url_len = url_case.url_len_override;
    }
    ParseMailtoURL(url_case.input, url_len, &parsed);

    std::string out_str;
    StdStringCanonOutput output(&out_str);
    bool success = CanonicalizeMailtoURL(url_case.input, url_len, parsed,
                                         &output, &out_parsed);
    output.Complete();

    EXPECT_EQ(url_case.expected_success, success);
    EXPECT_EQ(url_case.expected, out_str);

    // Make sure the spec was properly identified
    EXPECT_EQ(0U, out_parsed.scheme.begin);
    EXPECT_EQ(6U, out_parsed.scheme.len());

    EXPECT_EQ(url_case.expected_path.begin, out_parsed.path.begin);
    EXPECT_EQ(url_case.expected_path.is_valid(), out_parsed.path.is_valid());
    if (out_parsed.path.is_valid()) {
      EXPECT_EQ(url_case.expected_path.len(), out_parsed.path.len());
    }

    EXPECT_EQ(url_case.expected_query.begin, out_parsed.query.begin);
    EXPECT_EQ(url_case.expected_query.is_valid(), out_parsed.query.is_valid());
    if (out_parsed.query.is_valid()) {
      EXPECT_EQ(url_case.expected_query.len(), out_parsed.query.len());
    }
  }
}

TEST(URLCanonTest, IntToString) {
  // We fill the buffer with 0xff to ensure that it's getting properly
  // null-terminated. We also allocate one byte more than what we tell
  // IntToString about, and ensure that the extra byte is untouched.
  char buf[6];
  memset(buf, 0xff, sizeof(buf));
  EXPECT_EQ(0, IntToString(12, buf, sizeof(buf) - 1, 10));
  EXPECT_STREQ("12", buf);
  EXPECT_EQ('\xFF', buf[3]);

  // Test the edge cases - exactly the buffer size and one over
  memset(buf, 0xff, sizeof(buf));
  EXPECT_EQ(0, IntToString(1234, buf, sizeof(buf) - 1, 10));
  EXPECT_STREQ("1234", buf);
  EXPECT_EQ('\xFF', buf[5]);

  memset(buf, 0xff, sizeof(buf));
  EXPECT_EQ(EINVAL, IntToString(12345, buf, sizeof(buf) - 1, 10));
  EXPECT_EQ('\xFF', buf[5]);  // should never write to this location

  // Test the template overload (note that this will see the full buffer)
  memset(buf, 0xff, sizeof(buf));
  EXPECT_EQ(0, IntToString(12, buf, 10));
  EXPECT_STREQ("12", buf);
  EXPECT_EQ('\xFF', buf[3]);

  memset(buf, 0xff, sizeof(buf));
  EXPECT_EQ(0, IntToString(12345, buf, 10));
  EXPECT_STREQ("12345", buf);

  EXPECT_EQ(EINVAL, IntToString(123456, buf, 10));

  // Test that radix 16 is supported.
  memset(buf, 0xff, sizeof(buf));
  EXPECT_EQ(0, IntToString(1234, buf, sizeof(buf) - 1, 16));
  EXPECT_STREQ("4d2", buf);
  EXPECT_EQ('\xFF', buf[5]);
}

// Returns true if the given two Component structures are the same.
static bool ComponentIsEqual(const Component& a, const Component& b) {
  return a.begin == b.begin && a.is_valid() == b.is_valid() &&
         (!a.is_valid() || a.len() == b.len());
}

// Returns true if the given two structures are the same.
static bool ParsedIsEqual(const Parsed& a, const Parsed& b) {
  return ComponentIsEqual(a.scheme, b.scheme) &&
         ComponentIsEqual(a.username, b.username) &&
         ComponentIsEqual(a.password, b.password) &&
         ComponentIsEqual(a.host, b.host) && ComponentIsEqual(a.port, b.port) &&
         ComponentIsEqual(a.path, b.path) &&
         ComponentIsEqual(a.query, b.query) && ComponentIsEqual(a.ref, b.ref);
}

TEST(URLCanonTest, ResolveRelativeURL) {
  struct RelativeCase {
    const char* base;       // Input base URL: MUST BE CANONICAL
    bool is_base_hier;      // Is the base URL hierarchical
    bool is_base_file;      // Tells us if the base is a file URL.
    const char* test;       // Input URL to test against.
    bool succeed_relative;  // Whether we expect IsRelativeURL to succeed
    bool is_rel;            // Whether we expect |test| to be relative or not.
    bool succeed_resolve;   // Whether we expect ResolveRelativeURL to succeed.
    const char* resolved;   // What we expect in the result when resolving.
  } rel_cases[] = {
      // Basic absolute input.
      {"http://host/a", true, false, "http://another/", true, false, false,
       NULL},
      {"http://host/a", true, false, "http:////another/", true, false, false,
       NULL},
      // Empty relative URLs should only remove the ref part of the URL,
      // leaving the rest unchanged.
      {"http://foo/bar", true, false, "", true, true, true, "http://foo/bar"},
      {"http://foo/bar#ref", true, false, "", true, true, true,
       "http://foo/bar"},
      {"http://foo/bar#", true, false, "", true, true, true, "http://foo/bar"},
      // Spaces at the ends of the relative path should be ignored.
      {"http://foo/bar", true, false, "  another  ", true, true, true,
       "http://foo/another"},
      {"http://foo/bar", true, false, "  .  ", true, true, true, "http://foo/"},
      {"http://foo/bar", true, false, " \t ", true, true, true,
       "http://foo/bar"},
      // Matching schemes without two slashes are treated as relative.
      {"http://host/a", true, false, "http:path", true, true, true,
       "http://host/path"},
      {"http://host/a/", true, false, "http:path", true, true, true,
       "http://host/a/path"},
      {"http://host/a", true, false, "http:/path", true, true, true,
       "http://host/path"},
      {"http://host/a", true, false, "HTTP:/path", true, true, true,
       "http://host/path"},
      // Nonmatching schemes are absolute.
      {"http://host/a", true, false, "https:host2", true, false, false, NULL},
      {"http://host/a", true, false, "htto:/host2", true, false, false, NULL},
      // Absolute path input
      {"http://host/a", true, false, "/b/c/d", true, true, true,
       "http://host/b/c/d"},
      {"http://host/a", true, false, "\\b\\c\\d", true, true, true,
       "http://host/b/c/d"},
      {"http://host/a", true, false, "/b/../c", true, true, true,
       "http://host/c"},
      {"http://host/a?b#c", true, false, "/b/../c", true, true, true,
       "http://host/c"},
      {"http://host/a", true, false, "\\b/../c?x#y", true, true, true,
       "http://host/c?x#y"},
      {"http://host/a?b#c", true, false, "/b/../c?x#y", true, true, true,
       "http://host/c?x#y"},
      // Relative path input
      {"http://host/a", true, false, "b", true, true, true, "http://host/b"},
      {"http://host/a", true, false, "bc/de", true, true, true,
       "http://host/bc/de"},
      {"http://host/a/", true, false, "bc/de?query#ref", true, true, true,
       "http://host/a/bc/de?query#ref"},
      {"http://host/a/", true, false, ".", true, true, true, "http://host/a/"},
      {"http://host/a/", true, false, "..", true, true, true, "http://host/"},
      {"http://host/a/", true, false, "./..", true, true, true, "http://host/"},
      {"http://host/a/", true, false, "../.", true, true, true, "http://host/"},
      {"http://host/a/", true, false, "././.", true, true, true,
       "http://host/a/"},
      {"http://host/a?query#ref", true, false, "../../../foo", true, true, true,
       "http://host/foo"},
      // Query input
      {"http://host/a", true, false, "?foo=bar", true, true, true,
       "http://host/a?foo=bar"},
      {"http://host/a?x=y#z", true, false, "?", true, true, true,
       "http://host/a?"},
      {"http://host/a?x=y#z", true, false, "?foo=bar#com", true, true, true,
       "http://host/a?foo=bar#com"},
      // Ref input
      {"http://host/a", true, false, "#ref", true, true, true,
       "http://host/a#ref"},
      {"http://host/a#b", true, false, "#", true, true, true, "http://host/a#"},
      {"http://host/a?foo=bar#hello", true, false, "#bye", true, true, true,
       "http://host/a?foo=bar#bye"},
      // Non-hierarchical base: no relative handling. Relative input should
      // error, and if a scheme is present, it should be treated as absolute.
      {"data:foobar", false, false, "baz.html", false, false, false, NULL},
      {"data:foobar", false, false, "data:baz", true, false, false, NULL},
      {"data:foobar", false, false, "data:/base", true, false, false, NULL},
      // Non-hierarchical base: absolute input should succeed.
      {"data:foobar", false, false, "http://host/", true, false, false, NULL},
      {"data:foobar", false, false, "http:host", true, false, false, NULL},
      // Invalid schemes should be treated as relative.
      {"http://foo/bar", true, false, "./asd:fgh", true, true, true,
       "http://foo/asd:fgh"},
      {"http://foo/bar", true, false, ":foo", true, true, true,
       "http://foo/:foo"},
      {"http://foo/bar", true, false, " hello world", true, true, true,
       "http://foo/hello%20world"},
      {"data:asdf", false, false, ":foo", false, false, false, NULL},
      {"data:asdf", false, false, "bad(':foo')", false, false, false, NULL},
      // We should treat semicolons like any other character in URL resolving
      {"http://host/a", true, false, ";foo", true, true, true,
       "http://host/;foo"},
      {"http://host/a;", true, false, ";foo", true, true, true,
       "http://host/;foo"},
      {"http://host/a", true, false, ";/../bar", true, true, true,
       "http://host/bar"},
      // Relative URLs can also be written as "//foo/bar" which is relative to
      // the scheme. In this case, it would take the old scheme, so for http
      // the example would resolve to "http://foo/bar".
      {"http://host/a", true, false, "//another", true, true, true,
       "http://another/"},
      {"http://host/a", true, false, "//another/path?query#ref", true, true,
       true, "http://another/path?query#ref"},
      {"http://host/a", true, false, "///another/path", true, true, true,
       "http://another/path"},
      {"http://host/a", true, false, "//Another\\path", true, true, true,
       "http://another/path"},
      {"http://host/a", true, false, "//", true, true, false, "http:"},
      // IE will also allow one or the other to be a backslash to get the same
      // behavior.
      {"http://host/a", true, false, "\\/another/path", true, true, true,
       "http://another/path"},
      {"http://host/a", true, false, "/\\Another\\path", true, true, true,
       "http://another/path"},
      // On Unix we fall back to relative behavior since there's nothing else
      // reasonable to do.
      {"http://host/a", true, false, "\\\\Another\\path", true, true, true,
       "http://another/path"},
      // Even on Windows, we don't allow relative drive specs when the base
      // is not file.
      {"http://host/a", true, false, "/c:\\foo", true, true, true,
       "http://host/c:/foo"},
      {"http://host/a", true, false, "//c:\\foo", true, true, true,
       "http://c/foo"},
      // Ensure that ports aren't allowed for hosts relative to a file url.
      // Although the result string shows a host:port portion, the call to
      // resolve the relative URL returns false, indicating parse failure,
      // which is what is required.
      {"file:///foo.txt", true, true, "//host:80/bar.txt", true, true, false,
       "file://host:80/bar.txt"},
      // Absolute URLs are still not relative to a non-standard base URL.
      {"about:blank", false, false, "http://X/A", true, false, true, ""},
      {"about:blank", false, false, "content://content.Provider/", true, false,
       true, ""},
  };

  for (const auto& rel_case : rel_cases) {
    const RelativeCase& cur_case = rel_case;

    Parsed parsed;
    size_t base_len = strlen(cur_case.base);
    if (cur_case.is_base_file)
      ParseFileURL(cur_case.base, base_len, &parsed);
    else if (cur_case.is_base_hier)
      ParseStandardURL(cur_case.base, base_len, &parsed);
    else
      ParsePathURL(cur_case.base, base_len, false, &parsed);

    // First see if it is relative.
    size_t test_len = strlen(cur_case.test);
    bool is_relative;
    Component relative_component;
    bool succeed_is_rel =
        IsRelativeURL(cur_case.base, parsed, cur_case.test, test_len,
                      cur_case.is_base_hier, &is_relative, &relative_component);

    EXPECT_EQ(cur_case.succeed_relative, succeed_is_rel)
        << "succeed is rel failure on " << cur_case.test;
    EXPECT_EQ(cur_case.is_rel, is_relative)
        << "is rel failure on " << cur_case.test;
    // Now resolve it.
    if (succeed_is_rel && is_relative && cur_case.is_rel) {
      std::string resolved;
      StdStringCanonOutput output(&resolved);
      Parsed resolved_parsed;

      bool succeed_resolve = ResolveRelativeURL(
          cur_case.base, parsed, cur_case.is_base_file, cur_case.test,
          relative_component, NULL, &output, &resolved_parsed);
      output.Complete();

      EXPECT_EQ(cur_case.succeed_resolve, succeed_resolve);
      EXPECT_EQ(cur_case.resolved, resolved) << " on " << cur_case.test;

      // Verify that the output parsed structure is the same as parsing a
      // the URL freshly.
      Parsed ref_parsed;
      size_t resolved_len = resolved.size();
      if (cur_case.is_base_file) {
        ParseFileURL(resolved.c_str(), resolved_len, &ref_parsed);
      } else if (cur_case.is_base_hier) {
        ParseStandardURL(resolved.c_str(), resolved_len, &ref_parsed);
      } else {
        ParsePathURL(resolved.c_str(), resolved_len, false, &ref_parsed);
      }
      EXPECT_TRUE(ParsedIsEqual(ref_parsed, resolved_parsed));
    }
  }
}

}  // namespace url
