// 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 "quic/tools/quic_url.h" #include #include "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