15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/base_paths.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/files/file_path.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/url_fixer/url_fixer.h" 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/url_parse.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace url { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& os, const Component& part) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return os << "(begin=" << part.begin << ", len=" << part.len << ")"; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace url 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct SegmentCase { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string input; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string result; 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const url::Component scheme; 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const url::Component username; 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const url::Component password; 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const url::Component host; 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const url::Component port; 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const url::Component path; 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const url::Component query; 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const url::Component ref; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static const SegmentCase segment_cases[] = { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://www.google.com/", "http", 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 4), // scheme 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(7, 14), // host 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(21, 1), // path 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "aBoUt:vErSiOn", "about", 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 5), // scheme 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(6, 7), // host 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // path 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "about:host/path?query#ref", "about", 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 5), // scheme 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(6, 4), // host 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(10, 5), // path 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(16, 5), // query 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(22, 3), // ref 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "about://host/path?query#ref", "about", 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 5), // scheme 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(8, 4), // host 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(12, 5), // path 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(18, 5), // query 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(24, 3), // ref 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "chrome:host/path?query#ref", "chrome", 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 6), // scheme 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(7, 4), // host 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(11, 5), // path 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(17, 5), // query 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(23, 3), // ref 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "chrome://host/path?query#ref", "chrome", 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 6), // scheme 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(9, 4), // host 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(13, 5), // path 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(19, 5), // query 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(25, 3), // ref 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { " www.google.com:124?foo#", "http", 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // scheme 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(4, 14), // host 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(19, 3), // port 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // path 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(23, 3), // query 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(27, 0), // ref 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "user@www.google.com", "http", 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // scheme 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 4), // username 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(5, 14), // host 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // path 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ftp:/user:P:a$$Wd@..ftp.google.com...::23///pub?foo#bar", "ftp", 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 3), // scheme 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(5, 4), // username 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(10, 7), // password 1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(18, 20), // host 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(39, 2), // port 1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(41, 6), // path 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(48, 3), // query 1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(52, 3), // ref 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "[2001:db8::1]/path", "http", 1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // scheme 1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 13), // host 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(13, 5), // path 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "[::1]", "http", 1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // scheme 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 5), // host 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // path 1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incomplete IPv6 addresses (will not canonicalize). 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "[2001:4860:", "http", 1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // scheme 1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 11), // host 1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // path 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "[2001:4860:/foo", "http", 1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // scheme 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 11), // host 1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(11, 4), // path 1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "http://:b005::68]", "http", 1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 4), // scheme 1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(7, 10), // host 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // path 1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can't do anything useful with this. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { ":b005::68]", "", 1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(0, 0), // scheme 1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // username 1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // password 1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // host 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // port 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // path 1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // query 1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Component(), // ref 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef testing::Test URLFixerTest; 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST(URLFixerTest, SegmentURL) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu url::Parsed parts; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(segment_cases); ++i) { 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SegmentCase value = segment_cases[i]; 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result = url_fixer::SegmentURL(value.input, &parts); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.result, result); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.scheme, parts.scheme); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.username, parts.username); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.password, parts.password); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.host, parts.host); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.port, parts.port); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.path, parts.path); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.query, parts.query); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.ref, parts.ref); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a file and returns its full name as well as the decomposed 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version. Example: 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// full_path = "c:\foo\bar.txt" 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dir = "c:\foo" 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file_name = "bar.txt" 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool MakeTempFile(const base::FilePath& dir, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_name, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* full_path) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *full_path = dir.Append(file_name); 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return base::WriteFile(*full_path, "", 0) == 0; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the given URL is a file: URL that matches the given file 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsMatchingFileURL(const std::string& url, 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& full_file_path) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.length() <= 8) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (std::string("file:///") != url.substr(0, 8)) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // no file:/// prefix 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.find('\\') != std::string::npos) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // contains backslashes 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath derived_path; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::FileURLToFilePath(GURL(url), &derived_path); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath::CompareEqualIgnoreCase(derived_path.value(), 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_file_path.value()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct FixupCase { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string input; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string output; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} fixup_cases[] = { 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"www.google.com", "http://www.google.com/"}, 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {" www.google.com ", "http://www.google.com/"}, 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {" foo.com/asdf bar", "http://foo.com/asdf%20%20bar"}, 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"..www.google.com..", "http://www.google.com./"}, 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://......", "http://....../"}, 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://host.com:ninety-two/", "http://host.com:ninety-two/"}, 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://host.com:ninety-two?foo", "http://host.com:ninety-two/?foo"}, 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"google.com:123", "http://google.com:123/"}, 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"about:", "chrome://version/"}, 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"about:foo", "chrome://foo/"}, 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"about:version", "chrome://version/"}, 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"about:blank", "about:blank"}, 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"about:usr:pwd@hst/pth?qry#ref", "chrome://usr:pwd@hst/pth?qry#ref"}, 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"about://usr:pwd@hst/pth?qry#ref", "chrome://usr:pwd@hst/pth?qry#ref"}, 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"chrome:usr:pwd@hst/pth?qry#ref", "chrome://usr:pwd@hst/pth?qry#ref"}, 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"chrome://usr:pwd@hst/pth?qry#ref", "chrome://usr:pwd@hst/pth?qry#ref"}, 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"www:123", "http://www:123/"}, 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {" www:123", "http://www:123/"}, 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"www.google.com?foo", "http://www.google.com/?foo"}, 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"www.google.com#foo", "http://www.google.com/#foo"}, 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"www.google.com?", "http://www.google.com/?"}, 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"www.google.com#", "http://www.google.com/#"}, 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"www.google.com:123?foo#bar", "http://www.google.com:123/?foo#bar"}, 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"user@www.google.com", "http://user@www.google.com/"}, 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"\xE6\xB0\xB4.com", "http://xn--1rw.com/"}, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It would be better if this next case got treated as http, but I don't see 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a clean way to guess this isn't the new-and-exciting "user" scheme. 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"user:passwd@www.google.com:8080/", "user:passwd@www.google.com:8080/"}, 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // {"file:///c:/foo/bar%20baz.txt", "file:///C:/foo/bar%20baz.txt"}, 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"ftp.google.com", "ftp://ftp.google.com/"}, 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {" ftp.google.com", "ftp://ftp.google.com/"}, 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"FTP.GooGle.com", "ftp://ftp.google.com/"}, 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"ftpblah.google.com", "http://ftpblah.google.com/"}, 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"ftp", "http://ftp/"}, 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"google.ftp.com", "http://google.ftp.com/"}, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLs which end with 0x85 (NEL in ISO-8859). 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://foo.com/s?q=\xd0\x85", "http://foo.com/s?q=%D0%85"}, 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://foo.com/s?q=\xec\x97\x85", "http://foo.com/s?q=%EC%97%85"}, 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://foo.com/s?q=\xf0\x90\x80\x85", "http://foo.com/s?q=%F0%90%80%85"}, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLs which end with 0xA0 (non-break space in ISO-8859). 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://foo.com/s?q=\xd0\xa0", "http://foo.com/s?q=%D0%A0"}, 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://foo.com/s?q=\xec\x97\xa0", "http://foo.com/s?q=%EC%97%A0"}, 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://foo.com/s?q=\xf0\x90\x80\xa0", "http://foo.com/s?q=%F0%90%80%A0"}, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URLs containing IPv6 literals. 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"[2001:db8::2]", "http://[2001:db8::2]/"}, 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"[::]:80", "http://[::]/"}, 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"[::]:80/path", "http://[::]/path"}, 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"[::]:180/path", "http://[::]:180/path"}, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(pmarks): Maybe we should parse bare IPv6 literals someday. 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"::1", "::1"}, 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Semicolon as scheme separator for standard schemes. 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http;//www.google.com/", "http://www.google.com/"}, 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"about;chrome", "chrome://chrome/"}, 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Semicolon left as-is for non-standard schemes. 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"whatsup;//fool", "whatsup://fool"}, 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Semicolon left as-is in URL itself. 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http://host/port?query;moar", "http://host/port?query;moar"}, 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fewer slashes than expected. 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http;www.google.com/", "http://www.google.com/"}, 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"http;/www.google.com/", "http://www.google.com/"}, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Semicolon at start. 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {";http://www.google.com/", "http://%3Bhttp//www.google.com/"}, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST(URLFixerTest, FixupURL) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(fixup_cases); ++i) { 317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FixupCase value = fixup_cases[i]; 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(value.output, 319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) url_fixer::FixupURL(value.input, "").possibly_invalid_spec()) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "input: " << value.input; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Check the TLD-appending functionality. 324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FixupCase tld_cases[] = { 3256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld", 3266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld.", 3286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld..", 3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {".somedomainthatwillnotbeagtld", 3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"www.somedomainthatwillnotbeagtld", 3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld.com", 3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://somedomainthatwillnotbeagtld.com/"}, 3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"http://somedomainthatwillnotbeagtld", 3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"..somedomainthatwillnotbeagtld..", 3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"http://www.somedomainthatwillnotbeagtld", 3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"9999999999999999", "http://www.9999999999999999.com/"}, 3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld/foo", 3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/foo"}, 3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld.com/foo", 3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://somedomainthatwillnotbeagtld.com/foo"}, 3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld/?foo=.com", 3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/?foo=.com"}, 3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"www.somedomainthatwillnotbeagtld/?foo=www.", 3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/?foo=www."}, 3526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld.com/?foo=.com", 3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://somedomainthatwillnotbeagtld.com/?foo=.com"}, 3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"http://www.somedomainthatwillnotbeagtld.com", 3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com/"}, 3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"somedomainthatwillnotbeagtld:123", 3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com:123/"}, 3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) {"http://somedomainthatwillnotbeagtld:123", 3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "http://www.somedomainthatwillnotbeagtld.com:123/"}, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(tld_cases); ++i) { 362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FixupCase value = tld_cases[i]; 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(value.output, 364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) url_fixer::FixupURL(value.input, "com").possibly_invalid_spec()); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test different types of file inputs to URIFixerUpper::FixupURL. This 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't go into the nice array of fixups above since the file input 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has to exist. 371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST(URLFixerTest, FixupFile) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this "original" filename is the one we tweak to get all the variations 3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ScopedTempDir temp_dir_; 3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath original; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(MakeTempFile( 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) temp_dir_.path(), 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("url fixer upper existing file.txt")), 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &original)); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reference path 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL golden(net::FilePathToFileURL(original)); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // c:\foo\bar.txt -> file:///c:/foo/bar.txt (basic) 385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL fixedup(url_fixer::FixupURL(original.AsUTF8Unsafe(), std::string())); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(golden, fixedup); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(port): Make some equivalent tests for posix. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // c|/foo\bar.txt -> file:///c:/foo/bar.txt (pipe allowed instead of colon) 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string cur(base::WideToUTF8(original.value())); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(':', cur[1]); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur[1] = '|'; 394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(golden, url_fixer::FixupURL(cur, std::string())); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FixupCase cases[] = { 397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"c:\\Non-existent%20file.txt", "file:///C:/Non-existent%2520file.txt"}, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // \\foo\bar.txt -> file://foo/bar.txt 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UNC paths, this file won't exist, but since there are no escapes, it 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be returned just converted to a file: URL. 402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"\\\\NonexistentHost\\foo\\bar.txt", "file://nonexistenthost/foo/bar.txt"}, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We do this strictly, like IE8, which only accepts this form using 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // backslashes and not forward ones. Turning "//foo" into "http" matches 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Firefox and IE, silly though it may seem (it falls out of adding "http" 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the default protocol if you haven't entered one). 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"//NonexistentHost\\foo/bar.txt", "http://nonexistenthost/foo/bar.txt"}, 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"file:///C:/foo/bar", "file:///C:/foo/bar"}, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Much of the work here comes from GURL's canonicalization stage. 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"file://C:/foo/bar", "file:///C:/foo/bar"}, 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"file:c:", "file:///C:/"}, 413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"file:c:WINDOWS", "file:///C:/WINDOWS"}, 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"file:c|Program Files", "file:///C:/Program%20Files"}, 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"file:/file", "file://file/"}, 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"file:////////c:\\foo", "file:///C:/foo"}, 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"file://server/folder/file", "file://server/folder/file"}, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are fixups we don't do, but could consider: 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // {"file:///foo:/bar", "file://foo/bar"}, 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // {"file:/\\/server\\folder/file", "file://server/folder/file"}, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HOME "/Users/" 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HOME "/home/" 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 430f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) url_fixer::home_directory_override = "/foo"; 431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FixupCase cases[] = { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // File URLs go through GURL, which tries to escape intelligently. 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"/A%20non-existent file.txt", "file:///A%2520non-existent%20file.txt"}, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A plain "/" refers to the root. 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"/", "file:///"}, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These rely on the above home_directory_override. 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"~", "file:///foo"}, 439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"~/bar", "file:///foo/bar"}, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // References to other users' homedirs. 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"~foo", "file://" HOME "foo"}, 443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {"~x/blah", "file://" HOME "x/blah"}, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < arraysize(cases); i++) { 448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(cases[i].output, 449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) url_fixer::FixupURL(cases[i].input, "").possibly_invalid_spec()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DeleteFile(original, false)); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST(URLFixerTest, FixupRelativeFile) { 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath full_path; 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_part( 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("url_fixer_upper_existing_file.txt")); 4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ScopedTempDir temp_dir_; 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(MakeTempFile(temp_dir_.path(), file_part, &full_path)); 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) full_path = base::MakeAbsoluteFilePath(full_path); 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(full_path.empty()); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // make sure we pass through good URLs 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(fixup_cases); ++i) { 467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FixupCase value = fixup_cases[i]; 468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath input = base::FilePath::FromUTF8Unsafe(value.input); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value.output, 4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url_fixer::FixupRelativeFile(temp_dir_.path(), 4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) input).possibly_invalid_spec()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // make sure the existing file got fixed-up to a file URL, and that there 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are no backslashes 476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(IsMatchingFileURL( 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url_fixer::FixupRelativeFile(temp_dir_.path(), 4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) file_part).possibly_invalid_spec(), full_path)); 4797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DeleteFile(full_path, false)); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // create a filename we know doesn't exist and make sure it doesn't get 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fixed up to a file URL 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath nonexistent_file( 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("url_fixer_upper_nonexistent_file.txt")); 4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string fixedup(url_fixer::FixupRelativeFile( 4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) temp_dir_.path(), nonexistent_file).possibly_invalid_spec()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(std::string("file:///"), fixedup.substr(0, 8)); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsMatchingFileURL(fixedup, nonexistent_file)); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // make a subdir to make sure relative paths with directories work, also 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test spaces: 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "app_dir\url fixer-upper dir\url fixer-upper existing file.txt" 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath sub_dir(FILE_PATH_LITERAL("url fixer-upper dir")); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath sub_file( 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("url fixer-upper existing file.txt")); 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath new_dir = temp_dir_.path().Append(sub_dir); 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::CreateDirectory(new_dir); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(MakeTempFile(new_dir, sub_file, &full_path)); 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) full_path = base::MakeAbsoluteFilePath(full_path); 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_FALSE(full_path.empty()); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test file in the subdir 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath relative_file = sub_dir.Append(sub_file); 504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(IsMatchingFileURL( 5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url_fixer::FixupRelativeFile(temp_dir_.path(), 5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) relative_file).possibly_invalid_spec(), full_path)); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test file in the subdir with different slashes and escaping. 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType relative_file_str = sub_dir.value() + 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL("/") + sub_file.value(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReplaceSubstringsAfterOffset(&relative_file_str, 0, 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PATH_LITERAL(" "), FILE_PATH_LITERAL("%20")); 513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(IsMatchingFileURL( 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url_fixer::FixupRelativeFile(temp_dir_.path(), 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath(relative_file_str)).possibly_invalid_spec(), 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) full_path)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test relative directories and duplicate slashes 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (should resolve to the same file as above) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relative_file_str = sub_dir.value() + FILE_PATH_LITERAL("/../") + 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sub_dir.value() + FILE_PATH_LITERAL("///./") + sub_file.value(); 522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(IsMatchingFileURL( 5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url_fixer::FixupRelativeFile(temp_dir_.path(), 5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath(relative_file_str)).possibly_invalid_spec(), 5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) full_path)); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // done with the subdir 5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DeleteFile(full_path, false)); 5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::DeleteFile(new_dir, true)); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that an obvious HTTP URL isn't accidentally treated as an absolute 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // file path (on account of system-specific craziness). 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath empty_path; 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath http_url_path(FILE_PATH_LITERAL("http://../")); 535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE( 536f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) url_fixer::FixupRelativeFile(empty_path, http_url_path).SchemeIs("http")); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 538