1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/weak_ptr.h"
12 #include "base/message_loop/message_loop.h"
13 #include "base/stl_util.h"
14 #include "base/strings/string16.h"
15 #include "base/strings/string_util.h"
16 #include "base/strings/utf_string_conversions.h"
17 #include "build/build_config.h"
18 #include "content/browser/byte_stream.h"
19 #include "content/browser/download/download_create_info.h"
20 #include "content/browser/download/download_file_factory.h"
21 #include "content/browser/download/download_item_factory.h"
22 #include "content/browser/download/download_item_impl.h"
23 #include "content/browser/download/download_item_impl_delegate.h"
24 #include "content/browser/download/download_manager_impl.h"
25 #include "content/browser/download/download_request_handle.h"
26 #include "content/browser/download/mock_download_file.h"
27 #include "content/public/browser/browser_context.h"
28 #include "content/public/browser/download_interrupt_reasons.h"
29 #include "content/public/browser/download_item.h"
30 #include "content/public/browser/download_manager_delegate.h"
31 #include "content/public/test/mock_download_item.h"
32 #include "content/public/test/test_browser_context.h"
33 #include "content/public/test/test_browser_thread.h"
34 #include "net/base/net_log.h"
35 #include "net/base/net_util.h"
36 #include "testing/gmock/include/gmock/gmock.h"
37 #include "testing/gmock_mutant.h"
38 #include "testing/gtest/include/gtest/gtest.h"
40 using ::testing::AllOf
;
41 using ::testing::DoAll
;
44 using ::testing::Return
;
45 using ::testing::ReturnRef
;
46 using ::testing::SetArgPointee
;
47 using ::testing::StrictMock
;
50 ACTION_TEMPLATE(RunCallback
,
51 HAS_1_TEMPLATE_PARAMS(int, k
),
52 AND_1_VALUE_PARAMS(p0
)) {
53 return ::std::tr1::get
<k
>(args
).Run(p0
);
57 class ByteStreamReader
;
61 // Matches a DownloadCreateInfo* that points to the same object as |info| and
62 // has a |default_download_directory| that matches |download_directory|.
63 MATCHER_P2(DownloadCreateInfoWithDefaultPath
, info
, download_directory
, "") {
65 arg
->default_download_directory
== download_directory
;
68 class MockDownloadItemImpl
: public DownloadItemImpl
{
70 // Use history constructor for minimal base object.
71 explicit MockDownloadItemImpl(DownloadItemImplDelegate
* delegate
)
74 content::DownloadItem::kInvalidId
,
85 DownloadItem::COMPLETE
,
86 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS
,
87 DOWNLOAD_INTERRUPT_REASON_NONE
,
89 net::BoundNetLog()) {}
90 virtual ~MockDownloadItemImpl() {}
92 MOCK_METHOD4(OnDownloadTargetDetermined
,
93 void(const base::FilePath
&, TargetDisposition
,
94 DownloadDangerType
, const base::FilePath
&));
95 MOCK_METHOD1(AddObserver
, void(DownloadItem::Observer
*));
96 MOCK_METHOD1(RemoveObserver
, void(DownloadItem::Observer
*));
97 MOCK_METHOD0(UpdateObservers
, void());
98 MOCK_METHOD0(CanShowInFolder
, bool());
99 MOCK_METHOD0(CanOpenDownload
, bool());
100 MOCK_METHOD0(ShouldOpenFileBasedOnExtension
, bool());
101 MOCK_METHOD0(OpenDownload
, void());
102 MOCK_METHOD0(ShowDownloadInShell
, void());
103 MOCK_METHOD0(ValidateDangerousDownload
, void());
104 MOCK_METHOD1(StealDangerousDownload
, void(const AcquireFileCallback
&));
105 MOCK_METHOD3(UpdateProgress
, void(int64
, int64
, const std::string
&));
106 MOCK_METHOD1(Cancel
, void(bool));
107 MOCK_METHOD0(MarkAsComplete
, void());
108 MOCK_METHOD1(OnAllDataSaved
, void(const std::string
&));
109 MOCK_METHOD1(OnDownloadedFileRemoved
, void(bool));
111 scoped_ptr
<DownloadFile
> download_file
,
112 scoped_ptr
<DownloadRequestHandleInterface
> req_handle
) OVERRIDE
{
113 MockStart(download_file
.get(), req_handle
.get());
116 MOCK_METHOD2(MockStart
, void(DownloadFile
*, DownloadRequestHandleInterface
*));
118 MOCK_METHOD0(Remove
, void());
119 MOCK_CONST_METHOD1(TimeRemaining
, bool(base::TimeDelta
*));
120 MOCK_CONST_METHOD0(CurrentSpeed
, int64());
121 MOCK_CONST_METHOD0(PercentComplete
, int());
122 MOCK_CONST_METHOD0(AllDataSaved
, bool());
123 MOCK_CONST_METHOD1(MatchesQuery
, bool(const base::string16
& query
));
124 MOCK_CONST_METHOD0(IsDone
, bool());
125 MOCK_CONST_METHOD0(GetFullPath
, const base::FilePath
&());
126 MOCK_CONST_METHOD0(GetTargetFilePath
, const base::FilePath
&());
127 MOCK_CONST_METHOD0(GetTargetDisposition
, TargetDisposition());
128 MOCK_METHOD1(OnContentCheckCompleted
, void(DownloadDangerType
));
129 MOCK_CONST_METHOD0(GetState
, DownloadState());
130 MOCK_CONST_METHOD0(GetUrlChain
, const std::vector
<GURL
>&());
131 MOCK_METHOD1(SetTotalBytes
, void(int64
));
132 MOCK_CONST_METHOD0(GetURL
, const GURL
&());
133 MOCK_CONST_METHOD0(GetOriginalUrl
, const GURL
&());
134 MOCK_CONST_METHOD0(GetReferrerUrl
, const GURL
&());
135 MOCK_CONST_METHOD0(GetSuggestedFilename
, std::string());
136 MOCK_CONST_METHOD0(GetContentDisposition
, std::string());
137 MOCK_CONST_METHOD0(GetMimeType
, std::string());
138 MOCK_CONST_METHOD0(GetOriginalMimeType
, std::string());
139 MOCK_CONST_METHOD0(GetReferrerCharset
, std::string());
140 MOCK_CONST_METHOD0(GetRemoteAddress
, std::string());
141 MOCK_CONST_METHOD0(GetTotalBytes
, int64());
142 MOCK_CONST_METHOD0(GetReceivedBytes
, int64());
143 MOCK_CONST_METHOD0(GetHashState
, const std::string
&());
144 MOCK_CONST_METHOD0(GetHash
, const std::string
&());
145 MOCK_CONST_METHOD0(GetId
, uint32());
146 MOCK_CONST_METHOD0(GetStartTime
, base::Time());
147 MOCK_CONST_METHOD0(GetEndTime
, base::Time());
148 MOCK_METHOD0(GetDownloadManager
, DownloadManager
*());
149 MOCK_CONST_METHOD0(IsPaused
, bool());
150 MOCK_CONST_METHOD0(GetOpenWhenComplete
, bool());
151 MOCK_METHOD1(SetOpenWhenComplete
, void(bool));
152 MOCK_CONST_METHOD0(GetFileExternallyRemoved
, bool());
153 MOCK_CONST_METHOD0(GetDangerType
, DownloadDangerType());
154 MOCK_CONST_METHOD0(IsDangerous
, bool());
155 MOCK_METHOD0(GetAutoOpened
, bool());
156 MOCK_CONST_METHOD0(GetForcedFilePath
, const base::FilePath
&());
157 MOCK_CONST_METHOD0(HasUserGesture
, bool());
158 MOCK_CONST_METHOD0(GetTransitionType
, PageTransition());
159 MOCK_CONST_METHOD0(IsTemporary
, bool());
160 MOCK_METHOD1(SetIsTemporary
, void(bool));
161 MOCK_METHOD1(SetOpened
, void(bool));
162 MOCK_CONST_METHOD0(GetOpened
, bool());
163 MOCK_CONST_METHOD0(GetLastModifiedTime
, const std::string
&());
164 MOCK_CONST_METHOD0(GetETag
, const std::string
&());
165 MOCK_CONST_METHOD0(GetLastReason
, DownloadInterruptReason());
166 MOCK_CONST_METHOD0(GetBrowserContext
, BrowserContext
*());
167 MOCK_CONST_METHOD0(GetWebContents
, WebContents
*());
168 MOCK_CONST_METHOD0(GetFileNameToReportUser
, base::FilePath());
169 MOCK_METHOD1(SetDisplayName
, void(const base::FilePath
&));
170 MOCK_METHOD0(NotifyRemoved
, void());
171 // May be called when vlog is on.
172 virtual std::string
DebugString(bool verbose
) const OVERRIDE
{
173 return std::string();
177 class MockDownloadManagerDelegate
: public DownloadManagerDelegate
{
179 MockDownloadManagerDelegate();
180 virtual ~MockDownloadManagerDelegate();
182 MOCK_METHOD0(Shutdown
, void());
183 MOCK_METHOD1(GetNextId
, void(const DownloadIdCallback
&));
184 MOCK_METHOD2(DetermineDownloadTarget
,
185 bool(DownloadItem
* item
,
186 const DownloadTargetCallback
&));
187 MOCK_METHOD1(ShouldOpenFileBasedOnExtension
, bool(const base::FilePath
&));
188 MOCK_METHOD2(ShouldCompleteDownload
,
189 bool(DownloadItem
*, const base::Closure
&));
190 MOCK_METHOD2(ShouldOpenDownload
,
191 bool(DownloadItem
*, const DownloadOpenDelayedCallback
&));
192 MOCK_METHOD0(GenerateFileHash
, bool());
193 MOCK_METHOD4(GetSaveDir
, void(BrowserContext
*,
194 base::FilePath
*, base::FilePath
*, bool*));
195 MOCK_METHOD5(ChooseSavePath
, void(
196 WebContents
*, const base::FilePath
&, const base::FilePath::StringType
&,
197 bool, const SavePackagePathPickedCallback
&));
198 MOCK_CONST_METHOD0(ApplicationClientIdForFileScanning
, std::string());
201 MockDownloadManagerDelegate::MockDownloadManagerDelegate() {}
203 MockDownloadManagerDelegate::~MockDownloadManagerDelegate() {}
205 class MockDownloadItemFactory
206 : public DownloadItemFactory
,
207 public base::SupportsWeakPtr
<MockDownloadItemFactory
> {
209 MockDownloadItemFactory();
210 virtual ~MockDownloadItemFactory();
212 // Access to map of created items.
213 // TODO(rdsmith): Could add type (save page, persisted, etc.)
214 // functionality if it's ever needed by consumers.
216 // Returns NULL if no item of that id is present.
217 MockDownloadItemImpl
* GetItem(int id
);
219 // Remove and return an item made by the factory.
220 // Generally used during teardown.
221 MockDownloadItemImpl
* PopItem();
223 // Should be called when the item of this id is removed so that
224 // we don't keep dangling pointers.
225 void RemoveItem(int id
);
227 // Overridden methods from DownloadItemFactory.
228 virtual DownloadItemImpl
* CreatePersistedItem(
229 DownloadItemImplDelegate
* delegate
,
231 const base::FilePath
& current_path
,
232 const base::FilePath
& target_path
,
233 const std::vector
<GURL
>& url_chain
,
234 const GURL
& referrer_url
,
235 const base::Time
& start_time
,
236 const base::Time
& end_time
,
237 const std::string
& etag
,
238 const std::string
& last_modofied
,
239 int64 received_bytes
,
241 DownloadItem::DownloadState state
,
242 DownloadDangerType danger_type
,
243 DownloadInterruptReason interrupt_reason
,
245 const net::BoundNetLog
& bound_net_log
) OVERRIDE
;
246 virtual DownloadItemImpl
* CreateActiveItem(
247 DownloadItemImplDelegate
* delegate
,
249 const DownloadCreateInfo
& info
,
250 const net::BoundNetLog
& bound_net_log
) OVERRIDE
;
251 virtual DownloadItemImpl
* CreateSavePageItem(
252 DownloadItemImplDelegate
* delegate
,
254 const base::FilePath
& path
,
256 const std::string
& mime_type
,
257 scoped_ptr
<DownloadRequestHandleInterface
> request_handle
,
258 const net::BoundNetLog
& bound_net_log
) OVERRIDE
;
261 std::map
<uint32
, MockDownloadItemImpl
*> items_
;
262 DownloadItemImplDelegate item_delegate_
;
264 DISALLOW_COPY_AND_ASSIGN(MockDownloadItemFactory
);
267 MockDownloadItemFactory::MockDownloadItemFactory() {}
269 MockDownloadItemFactory::~MockDownloadItemFactory() {}
271 MockDownloadItemImpl
* MockDownloadItemFactory::GetItem(int id
) {
272 if (items_
.find(id
) == items_
.end())
277 MockDownloadItemImpl
* MockDownloadItemFactory::PopItem() {
281 std::map
<uint32
, MockDownloadItemImpl
*>::iterator first_item
283 MockDownloadItemImpl
* result
= first_item
->second
;
284 items_
.erase(first_item
);
288 void MockDownloadItemFactory::RemoveItem(int id
) {
289 DCHECK(items_
.find(id
) != items_
.end());
293 DownloadItemImpl
* MockDownloadItemFactory::CreatePersistedItem(
294 DownloadItemImplDelegate
* delegate
,
296 const base::FilePath
& current_path
,
297 const base::FilePath
& target_path
,
298 const std::vector
<GURL
>& url_chain
,
299 const GURL
& referrer_url
,
300 const base::Time
& start_time
,
301 const base::Time
& end_time
,
302 const std::string
& etag
,
303 const std::string
& last_modified
,
304 int64 received_bytes
,
306 DownloadItem::DownloadState state
,
307 DownloadDangerType danger_type
,
308 DownloadInterruptReason interrupt_reason
,
310 const net::BoundNetLog
& bound_net_log
) {
311 DCHECK(items_
.find(download_id
) == items_
.end());
312 MockDownloadItemImpl
* result
=
313 new StrictMock
<MockDownloadItemImpl
>(&item_delegate_
);
314 EXPECT_CALL(*result
, GetId())
315 .WillRepeatedly(Return(download_id
));
316 items_
[download_id
] = result
;
320 DownloadItemImpl
* MockDownloadItemFactory::CreateActiveItem(
321 DownloadItemImplDelegate
* delegate
,
323 const DownloadCreateInfo
& info
,
324 const net::BoundNetLog
& bound_net_log
) {
325 DCHECK(items_
.find(download_id
) == items_
.end());
327 MockDownloadItemImpl
* result
=
328 new StrictMock
<MockDownloadItemImpl
>(&item_delegate_
);
329 EXPECT_CALL(*result
, GetId())
330 .WillRepeatedly(Return(download_id
));
331 items_
[download_id
] = result
;
333 // Active items are created and then immediately are called to start
335 EXPECT_CALL(*result
, MockStart(_
, _
));
340 DownloadItemImpl
* MockDownloadItemFactory::CreateSavePageItem(
341 DownloadItemImplDelegate
* delegate
,
343 const base::FilePath
& path
,
345 const std::string
& mime_type
,
346 scoped_ptr
<DownloadRequestHandleInterface
> request_handle
,
347 const net::BoundNetLog
& bound_net_log
) {
348 DCHECK(items_
.find(download_id
) == items_
.end());
350 MockDownloadItemImpl
* result
=
351 new StrictMock
<MockDownloadItemImpl
>(&item_delegate_
);
352 EXPECT_CALL(*result
, GetId())
353 .WillRepeatedly(Return(download_id
));
354 items_
[download_id
] = result
;
359 class MockDownloadFileFactory
360 : public DownloadFileFactory
,
361 public base::SupportsWeakPtr
<MockDownloadFileFactory
> {
363 MockDownloadFileFactory() {}
364 virtual ~MockDownloadFileFactory() {}
366 // Overridden method from DownloadFileFactory
367 MOCK_METHOD8(MockCreateFile
, MockDownloadFile
*(
368 const DownloadSaveInfo
&,
369 const base::FilePath
&,
370 const GURL
&, const GURL
&, bool,
372 const net::BoundNetLog
&,
373 base::WeakPtr
<DownloadDestinationObserver
>));
375 virtual DownloadFile
* CreateFile(
376 scoped_ptr
<DownloadSaveInfo
> save_info
,
377 const base::FilePath
& default_download_directory
,
379 const GURL
& referrer_url
,
381 scoped_ptr
<ByteStreamReader
> stream
,
382 const net::BoundNetLog
& bound_net_log
,
383 base::WeakPtr
<DownloadDestinationObserver
> observer
) {
384 return MockCreateFile(*save_info
.get(), default_download_directory
, url
,
385 referrer_url
, calculate_hash
,
386 stream
.get(), bound_net_log
, observer
);
390 class MockBrowserContext
: public BrowserContext
{
392 MockBrowserContext() {}
393 ~MockBrowserContext() {}
395 MOCK_CONST_METHOD0(GetPath
, base::FilePath());
396 MOCK_CONST_METHOD0(IsOffTheRecord
, bool());
397 MOCK_METHOD0(GetRequestContext
, net::URLRequestContextGetter
*());
398 MOCK_METHOD1(GetRequestContextForRenderProcess
,
399 net::URLRequestContextGetter
*(int renderer_child_id
));
400 MOCK_METHOD0(GetMediaRequestContext
,
401 net::URLRequestContextGetter
*());
402 MOCK_METHOD1(GetMediaRequestContextForRenderProcess
,
403 net::URLRequestContextGetter
*(int renderer_child_id
));
404 MOCK_METHOD2(GetMediaRequestContextForStoragePartition
,
405 net::URLRequestContextGetter
*(
406 const base::FilePath
& partition_path
, bool in_memory
));
407 MOCK_METHOD5(RequestMIDISysExPermission
,
408 void(int render_process_id
,
411 const GURL
& requesting_frame
,
412 const MIDISysExPermissionCallback
& callback
));
413 MOCK_METHOD4(CancelMIDISysExPermissionRequest
,
414 void(int render_process_id
,
417 const GURL
& requesting_frame
));
418 MOCK_METHOD6(RequestProtectedMediaIdentifierPermission
,
419 void(int render_process_id
,
423 const GURL
& requesting_frame
,
424 const ProtectedMediaIdentifierPermissionCallback
&
426 MOCK_METHOD1(CancelProtectedMediaIdentifierPermissionRequests
,
428 MOCK_METHOD0(GetResourceContext
, ResourceContext
*());
429 MOCK_METHOD0(GetDownloadManagerDelegate
, DownloadManagerDelegate
*());
430 MOCK_METHOD0(GetGeolocationPermissionContext
,
431 GeolocationPermissionContext
* ());
432 MOCK_METHOD0(GetSpecialStoragePolicy
, quota::SpecialStoragePolicy
*());
435 class MockDownloadManagerObserver
: public DownloadManager::Observer
{
437 MockDownloadManagerObserver() {}
438 ~MockDownloadManagerObserver() {}
439 MOCK_METHOD2(OnDownloadCreated
, void(
440 DownloadManager
*, DownloadItem
*));
441 MOCK_METHOD1(ManagerGoingDown
, void(DownloadManager
*));
442 MOCK_METHOD2(SelectFileDialogDisplayed
, void(
443 DownloadManager
*, int32
));
448 class DownloadManagerTest
: public testing::Test
{
450 static const char* kTestData
;
451 static const size_t kTestDataLen
;
453 DownloadManagerTest()
454 : callback_called_(false),
455 ui_thread_(BrowserThread::UI
, &message_loop_
),
456 file_thread_(BrowserThread::FILE, &message_loop_
),
457 next_download_id_(0) {
460 // We tear down everything in TearDown().
461 virtual ~DownloadManagerTest() {}
463 // Create a MockDownloadItemFactory and MockDownloadManagerDelegate,
464 // then create a DownloadManager that points
466 virtual void SetUp() {
467 DCHECK(!download_manager_
);
469 mock_download_item_factory_
= (new MockDownloadItemFactory())->AsWeakPtr();
470 mock_download_file_factory_
= (new MockDownloadFileFactory())->AsWeakPtr();
471 mock_download_manager_delegate_
.reset(
472 new StrictMock
<MockDownloadManagerDelegate
>);
473 EXPECT_CALL(*mock_download_manager_delegate_
.get(), Shutdown())
475 mock_browser_context_
.reset(new StrictMock
<MockBrowserContext
>);
476 EXPECT_CALL(*mock_browser_context_
.get(), IsOffTheRecord())
477 .WillRepeatedly(Return(false));
479 download_manager_
.reset(new DownloadManagerImpl(
480 NULL
, mock_browser_context_
.get()));
481 download_manager_
->SetDownloadItemFactoryForTesting(
482 scoped_ptr
<DownloadItemFactory
>(
483 mock_download_item_factory_
.get()).Pass());
484 download_manager_
->SetDownloadFileFactoryForTesting(
485 scoped_ptr
<DownloadFileFactory
>(
486 mock_download_file_factory_
.get()).Pass());
487 observer_
.reset(new MockDownloadManagerObserver());
488 download_manager_
->AddObserver(observer_
.get());
489 download_manager_
->SetDelegate(mock_download_manager_delegate_
.get());
492 virtual void TearDown() {
493 while (MockDownloadItemImpl
*
494 item
= mock_download_item_factory_
->PopItem()) {
495 EXPECT_CALL(*item
, GetState())
496 .WillOnce(Return(DownloadItem::CANCELLED
));
498 EXPECT_CALL(GetMockObserver(), ManagerGoingDown(download_manager_
.get()))
501 download_manager_
->Shutdown();
502 download_manager_
.reset();
503 message_loop_
.RunUntilIdle();
504 ASSERT_EQ(NULL
, mock_download_item_factory_
.get());
505 ASSERT_EQ(NULL
, mock_download_file_factory_
.get());
506 message_loop_
.RunUntilIdle();
507 mock_download_manager_delegate_
.reset();
508 mock_browser_context_
.reset();
511 // Returns download id.
512 MockDownloadItemImpl
& AddItemToManager() {
513 DownloadCreateInfo info
;
515 // Args are ignored except for download id, so everything else can be
517 uint32 id
= next_download_id_
;
519 info
.request_handle
= DownloadRequestHandle();
520 download_manager_
->CreateActiveItem(id
, info
);
521 DCHECK(mock_download_item_factory_
->GetItem(id
));
522 MockDownloadItemImpl
& item(*mock_download_item_factory_
->GetItem(id
));
523 // Satisfy expectation. If the item is created in StartDownload(),
524 // we call Start on it immediately, so we need to set that expectation
526 scoped_ptr
<DownloadRequestHandleInterface
> req_handle
;
527 item
.Start(scoped_ptr
<DownloadFile
>(), req_handle
.Pass());
532 MockDownloadItemImpl
& GetMockDownloadItem(int id
) {
533 MockDownloadItemImpl
* itemp
= mock_download_item_factory_
->GetItem(id
);
539 void RemoveMockDownloadItem(int id
) {
540 // Owned by DownloadManager; should be deleted there.
541 mock_download_item_factory_
->RemoveItem(id
);
544 MockDownloadManagerDelegate
& GetMockDownloadManagerDelegate() {
545 return *mock_download_manager_delegate_
;
548 MockDownloadManagerObserver
& GetMockObserver() {
552 void DownloadTargetDeterminedCallback(
553 const base::FilePath
& target_path
,
554 DownloadItem::TargetDisposition disposition
,
555 DownloadDangerType danger_type
,
556 const base::FilePath
& intermediate_path
) {
557 callback_called_
= true;
558 target_path_
= target_path
;
559 target_disposition_
= disposition
;
560 danger_type_
= danger_type
;
561 intermediate_path_
= intermediate_path
;
564 void DetermineDownloadTarget(DownloadItemImpl
* item
) {
565 download_manager_
->DetermineDownloadTarget(
567 &DownloadManagerTest::DownloadTargetDeterminedCallback
,
568 base::Unretained(this)));
572 // Key test variable; we'll keep it available to sub-classes.
573 scoped_ptr
<DownloadManagerImpl
> download_manager_
;
574 base::WeakPtr
<MockDownloadFileFactory
> mock_download_file_factory_
;
576 // Target detetermined callback.
577 bool callback_called_
;
578 base::FilePath target_path_
;
579 DownloadItem::TargetDisposition target_disposition_
;
580 DownloadDangerType danger_type_
;
581 base::FilePath intermediate_path_
;
584 base::MessageLoopForUI message_loop_
;
585 TestBrowserThread ui_thread_
;
586 TestBrowserThread file_thread_
;
587 base::WeakPtr
<MockDownloadItemFactory
> mock_download_item_factory_
;
588 scoped_ptr
<MockDownloadManagerDelegate
> mock_download_manager_delegate_
;
589 scoped_ptr
<MockBrowserContext
> mock_browser_context_
;
590 scoped_ptr
<MockDownloadManagerObserver
> observer_
;
591 uint32 next_download_id_
;
593 DISALLOW_COPY_AND_ASSIGN(DownloadManagerTest
);
596 // Confirm the appropriate invocations occur when you start a download.
597 TEST_F(DownloadManagerTest
, StartDownload
) {
598 scoped_ptr
<DownloadCreateInfo
> info(new DownloadCreateInfo
);
599 scoped_ptr
<ByteStreamReader
> stream
;
600 uint32
local_id(5); // Random value
601 base::FilePath
download_path(FILE_PATH_LITERAL("download/path"));
603 EXPECT_FALSE(download_manager_
->GetDownload(local_id
));
605 EXPECT_CALL(GetMockObserver(), OnDownloadCreated(download_manager_
.get(), _
))
607 EXPECT_CALL(GetMockDownloadManagerDelegate(), GetNextId(_
))
608 .WillOnce(RunCallback
<0>(local_id
));
610 // Doing nothing will set the default download directory to null.
611 EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_
, _
, _
, _
));
612 EXPECT_CALL(GetMockDownloadManagerDelegate(), GenerateFileHash())
613 .WillOnce(Return(true));
614 EXPECT_CALL(GetMockDownloadManagerDelegate(),
615 ApplicationClientIdForFileScanning())
616 .WillRepeatedly(Return("client-id"));
617 MockDownloadFile
* mock_file
= new MockDownloadFile
;
618 EXPECT_CALL(*mock_file
, SetClientGuid("client-id"));
619 EXPECT_CALL(*mock_download_file_factory_
.get(),
620 MockCreateFile(Ref(*info
->save_info
.get()), _
, _
, _
, true,
622 .WillOnce(Return(mock_file
));
624 download_manager_
->StartDownload(
625 info
.Pass(), stream
.Pass(), DownloadUrlParameters::OnStartedCallback());
626 EXPECT_TRUE(download_manager_
->GetDownload(local_id
));
629 // Confirm that calling DetermineDownloadTarget behaves properly if the delegate
631 TEST_F(DownloadManagerTest
, DetermineDownloadTarget_True
) {
632 // Put a mock we have a handle to on the download manager.
633 MockDownloadItemImpl
& item(AddItemToManager());
634 EXPECT_CALL(item
, GetState())
635 .WillRepeatedly(Return(DownloadItem::IN_PROGRESS
));
637 EXPECT_CALL(GetMockDownloadManagerDelegate(),
638 DetermineDownloadTarget(&item
, _
))
639 .WillOnce(Return(true));
640 DetermineDownloadTarget(&item
);
643 // Confirm that calling DetermineDownloadTarget behaves properly if the delegate
644 // allows starting. This also tests OnDownloadTargetDetermined.
645 TEST_F(DownloadManagerTest
, DetermineDownloadTarget_False
) {
646 // Put a mock we have a handle to on the download manager.
647 MockDownloadItemImpl
& item(AddItemToManager());
649 base::FilePath
path(FILE_PATH_LITERAL("random_filepath.txt"));
650 EXPECT_CALL(GetMockDownloadManagerDelegate(),
651 DetermineDownloadTarget(&item
, _
))
652 .WillOnce(Return(false));
653 EXPECT_CALL(item
, GetForcedFilePath())
654 .WillOnce(ReturnRef(path
));
656 // Confirm that the callback was called with the right values in this case.
657 callback_called_
= false;
658 DetermineDownloadTarget(&item
);
659 EXPECT_TRUE(callback_called_
);
660 EXPECT_EQ(path
, target_path_
);
661 EXPECT_EQ(DownloadItem::TARGET_DISPOSITION_OVERWRITE
, target_disposition_
);
662 EXPECT_EQ(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS
, danger_type_
);
663 EXPECT_EQ(path
, intermediate_path_
);
666 // Confirm the DownloadManagerImpl::RemoveAllDownloads() functionality
667 TEST_F(DownloadManagerTest
, RemoveAllDownloads
) {
668 base::Time
now(base::Time::Now());
669 for (uint32 i
= 0; i
< 4; ++i
) {
670 MockDownloadItemImpl
& item(AddItemToManager());
671 EXPECT_EQ(i
, item
.GetId());
672 EXPECT_CALL(item
, GetStartTime())
673 .WillRepeatedly(Return(now
));
676 // Specify states for each.
677 EXPECT_CALL(GetMockDownloadItem(0), GetState())
678 .WillRepeatedly(Return(DownloadItem::COMPLETE
));
679 EXPECT_CALL(GetMockDownloadItem(1), GetState())
680 .WillRepeatedly(Return(DownloadItem::CANCELLED
));
681 EXPECT_CALL(GetMockDownloadItem(2), GetState())
682 .WillRepeatedly(Return(DownloadItem::INTERRUPTED
));
683 EXPECT_CALL(GetMockDownloadItem(3), GetState())
684 .WillRepeatedly(Return(DownloadItem::IN_PROGRESS
));
686 // Expectations for whether or not they'll actually be removed.
687 EXPECT_CALL(GetMockDownloadItem(0), Remove())
689 EXPECT_CALL(GetMockDownloadItem(1), Remove())
691 EXPECT_CALL(GetMockDownloadItem(2), Remove())
693 EXPECT_CALL(GetMockDownloadItem(3), Remove())
696 download_manager_
->RemoveAllDownloads();
697 // Because we're mocking the download item, the Remove call doesn't
698 // result in them being removed from the DownloadManager list.
701 } // namespace content