// 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
