15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/run_loop.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/chrome_download_manager_delegate.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/download/download_target_info.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/download_interrupt_reasons.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_download_item.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_download_manager.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_renderer_host.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/web_contents_tester.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AtMost; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Ref; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnPointee; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnRef; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnRefOfCopy; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::WithArg; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DownloadItem; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebContentsDelegate : public content::WebContentsDelegate { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockWebContentsDelegate() {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Google Mock action that posts a task to the current message loop that invokes 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the first argument of the mocked method as a callback. Said argument must be 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a base::Callback<void(ParamType)>. |result| must be of |ParamType| and is 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bound as that parameter. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class FooClass { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// virtual void Foo(base::Callback<void(bool)> callback); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// }; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EXPECT_CALL(mock_fooclass_instance, Foo(callback)) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// .WillOnce(ScheduleCallback(false)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(ScheduleCallback, result) { 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(arg0, result)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Similar to ScheduleCallback, but binds 2 arguments. 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ACTION_P2(ScheduleCallback2, result0, result1) { 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FROM_HERE, base::Bind(arg0, result0, result1)); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass of the ChromeDownloadManagerDelegate that uses a mock 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// DownloadProtectionService. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestChromeDownloadManagerDelegate : public ChromeDownloadManagerDelegate { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestChromeDownloadManagerDelegate(Profile* profile) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ChromeDownloadManagerDelegate(profile) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestChromeDownloadManagerDelegate() {} 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual safe_browsing::DownloadProtectionService* 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDownloadProtectionService() OVERRIDE { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void NotifyExtensions( 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadItem* download, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& suggested_virtual_path, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NotifyExtensionsCallback& callback) OVERRIDE { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(base::FilePath(), 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadPathReservationTracker::UNIQUIFY); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ReserveVirtualPath( 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadItem* download, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& virtual_path, 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool create_directory, 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadPathReservationTracker::FilenameConflictAction conflict_action, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DownloadPathReservationTracker::ReservedPathCallback& callback) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend the path reservation succeeded without any change to 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |target_path|. 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FROM_HERE, base::Bind(callback, virtual_path, true)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void PromptUserForDownloadPath( 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* download, 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& suggested_path, 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DownloadTargetDeterminerDelegate::FileSelectedCallback& callback) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OVERRIDE { 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath return_path = MockPromptUserForDownloadPath(download, 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) suggested_path, 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback); 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback.Run(return_path); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MOCK_METHOD3( 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockPromptUserForDownloadPath, 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath( 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::DownloadItem*, 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath&, 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const DownloadTargetDeterminerDelegate::FileSelectedCallback&)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ChromeDownloadManagerDelegateTest 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public ChromeRenderViewHostTestHarness { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeDownloadManagerDelegateTest(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ::testing::Test 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies and clears test expectations for |delegate_| and 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |download_manager_|. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VerifyAndClearExpectations(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates MockDownloadItem and sets up default expectations. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::MockDownloadItem* CreateActiveDownloadItem(int32 id); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given the relative path |path|, returns the full path under the temporary 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downloads directory. 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath GetPathInDownloadDir(const char* path); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the kDownloadDefaultDirectory user preference to |path|. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDefaultDownloadPath(const base::FilePath& path); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DetermineDownloadTarget(DownloadItem* download, 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadTargetInfo* result); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invokes ChromeDownloadManagerDelegate::CheckForFileExistence and waits for 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the asynchronous callback. The result passed into 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // content::CheckForFileExistenceCallback is the return value from this 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // method. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool CheckForFileExistence(DownloadItem* download); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& default_download_path() const; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestChromeDownloadManagerDelegate* delegate(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::MockDownloadManager* download_manager(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DownloadPrefs* download_prefs(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingPrefServiceSyncable* pref_service_; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir test_download_dir_; 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<content::MockDownloadManager> download_manager_; 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<TestChromeDownloadManagerDelegate> delegate_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebContentsDelegate web_contents_delegate_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeDownloadManagerDelegateTest::ChromeDownloadManagerDelegateTest() 170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : download_manager_(new ::testing::NiceMock<content::MockDownloadManager>) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegateTest::SetUp() { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeRenderViewHostTestHarness::SetUp(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(profile()); 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_.reset(new TestChromeDownloadManagerDelegate(profile())); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SetDownloadManager(download_manager_.get()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service_ = profile()->GetTestingPrefService(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->SetDelegate(&web_contents_delegate_); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_download_dir_.CreateUniqueTempDir()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultDownloadPath(test_download_dir_.path()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegateTest::TearDown() { 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->Shutdown(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeRenderViewHostTestHarness::TearDown(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegateTest::VerifyAndClearExpectations() { 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ::testing::Mock::VerifyAndClearExpectations(delegate_.get()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::MockDownloadItem* 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeDownloadManagerDelegateTest::CreateActiveDownloadItem(int32 id) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::MockDownloadItem* item = 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ::testing::NiceMock<content::MockDownloadItem>(); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ON_CALL(*item, GetBrowserContext()) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillByDefault(Return(profile())); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ON_CALL(*item, GetDangerType()) 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillByDefault(Return(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS)); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ON_CALL(*item, GetForcedFilePath()) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillByDefault(ReturnRefOfCopy(base::FilePath())); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*item, GetFullPath()) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillByDefault(ReturnRefOfCopy(base::FilePath())); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*item, GetHash()) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(ReturnRefOfCopy(std::string())); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ON_CALL(*item, GetId()) 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillByDefault(Return(id)); 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ON_CALL(*item, GetLastReason()) 213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .WillByDefault(Return(content::DOWNLOAD_INTERRUPT_REASON_NONE)); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*item, GetReferrerUrl()) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(ReturnRefOfCopy(GURL())); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ON_CALL(*item, GetState()) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillByDefault(Return(DownloadItem::IN_PROGRESS)); 218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ON_CALL(*item, GetTargetFilePath()) 219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) .WillByDefault(ReturnRefOfCopy(base::FilePath())); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*item, GetTransitionType()) 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillByDefault(Return(ui::PAGE_TRANSITION_LINK)); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ON_CALL(*item, GetWebContents()) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillByDefault(Return(web_contents())); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*item, HasUserGesture()) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(false)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*item, IsDangerous()) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(false)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(*item, IsTemporary()) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault(Return(false)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*download_manager_, GetDownload(id)) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(item)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return item; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath ChromeDownloadManagerDelegateTest::GetPathInDownloadDir( 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* relative_path) { 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath full_path = 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_download_dir_.path().AppendASCII(relative_path); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return full_path.NormalizePathSeparators(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeDownloadManagerDelegateTest::SetDefaultDownloadPath( 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_service_->SetFilePath(prefs::kDownloadDefaultDirectory, path); 245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pref_service_->SetFilePath(prefs::kSaveFileDefaultDirectory, path); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void StoreDownloadTargetInfo(const base::Closure& closure, 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadTargetInfo* target_info, 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::FilePath& target_path, 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadItem::TargetDisposition target_disposition, 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::DownloadDangerType danger_type, 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::FilePath& intermediate_path) { 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_info->target_path = target_path; 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_info->target_disposition = target_disposition; 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_info->danger_type = danger_type; 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target_info->intermediate_path = intermediate_path; 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) closure.Run(); 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ChromeDownloadManagerDelegateTest::DetermineDownloadTarget( 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DownloadItem* download_item, 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadTargetInfo* result) { 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::RunLoop loop_runner; 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate()->DetermineDownloadTarget( 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) download_item, 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&StoreDownloadTargetInfo, loop_runner.QuitClosure(), result)); 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) loop_runner.Run(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void StoreBoolAndRunClosure(const base::Closure& closure, 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool* result_storage, 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool result) { 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *result_storage = result; 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) closure.Run(); 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeDownloadManagerDelegateTest::CheckForFileExistence( 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadItem* download_item) { 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::RunLoop loop_runner; 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool result = false; 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate()->CheckForFileExistence( 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) download_item, 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&StoreBoolAndRunClosure, loop_runner.QuitClosure(), &result)); 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) loop_runner.Run(); 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return result; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath& ChromeDownloadManagerDelegateTest::default_download_path() 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_download_dir_.path(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestChromeDownloadManagerDelegate* 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeDownloadManagerDelegateTest::delegate() { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_.get(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::MockDownloadManager* 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeDownloadManagerDelegateTest::download_manager() { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return download_manager_.get(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadPrefs* ChromeDownloadManagerDelegateTest::download_prefs() { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->download_prefs(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ChromeDownloadManagerDelegateTest, StartDownload_LastSavePath) { 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL download_url("http://example.com/foo.txt"); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<content::MockDownloadItem> save_as_download( 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateActiveDownloadItem(0)); 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*save_as_download, GetURL()) 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(::testing::AnyNumber()) 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(ReturnRef(download_url)); 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*save_as_download, GetTargetDisposition()) 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(::testing::AnyNumber()) 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(Return(DownloadItem::TARGET_DISPOSITION_PROMPT)); 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<content::MockDownloadItem> automatic_download( 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateActiveDownloadItem(1)); 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*automatic_download, GetURL()) 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(::testing::AnyNumber()) 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(ReturnRef(download_url)); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*automatic_download, GetTargetDisposition()) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(::testing::AnyNumber()) 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(Return(DownloadItem::TARGET_DISPOSITION_OVERWRITE)); 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When the prompt is displayed for the first download, the user selects a 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // path in a different directory. 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadTargetInfo result; 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath expected_prompt_path(GetPathInDownloadDir("foo.txt")); 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath user_selected_path(GetPathInDownloadDir("bar/baz.txt")); 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*delegate(), 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockPromptUserForDownloadPath(save_as_download.get(), 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_prompt_path, _)) 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(user_selected_path)); 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DetermineDownloadTarget(save_as_download.get(), &result); 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(user_selected_path, result.target_path); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyAndClearExpectations(); 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The prompt path for the second download is the user selected directroy 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from the previous download. 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadTargetInfo result; 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath expected_prompt_path(GetPathInDownloadDir("bar/foo.txt")); 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*delegate(), 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockPromptUserForDownloadPath(save_as_download.get(), 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_prompt_path, _)) 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(base::FilePath())); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DetermineDownloadTarget(save_as_download.get(), &result); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyAndClearExpectations(); 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start an automatic download. This one should get the default download 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // path since the last download path only affects Save As downloads. 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadTargetInfo result; 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath expected_path(GetPathInDownloadDir("foo.txt")); 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DetermineDownloadTarget(automatic_download.get(), &result); 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(expected_path, result.target_path); 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyAndClearExpectations(); 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The prompt path for the next download should be the default. 371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) download_prefs()->SetSaveFilePath(download_prefs()->DownloadPath()); 372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DownloadTargetInfo result; 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath expected_prompt_path(GetPathInDownloadDir("foo.txt")); 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*delegate(), 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockPromptUserForDownloadPath(save_as_download.get(), 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_prompt_path, _)) 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(Return(base::FilePath())); 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DetermineDownloadTarget(save_as_download.get(), &result); 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyAndClearExpectations(); 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ChromeDownloadManagerDelegateTest, CheckForFileExistence) { 384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const char kData[] = "helloworld"; 385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const size_t kDataLength = sizeof(kData) - 1; 386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath existing_path = default_download_path().AppendASCII("foo"); 387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath non_existent_path = 388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) default_download_path().AppendASCII("bar"); 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile(existing_path, kData, kDataLength); 390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<content::MockDownloadItem> download_item( 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CreateActiveDownloadItem(1)); 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(*download_item, GetTargetFilePath()) 394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .WillRepeatedly(ReturnRef(existing_path)); 395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(CheckForFileExistence(download_item.get())); 396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) download_item.reset(CreateActiveDownloadItem(1)); 398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(*download_item, GetTargetFilePath()) 399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .WillRepeatedly(ReturnRef(non_existent_path)); 400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(CheckForFileExistence(download_item.get())); 401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 402