12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/url_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(UrlUtilTest, AppendQueryParameter) { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appending a name-value pair to a URL without a query component. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?name=value", 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendQueryParameter(GURL("http://example.com/path"), 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "name", "value").spec()); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appending a name-value pair to a URL with a query component. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The original component should be preserved, and the new pair should be 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appended with '&'. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?existing=one&name=value", 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendQueryParameter(GURL("http://example.com/path?existing=one"), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "name", "value").spec()); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appending a name-value pair with unsafe characters included. The 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unsafe characters should be escaped. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?existing=one&na+me=v.alue%3D", 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendQueryParameter(GURL("http://example.com/path?existing=one"), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "na me", "v.alue=").spec()); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(UrlUtilTest, AppendOrReplaceQueryParameter) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appending a name-value pair to a URL without a query component. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?name=value", 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendOrReplaceQueryParameter(GURL("http://example.com/path"), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "name", "value").spec()); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appending a name-value pair to a URL with a query component. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The original component should be preserved, and the new pair should be 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appended with '&'. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?existing=one&name=value", 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendOrReplaceQueryParameter( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://example.com/path?existing=one"), 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "name", "value").spec()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appending a name-value pair with unsafe characters included. The 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unsafe characters should be escaped. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?existing=one&na+me=v.alue%3D", 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendOrReplaceQueryParameter( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://example.com/path?existing=one"), 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "na me", "v.alue=").spec()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace value of an existing paramater. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?existing=one&name=new", 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendOrReplaceQueryParameter( 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://example.com/path?existing=one&name=old"), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "name", "new").spec()); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace a name-value pair with unsafe characters included. The 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unsafe characters should be escaped. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?na+me=n.ew%3D&existing=one", 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendOrReplaceQueryParameter( 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://example.com/path?na+me=old&existing=one"), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "na me", "n.ew=").spec()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace the value of first parameter with this name only. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?name=new&existing=one&name=old", 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendOrReplaceQueryParameter( 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://example.com/path?name=old&existing=one&name=old"), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "name", "new").spec()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preserve the content of the original params regarless of our failure to 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interpret them correctly. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://example.com/path?bar&name=new&left=&" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "=right&=&&name=again", 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendOrReplaceQueryParameter( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://example.com/path?bar&name=old&left=&" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "=right&=&&name=again"), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "name", "new").spec()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(UrlUtilTest, GetValueForKeyInQuery) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://example.com/path?name=value&boolParam&" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "url=http://test.com/q?n1%3Dv1%26n2"); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // False when getting a non-existent query param. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetValueForKeyInQuery(url, "non-exist", &value)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True when query param exist. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetValueForKeyInQuery(url, "name", &value)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("value", value); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetValueForKeyInQuery(url, "boolParam", &value)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", value); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetValueForKeyInQuery(url, "url", &value)); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://test.com/q?n1=v1&n2", value); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST(UrlUtilTest, GetValueForKeyInQueryInvalidURL) { 1042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GURL url("http://%01/?test"); 1052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::string value; 1062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Always false when parsing an invalid URL. 1082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_FALSE(GetValueForKeyInQuery(url, "test", &value)); 1092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(UrlUtilTest, ParseQuery) { 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL url("http://example.com/path?name=value&boolParam&" 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "url=http://test.com/q?n1%3Dv1%26n2&" 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "multikey=value1&multikey=value2&multikey"); 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QueryIterator it(url); 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_FALSE(it.IsAtEnd()); 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("name", it.GetKey()); 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("value", it.GetValue()); 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("value", it.GetUnescapedValue()); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it.Advance(); 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_FALSE(it.IsAtEnd()); 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("boolParam", it.GetKey()); 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("", it.GetValue()); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("", it.GetUnescapedValue()); 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it.Advance(); 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_FALSE(it.IsAtEnd()); 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("url", it.GetKey()); 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("http://test.com/q?n1%3Dv1%26n2", it.GetValue()); 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("http://test.com/q?n1=v1&n2", it.GetUnescapedValue()); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it.Advance(); 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_FALSE(it.IsAtEnd()); 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("multikey", it.GetKey()); 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("value1", it.GetValue()); 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("value1", it.GetUnescapedValue()); 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it.Advance(); 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_FALSE(it.IsAtEnd()); 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("multikey", it.GetKey()); 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("value2", it.GetValue()); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("value2", it.GetUnescapedValue()); 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it.Advance(); 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_FALSE(it.IsAtEnd()); 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("multikey", it.GetKey()); 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("", it.GetValue()); 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("", it.GetUnescapedValue()); 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it.Advance(); 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(it.IsAtEnd()); 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(UrlUtilTest, ParseQueryInvalidURL) { 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL url("http://%01/?test"); 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) QueryIterator it(url); 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(it.IsAtEnd()); 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 164