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