1 //
2 // Copyright (C) 2012 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "shill/http_url.h"
18 
19 #include <gtest/gtest.h>
20 
21 using std::string;
22 using testing::Test;
23 
24 namespace shill {
25 
26 struct StringAndResult {
StringAndResultshill::StringAndResult27   StringAndResult(const string& in_url_string,
28                   bool in_result)
29       : url_string(in_url_string),
30         result(in_result) {}
StringAndResultshill::StringAndResult31   StringAndResult(const string& in_url_string,
32                   bool in_result,
33                   HTTPURL::Protocol in_protocol,
34                   const string& in_host,
35                   int in_port,
36                   const string& in_path)
37       : url_string(in_url_string),
38         result(in_result),
39         protocol(in_protocol),
40         host(in_host),
41         port(in_port),
42         path(in_path) {}
43   string url_string;
44   bool result;
45   HTTPURL::Protocol protocol;
46   string host;
47   int port;
48   string path;
49 };
50 
51 class HTTPURLParseTest : public testing::TestWithParam<StringAndResult> {
52  protected:
53   HTTPURL url_;
54 };
55 
TEST_P(HTTPURLParseTest,ParseURL)56 TEST_P(HTTPURLParseTest, ParseURL) {
57   bool result = url_.ParseFromString(GetParam().url_string);
58   EXPECT_EQ(GetParam().result, result);
59   if (GetParam().result && result) {
60     EXPECT_EQ(GetParam().host, url_.host());
61     EXPECT_EQ(GetParam().path, url_.path());
62     EXPECT_EQ(GetParam().protocol, url_.protocol());
63     EXPECT_EQ(GetParam().port, url_.port());
64   }
65 }
66 
67 INSTANTIATE_TEST_CASE_P(
68     HTTPURLParseStringsTest,
69     HTTPURLParseTest,
70     ::testing::Values(
71         StringAndResult("", false),                      // Empty string
72         StringAndResult("xxx", false),                   // No known prefix
73         StringAndResult(" http://www.foo.com", false),   // Leading garbage
74         StringAndResult("http://", false),               // No hostname
75         StringAndResult("http://:100", false),           // Port but no hostname
76         StringAndResult("http://www.foo.com:", false),   // Colon but no port
77         StringAndResult("http://www.foo.com:x", false),  // Non-numeric port
78         StringAndResult("http://foo.com:10:20", false),  // Too many colons
79         StringAndResult("http://www.foo.com", true,
80                         HTTPURL::kProtocolHTTP,
81                         "www.foo.com",
82                         HTTPURL::kDefaultHTTPPort,
83                         "/"),
84         StringAndResult("https://www.foo.com", true,
85                         HTTPURL::kProtocolHTTPS,
86                         "www.foo.com",
87                         HTTPURL::kDefaultHTTPSPort,
88                         "/"),
89         StringAndResult("https://www.foo.com:4443", true,
90                         HTTPURL::kProtocolHTTPS,
91                         "www.foo.com",
92                         4443,
93                         "/"),
94         StringAndResult("http://www.foo.com/bar", true,
95                         HTTPURL::kProtocolHTTP,
96                         "www.foo.com",
97                         HTTPURL::kDefaultHTTPPort,
98                         "/bar"),
99         StringAndResult("http://www.foo.com?bar", true,
100                         HTTPURL::kProtocolHTTP,
101                         "www.foo.com",
102                         HTTPURL::kDefaultHTTPPort,
103                         "/?bar")));
104 
105 }  // namespace shill
106