blob: aa045c29d20543178c5a8b09eb5fd58260f1948f [file] [log] [blame]
// 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