| Index: chrome/browser/download_manager_unittest.cc | 
| =================================================================== | 
| --- chrome/browser/download_manager_unittest.cc	(revision 2162) | 
| +++ chrome/browser/download_manager_unittest.cc	(working copy) | 
| @@ -1,320 +0,0 @@ | 
| -// Copyright (c) 2006-2008 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 <string> | 
| - | 
| -#include "base/logging.h" | 
| -#include "chrome/browser/download_manager.h" | 
| -#include "chrome/browser/download_util.h" | 
| -#include "testing/gtest/include/gtest/gtest.h" | 
| - | 
| -class DownloadManagerTest : public testing::Test { | 
| - public: | 
| -  DownloadManagerTest() { | 
| -    download_manager_ = new DownloadManager(); | 
| -    download_util::InitializeExeTypes(&download_manager_->exe_types_); | 
| -  } | 
| - | 
| -  void GetGeneratedFilename(const std::string& content_disposition, | 
| -                            const std::wstring& url, | 
| -                            const std::string& mime_type, | 
| -                            std::wstring* generated_name) { | 
| -    DownloadCreateInfo info; | 
| -    info.content_disposition = content_disposition; | 
| -    info.url = url; | 
| -    info.mime_type = mime_type; | 
| -    download_manager_->GenerateFilename(&info, generated_name); | 
| -  } | 
| - | 
| - protected: | 
| -  scoped_refptr<DownloadManager> download_manager_; | 
| -  MessageLoopForUI message_loop_; | 
| - | 
| -  DISALLOW_EVIL_CONSTRUCTORS(DownloadManagerTest); | 
| -}; | 
| - | 
| -static const struct { | 
| -  const char* disposition; | 
| -  const wchar_t* url; | 
| -  const char* mime_type; | 
| -  const wchar_t* expected_name; | 
| -} kGeneratedFiles[] = { | 
| -  // No 'filename' keyword in the disposition, use the URL | 
| -  {"a_file_name.txt", | 
| -   L"http://www.evil.com/my_download.txt", | 
| -   "text/plain", | 
| -   L"my_download.txt"}, | 
| - | 
| -  // Disposition has relative paths, remove them | 
| -  {"filename=../../../../././../a_file_name.txt", | 
| -   L"http://www.evil.com/my_download.txt", | 
| -   "text/plain", | 
| -   L"a_file_name.txt"}, | 
| - | 
| -  // Disposition has parent directories, remove them | 
| -  {"filename=dir1/dir2/a_file_name.txt", | 
| -   L"http://www.evil.com/my_download.txt", | 
| -   "text/plain", | 
| -   L"a_file_name.txt"}, | 
| - | 
| -  // No useful information in disposition or URL, use default | 
| -  {"", L"http://www.truncated.com/path/", "text/plain", L"download.txt"}, | 
| - | 
| -  // Spaces in the disposition file name | 
| -  {"filename=My Downloaded File.exe", | 
| -   L"http://www.frontpagehacker.com/a_download.exe", | 
| -   "application/octet-stream", | 
| -   L"My Downloaded File.exe"}, | 
| - | 
| -  {"filename=my-cat", | 
| -   L"http://www.example.com/my-cat", | 
| -   "image/jpeg", | 
| -   L"my-cat.jpg"}, | 
| - | 
| -  {"filename=my-cat", | 
| -   L"http://www.example.com/my-cat", | 
| -   "text/plain", | 
| -   L"my-cat.txt"}, | 
| - | 
| -  {"filename=my-cat", | 
| -   L"http://www.example.com/my-cat", | 
| -   "text/html", | 
| -   L"my-cat.htm"}, | 
| - | 
| -  {"filename=my-cat", | 
| -   L"http://www.example.com/my-cat", | 
| -   "dance/party", | 
| -   L"my-cat"}, | 
| - | 
| -  {"filename=my-cat.jpg", | 
| -   L"http://www.example.com/my-cat.jpg", | 
| -   "text/plain", | 
| -   L"my-cat.jpg"}, | 
| - | 
| -  {"filename=evil.exe", | 
| -   L"http://www.goodguy.com/evil.exe", | 
| -   "image/jpeg", | 
| -   L"evil.jpg"}, | 
| - | 
| -  {"filename=evil.exe.exe", | 
| -   L"http://www.goodguy.com/evil.exe.exe", | 
| -   "dance/party", | 
| -   L"evil.exe.download"}, | 
| - | 
| -  {"filename=evil.exe", | 
| -   L"http://www.goodguy.com/evil.exe", | 
| -   "application/xml", | 
| -   L"evil.xml"}, | 
| - | 
| -  {"filename=evil.exe", | 
| -   L"http://www.goodguy.com/evil.exe", | 
| -   "application/html+xml", | 
| -   L"evil.download"}, | 
| - | 
| -  {"filename=evil.exe", | 
| -   L"http://www.goodguy.com/evil.exe", | 
| -   "application/rss+xml", | 
| -   L"evil.download"}, | 
| - | 
| -  {"filename=utils.js", | 
| -   L"http://www.goodguy.com/utils.js", | 
| -   "application/x-javascript", | 
| -   L"utils.js"}, | 
| - | 
| -  {"filename=contacts.js", | 
| -   L"http://www.goodguy.com/contacts.js", | 
| -   "application/json", | 
| -   L"contacts.js"}, | 
| - | 
| -  {"filename=utils.js", | 
| -   L"http://www.goodguy.com/utils.js", | 
| -   "text/javascript", | 
| -   L"utils.js"}, | 
| - | 
| -  {"filename=utils.js", | 
| -   L"http://www.goodguy.com/utils.js", | 
| -   "text/javascript;version=2", | 
| -   L"utils.js"}, | 
| - | 
| -  {"filename=utils.js", | 
| -   L"http://www.goodguy.com/utils.js", | 
| -   "application/ecmascript", | 
| -   L"utils.js"}, | 
| - | 
| -  {"filename=utils.js", | 
| -   L"http://www.goodguy.com/utils.js", | 
| -   "application/ecmascript;version=4", | 
| -   L"utils.js"}, | 
| - | 
| -  {"filename=program.exe", | 
| -   L"http://www.goodguy.com/program.exe", | 
| -   "application/foo-bar", | 
| -   L"program.exe"}, | 
| - | 
| -  {"filename=../foo.txt", | 
| -   L"http://www.evil.com/../foo.txt", | 
| -   "text/plain", | 
| -   L"foo.txt"}, | 
| - | 
| -  {"filename=..\\foo.txt", | 
| -   L"http://www.evil.com/..\\foo.txt", | 
| -   "text/plain", | 
| -   L"foo.txt"}, | 
| - | 
| -  {"filename=.hidden", | 
| -   L"http://www.evil.com/.hidden", | 
| -   "text/plain", | 
| -   L"hidden.txt"}, | 
| - | 
| -  {"filename=trailing.", | 
| -   L"http://www.evil.com/trailing.", | 
| -   "dance/party", | 
| -   L"trailing"}, | 
| - | 
| -  {"filename=trailing.", | 
| -   L"http://www.evil.com/trailing.", | 
| -   "text/plain", | 
| -   L"trailing.txt"}, | 
| - | 
| -  {"filename=.", | 
| -   L"http://www.evil.com/.", | 
| -   "dance/party", | 
| -   L"download"}, | 
| - | 
| -  {"filename=..", | 
| -   L"http://www.evil.com/..", | 
| -   "dance/party", | 
| -   L"download"}, | 
| - | 
| -  {"filename=...", | 
| -   L"http://www.evil.com/...", | 
| -   "dance/party", | 
| -   L"download"}, | 
| - | 
| -  {"a_file_name.txt", | 
| -   L"http://www.evil.com/", | 
| -   "image/jpeg", | 
| -   L"download.jpg"}, | 
| - | 
| -  {"filename=", | 
| -   L"http://www.evil.com/", | 
| -   "image/jpeg", | 
| -   L"download.jpg"}, | 
| - | 
| -  {"filename=simple", | 
| -   L"http://www.example.com/simple", | 
| -   "application/octet-stream", | 
| -   L"simple"}, | 
| - | 
| -  {"filename=COM1", | 
| -   L"http://www.goodguy.com/COM1", | 
| -   "application/foo-bar", | 
| -   L"_COM1"}, | 
| - | 
| -  {"filename=COM4.txt", | 
| -   L"http://www.goodguy.com/COM4.txt", | 
| -   "text/plain", | 
| -   L"_COM4.txt"}, | 
| - | 
| -  {"filename=lpt1.TXT", | 
| -   L"http://www.goodguy.com/lpt1.TXT", | 
| -   "text/plain", | 
| -   L"_lpt1.TXT"}, | 
| - | 
| -  {"filename=clock$.txt", | 
| -   L"http://www.goodguy.com/clock$.txt", | 
| -   "text/plain", | 
| -   L"_clock$.txt"}, | 
| - | 
| -  {"filename=mycom1.foo", | 
| -   L"http://www.goodguy.com/mycom1.foo", | 
| -   "text/plain", | 
| -   L"mycom1.foo"}, | 
| - | 
| -  {"filename=Setup.exe.local", | 
| -   L"http://www.badguy.com/Setup.exe.local", | 
| -   "application/foo-bar", | 
| -   L"Setup.exe.download"}, | 
| - | 
| -  {"filename=Setup.exe.local.local", | 
| -   L"http://www.badguy.com/Setup.exe.local", | 
| -   "application/foo-bar", | 
| -   L"Setup.exe.local.download"}, | 
| - | 
| -  {"filename=Setup.exe.lnk", | 
| -   L"http://www.badguy.com/Setup.exe.lnk", | 
| -   "application/foo-bar", | 
| -   L"Setup.exe.download"}, | 
| - | 
| -  {"filename=Desktop.ini", | 
| -   L"http://www.badguy.com/Desktop.ini", | 
| -   "application/foo-bar", | 
| -   L"_Desktop.ini"}, | 
| - | 
| -  {"filename=Thumbs.db", | 
| -   L"http://www.badguy.com/Thumbs.db", | 
| -   "application/foo-bar", | 
| -   L"_Thumbs.db"}, | 
| - | 
| -  {"filename=source.srf", | 
| -   L"http://www.hotmail.com", | 
| -   "image/jpeg", | 
| -   L"source.srf.jpg"}, | 
| - | 
| -  {"filename=source.jpg", | 
| -   L"http://www.hotmail.com", | 
| -   "application/x-javascript", | 
| -   L"source.jpg"}, | 
| - | 
| -  // NetUtilTest.{GetSuggestedFilename, GetFileNameFromCD} test these | 
| -  // more thoroughly. Tested below are a small set of samples. | 
| -  {"attachment; filename=\"%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg\"", | 
| -   L"http://www.examples.com/", | 
| -   "image/jpeg", | 
| -   L"\uc608\uc220 \uc608\uc220.jpg"}, | 
| - | 
| -  {"attachment; name=abc de.pdf", | 
| -   L"http://www.examples.com/q.cgi?id=abc", | 
| -   "application/octet-stream", | 
| -   L"abc de.pdf"}, | 
| - | 
| -  {"filename=\"=?EUC-JP?Q?=B7=DD=BD=D13=2Epng?=\"", | 
| -   L"http://www.example.com/path", | 
| -   "image/png", | 
| -   L"\x82b8\x8853" L"3.png"}, | 
| - | 
| -  // The following two have invalid CD headers and filenames come | 
| -  // from the URL. | 
| -  {"attachment; filename==?iiso88591?Q?caf=EG?=", | 
| -   L"http://www.example.com/test%20123", | 
| -   "image/jpeg", | 
| -   L"test 123.jpg"}, | 
| - | 
| -  {"malformed_disposition", | 
| -   L"http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg", | 
| -   "image/jpeg", | 
| -   L"\uc608\uc220 \uc608\uc220.jpg"}, | 
| - | 
| -  // Invalid C-D. No filename from URL. Falls back to 'download'. | 
| -  {"attachment; filename==?iso88591?Q?caf=E3?", | 
| -   L"http://www.google.com/path1/path2/", | 
| -   "image/jpeg", | 
| -   L"download.jpg"}, | 
| - | 
| -  // TODO(darin): Add some raw 8-bit Content-Disposition tests. | 
| -}; | 
| - | 
| -// Tests to ensure that the file names we generate from hints from the server | 
| -// (content-disposition, URL name, etc) don't cause security holes. | 
| -TEST_F(DownloadManagerTest, TestDownloadFilename) { | 
| -  for (int i = 0; i < arraysize(kGeneratedFiles); ++i) { | 
| -    std::wstring file_name; | 
| -    GetGeneratedFilename(kGeneratedFiles[i].disposition, | 
| -                         kGeneratedFiles[i].url, | 
| -                         kGeneratedFiles[i].mime_type, | 
| -                         &file_name); | 
| -    EXPECT_EQ(kGeneratedFiles[i].expected_name, file_name); | 
| -  } | 
| -} | 
| - | 
|  |