Home | History | Annotate | Download | only in shill
      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 {
     27   StringAndResult(const string& in_url_string,
     28                   bool in_result)
     29       : url_string(in_url_string),
     30         result(in_result) {}
     31   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 
     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