download_manager_impl_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/scoped_temp_dir.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/byte_stream.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_create_info.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_file_factory.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_item_factory.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_item_impl.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_item_impl_delegate.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_manager_impl.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_request_handle.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mock_download_file.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_interrupt_reasons.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager_delegate.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_download_item.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_context.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock_mutant.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AllOf;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Eq;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Ref;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnRef;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ByteStreamReader;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Matches a DownloadCreateInfo* that points to the same object as |info| and
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has a |default_download_directory| that matches |download_directory|.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P2(DownloadCreateInfoWithDefaultPath, info, download_directory, "") {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg == info &&
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg->default_download_directory == download_directory;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadItemImpl : public DownloadItemImpl {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use history constructor for minimal base object.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl(DownloadItemImplDelegate* delegate)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : DownloadItemImpl(delegate, DownloadId(),
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         DownloadPersistentStoreInfo(),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         net::BoundNetLog()) {}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDownloadItemImpl() {}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD4(OnDownloadTargetDetermined,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(const FilePath&, TargetDisposition,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    DownloadDangerType, const FilePath&));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(AddObserver, void(DownloadItem::Observer*));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(RemoveObserver, void(DownloadItem::Observer*));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(UpdateObservers, void());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(CanShowInFolder, bool());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(CanOpenDownload, bool());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(ShouldOpenFileBasedOnExtension, bool());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OpenDownload, void());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(ShowDownloadInShell, void());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(DangerousDownloadValidated, void());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3(UpdateProgress, void(int64, int64, const std::string&));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Cancel, void(bool));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(MarkAsComplete, void());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnAllDataSaved, void(const std::string&));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OnDownloadedFileRemoved, void());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(MaybeCompleteDownload, void());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Start(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadFile> download_file) OVERRIDE {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockStart(download_file.get());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(MockStart, void(DownloadFile*));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Delete, void(DeleteReason));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Remove, void());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta*));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(CurrentSpeed, int64());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(PercentComplete, int());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(AllDataSaved, bool());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(TogglePause, void());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD1(MatchesQuery, bool(const string16& query));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsPartialDownload, bool());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsInProgress, bool());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsCancelled, bool());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsInterrupted, bool());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsComplete, bool());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetFullPath, const FilePath&());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetTargetFilePath, const FilePath&());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetTargetDisposition, TargetDisposition());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnContentCheckCompleted, void(DownloadDangerType));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetState, DownloadState());
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetUrlChain, const std::vector<GURL>&());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetTotalBytes, void(int64));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetURL, const GURL&());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetOriginalUrl, const GURL&());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetReferrerUrl, const GURL&());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetSuggestedFilename, std::string());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetContentDisposition, std::string());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetMimeType, std::string());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetOriginalMimeType, std::string());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetReferrerCharset, std::string());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetRemoteAddress, std::string());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetTotalBytes, int64());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetReceivedBytes, int64());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetHashState, const std::string&());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetHash, const std::string&());
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetId, int32());
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetGlobalId, DownloadId());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetStartTime, base::Time());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetEndTime, base::Time());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(SetIsPersisted, void());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsPersisted, bool());
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetDbHandle, void(int64));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetDbHandle, int64());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetDownloadManager, DownloadManager*());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsPaused, bool());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetOpenWhenComplete, bool());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetOpenWhenComplete, void(bool));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetSafetyState, SafetyState());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsDangerous, bool());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetAutoOpened, bool());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetForcedFilePath, const FilePath&());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(HasUserGesture, bool());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetTransitionType, PageTransition());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsTemporary, bool());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetIsTemporary, void(bool));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetOpened, void(bool));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetOpened, bool());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetETag, const std::string&());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetPersistentStoreInfo, DownloadPersistentStoreInfo());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetWebContents, WebContents*());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetFileNameToReportUser, FilePath());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetDisplayName, void(const FilePath&));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetUserVerifiedFilePath, FilePath());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(MockDownloadOpenForTesting, void());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May be called when vlog is on.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string DebugString(bool verbose) const OVERRIDE { return ""; }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadManagerDelegate : public DownloadManagerDelegate {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadManagerDelegate();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDownloadManagerDelegate();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Shutdown, void());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetNextId, DownloadId());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(DetermineDownloadTarget,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(DownloadItem* item,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const DownloadTargetCallback&));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetAlternativeWebContentsToNotifyForDownload, WebContents*());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const FilePath&));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(ShouldCompleteDownload,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(DownloadItem*, const base::Closure&));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(ShouldOpenDownload,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(DownloadItem*, const DownloadOpenDelayedCallback&));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GenerateFileHash, bool());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(AddItemToPersistentStore, void(DownloadItem*));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(UpdateItemInPersistentStore, void(DownloadItem*));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(UpdatePathForItemInPersistentStore,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(DownloadItem*, const FilePath&));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(RemoveItemFromPersistentStore, void(DownloadItem*));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(RemoveItemsFromPersistentStoreBetween, void(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time remove_begin, base::Time remove_end));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD4(GetSaveDir, void(BrowserContext*,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                FilePath*, FilePath*, bool*));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD5(ChooseSavePath, void(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebContents*, const FilePath&, const FilePath::StringType&,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool, const SavePackagePathPickedCallback&));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadManagerDelegate::MockDownloadManagerDelegate() {}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadManagerDelegate::~MockDownloadManagerDelegate() {}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadItemFactory
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DownloadItemFactory,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<MockDownloadItemFactory> {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemFactory();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDownloadItemFactory();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Access to map of created items.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rdsmith): Could add type (save page, persisted, etc.)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // functionality if it's ever needed by consumers.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns NULL if no item of that id is present.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* GetItem(int id);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove and return an item made by the factory.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generally used during teardown.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* PopItem();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be called when the item of this id is removed so that
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we don't keep dangling pointers.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveItem(int id);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden methods from DownloadItemFactory.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadItemImpl* CreatePersistedItem(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImplDelegate* delegate,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadId download_id,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const DownloadPersistentStoreInfo& info,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::BoundNetLog& bound_net_log) OVERRIDE;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadItemImpl* CreateActiveItem(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImplDelegate* delegate,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const DownloadCreateInfo& info,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadRequestHandleInterface> request_handle,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::BoundNetLog& bound_net_log) OVERRIDE;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadItemImpl* CreateSavePageItem(
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImplDelegate* delegate,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FilePath& path,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadId download_id,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& mime_type,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::BoundNetLog& bound_net_log) OVERRIDE;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<int32, MockDownloadItemImpl*> items_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemImplDelegate item_delegate_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockDownloadItemFactory);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadItemFactory::MockDownloadItemFactory() {}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadItemFactory::~MockDownloadItemFactory() {}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadItemImpl* MockDownloadItemFactory::GetItem(int id) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (items_.find(id) == items_.end())
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return items_[id];
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadItemImpl* MockDownloadItemFactory::PopItem() {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (items_.empty())
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<int32, MockDownloadItemImpl*>::iterator first_item
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      = items_.begin();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* result = first_item->second;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items_.erase(first_item);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockDownloadItemFactory::RemoveItem(int id) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(items_.find(id) != items_.end());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items_.erase(id);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadItemImpl* MockDownloadItemFactory::CreatePersistedItem(
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItemImplDelegate* delegate,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadId download_id,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DownloadPersistentStoreInfo& info,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::BoundNetLog& bound_net_log) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int local_id = download_id.local();
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(items_.find(local_id) == items_.end());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* result =
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new StrictMock<MockDownloadItemImpl>(&item_delegate_);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*result, GetId())
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(local_id));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items_[local_id] = result;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadItemImpl* MockDownloadItemFactory::CreateActiveItem(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItemImplDelegate* delegate,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DownloadCreateInfo& info,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<DownloadRequestHandleInterface> request_handle,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::BoundNetLog& bound_net_log) {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int local_id = info.download_id.local();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(items_.find(local_id) == items_.end());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* result =
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new StrictMock<MockDownloadItemImpl>(&item_delegate_);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*result, GetId())
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(local_id));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*result, GetGlobalId())
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(DownloadId(delegate, local_id)));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items_[local_id] = result;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Active items are created and then immediately are called to start
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the download.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*result, MockStart(_));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadItemImpl* MockDownloadItemFactory::CreateSavePageItem(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItemImplDelegate* delegate,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FilePath& path,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadId download_id,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& mime_type,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::BoundNetLog& bound_net_log) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int local_id = download_id.local();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(items_.find(local_id) == items_.end());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* result =
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new StrictMock<MockDownloadItemImpl>(&item_delegate_);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*result, GetId())
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(local_id));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items_[local_id] = result;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadFileFactory
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DownloadFileFactory,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<MockDownloadFileFactory> {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadFileFactory() {}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDownloadFileFactory() {}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden method from DownloadFileFactory
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD8(MockCreateFile, DownloadFile*(
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DownloadSaveInfo&,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FilePath&,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL&, const GURL&, bool,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ByteStreamReader*,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::BoundNetLog&,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WeakPtr<DownloadDestinationObserver>));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadFile* CreateFile(
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadSaveInfo> save_info,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FilePath& default_download_directory,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& referrer_url,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool calculate_hash,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<ByteStreamReader> stream,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::BoundNetLog& bound_net_log,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WeakPtr<DownloadDestinationObserver> observer) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MockCreateFile(*save_info.get(), default_download_directory, url,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          referrer_url, calculate_hash,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          stream.get(), bound_net_log, observer);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockBrowserContext : public BrowserContext {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockBrowserContext() {}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MockBrowserContext() {}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetPath, FilePath());
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsOffTheRecord, bool());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetRequestContext, net::URLRequestContextGetter*());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetRequestContextForRenderProcess,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*(int renderer_child_id));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(GetRequestContextForStoragePartition,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*(
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const FilePath& partition_path, bool in_memory));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetMediaRequestContext,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetMediaRequestContextForRenderProcess,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*(int renderer_child_id));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(GetMediaRequestContextForStoragePartition,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const FilePath& partition_path, bool in_memory));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetResourceContext, ResourceContext*());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetDownloadManagerDelegate, DownloadManagerDelegate*());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetGeolocationPermissionContext,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GeolocationPermissionContext* ());
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetSpeechRecognitionPreferences,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               SpeechRecognitionPreferences* ());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetSpecialStoragePolicy, quota::SpecialStoragePolicy*());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadManagerObserver : public DownloadManager::Observer {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadManagerObserver() {}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MockDownloadManagerObserver() {}
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnDownloadCreated, void(
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DownloadManager*, DownloadItem*));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(ManagerGoingDown, void(DownloadManager*));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(SelectFileDialogDisplayed, void(
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DownloadManager*, int32));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadManagerTest : public testing::Test {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kTestData;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kTestDataLen;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManagerTest()
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_thread_(BrowserThread::FILE, &message_loop_),
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        next_download_id_(0) {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We tear down everything in TearDown().
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~DownloadManagerTest() {}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a MockDownloadItemFactory and MockDownloadManagerDelegate,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then create a DownloadManager that points
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at all of those.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!download_manager_.get());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_item_factory_ = (new MockDownloadItemFactory())->AsWeakPtr();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_file_factory_ = (new MockDownloadFileFactory())->AsWeakPtr();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_manager_delegate_.reset(
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new StrictMock<MockDownloadManagerDelegate>);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_download_manager_delegate_.get(), Shutdown())
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_browser_context_.reset(new StrictMock<MockBrowserContext>);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_browser_context_.get(), IsOffTheRecord())
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(false));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_ = new DownloadManagerImpl(NULL);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->SetDownloadItemFactoryForTesting(
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<DownloadItemFactory>(
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mock_download_item_factory_.get()).Pass());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->SetDownloadFileFactoryForTesting(
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<DownloadFileFactory>(
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mock_download_file_factory_.get()).Pass());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.reset(new MockDownloadManagerObserver());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->AddObserver(observer_.get());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->SetDelegate(mock_download_manager_delegate_.get());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->Init(mock_browser_context_.get());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (MockDownloadItemImpl*
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           item = mock_download_item_factory_->PopItem()) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*item, GetSafetyState())
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .WillOnce(Return(DownloadItem::SAFE));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(*item, IsPartialDownload())
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .WillOnce(Return(false));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(GetMockObserver(), ManagerGoingDown(download_manager_.get()))
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return());
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->Shutdown();
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_ = NULL;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunUntilIdle();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(NULL, mock_download_item_factory_.get());
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(NULL, mock_download_file_factory_.get());
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunUntilIdle();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_manager_delegate_.reset();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_browser_context_.reset();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns download id.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& AddItemToManager() {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadCreateInfo info;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const char* kDownloadIdDomain = "Test download id domain";
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Args are ignored except for download id, so everything else can be
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // null.
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id = next_download_id_;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++next_download_id_;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.download_id = DownloadId(kDownloadIdDomain, id);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.request_handle = DownloadRequestHandle();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->CreateDownloadItem(&info, net::BoundNetLog());
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(mock_download_item_factory_->GetItem(id));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockDownloadItemImpl& item(*mock_download_item_factory_->GetItem(id));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Satisfy expectation.  If the item is created in StartDownload(),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we call Start on it immediately, so we need to set that expectation
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in the factory.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    item.Start(scoped_ptr<DownloadFile>());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return item;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& GetMockDownloadItem(int id) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockDownloadItemImpl* itemp = mock_download_item_factory_->GetItem(id);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(itemp);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *itemp;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveMockDownloadItem(int id) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Owned by DownloadManager; should be deleted there.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_item_factory_->RemoveItem(id);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadManagerDelegate& GetMockDownloadManagerDelegate() {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *mock_download_manager_delegate_;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadManagerObserver& GetMockObserver() {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *observer_;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Probe at private internals.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DownloadStopped(DownloadItemImpl* item) {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->DownloadStopped(item);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DownloadTargetDeterminedCallback(
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FilePath& target_path,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::TargetDisposition disposition,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadDangerType danger_type,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FilePath& intermediate_path) {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_called_ = true;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target_path_ = target_path;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target_disposition_ = disposition;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    danger_type_ = danger_type;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intermediate_path_ = intermediate_path;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DetermineDownloadTarget(DownloadItemImpl* item) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->DetermineDownloadTarget(
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        item, base::Bind(
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &DownloadManagerTest::DownloadTargetDeterminedCallback,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(this)));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddItemToHistory(MockDownloadItemImpl& item, int64 db_handle) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For DCHECK in AddDownloadItemToHistory.  Don't want to use
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // WillRepeatedly as it may have to return true after this.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (DCHECK_IS_ON())
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_CALL(item, IsPersisted())
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .WillRepeatedly(Return(false));
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(item, SetDbHandle(db_handle));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(item, SetIsPersisted());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(item, GetDbHandle())
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(db_handle));
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Null out ShowDownloadInBrowser
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(item, GetWebContents())
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(static_cast<WebContents*>(NULL)));
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(GetMockDownloadManagerDelegate(),
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                GetAlternativeWebContentsToNotifyForDownload())
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(static_cast<WebContents*>(NULL)));
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(item, IsInProgress())
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(true));
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // History addition should result in a call into MaybeCompleteDownload().
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(item, MaybeCompleteDownload())
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return());
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->OnItemAddedToPersistentStore(item.GetId(), db_handle);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key test variable; we'll keep it available to sub-classes.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<DownloadManagerImpl> download_manager_;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<MockDownloadFileFactory> mock_download_file_factory_;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Target detetermined callback.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool callback_called_;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath target_path_;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem::TargetDisposition target_disposition_;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadDangerType danger_type_;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath intermediate_path_;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoopForUI message_loop_;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowserThread ui_thread_;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowserThread file_thread_;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<MockDownloadItemFactory> mock_download_item_factory_;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockDownloadManagerDelegate> mock_download_manager_delegate_;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockBrowserContext> mock_browser_context_;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockDownloadManagerObserver> observer_;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int next_download_id_;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadManagerTest);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm the appropriate invocations occur when you start a download.
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadManagerTest, StartDownload) {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ByteStreamReader> stream;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 local_id(5);                    // Random value
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath download_path(FILE_PATH_LITERAL("download/path"));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(download_manager_->GetDownload(local_id));
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockObserver(), OnDownloadCreated(download_manager_.get(), _))
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(), GetNextId())
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(DownloadId(this, local_id)));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Doing nothing will set the default download directory to null.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _, _));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(), GenerateFileHash())
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(true));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_download_file_factory_.get(),
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              MockCreateFile(Ref(*info->save_info.get()), _, _, _, true,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             stream.get(), _, _));
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_manager_->StartDownload(info.Pass(), stream.Pass());
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(download_manager_->GetDownload(local_id));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that calling DetermineDownloadTarget behaves properly if the delegate
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// blocks starting.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadManagerTest, DetermineDownloadTarget_True) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put a mock we have a handle to on the download manager.
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& item(AddItemToManager());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(),
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              DetermineDownloadTarget(&item, _))
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(true));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DetermineDownloadTarget(&item);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that calling DetermineDownloadTarget behaves properly if the delegate
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allows starting.  This also tests OnDownloadTargetDetermined.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadManagerTest, DetermineDownloadTarget_False) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put a mock we have a handle to on the download manager.
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& item(AddItemToManager());
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath path(FILE_PATH_LITERAL("random_filepath.txt"));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(),
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              DetermineDownloadTarget(&item, _))
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(false));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(item, GetForcedFilePath())
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(ReturnRef(path));
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm that the callback was called with the right values in this case.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_called_ = false;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DetermineDownloadTarget(&item);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback_called_);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(path, target_path_);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DownloadItem::TARGET_DISPOSITION_OVERWRITE, target_disposition_);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, danger_type_);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(path, intermediate_path_);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Does DownloadStopped remove Download from appropriate queues?
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test tests non-persisted downloads.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadManagerTest, OnDownloadStopped_NonPersisted) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put a mock we have a handle to on the download manager.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& item(AddItemToManager());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(item, IsPersisted())
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(false));
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(item, GetState())
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(DownloadItem::CANCELLED));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(item, GetDbHandle())
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(DownloadItem::kUninitializedHandle));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadStopped(&item);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Does DownloadStopped remove Download from appropriate queues?
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test tests persisted downloads.
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadManagerTest, OnDownloadStopped_Persisted) {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put a mock we have a handle to on the download manager.
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& item(AddItemToManager());
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 db_handle = 0x7;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddItemToHistory(item, db_handle);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(item, IsPersisted())
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(true));
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(),
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              UpdateItemInPersistentStore(&item));
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(item, GetState())
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(DownloadItem::CANCELLED));
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(item, GetDbHandle())
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(Return(db_handle));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadStopped(&item);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
694