// Copyright 2020 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 "util/url.h" #include "gtest/gtest.h" namespace openscreen { TEST(UrlTest, Validity) { const char* valid_cases[] = { "http://google.com", "unknown://google.com", "http://user:pass@google.com", "http://google.com:12345", "http://google.com/path", "http://google.com//path", "http://google.com?k=v#fragment", "http://user:pass@google.com:12345/path?k=v#fragment", "http:/path", "http:path", }; constexpr int valid_case_count = sizeof(valid_cases) / sizeof(valid_cases[0]); for (size_t i = 0; i < valid_case_count; i++) { EXPECT_TRUE(Url(valid_cases[i]).is_valid()) << "Case: " << valid_cases[i]; } const char* invalid_cases[] = { "http://?k=v", "http:://google.com", "http//google.com", "http://google.com:12three45", "://google.com", "path", }; constexpr int invalid_case_count = sizeof(invalid_cases) / sizeof(invalid_cases[0]); for (size_t i = 0; i < invalid_case_count; i++) { EXPECT_FALSE(Url(invalid_cases[i]).is_valid()) << "Case: " << invalid_cases[i]; } } TEST(UrlTest, Components) { Url url("http://user:pass@google.com:99/foo;bar?q=a#ref"); EXPECT_TRUE(url.is_valid()); EXPECT_TRUE(url.has_host()); EXPECT_TRUE(url.has_port()); EXPECT_TRUE(url.has_path()); EXPECT_TRUE(url.has_query()); EXPECT_EQ("http", url.scheme()); EXPECT_EQ("google.com", url.host()); EXPECT_EQ(99, url.port()); EXPECT_EQ("/foo;bar", url.path()); EXPECT_EQ("q=a", url.query()); } TEST(UrlTest, Copy) { Url url1("http://user:pass@google.com:99/foo;bar?q=a#ref"); Url url2(url1); EXPECT_TRUE(url1.is_valid()); EXPECT_TRUE(url1.has_host()); EXPECT_TRUE(url1.has_port()); EXPECT_TRUE(url1.has_path()); EXPECT_TRUE(url1.has_query()); EXPECT_EQ("http", url1.scheme()); EXPECT_EQ("google.com", url1.host()); EXPECT_EQ(99, url1.port()); EXPECT_EQ("/foo;bar", url1.path()); EXPECT_EQ("q=a", url1.query()); EXPECT_TRUE(url2.is_valid()); EXPECT_TRUE(url2.has_host()); EXPECT_TRUE(url2.has_port()); EXPECT_TRUE(url2.has_path()); EXPECT_TRUE(url2.has_query()); EXPECT_EQ("http", url2.scheme()); EXPECT_EQ("google.com", url2.host()); EXPECT_EQ(99, url2.port()); EXPECT_EQ("/foo;bar", url2.path()); EXPECT_EQ("q=a", url2.query()); } TEST(UrlTest, Move) { Url url1("http://user:pass@google.com:99/foo;bar?q=a#ref"); Url url2(std::move(url1)); EXPECT_FALSE(url1.is_valid()); EXPECT_TRUE(url2.is_valid()); EXPECT_TRUE(url2.has_host()); EXPECT_TRUE(url2.has_port()); EXPECT_TRUE(url2.has_path()); EXPECT_TRUE(url2.has_query()); EXPECT_EQ("http", url2.scheme()); EXPECT_EQ("google.com", url2.host()); EXPECT_EQ(99, url2.port()); EXPECT_EQ("/foo;bar", url2.path()); EXPECT_EQ("q=a", url2.query()); } TEST(UrlTest, Assign) { Url url1("http://user:pass@google.com:99/foo;bar?q=a#ref"); Url url2("https://example.com"); Url url3("https://example.com"); url2 = url1; EXPECT_TRUE(url1.is_valid()); EXPECT_TRUE(url1.has_host()); EXPECT_TRUE(url1.has_port()); EXPECT_TRUE(url1.has_path()); EXPECT_TRUE(url1.has_query()); EXPECT_EQ("http", url1.scheme()); EXPECT_EQ("google.com", url1.host()); EXPECT_EQ(99, url1.port()); EXPECT_EQ("/foo;bar", url1.path()); EXPECT_EQ("q=a", url1.query()); EXPECT_TRUE(url2.is_valid()); EXPECT_TRUE(url2.has_host()); EXPECT_TRUE(url2.has_port()); EXPECT_TRUE(url2.has_path()); EXPECT_TRUE(url2.has_query()); EXPECT_EQ("http", url2.scheme()); EXPECT_EQ("google.com", url2.host()); EXPECT_EQ(99, url2.port()); EXPECT_EQ("/foo;bar", url2.path()); EXPECT_EQ("q=a", url2.query()); url3 = std::move(url1); EXPECT_FALSE(url1.is_valid()); EXPECT_TRUE(url3.is_valid()); EXPECT_TRUE(url3.has_host()); EXPECT_TRUE(url3.has_port()); EXPECT_TRUE(url3.has_path()); EXPECT_TRUE(url3.has_query()); EXPECT_EQ("http", url3.scheme()); EXPECT_EQ("google.com", url3.host()); EXPECT_EQ(99, url3.port()); EXPECT_EQ("/foo;bar", url3.path()); EXPECT_EQ("q=a", url3.query()); } TEST(UrlTest, Cast) { std::string cast( "cast:233637DE?capabilities=video_out%2Caudio_out&clientId=" "157299995976393660&autoJoinPolicy=tab_and_origin_scoped&" "defaultActionPolicy=create_session&launchTimeout=30000"); Url url(cast); EXPECT_TRUE(url.is_valid()); EXPECT_TRUE(url.has_query()); EXPECT_EQ(url.scheme(), "cast"); EXPECT_EQ(url.path(), "233637DE"); EXPECT_EQ(url.query(), cast.c_str() + 14); } } // namespace openscreen