1 // Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <brillo/url_utils.h> 6 7 #include <gtest/gtest.h> 8 9 namespace brillo { 10 11 TEST(UrlUtils, Combine) { 12 EXPECT_EQ("http://sample.org/path", 13 url::Combine("http://sample.org", "path")); 14 EXPECT_EQ("http://sample.org/path", 15 url::Combine("http://sample.org/", "path")); 16 EXPECT_EQ("path1/path2", url::Combine("", "path1/path2")); 17 EXPECT_EQ("path1/path2", url::Combine("path1", "path2")); 18 EXPECT_EQ("http://sample.org", url::Combine("http://sample.org", "")); 19 EXPECT_EQ("http://sample.org/path", 20 url::Combine("http://sample.org/", "/path")); 21 EXPECT_EQ("http://sample.org/path", 22 url::Combine("http://sample.org", "//////path")); 23 EXPECT_EQ("http://sample.org/", url::Combine("http://sample.org", "///")); 24 EXPECT_EQ("http://sample.org/obj/path1/path2", 25 url::Combine("http://sample.org/obj", "path1/path2")); 26 EXPECT_EQ("http://sample.org/obj/path1/path2#tag", 27 url::Combine("http://sample.org/obj#tag", "path1/path2")); 28 EXPECT_EQ("http://sample.org/obj/path1/path2?k1=v1&k2=v2", 29 url::Combine("http://sample.org/obj?k1=v1&k2=v2", "path1/path2")); 30 EXPECT_EQ("http://sample.org/obj/path1/path2?k1=v1#k2=v2", 31 url::Combine("http://sample.org/obj/?k1=v1#k2=v2", "path1/path2")); 32 EXPECT_EQ("http://sample.org/obj/path1/path2#tag?", 33 url::Combine("http://sample.org/obj#tag?", "path1/path2")); 34 EXPECT_EQ("path1/path2", url::CombineMultiple("", {"path1", "path2"})); 35 EXPECT_EQ("http://sample.org/obj/part1/part2", 36 url::CombineMultiple("http://sample.org", 37 {"obj", "", "/part1/", "part2"})); 38 } 39 40 TEST(UrlUtils, GetQueryString) { 41 EXPECT_EQ("", url::GetQueryString("http://sample.org", false)); 42 EXPECT_EQ("", url::GetQueryString("http://sample.org", true)); 43 EXPECT_EQ("", url::GetQueryString("", false)); 44 EXPECT_EQ("", url::GetQueryString("", true)); 45 46 EXPECT_EQ("?q=v&b=2#tag?2", 47 url::GetQueryString("http://s.com/?q=v&b=2#tag?2", false)); 48 EXPECT_EQ("?q=v&b=2", 49 url::GetQueryString("http://s.com/?q=v&b=2#tag?2", true)); 50 51 EXPECT_EQ("#tag?a=2", url::GetQueryString("http://s.com/#tag?a=2", false)); 52 EXPECT_EQ("", url::GetQueryString("http://s.com/#tag?a=2", true)); 53 54 EXPECT_EQ("?a=2&b=2", url::GetQueryString("?a=2&b=2", false)); 55 EXPECT_EQ("?a=2&b=2", url::GetQueryString("?a=2&b=2", true)); 56 57 EXPECT_EQ("#s#?d#?f?#s?#d", url::GetQueryString("#s#?d#?f?#s?#d", false)); 58 EXPECT_EQ("", url::GetQueryString("#s#?d#?f?#s?#d", true)); 59 } 60 61 TEST(UrlUtils, GetQueryStringParameters) { 62 auto params = url::GetQueryStringParameters( 63 "http://sample.org/path?k=v&&%3Dkey%3D=val%26&r#blah"); 64 65 EXPECT_EQ(3, params.size()); 66 EXPECT_EQ("k", params[0].first); 67 EXPECT_EQ("v", params[0].second); 68 EXPECT_EQ("=key=", params[1].first); 69 EXPECT_EQ("val&", params[1].second); 70 EXPECT_EQ("r", params[2].first); 71 EXPECT_EQ("", params[2].second); 72 } 73 74 TEST(UrlUtils, GetQueryStringValue) { 75 std::string url = "http://url?key1=val1&&key2=val2"; 76 EXPECT_EQ("val1", url::GetQueryStringValue(url, "key1")); 77 EXPECT_EQ("val2", url::GetQueryStringValue(url, "key2")); 78 EXPECT_EQ("", url::GetQueryStringValue(url, "key3")); 79 80 auto params = url::GetQueryStringParameters(url); 81 EXPECT_EQ("val1", url::GetQueryStringValue(params, "key1")); 82 EXPECT_EQ("val2", url::GetQueryStringValue(params, "key2")); 83 EXPECT_EQ("", url::GetQueryStringValue(params, "key3")); 84 } 85 86 TEST(UrlUtils, TrimOffQueryString) { 87 std::string url = "http://url?key1=val1&key2=val2#fragment"; 88 std::string query = url::TrimOffQueryString(&url); 89 EXPECT_EQ("http://url", url); 90 EXPECT_EQ("?key1=val1&key2=val2#fragment", query); 91 92 url = "http://url#fragment"; 93 query = url::TrimOffQueryString(&url); 94 EXPECT_EQ("http://url", url); 95 EXPECT_EQ("#fragment", query); 96 97 url = "http://url"; 98 query = url::TrimOffQueryString(&url); 99 EXPECT_EQ("http://url", url); 100 EXPECT_EQ("", query); 101 } 102 103 TEST(UrlUtils, RemoveQueryString) { 104 std::string url = "http://url?key1=val1&key2=val2#fragment"; 105 EXPECT_EQ("http://url", url::RemoveQueryString(url, true)); 106 EXPECT_EQ("http://url#fragment", url::RemoveQueryString(url, false)); 107 } 108 109 TEST(UrlUtils, AppendQueryParam) { 110 std::string url = "http://server.com/path"; 111 url = url::AppendQueryParam(url, "param", "value"); 112 EXPECT_EQ("http://server.com/path?param=value", url); 113 url = url::AppendQueryParam(url, "param2", "v"); 114 EXPECT_EQ("http://server.com/path?param=value¶m2=v", url); 115 116 url = "http://server.com/path#fragment"; 117 url = url::AppendQueryParam(url, "param", "value"); 118 EXPECT_EQ("http://server.com/path?param=value#fragment", url); 119 url = url::AppendQueryParam(url, "param2", "v"); 120 EXPECT_EQ("http://server.com/path?param=value¶m2=v#fragment", url); 121 122 url = url::AppendQueryParam("http://server.com/path?", "param", "value"); 123 EXPECT_EQ("http://server.com/path?param=value", url); 124 } 125 126 TEST(UrlUtils, AppendQueryParams) { 127 std::string url = "http://server.com/path"; 128 url = url::AppendQueryParams(url, {}); 129 EXPECT_EQ("http://server.com/path", url); 130 url = url::AppendQueryParams(url, {{"param", "value"}, {"q", "="}}); 131 EXPECT_EQ("http://server.com/path?param=value&q=%3D", url); 132 url += "#fr?"; 133 url = url::AppendQueryParams(url, {{"p", "1"}, {"s&", "\n"}}); 134 EXPECT_EQ("http://server.com/path?param=value&q=%3D&p=1&s%26=%0A#fr?", url); 135 } 136 137 TEST(UrlUtils, HasQueryString) { 138 EXPECT_FALSE(url::HasQueryString("http://server.com/path")); 139 EXPECT_FALSE(url::HasQueryString("http://server.com/path#blah?v=1")); 140 EXPECT_TRUE(url::HasQueryString("http://server.com/path?v=1#blah")); 141 EXPECT_TRUE(url::HasQueryString("http://server.com/path?v=1")); 142 EXPECT_FALSE(url::HasQueryString("")); 143 EXPECT_TRUE(url::HasQueryString("?ss")); 144 } 145 146 } // namespace brillo 147