| // Copyright (c) 2012 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 "net/third_party/quiche/src/quic/tools/quic_url.h" | 
 |  | 
 | #include <string> | 
 |  | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" | 
 |  | 
 | namespace quic { | 
 | namespace test { | 
 | namespace { | 
 |  | 
 | class QuicUrlTest : public QuicTest {}; | 
 |  | 
 | TEST_F(QuicUrlTest, Basic) { | 
 |   // No scheme specified. | 
 |   std::string url_str = "www.example.com"; | 
 |   QuicUrl url(url_str); | 
 |   EXPECT_FALSE(url.IsValid()); | 
 |  | 
 |   // scheme is HTTP. | 
 |   url_str = "http://www.example.com"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_TRUE(url.IsValid()); | 
 |   EXPECT_EQ("http://www.example.com/", url.ToString()); | 
 |   EXPECT_EQ("http", url.scheme()); | 
 |   EXPECT_EQ("www.example.com", url.HostPort()); | 
 |   EXPECT_EQ("/", url.PathParamsQuery()); | 
 |   EXPECT_EQ(80u, url.port()); | 
 |  | 
 |   // scheme is HTTPS. | 
 |   url_str = "https://www.example.com:12345/path/to/resource?a=1&campaign=2"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_TRUE(url.IsValid()); | 
 |   EXPECT_EQ("https://www.example.com:12345/path/to/resource?a=1&campaign=2", | 
 |             url.ToString()); | 
 |   EXPECT_EQ("https", url.scheme()); | 
 |   EXPECT_EQ("www.example.com:12345", url.HostPort()); | 
 |   EXPECT_EQ("/path/to/resource?a=1&campaign=2", url.PathParamsQuery()); | 
 |   EXPECT_EQ(12345u, url.port()); | 
 |  | 
 |   // scheme is FTP. | 
 |   url_str = "ftp://www.example.com"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_TRUE(url.IsValid()); | 
 |   EXPECT_EQ("ftp://www.example.com/", url.ToString()); | 
 |   EXPECT_EQ("ftp", url.scheme()); | 
 |   EXPECT_EQ("www.example.com", url.HostPort()); | 
 |   EXPECT_EQ("/", url.PathParamsQuery()); | 
 |   EXPECT_EQ(21u, url.port()); | 
 | } | 
 |  | 
 | TEST_F(QuicUrlTest, DefaultScheme) { | 
 |   // Default scheme to HTTP. | 
 |   std::string url_str = "www.example.com"; | 
 |   QuicUrl url(url_str, "http"); | 
 |   EXPECT_EQ("http://www.example.com/", url.ToString()); | 
 |   EXPECT_EQ("http", url.scheme()); | 
 |  | 
 |   // URL already has a scheme specified. | 
 |   url_str = "http://www.example.com"; | 
 |   url = QuicUrl(url_str, "https"); | 
 |   EXPECT_EQ("http://www.example.com/", url.ToString()); | 
 |   EXPECT_EQ("http", url.scheme()); | 
 |  | 
 |   // Default scheme to FTP. | 
 |   url_str = "www.example.com"; | 
 |   url = QuicUrl(url_str, "ftp"); | 
 |   EXPECT_EQ("ftp://www.example.com/", url.ToString()); | 
 |   EXPECT_EQ("ftp", url.scheme()); | 
 | } | 
 |  | 
 | TEST_F(QuicUrlTest, IsValid) { | 
 |   std::string url_str = | 
 |       "ftp://www.example.com:12345/path/to/resource?a=1&campaign=2"; | 
 |   EXPECT_TRUE(QuicUrl(url_str).IsValid()); | 
 |  | 
 |   // Invalid characters in host name. | 
 |   url_str = "https://www%.example.com:12345/path/to/resource?a=1&campaign=2"; | 
 |   EXPECT_FALSE(QuicUrl(url_str).IsValid()); | 
 |  | 
 |   // Invalid characters in scheme. | 
 |   url_str = "%http://www.example.com:12345/path/to/resource?a=1&campaign=2"; | 
 |   EXPECT_FALSE(QuicUrl(url_str).IsValid()); | 
 |  | 
 |   // Host name too long. | 
 |   std::string host(1024, 'a'); | 
 |   url_str = "https://" + host; | 
 |   EXPECT_FALSE(QuicUrl(url_str).IsValid()); | 
 |  | 
 |   // Invalid port number. | 
 |   url_str = "https://www..example.com:123456/path/to/resource?a=1&campaign=2"; | 
 |   EXPECT_FALSE(QuicUrl(url_str).IsValid()); | 
 | } | 
 |  | 
 | TEST_F(QuicUrlTest, HostPort) { | 
 |   std::string url_str = "http://www.example.com/"; | 
 |   QuicUrl url(url_str); | 
 |   EXPECT_EQ("www.example.com", url.HostPort()); | 
 |   EXPECT_EQ("www.example.com", url.host()); | 
 |   EXPECT_EQ(80u, url.port()); | 
 |  | 
 |   url_str = "http://www.example.com:80/"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_EQ("www.example.com", url.HostPort()); | 
 |   EXPECT_EQ("www.example.com", url.host()); | 
 |   EXPECT_EQ(80u, url.port()); | 
 |  | 
 |   url_str = "http://www.example.com:81/"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_EQ("www.example.com:81", url.HostPort()); | 
 |   EXPECT_EQ("www.example.com", url.host()); | 
 |   EXPECT_EQ(81u, url.port()); | 
 |  | 
 |   url_str = "https://192.168.1.1:443/"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_EQ("192.168.1.1", url.HostPort()); | 
 |   EXPECT_EQ("192.168.1.1", url.host()); | 
 |   EXPECT_EQ(443u, url.port()); | 
 |  | 
 |   url_str = "http://[2001::1]:80/"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_EQ("[2001::1]", url.HostPort()); | 
 |   EXPECT_EQ("2001::1", url.host()); | 
 |   EXPECT_EQ(80u, url.port()); | 
 |  | 
 |   url_str = "http://[2001::1]:81/"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_EQ("[2001::1]:81", url.HostPort()); | 
 |   EXPECT_EQ("2001::1", url.host()); | 
 |   EXPECT_EQ(81u, url.port()); | 
 | } | 
 |  | 
 | TEST_F(QuicUrlTest, PathParamsQuery) { | 
 |   std::string url_str = | 
 |       "https://www.example.com:12345/path/to/resource?a=1&campaign=2"; | 
 |   QuicUrl url(url_str); | 
 |   EXPECT_EQ("/path/to/resource?a=1&campaign=2", url.PathParamsQuery()); | 
 |   EXPECT_EQ("/path/to/resource", url.path()); | 
 |  | 
 |   url_str = "https://www.example.com/?"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_EQ("/?", url.PathParamsQuery()); | 
 |   EXPECT_EQ("/", url.path()); | 
 |  | 
 |   url_str = "https://www.example.com/"; | 
 |   url = QuicUrl(url_str); | 
 |   EXPECT_EQ("/", url.PathParamsQuery()); | 
 |   EXPECT_EQ("/", url.path()); | 
 | } | 
 |  | 
 | }  // namespace | 
 | }  // namespace test | 
 | }  // namespace quic |