15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 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 "net/tools/dump_cache/url_utilities.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(UrlUtilitiesTest, GetUrlHost) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com",
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHost("http://www.foo.com"));
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com",
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHost("http://www.foo.com:80"));
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com",
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHost("http://www.foo.com:80/"));
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com",
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHost("http://www.foo.com/news"));
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com",
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHost("www.foo.com:80/news?q=hello"));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com",
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHost("www.foo.com/news?q=a:b"));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com",
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHost("www.foo.com:80"));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(UrlUtilitiesTest, GetUrlHostPath) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com",
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHostPath("http://www.foo.com"));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com:80",
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHostPath("http://www.foo.com:80"));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com:80/",
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHostPath("http://www.foo.com:80/"));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com/news",
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHostPath("http://www.foo.com/news"));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com:80/news?q=hello",
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHostPath("www.foo.com:80/news?q=hello"));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com/news?q=a:b",
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHostPath("www.foo.com/news?q=a:b"));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com:80",
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlHostPath("www.foo.com:80"));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(UrlUtilitiesTest, GetUrlPath) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/",
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlPath("http://www.foo.com"));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/",
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlPath("http://www.foo.com:80"));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/",
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlPath("http://www.foo.com:80/"));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/news",
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlPath("http://www.foo.com/news"));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/news?q=hello",
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlPath("www.foo.com:80/news?q=hello"));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/news?q=a:b",
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlPath("www.foo.com/news?q=a:b"));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/",
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::GetUrlPath("www.foo.com:80"));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(UrlUtilitiesTest, Unescape) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Basic examples are left alone.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://www.foo.com",
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::Unescape("http://www.foo.com"));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("www.foo.com:80/news?q=hello",
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::Unescape("www.foo.com:80/news?q=hello"));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All chars can be unescaped.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("~`!@#$%^&*()_-+={[}]|\\:;\"'<,>.?/",
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::Unescape("%7E%60%21%40%23%24%25%5E%26%2A%28%29%5F%2D"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   "%2B%3D%7B%5B%7D%5D%7C%5C%3A%3B%22%27%3C%2C"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   "%3E%2E%3F%2F"));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int c = 0; c < 256; ++c) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string unescaped_char(1, implicit_cast<unsigned char>(c));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string escaped_char = base::StringPrintf("%%%02X", c);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(unescaped_char, UrlUtilities::Unescape(escaped_char))
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "escaped_char = " << escaped_char;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    escaped_char = base::StringPrintf("%%%02x", c);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(unescaped_char, UrlUtilities::Unescape(escaped_char))
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "escaped_char = " << escaped_char;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All non-% chars are left alone.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("~`!@#$^&*()_-+={[}]|\\:;\"'<,>.?/",
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            UrlUtilities::Unescape("~`!@#$^&*()_-+={[}]|\\:;\"'<,>.?/"));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int c = 0; c < 256; ++c) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c != '%') {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string just_char(1, implicit_cast<unsigned char>(c));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(just_char, UrlUtilities::Unescape(just_char));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some examples to unescape.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Hello, world!", UrlUtilities::Unescape("Hello%2C world%21"));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not actually escapes.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("%", UrlUtilities::Unescape("%"));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("%www", UrlUtilities::Unescape("%www"));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("%foo", UrlUtilities::Unescape("%foo"));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("%1", UrlUtilities::Unescape("%1"));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("%1x", UrlUtilities::Unescape("%1x"));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("%%", UrlUtilities::Unescape("%%"));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Escapes following non-escapes.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("%!", UrlUtilities::Unescape("%%21"));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("%2!", UrlUtilities::Unescape("%2%21"));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115