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"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/byte_stream.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_create_info.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_file_factory.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_item_factory.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_item_impl.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_item_impl_delegate.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_manager_impl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_request_handle.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/mock_download_file.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_interrupt_reasons.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager_delegate.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_download_item.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_context.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock_mutant.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AllOf;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Eq;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Ref;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnRef;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochACTION_TEMPLATE(RunCallback,
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                AND_1_VALUE_PARAMS(p0)) {
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return ::std::tr1::get<k>(args).Run(p0);
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ByteStreamReader;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Matches a DownloadCreateInfo* that points to the same object as |info| and
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has a |default_download_directory| that matches |download_directory|.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P2(DownloadCreateInfoWithDefaultPath, info, download_directory, "") {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg == info &&
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg->default_download_directory == download_directory;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadItemImpl : public DownloadItemImpl {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use history constructor for minimal base object.
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  explicit MockDownloadItemImpl(DownloadItemImplDelegate* delegate)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : DownloadItemImpl(
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          delegate,
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          content::DownloadItem::kInvalidId,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::FilePath(),
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::FilePath(),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          std::vector<GURL>(),
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GURL(),
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          "application/octet-stream",
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          "application/octet-stream",
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Time(),
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Time(),
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          std::string(),
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          std::string(),
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          DownloadItem::COMPLETE,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          DOWNLOAD_INTERRUPT_REASON_NONE,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          false,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          net::BoundNetLog()) {}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDownloadItemImpl() {}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD4(OnDownloadTargetDetermined,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               void(const base::FilePath&, TargetDisposition,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    DownloadDangerType, const base::FilePath&));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(AddObserver, void(DownloadItem::Observer*));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(RemoveObserver, void(DownloadItem::Observer*));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(UpdateObservers, void());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(CanShowInFolder, bool());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(CanOpenDownload, bool());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(ShouldOpenFileBasedOnExtension, bool());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OpenDownload, void());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(ShowDownloadInShell, void());
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MOCK_METHOD0(ValidateDangerousDownload, void());
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MOCK_METHOD1(StealDangerousDownload, void(const AcquireFileCallback&));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3(UpdateProgress, void(int64, int64, const std::string&));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(Cancel, void(bool));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(MarkAsComplete, void());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnAllDataSaved, void(const std::string&));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OnDownloadedFileRemoved, void());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Start(
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<DownloadFile> download_file,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<DownloadRequestHandleInterface> req_handle) OVERRIDE {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockStart(download_file.get(), req_handle.get());
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(MockStart, void(DownloadFile*, DownloadRequestHandleInterface*));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Remove, void());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta*));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(CurrentSpeed, int64());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(PercentComplete, int());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(AllDataSaved, bool());
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_CONST_METHOD1(MatchesQuery, bool(const base::string16& query));
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MOCK_CONST_METHOD0(IsDone, bool());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_CONST_METHOD0(GetFullPath, const base::FilePath&());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_CONST_METHOD0(GetTargetFilePath, const base::FilePath&());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetTargetDisposition, TargetDisposition());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnContentCheckCompleted, void(DownloadDangerType));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetState, DownloadState());
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetUrlChain, const std::vector<GURL>&());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetTotalBytes, void(int64));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetURL, const GURL&());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetOriginalUrl, const GURL&());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetReferrerUrl, const GURL&());
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(GetTabUrl, const GURL&());
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(GetTabReferrerUrl, const GURL&());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetSuggestedFilename, std::string());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetContentDisposition, std::string());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetMimeType, std::string());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetOriginalMimeType, std::string());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetReferrerCharset, std::string());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetRemoteAddress, std::string());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetTotalBytes, int64());
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetReceivedBytes, int64());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetHashState, const std::string&());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetHash, const std::string&());
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MOCK_CONST_METHOD0(GetId, uint32());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetStartTime, base::Time());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetEndTime, base::Time());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetDownloadManager, DownloadManager*());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsPaused, bool());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetOpenWhenComplete, bool());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetOpenWhenComplete, void(bool));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsDangerous, bool());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetAutoOpened, bool());
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_CONST_METHOD0(GetForcedFilePath, const base::FilePath&());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(HasUserGesture, bool());
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MOCK_CONST_METHOD0(GetTransitionType, ui::PageTransition());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsTemporary, bool());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetIsTemporary, void(bool));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(SetOpened, void(bool));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetOpened, bool());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetETag, const std::string&());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(GetWebContents, WebContents*());
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_CONST_METHOD0(GetFileNameToReportUser, base::FilePath());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(SetDisplayName, void(const base::FilePath&));
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(NotifyRemoved, void());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May be called when vlog is on.
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual std::string DebugString(bool verbose) const OVERRIDE {
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return std::string();
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadManagerDelegate : public DownloadManagerDelegate {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadManagerDelegate();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDownloadManagerDelegate();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Shutdown, void());
1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MOCK_METHOD1(GetNextId, void(const DownloadIdCallback&));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(DetermineDownloadTarget,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(DownloadItem* item,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const DownloadTargetCallback&));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(ShouldOpenFileBasedOnExtension, bool(const base::FilePath&));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(ShouldCompleteDownload,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(DownloadItem*, const base::Closure&));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(ShouldOpenDownload,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(DownloadItem*, const DownloadOpenDelayedCallback&));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GenerateFileHash, bool());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD4(GetSaveDir, void(BrowserContext*,
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                base::FilePath*, base::FilePath*, bool*));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD5(ChooseSavePath, void(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents*, const base::FilePath&, const base::FilePath::StringType&,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool, const SavePackagePathPickedCallback&));
202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  MOCK_CONST_METHOD0(ApplicationClientIdForFileScanning, std::string());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadManagerDelegate::MockDownloadManagerDelegate() {}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadManagerDelegate::~MockDownloadManagerDelegate() {}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadItemFactory
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DownloadItemFactory,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<MockDownloadItemFactory> {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemFactory();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDownloadItemFactory();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Access to map of created items.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rdsmith): Could add type (save page, persisted, etc.)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // functionality if it's ever needed by consumers.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns NULL if no item of that id is present.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* GetItem(int id);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove and return an item made by the factory.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generally used during teardown.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* PopItem();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be called when the item of this id is removed so that
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we don't keep dangling pointers.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveItem(int id);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden methods from DownloadItemFactory.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadItemImpl* CreatePersistedItem(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImplDelegate* delegate,
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 download_id,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& current_path,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& target_path,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<GURL>& url_chain,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& referrer_url,
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& mime_type,
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& original_mime_type,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time& start_time,
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time& end_time,
243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const std::string& etag,
244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const std::string& last_modofied,
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 received_bytes,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 total_bytes,
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadItem::DownloadState state,
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadDangerType danger_type,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DownloadInterruptReason interrupt_reason,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool opened,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::BoundNetLog& bound_net_log) OVERRIDE;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadItemImpl* CreateActiveItem(
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImplDelegate* delegate,
2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 download_id,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const DownloadCreateInfo& info,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::BoundNetLog& bound_net_log) OVERRIDE;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadItemImpl* CreateSavePageItem(
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItemImplDelegate* delegate,
2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 download_id,
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const std::string& mime_type,
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<DownloadRequestHandleInterface> request_handle,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::BoundNetLog& bound_net_log) OVERRIDE;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::map<uint32, MockDownloadItemImpl*> items_;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItemImplDelegate item_delegate_;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockDownloadItemFactory);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadItemFactory::MockDownloadItemFactory() {}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadItemFactory::~MockDownloadItemFactory() {}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadItemImpl* MockDownloadItemFactory::GetItem(int id) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (items_.find(id) == items_.end())
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return items_[id];
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockDownloadItemImpl* MockDownloadItemFactory::PopItem() {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (items_.empty())
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::map<uint32, MockDownloadItemImpl*>::iterator first_item
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      = items_.begin();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* result = first_item->second;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items_.erase(first_item);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockDownloadItemFactory::RemoveItem(int id) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(items_.find(id) != items_.end());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  items_.erase(id);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadItemImpl* MockDownloadItemFactory::CreatePersistedItem(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItemImplDelegate* delegate,
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    uint32 download_id,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& current_path,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& target_path,
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::vector<GURL>& url_chain,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& referrer_url,
306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& mime_type,
307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& original_mime_type,
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Time& start_time,
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Time& end_time,
310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const std::string& etag,
311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const std::string& last_modified,
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 received_bytes,
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 total_bytes,
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadItem::DownloadState state,
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadDangerType danger_type,
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DownloadInterruptReason interrupt_reason,
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool opened,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::BoundNetLog& bound_net_log) {
3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(items_.find(download_id) == items_.end());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* result =
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new StrictMock<MockDownloadItemImpl>(&item_delegate_);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*result, GetId())
3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      .WillRepeatedly(Return(download_id));
3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  items_[download_id] = result;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadItemImpl* MockDownloadItemFactory::CreateActiveItem(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItemImplDelegate* delegate,
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    uint32 download_id,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DownloadCreateInfo& info,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::BoundNetLog& bound_net_log) {
3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(items_.find(download_id) == items_.end());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* result =
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new StrictMock<MockDownloadItemImpl>(&item_delegate_);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*result, GetId())
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .WillRepeatedly(Return(download_id));
3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  items_[download_id] = result;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Active items are created and then immediately are called to start
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the download.
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*result, MockStart(_, _));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadItemImpl* MockDownloadItemFactory::CreateSavePageItem(
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadItemImplDelegate* delegate,
3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    uint32 download_id,
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& mime_type,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DownloadRequestHandleInterface> request_handle,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::BoundNetLog& bound_net_log) {
3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(items_.find(download_id) == items_.end());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl* result =
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new StrictMock<MockDownloadItemImpl>(&item_delegate_);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*result, GetId())
3617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      .WillRepeatedly(Return(download_id));
3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  items_[download_id] = result;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadFileFactory
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public DownloadFileFactory,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<MockDownloadFileFactory> {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadFileFactory() {}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockDownloadFileFactory() {}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden method from DownloadFileFactory
375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  MOCK_METHOD8(MockCreateFile, MockDownloadFile*(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DownloadSaveInfo&,
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath&,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL&, const GURL&, bool,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ByteStreamReader*,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::BoundNetLog&,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WeakPtr<DownloadDestinationObserver>));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DownloadFile* CreateFile(
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadSaveInfo> save_info,
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& default_download_directory,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& referrer_url,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool calculate_hash,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<ByteStreamReader> stream,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::BoundNetLog& bound_net_log,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WeakPtr<DownloadDestinationObserver> observer) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MockCreateFile(*save_info.get(), default_download_directory, url,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          referrer_url, calculate_hash,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          stream.get(), bound_net_log, observer);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockBrowserContext : public BrowserContext {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockBrowserContext() {}
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MockBrowserContext() {}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MOCK_CONST_METHOD0(GetPath, base::FilePath());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsOffTheRecord, bool());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetRequestContext, net::URLRequestContextGetter*());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetRequestContextForRenderProcess,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*(int renderer_child_id));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetMediaRequestContext,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetMediaRequestContextForRenderProcess,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*(int renderer_child_id));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(GetMediaRequestContextForStoragePartition,
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               net::URLRequestContextGetter*(
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const base::FilePath& partition_path, bool in_memory));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetResourceContext, ResourceContext*());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(GetDownloadManagerDelegate, DownloadManagerDelegate*());
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD0(GetGuestManager, BrowserPluginGuestManager* ());
41803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MOCK_METHOD0(GetSpecialStoragePolicy, storage::SpecialStoragePolicy*());
419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MOCK_METHOD0(GetPushMessagingService, PushMessagingService*());
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MOCK_METHOD0(GetSSLHostStateDelegate, SSLHostStateDelegate*());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDownloadManagerObserver : public DownloadManager::Observer {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadManagerObserver() {}
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~MockDownloadManagerObserver() {}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnDownloadCreated, void(
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DownloadManager*, DownloadItem*));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(ManagerGoingDown, void(DownloadManager*));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(SelectFileDialogDisplayed, void(
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DownloadManager*, int32));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
434a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}  // namespace
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadManagerTest : public testing::Test {
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* kTestData;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kTestDataLen;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadManagerTest()
4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : callback_called_(false),
4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ui_thread_(BrowserThread::UI, &message_loop_),
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_thread_(BrowserThread::FILE, &message_loop_),
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        next_download_id_(0) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We tear down everything in TearDown().
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadManagerTest() {}
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a MockDownloadItemFactory and MockDownloadManagerDelegate,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then create a DownloadManager that points
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at all of those.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
45590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DCHECK(!download_manager_);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_item_factory_ = (new MockDownloadItemFactory())->AsWeakPtr();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_file_factory_ = (new MockDownloadFileFactory())->AsWeakPtr();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_manager_delegate_.reset(
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new StrictMock<MockDownloadManagerDelegate>);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_download_manager_delegate_.get(), Shutdown())
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return());
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_browser_context_.reset(new StrictMock<MockBrowserContext>);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*mock_browser_context_.get(), IsOffTheRecord())
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(false));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    download_manager_.reset(new DownloadManagerImpl(
46890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                NULL, mock_browser_context_.get()));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->SetDownloadItemFactoryForTesting(
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<DownloadItemFactory>(
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mock_download_item_factory_.get()).Pass());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->SetDownloadFileFactoryForTesting(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<DownloadFileFactory>(
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mock_download_file_factory_.get()).Pass());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_.reset(new MockDownloadManagerObserver());
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->AddObserver(observer_.get());
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->SetDelegate(mock_download_manager_delegate_.get());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (MockDownloadItemImpl*
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           item = mock_download_item_factory_->PopItem()) {
483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      EXPECT_CALL(*item, GetState())
484868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          .WillOnce(Return(DownloadItem::CANCELLED));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(GetMockObserver(), ManagerGoingDown(download_manager_.get()))
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->Shutdown();
49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    download_manager_.reset();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunUntilIdle();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(NULL, mock_download_item_factory_.get());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(NULL, mock_download_file_factory_.get());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunUntilIdle();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_manager_delegate_.reset();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_browser_context_.reset();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns download id.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& AddItemToManager() {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DownloadCreateInfo info;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Args are ignored except for download id, so everything else can be
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // null.
5057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    uint32 id = next_download_id_;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++next_download_id_;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info.request_handle = DownloadRequestHandle();
5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    download_manager_->CreateActiveItem(id, info);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(mock_download_item_factory_->GetItem(id));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockDownloadItemImpl& item(*mock_download_item_factory_->GetItem(id));
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Satisfy expectation.  If the item is created in StartDownload(),
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we call Start on it immediately, so we need to set that expectation
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in the factory.
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<DownloadRequestHandleInterface> req_handle;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    item.Start(scoped_ptr<DownloadFile>(), req_handle.Pass());
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return item;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& GetMockDownloadItem(int id) {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MockDownloadItemImpl* itemp = mock_download_item_factory_->GetItem(id);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(itemp);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *itemp;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveMockDownloadItem(int id) {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Owned by DownloadManager; should be deleted there.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_download_item_factory_->RemoveItem(id);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadManagerDelegate& GetMockDownloadManagerDelegate() {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *mock_download_manager_delegate_;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadManagerObserver& GetMockObserver() {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *observer_;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DownloadTargetDeterminedCallback(
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& target_path,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadItem::TargetDisposition disposition,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DownloadDangerType danger_type,
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& intermediate_path) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_called_ = true;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target_path_ = target_path;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target_disposition_ = disposition;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    danger_type_ = danger_type;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intermediate_path_ = intermediate_path;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DetermineDownloadTarget(DownloadItemImpl* item) {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    download_manager_->DetermineDownloadTarget(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        item, base::Bind(
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &DownloadManagerTest::DownloadTargetDeterminedCallback,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Unretained(this)));
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key test variable; we'll keep it available to sub-classes.
56190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<DownloadManagerImpl> download_manager_;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<MockDownloadFileFactory> mock_download_file_factory_;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Target detetermined callback.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool callback_called_;
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath target_path_;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadItem::TargetDisposition target_disposition_;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DownloadDangerType danger_type_;
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath intermediate_path_;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowserThread ui_thread_;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowserThread file_thread_;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<MockDownloadItemFactory> mock_download_item_factory_;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockDownloadManagerDelegate> mock_download_manager_delegate_;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockBrowserContext> mock_browser_context_;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockDownloadManagerObserver> observer_;
5797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  uint32 next_download_id_;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadManagerTest);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm the appropriate invocations occur when you start a download.
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadManagerTest, StartDownload) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ByteStreamReader> stream;
5887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  uint32 local_id(5);  // Random value
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath download_path(FILE_PATH_LITERAL("download/path"));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(download_manager_->GetDownload(local_id));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockObserver(), OnDownloadCreated(download_manager_.get(), _))
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return());
5957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_CALL(GetMockDownloadManagerDelegate(), GetNextId(_))
5967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      .WillOnce(RunCallback<0>(local_id));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Doing nothing will set the default download directory to null.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _, _));
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(), GenerateFileHash())
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(true));
602ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(GetMockDownloadManagerDelegate(),
603ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              ApplicationClientIdForFileScanning())
604ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      .WillRepeatedly(Return("client-id"));
605ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  MockDownloadFile* mock_file = new MockDownloadFile;
606ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(*mock_file, SetClientGuid("client-id"));
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*mock_download_file_factory_.get(),
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              MockCreateFile(Ref(*info->save_info.get()), _, _, _, true,
609ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                             stream.get(), _, _))
610ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      .WillOnce(Return(mock_file));
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  download_manager_->StartDownload(
6137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      info.Pass(), stream.Pass(), DownloadUrlParameters::OnStartedCallback());
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(download_manager_->GetDownload(local_id));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that calling DetermineDownloadTarget behaves properly if the delegate
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// blocks starting.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadManagerTest, DetermineDownloadTarget_True) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put a mock we have a handle to on the download manager.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& item(AddItemToManager());
6227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(item, GetState())
6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillRepeatedly(Return(DownloadItem::IN_PROGRESS));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(),
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              DetermineDownloadTarget(&item, _))
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(true));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DetermineDownloadTarget(&item);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm that calling DetermineDownloadTarget behaves properly if the delegate
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allows starting.  This also tests OnDownloadTargetDetermined.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadManagerTest, DetermineDownloadTarget_False) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put a mock we have a handle to on the download manager.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockDownloadItemImpl& item(AddItemToManager());
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path(FILE_PATH_LITERAL("random_filepath.txt"));
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadManagerDelegate(),
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              DetermineDownloadTarget(&item, _))
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(false));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(item, GetForcedFilePath())
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(ReturnRef(path));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm that the callback was called with the right values in this case.
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_called_ = false;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DetermineDownloadTarget(&item);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(callback_called_);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(path, target_path_);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DownloadItem::TARGET_DISPOSITION_OVERWRITE, target_disposition_);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, danger_type_);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(path, intermediate_path_);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Confirm the DownloadManagerImpl::RemoveAllDownloads() functionality
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DownloadManagerTest, RemoveAllDownloads) {
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time now(base::Time::Now());
6577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for (uint32 i = 0; i < 4; ++i) {
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockDownloadItemImpl& item(AddItemToManager());
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(i, item.GetId());
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(item, GetStartTime())
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(Return(now));
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Specify states for each.
6657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadItem(0), GetState())
6667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillRepeatedly(Return(DownloadItem::COMPLETE));
6677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadItem(1), GetState())
6687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillRepeatedly(Return(DownloadItem::CANCELLED));
6697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadItem(2), GetState())
6707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillRepeatedly(Return(DownloadItem::INTERRUPTED));
6717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(GetMockDownloadItem(3), GetState())
6727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillRepeatedly(Return(DownloadItem::IN_PROGRESS));
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Expectations for whether or not they'll actually be removed.
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(GetMockDownloadItem(0), Remove())
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(Return());
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(GetMockDownloadItem(1), Remove())
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(Return());
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(GetMockDownloadItem(2), Remove())
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillOnce(Return());
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(GetMockDownloadItem(3), Remove())
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(0);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  download_manager_->RemoveAllDownloads();
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Because we're mocking the download item, the Remove call doesn't
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // result in them being removed from the DownloadManager list.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
690