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