• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium 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 "net/base/url_util.h"
6 
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "url/gurl.h"
9 
10 namespace net {
11 namespace {
12 
TEST(UrlUtilTest,AppendQueryParameter)13 TEST(UrlUtilTest, AppendQueryParameter) {
14   // Appending a name-value pair to a URL without a query component.
15   EXPECT_EQ("http://example.com/path?name=value",
16             AppendQueryParameter(GURL("http://example.com/path"),
17                                  "name", "value").spec());
18 
19   // Appending a name-value pair to a URL with a query component.
20   // The original component should be preserved, and the new pair should be
21   // appended with '&'.
22   EXPECT_EQ("http://example.com/path?existing=one&name=value",
23             AppendQueryParameter(GURL("http://example.com/path?existing=one"),
24                                  "name", "value").spec());
25 
26   // Appending a name-value pair with unsafe characters included. The
27   // unsafe characters should be escaped.
28   EXPECT_EQ("http://example.com/path?existing=one&na+me=v.alue%3D",
29             AppendQueryParameter(GURL("http://example.com/path?existing=one"),
30                                  "na me", "v.alue=").spec());
31 
32 }
33 
TEST(UrlUtilTest,AppendOrReplaceQueryParameter)34 TEST(UrlUtilTest, AppendOrReplaceQueryParameter) {
35   // Appending a name-value pair to a URL without a query component.
36   EXPECT_EQ("http://example.com/path?name=value",
37             AppendOrReplaceQueryParameter(GURL("http://example.com/path"),
38                                  "name", "value").spec());
39 
40   // Appending a name-value pair to a URL with a query component.
41   // The original component should be preserved, and the new pair should be
42   // appended with '&'.
43   EXPECT_EQ("http://example.com/path?existing=one&name=value",
44       AppendOrReplaceQueryParameter(
45           GURL("http://example.com/path?existing=one"),
46           "name", "value").spec());
47 
48   // Appending a name-value pair with unsafe characters included. The
49   // unsafe characters should be escaped.
50   EXPECT_EQ("http://example.com/path?existing=one&na+me=v.alue%3D",
51       AppendOrReplaceQueryParameter(
52           GURL("http://example.com/path?existing=one"),
53           "na me", "v.alue=").spec());
54 
55   // Replace value of an existing paramater.
56   EXPECT_EQ("http://example.com/path?existing=one&name=new",
57       AppendOrReplaceQueryParameter(
58           GURL("http://example.com/path?existing=one&name=old"),
59           "name", "new").spec());
60 
61   // Replace a name-value pair with unsafe characters included. The
62   // unsafe characters should be escaped.
63   EXPECT_EQ("http://example.com/path?na+me=n.ew%3D&existing=one",
64       AppendOrReplaceQueryParameter(
65           GURL("http://example.com/path?na+me=old&existing=one"),
66           "na me", "n.ew=").spec());
67 
68   // Replace the value of first parameter with this name only.
69   EXPECT_EQ("http://example.com/path?name=new&existing=one&name=old",
70       AppendOrReplaceQueryParameter(
71           GURL("http://example.com/path?name=old&existing=one&name=old"),
72           "name", "new").spec());
73 
74   // Preserve the content of the original params regarless of our failure to
75   // interpret them correctly.
76   EXPECT_EQ("http://example.com/path?bar&name=new&left=&"
77             "=right&=&&name=again",
78       AppendOrReplaceQueryParameter(
79           GURL("http://example.com/path?bar&name=old&left=&"
80                 "=right&=&&name=again"),
81           "name", "new").spec());
82 }
83 
TEST(UrlUtilTest,GetValueForKeyInQuery)84 TEST(UrlUtilTest, GetValueForKeyInQuery) {
85   GURL url("http://example.com/path?name=value&boolParam&"
86            "url=http://test.com/q?n1%3Dv1%26n2");
87   std::string value;
88 
89   // False when getting a non-existent query param.
90   EXPECT_FALSE(GetValueForKeyInQuery(url, "non-exist", &value));
91 
92   // True when query param exist.
93   EXPECT_TRUE(GetValueForKeyInQuery(url, "name", &value));
94   EXPECT_EQ("value", value);
95 
96   EXPECT_TRUE(GetValueForKeyInQuery(url, "boolParam", &value));
97   EXPECT_EQ("", value);
98 
99   EXPECT_TRUE(GetValueForKeyInQuery(url, "url", &value));
100   EXPECT_EQ("http://test.com/q?n1=v1&n2", value);
101 }
102 
TEST(UrlUtilTest,GetValueForKeyInQueryInvalidURL)103 TEST(UrlUtilTest, GetValueForKeyInQueryInvalidURL) {
104   GURL url("http://%01/?test");
105   std::string value;
106 
107   // Always false when parsing an invalid URL.
108   EXPECT_FALSE(GetValueForKeyInQuery(url, "test", &value));
109 }
110 
TEST(UrlUtilTest,ParseQuery)111 TEST(UrlUtilTest, ParseQuery) {
112   const GURL url("http://example.com/path?name=value&boolParam&"
113                  "url=http://test.com/q?n1%3Dv1%26n2&"
114                  "multikey=value1&multikey=value2&multikey");
115   QueryIterator it(url);
116 
117   ASSERT_FALSE(it.IsAtEnd());
118   EXPECT_EQ("name", it.GetKey());
119   EXPECT_EQ("value", it.GetValue());
120   EXPECT_EQ("value", it.GetUnescapedValue());
121   it.Advance();
122 
123   ASSERT_FALSE(it.IsAtEnd());
124   EXPECT_EQ("boolParam", it.GetKey());
125   EXPECT_EQ("", it.GetValue());
126   EXPECT_EQ("", it.GetUnescapedValue());
127   it.Advance();
128 
129   ASSERT_FALSE(it.IsAtEnd());
130   EXPECT_EQ("url", it.GetKey());
131   EXPECT_EQ("http://test.com/q?n1%3Dv1%26n2", it.GetValue());
132   EXPECT_EQ("http://test.com/q?n1=v1&n2", it.GetUnescapedValue());
133   it.Advance();
134 
135   ASSERT_FALSE(it.IsAtEnd());
136   EXPECT_EQ("multikey", it.GetKey());
137   EXPECT_EQ("value1", it.GetValue());
138   EXPECT_EQ("value1", it.GetUnescapedValue());
139   it.Advance();
140 
141   ASSERT_FALSE(it.IsAtEnd());
142   EXPECT_EQ("multikey", it.GetKey());
143   EXPECT_EQ("value2", it.GetValue());
144   EXPECT_EQ("value2", it.GetUnescapedValue());
145   it.Advance();
146 
147   ASSERT_FALSE(it.IsAtEnd());
148   EXPECT_EQ("multikey", it.GetKey());
149   EXPECT_EQ("", it.GetValue());
150   EXPECT_EQ("", it.GetUnescapedValue());
151   it.Advance();
152 
153   EXPECT_TRUE(it.IsAtEnd());
154 }
155 
TEST(UrlUtilTest,ParseQueryInvalidURL)156 TEST(UrlUtilTest, ParseQueryInvalidURL) {
157   const GURL url("http://%01/?test");
158   QueryIterator it(url);
159   EXPECT_TRUE(it.IsAtEnd());
160 }
161 
162 }  // namespace
163 }  // namespace net
164