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