| Index: net/tools/flip_server/url_to_filename_encoder_unittest.cc
|
| diff --git a/net/tools/flip_server/url_to_filename_encoder_unittest.cc b/net/tools/flip_server/url_to_filename_encoder_unittest.cc
|
| deleted file mode 100644
|
| index 2662f756d2f9edec98ff62709ebf0de399be6734..0000000000000000000000000000000000000000
|
| --- a/net/tools/flip_server/url_to_filename_encoder_unittest.cc
|
| +++ /dev/null
|
| @@ -1,357 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/tools/flip_server/url_to_filename_encoder.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/strings/string_piece.h"
|
| -#include "base/strings/string_split.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using base::StringPiece;
|
| -using std::string;
|
| -
|
| -namespace net {
|
| -
|
| -#ifdef WIN32
|
| -char kDirSeparator = '\\';
|
| -char kOtherDirSeparator = '/';
|
| -#else
|
| -char kDirSeparator = '/';
|
| -char kOtherDirSeparator = '\\';
|
| -#endif
|
| -
|
| -class UrlToFilenameEncoderTest : public ::testing::Test {
|
| - protected:
|
| - UrlToFilenameEncoderTest()
|
| - : escape_(1, UrlToFilenameEncoder::kEscapeChar),
|
| - dir_sep_(1, kDirSeparator) {}
|
| -
|
| - void CheckSegmentLength(const StringPiece& escaped_word) {
|
| - for (const base::StringPiece& component :
|
| - base::SplitStringPiece(escaped_word, "/", base::KEEP_WHITESPACE,
|
| - base::SPLIT_WANT_NONEMPTY)) {
|
| - EXPECT_GE(UrlToFilenameEncoder::kMaximumSubdirectoryLength,
|
| - component.size());
|
| - }
|
| - }
|
| -
|
| - void CheckValidChars(const StringPiece& escaped_word, char invalid_slash) {
|
| - // These characters are invalid in Windows. We add in ', as that's pretty
|
| - // inconvenient in a Unix filename.
|
| - //
|
| - // See http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx
|
| - const string kInvalidChars = "<>:\"|?*'";
|
| - for (size_t i = 0; i < escaped_word.size(); ++i) {
|
| - char c = escaped_word[i];
|
| - EXPECT_EQ(string::npos, kInvalidChars.find(c));
|
| - EXPECT_NE(invalid_slash, c);
|
| - EXPECT_NE('\0', c); // only invalid character in Posix
|
| - EXPECT_GT(0x7E, c); // only English printable characters
|
| - }
|
| - }
|
| -
|
| - void Validate(const string& in_word, const string& gold_word) {
|
| - string escaped_word, url;
|
| - UrlToFilenameEncoder::EncodeSegment(std::string(), in_word, '/',
|
| - &escaped_word);
|
| - EXPECT_EQ(gold_word, escaped_word);
|
| - CheckSegmentLength(escaped_word);
|
| - CheckValidChars(escaped_word, '\\');
|
| - UrlToFilenameEncoder::Decode(escaped_word, '/', &url);
|
| - EXPECT_EQ(in_word, url);
|
| - }
|
| -
|
| - void ValidateAllSegmentsSmall(const string& in_word) {
|
| - string escaped_word, url;
|
| - UrlToFilenameEncoder::EncodeSegment(std::string(), in_word, '/',
|
| - &escaped_word);
|
| - CheckSegmentLength(escaped_word);
|
| - CheckValidChars(escaped_word, '\\');
|
| - UrlToFilenameEncoder::Decode(escaped_word, '/', &url);
|
| - EXPECT_EQ(in_word, url);
|
| - }
|
| -
|
| - void ValidateNoChange(const string& word) {
|
| - // We always suffix the leaf with kEscapeChar, unless the leaf is empty.
|
| - Validate(word, word + escape_);
|
| - }
|
| -
|
| - void ValidateEscaped(unsigned char ch) {
|
| - // We always suffix the leaf with kEscapeChar, unless the leaf is empty.
|
| - char escaped[100];
|
| - const char escape = UrlToFilenameEncoder::kEscapeChar;
|
| - base::snprintf(escaped, sizeof(escaped), "%c%02X%c", escape, ch, escape);
|
| - Validate(string(1, ch), escaped);
|
| - }
|
| -
|
| - void ValidateUrl(const string& url,
|
| - const string& base_path,
|
| - bool legacy_escape,
|
| - const string& gold_filename) {
|
| - string encoded_filename =
|
| - UrlToFilenameEncoder::Encode(url, base_path, legacy_escape);
|
| - EXPECT_EQ(gold_filename, encoded_filename);
|
| - if (!legacy_escape) {
|
| - CheckSegmentLength(encoded_filename);
|
| - CheckValidChars(encoded_filename, kOtherDirSeparator);
|
| - string decoded_url;
|
| - UrlToFilenameEncoder::Decode(encoded_filename, kDirSeparator,
|
| - &decoded_url);
|
| - if (url != decoded_url) {
|
| - EXPECT_EQ(url, "http://" + decoded_url);
|
| - }
|
| - }
|
| - }
|
| -
|
| - void ValidateUrlOldNew(const string& url,
|
| - const string& gold_old_filename,
|
| - const string& gold_new_filename) {
|
| - ValidateUrl(url, std::string(), true, gold_old_filename);
|
| - ValidateUrl(url, std::string(), false, gold_new_filename);
|
| - }
|
| -
|
| - void ValidateEncodeSame(const string& url1, const string& url2) {
|
| - string filename1 = UrlToFilenameEncoder::Encode(url1, std::string(), false);
|
| - string filename2 = UrlToFilenameEncoder::Encode(url2, std::string(), false);
|
| - EXPECT_EQ(filename1, filename2);
|
| - }
|
| -
|
| - string escape_;
|
| - string dir_sep_;
|
| -};
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, DoesNotEscape) {
|
| - ValidateNoChange(std::string());
|
| - ValidateNoChange("abcdefg");
|
| - ValidateNoChange("abcdefghijklmnopqrstuvwxyz");
|
| - ValidateNoChange("ZYXWVUT");
|
| - ValidateNoChange("ZYXWVUTSRQPONMLKJIHGFEDCBA");
|
| - ValidateNoChange("01234567689");
|
| - ValidateNoChange("_.=+-");
|
| - ValidateNoChange(
|
| - "abcdefghijklmnopqrstuvwxyzZYXWVUTSRQPONMLKJIHGFEDCBA"
|
| - "01234567689_.=+-");
|
| - ValidateNoChange("index.html");
|
| - ValidateNoChange("/");
|
| - ValidateNoChange("/.");
|
| - ValidateNoChange(".");
|
| - ValidateNoChange("..");
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, Escapes) {
|
| - const string bad_chars =
|
| - "<>:\"\\|?*" // Illegal on Windows
|
| - "~`!$^&(){}[]';" // Bad for Unix shells
|
| - "^@" // Build tool doesn't like
|
| - "#%" // Tool doesn't like
|
| - ","; // The escape char has to be escaped
|
| -
|
| - for (size_t i = 0; i < bad_chars.size(); ++i) {
|
| - ValidateEscaped(bad_chars[i]);
|
| - }
|
| -
|
| - // Check non-printable characters.
|
| - ValidateEscaped('\0');
|
| - for (size_t i = 127; i < 256; ++i) {
|
| - ValidateEscaped(static_cast<char>(i));
|
| - }
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, DoesEscapeCorrectly) {
|
| - Validate("mysite.com&x", "mysite.com" + escape_ + "26x" + escape_);
|
| - Validate("/./", "/" + escape_ + "./" + escape_);
|
| - Validate("/../", "/" + escape_ + "../" + escape_);
|
| - Validate("//", "/" + escape_ + "2F" + escape_);
|
| - Validate("/./leaf", "/" + escape_ + "./leaf" + escape_);
|
| - Validate("/../leaf", "/" + escape_ + "../leaf" + escape_);
|
| - Validate("//leaf", "/" + escape_ + "2Fleaf" + escape_);
|
| - Validate("mysite/u?param1=x¶m2=y", "mysite/u" + escape_ + "3Fparam1=x" +
|
| - escape_ + "26param2=y" + escape_);
|
| - Validate("search?q=dogs&go=&form=QBLH&qs=n", // from Latency Labs bing test.
|
| - "search" + escape_ + "3Fq=dogs" + escape_ + "26go=" + escape_ +
|
| - "26form=QBLH" + escape_ + "26qs=n" + escape_);
|
| - Validate("~joebob/my_neeto-website+with_stuff.asp?id=138&content=true",
|
| - "" + escape_ + "7Ejoebob/my_neeto-website+with_stuff.asp" + escape_ +
|
| - "3Fid=138" + escape_ + "26content=true" + escape_);
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, EncodeUrlCorrectly) {
|
| - ValidateUrlOldNew("http://www.google.com/index.html",
|
| - "www.google.com" + dir_sep_ + "indexx2Ehtml",
|
| - "www.google.com" + dir_sep_ + "index.html" + escape_);
|
| - ValidateUrlOldNew("http://www.google.com/x/search?hl=en&q=dogs&oq=",
|
| - "www.google.com" + dir_sep_ + "x" + dir_sep_ +
|
| - "searchx3Fhlx3Denx26qx3Ddogsx26oqx3D",
|
| -
|
| - "www.google.com" + dir_sep_ + "x" + dir_sep_ + "search" +
|
| - escape_ + "3Fhl=en" + escape_ + "26q=dogs" + escape_ +
|
| - "26oq=" + escape_);
|
| - ValidateUrlOldNew(
|
| - "http://www.foo.com/a//",
|
| - "www.foo.com" + dir_sep_ + "ax255Cx255Cindexx2Ehtml",
|
| - "www.foo.com" + dir_sep_ + "a" + dir_sep_ + escape_ + "2F" + escape_);
|
| -
|
| - // From bug: Double slash preserved.
|
| - ValidateUrl("http://www.foo.com/u?site=http://www.google.com/index.html",
|
| - std::string(), false,
|
| - "www.foo.com" + dir_sep_ + "u" + escape_ + "3Fsite=http" +
|
| - escape_ + "3A" + dir_sep_ + escape_ + "2Fwww.google.com" +
|
| - dir_sep_ + "index.html" + escape_);
|
| - ValidateUrlOldNew(
|
| - "http://blogutils.net/olct/online.php?"
|
| - "site=http://thelwordfanfics.blogspot.&interval=600",
|
| -
|
| - "blogutils.net" + dir_sep_ + "olct" + dir_sep_ +
|
| - "onlinex2Ephpx3F"
|
| - "sitex3Dhttpx3Ax255Cx255Cthelwordfanficsx2Eblogspotx2Ex26intervalx3D6"
|
| - "00",
|
| -
|
| - "blogutils.net" + dir_sep_ + "olct" + dir_sep_ + "online.php" + escape_ +
|
| - "3Fsite=http" + escape_ + "3A" + dir_sep_ + escape_ +
|
| - "2Fthelwordfanfics.blogspot." + escape_ + "26interval=600" + escape_);
|
| -}
|
| -
|
| -// From bug: Escapes treated the same as normal char.
|
| -TEST_F(UrlToFilenameEncoderTest, UnescapeUrlsBeforeEncode) {
|
| - for (int i = 0; i < 128; ++i) {
|
| - string unescaped(1, static_cast<char>(i));
|
| - string escaped = base::StringPrintf("%%%02X", i);
|
| - ValidateEncodeSame(unescaped, escaped);
|
| - }
|
| -
|
| - ValidateEncodeSame(
|
| - "http://www.blogger.com/navbar.g?bName=God!&Mode=FOO&searchRoot"
|
| - "=http%3A%2F%2Fsurvivorscanthrive.blogspot.com%2Fsearch",
|
| -
|
| - "http://www.blogger.com/navbar.g?bName=God%21&Mode=FOO&searchRoot"
|
| - "=http%3A%2F%2Fsurvivorscanthrive.blogspot.com%2Fsearch");
|
| -}
|
| -
|
| -// From bug: Filename encoding is not prefix-free.
|
| -TEST_F(UrlToFilenameEncoderTest, EscapeSecondSlash) {
|
| - Validate("/", "/" + escape_);
|
| - Validate("//", "/" + escape_ + "2F" + escape_);
|
| - Validate("///", "/" + escape_ + "2F" + "/" + escape_);
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, LongTail) {
|
| - static char long_word[] =
|
| - "~joebob/briggs/12345678901234567890123456789012345678901234567890"
|
| - "1234567890123456789012345678901234567890123456789012345678901234567890"
|
| - "1234567890123456789012345678901234567890123456789012345678901234567890"
|
| - "1234567890123456789012345678901234567890123456789012345678901234567890"
|
| - "1234567890123456789012345678901234567890123456789012345678901234567890"
|
| - "1234567890123456789012345678901234567890123456789012345678901234567890";
|
| -
|
| - // the long lines in the string below are 64 characters, so we can see
|
| - // the slashes every 128.
|
| - string gold_long_word =
|
| - escape_ +
|
| - "7Ejoebob/briggs/"
|
| - "1234567890123456789012345678901234567890123456789012345678901234"
|
| - "56789012345678901234567890123456789012345678901234567890123456" +
|
| - escape_ +
|
| - "-/"
|
| - "7890123456789012345678901234567890123456789012345678901234567890"
|
| - "12345678901234567890123456789012345678901234567890123456789012" +
|
| - escape_ +
|
| - "-/"
|
| - "3456789012345678901234567890123456789012345678901234567890123456"
|
| - "78901234567890123456789012345678901234567890123456789012345678" +
|
| - escape_ +
|
| - "-/"
|
| - "9012345678901234567890" +
|
| - escape_;
|
| - EXPECT_LT(UrlToFilenameEncoder::kMaximumSubdirectoryLength,
|
| - sizeof(long_word));
|
| - Validate(long_word, gold_long_word);
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, LongTailQuestion) {
|
| - // Here the '?' in the last path segment expands to @3F, making
|
| - // it hit 128 chars before the input segment gets that big.
|
| - static char long_word[] =
|
| - "~joebob/briggs/1234567?1234567?1234567?1234567?1234567?"
|
| - "1234567?1234567?1234567?1234567?1234567?1234567?1234567?"
|
| - "1234567?1234567?1234567?1234567?1234567?1234567?1234567?"
|
| - "1234567?1234567?1234567?1234567?1234567?1234567?1234567?"
|
| - "1234567?1234567?1234567?1234567?1234567?1234567?1234567?"
|
| - "1234567?1234567?1234567?1234567?1234567?1234567?1234567?";
|
| -
|
| - // Notice that at the end of the third segment, we avoid splitting
|
| - // the (escape_ + "3F") that was generated from the "?", so that segment is
|
| - // only 127 characters.
|
| - string pattern = "1234567" + escape_ + "3F"; // 10 characters
|
| - string gold_long_word =
|
| - escape_ + "7Ejoebob/briggs/" + pattern + pattern + pattern + pattern +
|
| - pattern + pattern +
|
| - "1234"
|
| - "567" +
|
| - escape_ + "3F" + pattern + pattern + pattern + pattern + pattern +
|
| - "123456" + escape_ +
|
| - "-/"
|
| - "7" +
|
| - escape_ + "3F" + pattern + pattern + pattern + pattern + pattern +
|
| - pattern + pattern + pattern + pattern + pattern + pattern + pattern +
|
| - "12" + escape_ +
|
| - "-/"
|
| - "34567" +
|
| - escape_ + "3F" + pattern + pattern + pattern + pattern + pattern +
|
| - "1234567" + escape_ + "3F" + pattern + pattern + pattern + pattern +
|
| - pattern + "1234567" + escape_ + "-/" + escape_ + "3F" + pattern +
|
| - pattern + escape_;
|
| - EXPECT_LT(UrlToFilenameEncoder::kMaximumSubdirectoryLength,
|
| - sizeof(long_word));
|
| - Validate(long_word, gold_long_word);
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, CornerCasesNearMaxLenNoEscape) {
|
| - // hit corner cases, +/- 4 characters from kMaxLen
|
| - for (int i = -4; i <= 4; ++i) {
|
| - string input;
|
| - input.append(i + UrlToFilenameEncoder::kMaximumSubdirectoryLength, 'x');
|
| - ValidateAllSegmentsSmall(input);
|
| - }
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, CornerCasesNearMaxLenWithEscape) {
|
| - // hit corner cases, +/- 4 characters from kMaxLen. This time we
|
| - // leave off the last 'x' and put in a '.', which ensures that we
|
| - // are truncating with '/' *after* the expansion.
|
| - for (int i = -4; i <= 4; ++i) {
|
| - string input;
|
| - input.append(i + UrlToFilenameEncoder::kMaximumSubdirectoryLength - 1, 'x');
|
| - input.append(1, '.'); // this will expand to 3 characters.
|
| - ValidateAllSegmentsSmall(input);
|
| - }
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, LeafBranchAlias) {
|
| - Validate("/a/b/c", "/a/b/c" + escape_); // c is leaf file "c,"
|
| - Validate("/a/b/c/d", "/a/b/c/d" + escape_); // c is directory "c"
|
| - Validate("/a/b/c/d/", "/a/b/c/d/" + escape_);
|
| -}
|
| -
|
| -TEST_F(UrlToFilenameEncoderTest, BackslashSeparator) {
|
| - string long_word;
|
| - string escaped_word;
|
| - long_word.append(UrlToFilenameEncoder::kMaximumSubdirectoryLength + 1, 'x');
|
| - UrlToFilenameEncoder::EncodeSegment(std::string(), long_word, '\\',
|
| - &escaped_word);
|
| -
|
| - // check that one backslash, plus the escape ",-", and the ending , got added.
|
| - EXPECT_EQ(long_word.size() + 4, escaped_word.size());
|
| - ASSERT_LT(UrlToFilenameEncoder::kMaximumSubdirectoryLength,
|
| - escaped_word.size());
|
| - // Check that the backslash got inserted at the correct spot.
|
| - EXPECT_EQ('\\',
|
| - escaped_word[UrlToFilenameEncoder::kMaximumSubdirectoryLength]);
|
| -}
|
| -
|
| -} // namespace net
|
|
|