123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- /**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include "hdfspp/uri.h"
- #include <gmock/gmock.h>
- using ::testing::_;
- using namespace hdfs;
- URI expect_uri_throw(const char *uri) {
- bool threw = false;
- std::string what_msg;
- URI val;
- try {
- val = URI::parse_from_string(uri);
- } catch (const uri_parse_error& e) {
- threw = true;
- what_msg = e.what();
- } catch (...) {
- threw = true;
- }
- EXPECT_TRUE(threw);
- EXPECT_EQ(what_msg, uri);
- return val;
- }
- URI expect_uri_nothrow(const char *uri) {
- bool threw = false;
- std::string what_msg;
- URI val;
- try {
- val = URI::parse_from_string(uri);
- } catch (const uri_parse_error& e) {
- threw = true;
- what_msg = e.what();
- } catch (...) {
- threw = true;
- }
- EXPECT_FALSE(threw);
- EXPECT_EQ(what_msg, "");
- return val;
- }
- TEST(UriTest, TestDegenerateInputs) {
- /* Empty input */
- expect_uri_nothrow("");
- /* Invalid encoding */
- expect_uri_throw("%%");
- /* Invalid port */
- expect_uri_throw("hdfs://nn:foo/");
- /* Negative port */
- expect_uri_throw("hdfs://nn:-100/");
- /* Empty paths */
- expect_uri_nothrow("hdfs://////");
- }
- TEST(UriTest, TestNominalInputs) {
- /* Simple input */
- {
- URI uri = expect_uri_nothrow("hdfs:///foo");
- EXPECT_EQ("hdfs", uri.get_scheme());
- EXPECT_EQ("", uri.get_host());
- EXPECT_FALSE(uri.has_port());
- EXPECT_EQ(0, uri.get_port_or_default(0));
- EXPECT_EQ("/foo", uri.get_path());
- EXPECT_EQ("", uri.get_fragment());
- EXPECT_EQ("", uri.get_query());
- }
- /* With authority */
- {
- URI uri = expect_uri_nothrow("hdfs://host:100/foo");
- EXPECT_EQ("hdfs", uri.get_scheme());
- EXPECT_EQ("host", uri.get_host());
- EXPECT_TRUE(uri.has_port());
- EXPECT_EQ(100, uri.get_port());
- EXPECT_EQ(100, uri.get_port_or_default(0));
- EXPECT_EQ("/foo", uri.get_path());
- EXPECT_EQ("", uri.get_fragment());
- EXPECT_EQ("", uri.get_query());
- }
- /* No scheme */
- {
- URI uri = expect_uri_nothrow("/foo");
- EXPECT_EQ("", uri.get_scheme());
- EXPECT_EQ("", uri.get_host());
- EXPECT_FALSE(uri.has_port());
- EXPECT_EQ(0, uri.get_port_or_default(0));
- EXPECT_EQ("/foo", uri.get_path());
- EXPECT_EQ("", uri.get_fragment());
- EXPECT_EQ("", uri.get_query());
- }
- /* All fields */
- {
- URI uri = expect_uri_nothrow("hdfs://nn:8020/path/to/data?a=b&c=d#fragment");
- EXPECT_EQ("hdfs", uri.get_scheme());
- EXPECT_EQ("nn", uri.get_host());
- EXPECT_TRUE(uri.has_port());
- EXPECT_EQ(8020, uri.get_port());
- EXPECT_EQ(8020, uri.get_port_or_default(0));
- EXPECT_EQ("/path/to/data", uri.get_path());
- EXPECT_EQ("a=b&c=d", uri.get_query());
- EXPECT_EQ(3, uri.get_path_elements().size());
- EXPECT_EQ("path", uri.get_path_elements()[0]);
- EXPECT_EQ("to", uri.get_path_elements()[1]);
- EXPECT_EQ("data", uri.get_path_elements()[2]);
- EXPECT_EQ(2, uri.get_query_elements().size());
- EXPECT_EQ("a", uri.get_query_elements()[0].key);
- EXPECT_EQ("b", uri.get_query_elements()[0].value);
- EXPECT_EQ("c", uri.get_query_elements()[1].key);
- EXPECT_EQ("d", uri.get_query_elements()[1].value);
- EXPECT_EQ("fragment", uri.get_fragment());
- }
- }
- TEST(UriTest, TestEncodedInputs) {
- // Note that scheme and port cannot be uri-encoded
- /* Encoded input */
- {
- URI uri = expect_uri_nothrow("S://%5E:1/+%5E%20?%5E=%5E#%5E");
- EXPECT_EQ("S", uri.get_scheme());
- EXPECT_EQ("^", uri.get_host());
- EXPECT_EQ(1, uri.get_port_or_default(0));
- EXPECT_EQ("/ ^ ", uri.get_path());
- EXPECT_EQ("^", uri.get_fragment());
- EXPECT_EQ("^=^", uri.get_query());
- }
- /* Lowercase */
- {
- URI uri = expect_uri_nothrow("S://%5e:1/+%5e%20?%5e=%5e#%5e");
- EXPECT_EQ("S", uri.get_scheme());
- EXPECT_EQ("^", uri.get_host());
- EXPECT_EQ(1, uri.get_port_or_default(0));
- EXPECT_EQ("/ ^ ", uri.get_path());
- EXPECT_EQ("^", uri.get_fragment());
- EXPECT_EQ("^=^", uri.get_query());
- }
- }
- TEST(UriTest, TestDecodedInputsAndOutputs) {
- /* All fields non-encoded and shouldn't be interpreted */
- {
- URI uri = expect_uri_nothrow("S://%25/%25+?%25=%25#%25");
- EXPECT_EQ("S", uri.get_scheme());
- EXPECT_EQ("%", uri.get_host());
- EXPECT_EQ(0, uri.get_port_or_default(0));
- EXPECT_EQ("/% ", uri.get_path());
- EXPECT_EQ("%", uri.get_fragment());
- EXPECT_EQ("%=%", uri.get_query());
- }
- /* All fields encode fields on their way out */
- {
- URI uri = expect_uri_nothrow("S://%25/%25+?%25=%25#%25");
- EXPECT_EQ("S", uri.get_scheme(true));
- EXPECT_EQ("%25", uri.get_host(true));
- EXPECT_EQ(0, uri.get_port_or_default(0));
- EXPECT_EQ("/%25+", uri.get_path(true));
- EXPECT_EQ("%25", uri.get_fragment(true));
- EXPECT_EQ("%25=%25", uri.get_query(true));
- }
- }
- TEST(UriTest, TestSetters) {
- /* Non-encoded inputs */
- {
- URI uri;
- uri.set_scheme("S");
- uri.set_host("%");
- uri.set_port(100);
- uri.set_path("%/%/%");
- uri.set_fragment("%");
- uri.set_query("%25=%25"); //set_query must always be encoded
- EXPECT_EQ("S://%25:100/%25/%25/%25?%25=%25#%25", uri.str());
- }
- /* Incremental adders, non-encoded */
- {
- URI uri;
- uri.set_scheme("S");
- uri.set_host("%");
- uri.set_port(100);
- uri.set_fragment("%");
- EXPECT_EQ("S://%25:100#%25", uri.str());
- uri.add_path("%");
- uri.add_query("%", "%");
- EXPECT_EQ("S://%25:100/%25?%25=%25#%25", uri.str());
- uri.add_path("%");
- uri.add_query("%", "%");
- EXPECT_EQ("S://%25:100/%25/%25?%25=%25&%25=%25#%25", uri.str());
- }
- /* Encoded inputs */
- {
- URI uri;
- uri.set_scheme("S", true);
- uri.set_host("%25", true);
- uri.set_port(100);
- uri.set_path("%25/%25/%25", true);
- uri.set_fragment("%25", true);
- uri.set_query("%25=%25"); //set_query must always be encoded
- EXPECT_EQ("S://%25:100/%25/%25/%25?%25=%25#%25", uri.str());
- }
- /* Incremental adders, encoded */
- {
- URI uri;
- uri.set_scheme("S", true);
- uri.set_host("%25", true);
- uri.set_port(100);
- uri.set_fragment("%25", true);
- EXPECT_EQ("S://%25:100#%25", uri.str());
- uri.add_path("%25", true);
- uri.add_query("%25", "%25", true);
- EXPECT_EQ("S://%25:100/%25?%25=%25#%25", uri.str());
- uri.add_path("%25", true);
- uri.add_query("%25", "%25", true);
- EXPECT_EQ("S://%25:100/%25/%25?%25=%25&%25=%25#%25", uri.str());
- }
- }
- TEST(UriTest, QueryManip) {
- // Not encoded, just basic adding and removing query parts
- {
- URI uri = URI::parse_from_string("hdfs://nn:8020/path?thedude=lebowski&donny=outofhiselement");
- EXPECT_TRUE(uri.has_port());
- EXPECT_EQ(uri.get_query(), "thedude=lebowski&donny=outofhiselement");
- std::vector<URI::Query> queries = uri.get_query_elements();
- EXPECT_EQ(queries.size(), 2);
- EXPECT_EQ(queries[0].key, "thedude");
- EXPECT_EQ(queries[0].value, "lebowski");
- EXPECT_EQ(queries[1].key, "donny");
- EXPECT_EQ(queries[1].value, "outofhiselement");
- uri.remove_query("donny"); // that's a bummer, man
- EXPECT_EQ(uri.get_query(), "thedude=lebowski");
- queries = uri.get_query_elements();
- EXPECT_EQ(queries.size(), 1);
- EXPECT_EQ(queries[0].key, "thedude");
- EXPECT_EQ(queries[0].value, "lebowski");
- uri.add_query("HeyPeter", "CheckItOut");
- EXPECT_EQ(uri.get_query(), "thedude=lebowski&HeyPeter=CheckItOut");
- queries = uri.get_query_elements();
- EXPECT_EQ(queries.size(), 2);
- }
- }
- int main(int argc, char *argv[]) {
- /*
- * The following line must be executed to initialize Google Mock
- * (and Google Test) before running the tests.
- */
- ::testing::InitGoogleMock(&argc, argv);
- return RUN_ALL_TESTS();
- }
|