| // Copyright 2018 The Chromium OS 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 "shill/http_url.h" |
| |
| #include <gtest/gtest.h> |
| |
| using std::string; |
| |
| namespace shill { |
| |
| struct StringAndResult { |
| explicit StringAndResult(const string& in_url_string) |
| : url_string(in_url_string), result(false) {} |
| |
| StringAndResult(const string& in_url_string, |
| HttpUrl::Protocol in_protocol, |
| const string& in_host, |
| int in_port, |
| const string& in_path) |
| : url_string(in_url_string), |
| result(true), |
| protocol(in_protocol), |
| host(in_host), |
| port(in_port), |
| path(in_path) {} |
| |
| string url_string; |
| bool result; |
| HttpUrl::Protocol protocol; |
| string host; |
| int port; |
| string path; |
| }; |
| |
| class HttpUrlParseTest : public testing::TestWithParam<StringAndResult> { |
| protected: |
| HttpUrl url_; |
| }; |
| |
| TEST_P(HttpUrlParseTest, ParseURL) { |
| bool result = url_.ParseFromString(GetParam().url_string); |
| EXPECT_EQ(GetParam().result, result); |
| if (GetParam().result && result) { |
| EXPECT_EQ(GetParam().host, url_.host()); |
| EXPECT_EQ(GetParam().path, url_.path()); |
| EXPECT_EQ(GetParam().protocol, url_.protocol()); |
| EXPECT_EQ(GetParam().port, url_.port()); |
| } |
| } |
| |
| INSTANTIATE_TEST_CASE_P( |
| ParseFailed, |
| HttpUrlParseTest, |
| ::testing::Values( |
| StringAndResult(""), // Empty string |
| StringAndResult("xxx"), // No known prefix |
| StringAndResult(" http://www.foo.com"), // Leading garbage |
| StringAndResult("http://"), // No hostname |
| StringAndResult("http://:100"), // Port but no hostname |
| StringAndResult("http://www.foo.com:"), // Colon but no port |
| StringAndResult("http://www.foo.com:x"), // Non-numeric port |
| StringAndResult("http://foo.com:10:20"))); // Too many colons |
| |
| INSTANTIATE_TEST_CASE_P( |
| ParseSucceeded, |
| HttpUrlParseTest, |
| ::testing::Values(StringAndResult("http://www.foo.com", |
| HttpUrl::Protocol::kHttp, |
| "www.foo.com", |
| HttpUrl::kDefaultHttpPort, |
| "/"), |
| StringAndResult("https://www.foo.com", |
| HttpUrl::Protocol::kHttps, |
| "www.foo.com", |
| HttpUrl::kDefaultHttpsPort, |
| "/"), |
| StringAndResult("https://www.foo.com:4443", |
| HttpUrl::Protocol::kHttps, |
| "www.foo.com", |
| 4443, |
| "/"), |
| StringAndResult("http://www.foo.com/bar", |
| HttpUrl::Protocol::kHttp, |
| "www.foo.com", |
| HttpUrl::kDefaultHttpPort, |
| "/bar"), |
| StringAndResult("http://www.foo.com?bar", |
| HttpUrl::Protocol::kHttp, |
| "www.foo.com", |
| HttpUrl::kDefaultHttpPort, |
| "/?bar"))); |
| |
| } // namespace shill |