Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: content/browser/download/download_item_impl_unittest.cc

Issue 148133007: [Downloads] Always call DM::StartDownload() for explicit downloads. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comment updates Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/download/download_item_impl.h" 5 #include "content/browser/download/download_item_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <iterator> 9 #include <iterator>
10 #include <queue> 10 #include <queue>
(...skipping 10 matching lines...) Expand all
21 #include "content/browser/download/download_file_factory.h" 21 #include "content/browser/download/download_file_factory.h"
22 #include "content/browser/download/download_item_impl_delegate.h" 22 #include "content/browser/download/download_item_impl_delegate.h"
23 #include "content/browser/download/download_request_handle.h" 23 #include "content/browser/download/download_request_handle.h"
24 #include "content/browser/download/mock_download_file.h" 24 #include "content/browser/download/mock_download_file.h"
25 #include "content/public/browser/browser_thread.h" 25 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/download_destination_observer.h" 26 #include "content/public/browser/download_destination_observer.h"
27 #include "content/public/browser/download_interrupt_reasons.h" 27 #include "content/public/browser/download_interrupt_reasons.h"
28 #include "content/public/browser/download_url_parameters.h" 28 #include "content/public/browser/download_url_parameters.h"
29 #include "content/public/common/content_features.h" 29 #include "content/public/common/content_features.h"
30 #include "content/public/test/mock_download_item.h" 30 #include "content/public/test/mock_download_item.h"
31 #include "content/public/test/mock_download_item.h"
32 #include "content/public/test/test_browser_context.h"
31 #include "content/public/test/test_browser_context.h" 33 #include "content/public/test/test_browser_context.h"
32 #include "content/public/test/test_browser_thread_bundle.h" 34 #include "content/public/test/test_browser_thread_bundle.h"
35 #include "content/public/test/web_contents_tester.h"
33 #include "testing/gmock/include/gmock/gmock.h" 36 #include "testing/gmock/include/gmock/gmock.h"
34 #include "testing/gtest/include/gtest/gtest.h" 37 #include "testing/gtest/include/gtest/gtest.h"
35 38
36 using ::testing::DoAll; 39 using ::testing::DoAll;
37 using ::testing::NiceMock; 40 using ::testing::NiceMock;
38 using ::testing::Property; 41 using ::testing::Property;
39 using ::testing::Return; 42 using ::testing::Return;
40 using ::testing::SaveArg; 43 using ::testing::SaveArg;
41 using ::testing::StrictMock; 44 using ::testing::StrictMock;
42 using ::testing::WithArg; 45 using ::testing::WithArg;
(...skipping 26 matching lines...) Expand all
69 MOCK_METHOD1(CheckForFileRemoval, void(DownloadItemImpl*)); 72 MOCK_METHOD1(CheckForFileRemoval, void(DownloadItemImpl*));
70 73
71 void ResumeInterruptedDownload(scoped_ptr<DownloadUrlParameters> params, 74 void ResumeInterruptedDownload(scoped_ptr<DownloadUrlParameters> params,
72 uint32_t id) override { 75 uint32_t id) override {
73 MockResumeInterruptedDownload(params.get(), id); 76 MockResumeInterruptedDownload(params.get(), id);
74 } 77 }
75 MOCK_METHOD2(MockResumeInterruptedDownload, 78 MOCK_METHOD2(MockResumeInterruptedDownload,
76 void(DownloadUrlParameters* params, uint32_t id)); 79 void(DownloadUrlParameters* params, uint32_t id));
77 80
78 MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*()); 81 MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*());
79 MOCK_METHOD1(UpdatePersistence, void(DownloadItemImpl*));
80 MOCK_METHOD1(DownloadOpened, void(DownloadItemImpl*)); 82 MOCK_METHOD1(DownloadOpened, void(DownloadItemImpl*));
81 MOCK_METHOD1(DownloadRemoved, void(DownloadItemImpl*)); 83 MOCK_METHOD1(DownloadRemoved, void(DownloadItemImpl*));
82 MOCK_CONST_METHOD1(AssertStateConsistent, void(DownloadItemImpl*)); 84 MOCK_CONST_METHOD1(AssertStateConsistent, void(DownloadItemImpl*));
83 85
84 void VerifyAndClearExpectations() { 86 void VerifyAndClearExpectations() {
85 ::testing::Mock::VerifyAndClearExpectations(this); 87 ::testing::Mock::VerifyAndClearExpectations(this);
86 SetDefaultExpectations(); 88 SetDefaultExpectations();
87 } 89 }
88 90
89 private: 91 private:
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 int resume_count() const { return resume_count_; } 133 int resume_count() const { return resume_count_; }
132 134
133 bool CheckAndResetDownloadUpdated() { 135 bool CheckAndResetDownloadUpdated() {
134 bool was_updated = updated_; 136 bool was_updated = updated_;
135 updated_ = false; 137 updated_ = false;
136 return was_updated; 138 return was_updated;
137 } 139 }
138 140
139 private: 141 private:
140 void OnDownloadRemoved(DownloadItem* download) override { 142 void OnDownloadRemoved(DownloadItem* download) override {
141 DVLOG(20) << " " << __FUNCTION__ 143 SCOPED_TRACE(::testing::Message() << " " << __FUNCTION__ << " download = "
142 << " download = " << download->DebugString(false); 144 << download->DebugString(false));
143 removed_ = true; 145 removed_ = true;
144 } 146 }
145 147
146 void OnDownloadUpdated(DownloadItem* download) override { 148 void OnDownloadUpdated(DownloadItem* download) override {
147 DVLOG(20) << " " << __FUNCTION__ 149 DVLOG(20) << " " << __FUNCTION__
148 << " download = " << download->DebugString(false); 150 << " download = " << download->DebugString(false);
149 updated_ = true; 151 updated_ = true;
150 DownloadItem::DownloadState new_state = download->GetState(); 152 DownloadItem::DownloadState new_state = download->GetState();
151 if (last_state_ == DownloadItem::IN_PROGRESS && 153 if (last_state_ == DownloadItem::IN_PROGRESS &&
152 new_state == DownloadItem::INTERRUPTED) { 154 new_state == DownloadItem::INTERRUPTED) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 } 208 }
207 209
208 ACTION_P(ScheduleClosure, closure) { 210 ACTION_P(ScheduleClosure, closure) {
209 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, closure); 211 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, closure);
210 } 212 }
211 213
212 } // namespace 214 } // namespace
213 215
214 class DownloadItemTest : public testing::Test { 216 class DownloadItemTest : public testing::Test {
215 public: 217 public:
216 DownloadItemTest() { 218 DownloadItemTest()
219 : delegate_(), next_download_id_(DownloadItem::kInvalidId + 1) {
217 base::FeatureList::ClearInstanceForTesting(); 220 base::FeatureList::ClearInstanceForTesting();
218 scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); 221 scoped_ptr<base::FeatureList> feature_list(new base::FeatureList);
219 feature_list->InitializeFromCommandLine(features::kDownloadResumption.name, 222 feature_list->InitializeFromCommandLine(features::kDownloadResumption.name,
220 std::string()); 223 std::string());
221 base::FeatureList::SetInstance(std::move(feature_list)); 224 base::FeatureList::SetInstance(std::move(feature_list));
225
226 create_info_.reset(new DownloadCreateInfo());
227 create_info_->save_info =
228 scoped_ptr<DownloadSaveInfo>(new DownloadSaveInfo());
229 create_info_->save_info->prompt_for_save_location = false;
230 create_info_->url_chain.push_back(GURL("http://example.com/download"));
231 create_info_->etag = "SomethingToSatisfyResumption";
222 } 232 }
223 233
224 ~DownloadItemTest() { 234 ~DownloadItemTest() {
225 RunAllPendingInMessageLoops(); 235 RunAllPendingInMessageLoops();
226 STLDeleteElements(&allocated_downloads_); 236 STLDeleteElements(&allocated_downloads_);
227 } 237 }
228 238
229 DownloadItemImpl* CreateDownloadItemWithCreateInfo( 239 DownloadItemImpl* CreateDownloadItemWithCreateInfo(
230 scoped_ptr<DownloadCreateInfo> info) { 240 scoped_ptr<DownloadCreateInfo> info) {
231 DownloadItemImpl* download = new DownloadItemImpl( 241 DownloadItemImpl* download = new DownloadItemImpl(
232 &delegate_, next_download_id_++, *(info.get()), net::BoundNetLog()); 242 &delegate_, next_download_id_++, *(info.get()), net::BoundNetLog());
233 allocated_downloads_.insert(download); 243 allocated_downloads_.insert(download);
234 return download; 244 return download;
235 } 245 }
236 246
237 // This class keeps ownership of the created download item; it will 247 // This class keeps ownership of the created download item; it will
238 // be torn down at the end of the test unless DestroyDownloadItem is 248 // be torn down at the end of the test unless DestroyDownloadItem is
239 // called. 249 // called.
240 DownloadItemImpl* CreateDownloadItem() { 250 DownloadItemImpl* CreateDownloadItem() {
241 scoped_ptr<DownloadCreateInfo> info; 251 create_info_->download_id = ++next_download_id_;
242 252 DownloadItemImpl* download =
243 info.reset(new DownloadCreateInfo()); 253 new DownloadItemImpl(&delegate_, create_info_->download_id,
244 info->save_info = scoped_ptr<DownloadSaveInfo>(new DownloadSaveInfo()); 254 *create_info_, net::BoundNetLog());
245 info->save_info->prompt_for_save_location = false; 255 allocated_downloads_.insert(download);
246 info->url_chain.push_back(GURL("http://example.com/download")); 256 return download;
247 info->etag = "SomethingToSatisfyResumption";
248
249 return CreateDownloadItemWithCreateInfo(std::move(info));
250 } 257 }
251 258
252 // Add DownloadFile to DownloadItem 259 // Add DownloadFile to DownloadItem. Set |callback| to nullptr if a download
260 // target determination is not expected.
253 MockDownloadFile* CallDownloadItemStart( 261 MockDownloadFile* CallDownloadItemStart(
254 DownloadItemImpl* item, 262 DownloadItemImpl* item,
255 DownloadItemImplDelegate::DownloadTargetCallback* callback) { 263 DownloadItemImplDelegate::DownloadTargetCallback* callback) {
256 MockDownloadFile* mock_download_file(new StrictMock<MockDownloadFile>); 264 MockDownloadFile* mock_download_file = nullptr;
257 scoped_ptr<DownloadFile> download_file(mock_download_file); 265 scoped_ptr<DownloadFile> download_file;
258 EXPECT_CALL(*mock_download_file, Initialize(_));
259 if (callback) { 266 if (callback) {
260 // Save the callback.
261 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) 267 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
262 .WillOnce(SaveArg<1>(callback)); 268 .WillOnce(SaveArg<1>(callback));
263 } else { 269 } else {
264 // Drop it on the floor. 270 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)).Times(0);
265 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _));
266 } 271 }
267 272
268 scoped_ptr<DownloadRequestHandleInterface> request_handle( 273 // Only create a DownloadFile if the request was successful.
274 if (create_info_->result == DOWNLOAD_INTERRUPT_REASON_NONE) {
275 mock_download_file = new StrictMock<MockDownloadFile>;
276 download_file.reset(mock_download_file);
277 EXPECT_CALL(*mock_download_file, Initialize(_))
278 .WillOnce(ScheduleCallbackWithParam(DOWNLOAD_INTERRUPT_REASON_NONE));
279 EXPECT_CALL(*mock_download_file, FullPath())
280 .WillRepeatedly(Return(base::FilePath()));
281 }
282
283 scoped_ptr<MockRequestHandle> request_handle(
269 new NiceMock<MockRequestHandle>); 284 new NiceMock<MockRequestHandle>);
270 item->Start(std::move(download_file), std::move(request_handle)); 285 item->Start(std::move(download_file), std::move(request_handle),
286 *create_info_);
271 RunAllPendingInMessageLoops(); 287 RunAllPendingInMessageLoops();
272 288
273 // So that we don't have a function writing to a stack variable 289 // So that we don't have a function writing to a stack variable
274 // lying around if the above failed. 290 // lying around if the above failed.
275 mock_delegate()->VerifyAndClearExpectations(); 291 mock_delegate()->VerifyAndClearExpectations();
276 EXPECT_CALL(*mock_delegate(), AssertStateConsistent(_)) 292 EXPECT_CALL(*mock_delegate(), AssertStateConsistent(_))
277 .WillRepeatedly(Return()); 293 .WillRepeatedly(Return());
278 EXPECT_CALL(*mock_delegate(), ShouldOpenFileBasedOnExtension(_)) 294 EXPECT_CALL(*mock_delegate(), ShouldOpenFileBasedOnExtension(_))
279 .WillRepeatedly(Return(false)); 295 .WillRepeatedly(Return(false));
280 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(_, _)) 296 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(_, _))
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 360
345 MockDelegate* mock_delegate() { 361 MockDelegate* mock_delegate() {
346 return &delegate_; 362 return &delegate_;
347 } 363 }
348 364
349 void OnDownloadFileAcquired(base::FilePath* return_path, 365 void OnDownloadFileAcquired(base::FilePath* return_path,
350 const base::FilePath& path) { 366 const base::FilePath& path) {
351 *return_path = path; 367 *return_path = path;
352 } 368 }
353 369
370 DownloadCreateInfo* create_info() { return create_info_.get(); }
371
372 BrowserContext* browser_context() { return &browser_context_; }
373
354 private: 374 private:
355 int next_download_id_ = DownloadItem::kInvalidId + 1;
356 StrictMock<MockDelegate> delegate_; 375 StrictMock<MockDelegate> delegate_;
357 std::set<DownloadItem*> allocated_downloads_; 376 std::set<DownloadItem*> allocated_downloads_;
377 scoped_ptr<DownloadCreateInfo> create_info_;
378 uint32_t next_download_id_ = DownloadItem::kInvalidId + 1;
379 TestBrowserContext browser_context_;
358 TestBrowserThreadBundle thread_bundle_; 380 TestBrowserThreadBundle thread_bundle_;
359 }; 381 };
360 382
361 // Tests to ensure calls that change a DownloadItem generate an update to 383 // Tests to ensure calls that change a DownloadItem generate an update to
362 // observers. 384 // observers.
363 // State changing functions not tested: 385 // State changing functions not tested:
364 // void OpenDownload(); 386 // void OpenDownload();
365 // void ShowDownloadInShell(); 387 // void ShowDownloadInShell();
366 // void CompleteDelayedDownload(); 388 // void CompleteDelayedDownload();
367 // set_* mutators 389 // set_* mutators
368 390
369 TEST_F(DownloadItemTest, NotificationAfterUpdate) { 391 TEST_F(DownloadItemTest, NotificationAfterUpdate) {
370 DownloadItemImpl* item = CreateDownloadItem(); 392 DownloadItemImpl* item = CreateDownloadItem();
371 MockDownloadFile* file = 393 MockDownloadFile* file =
372 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); 394 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
373 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 395 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
374 TestDownloadItemObserver observer(item); 396 TestDownloadItemObserver observer(item);
375 397
376 item->DestinationUpdate(kDownloadChunkSize, kDownloadSpeed, std::string()); 398 item->DestinationUpdate(kDownloadChunkSize, kDownloadSpeed, std::string());
377 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); 399 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
378 EXPECT_EQ(kDownloadSpeed, item->CurrentSpeed()); 400 EXPECT_EQ(kDownloadSpeed, item->CurrentSpeed());
379 CleanupItem(item, file, DownloadItem::IN_PROGRESS); 401 CleanupItem(item, file, DownloadItem::IN_PROGRESS);
380 } 402 }
381 403
382 TEST_F(DownloadItemTest, NotificationAfterCancel) { 404 TEST_F(DownloadItemTest, NotificationAfterCancel) {
383 DownloadItemImpl* user_cancel = CreateDownloadItem(); 405 DownloadItemImpl* user_cancel = CreateDownloadItem();
384 MockDownloadFile* download_file = CallDownloadItemStart(user_cancel, nullptr); 406 DownloadItemImplDelegate::DownloadTargetCallback target_callback;
407 MockDownloadFile* download_file =
408 CallDownloadItemStart(user_cancel, &target_callback);
385 EXPECT_CALL(*download_file, Cancel()); 409 EXPECT_CALL(*download_file, Cancel());
410
386 TestDownloadItemObserver observer1(user_cancel); 411 TestDownloadItemObserver observer1(user_cancel);
387
388 user_cancel->Cancel(true); 412 user_cancel->Cancel(true);
389 ASSERT_TRUE(observer1.CheckAndResetDownloadUpdated()); 413 ASSERT_TRUE(observer1.CheckAndResetDownloadUpdated());
390 414
391 DownloadItemImpl* system_cancel = CreateDownloadItem(); 415 DownloadItemImpl* system_cancel = CreateDownloadItem();
392 download_file = CallDownloadItemStart(system_cancel, nullptr); 416 download_file = CallDownloadItemStart(system_cancel, &target_callback);
393 EXPECT_CALL(*download_file, Cancel()); 417 EXPECT_CALL(*download_file, Cancel());
418
394 TestDownloadItemObserver observer2(system_cancel); 419 TestDownloadItemObserver observer2(system_cancel);
395
396 system_cancel->Cancel(false); 420 system_cancel->Cancel(false);
397 ASSERT_TRUE(observer2.CheckAndResetDownloadUpdated()); 421 ASSERT_TRUE(observer2.CheckAndResetDownloadUpdated());
398 } 422 }
399 423
400 TEST_F(DownloadItemTest, NotificationAfterComplete) { 424 TEST_F(DownloadItemTest, NotificationAfterComplete) {
401 DownloadItemImpl* item = CreateDownloadItem(); 425 DownloadItemImpl* item = CreateDownloadItem();
402 TestDownloadItemObserver observer(item); 426 TestDownloadItemObserver observer(item);
403 MockDownloadFile* download_file = 427 MockDownloadFile* download_file =
404 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); 428 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
405 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); 429 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
(...skipping 25 matching lines...) Expand all
431 } 455 }
432 456
433 TEST_F(DownloadItemTest, NotificationAfterDestroyed) { 457 TEST_F(DownloadItemTest, NotificationAfterDestroyed) {
434 DownloadItemImpl* item = CreateDownloadItem(); 458 DownloadItemImpl* item = CreateDownloadItem();
435 TestDownloadItemObserver observer(item); 459 TestDownloadItemObserver observer(item);
436 460
437 DestroyDownloadItem(item); 461 DestroyDownloadItem(item);
438 ASSERT_TRUE(observer.download_destroyed()); 462 ASSERT_TRUE(observer.download_destroyed());
439 } 463 }
440 464
465 // Test that a download is resumed automatcially after a continuable interrupt.
441 TEST_F(DownloadItemTest, ContinueAfterInterrupted) { 466 TEST_F(DownloadItemTest, ContinueAfterInterrupted) {
442 TestBrowserContext test_browser_context;
443 DownloadItemImpl* item = CreateDownloadItem(); 467 DownloadItemImpl* item = CreateDownloadItem();
444 TestDownloadItemObserver observer(item); 468 TestDownloadItemObserver observer(item);
445 MockDownloadFile* download_file = 469 MockDownloadFile* download_file =
446 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); 470 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
447 471
448 // Interrupt the download, using a continuable interrupt. 472 // Interrupt the download, using a continuable interrupt.
449 EXPECT_CALL(*download_file, FullPath()) 473 EXPECT_CALL(*download_file, FullPath())
450 .WillOnce(Return(base::FilePath())); 474 .WillOnce(Return(base::FilePath()));
451 EXPECT_CALL(*download_file, Detach()); 475 EXPECT_CALL(*download_file, Detach());
452 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) 476 EXPECT_CALL(*mock_delegate(), GetBrowserContext())
453 .WillRepeatedly(Return(&test_browser_context)); 477 .WillRepeatedly(Return(browser_context()));
454 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)).Times(1); 478 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)).Times(1);
455 item->DestinationObserverAsWeakPtr()->DestinationError( 479 item->DestinationObserverAsWeakPtr()->DestinationError(
456 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); 480 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR);
457 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); 481 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
458 // Since the download is resumed automatically, the interrupt count doesn't 482 // Since the download is resumed automatically, the interrupt count doesn't
459 // increase. 483 // increase.
460 ASSERT_EQ(0, observer.interrupt_count()); 484 ASSERT_EQ(0, observer.interrupt_count());
461 485
462 // Test expectations verify that ResumeInterruptedDownload() is called (by way 486 // Test expectations verify that ResumeInterruptedDownload() is called (by way
463 // of MockResumeInterruptedDownload) after the download is interrupted. But 487 // of MockResumeInterruptedDownload) after the download is interrupted. But
464 // the mock doesn't follow through with the resumption. 488 // the mock doesn't follow through with the resumption.
465 // ResumeInterruptedDownload() being called is sufficient for verifying that 489 // ResumeInterruptedDownload() being called is sufficient for verifying that
466 // the automatic resumption was triggered. 490 // the automatic resumption was triggered.
467 RunAllPendingInMessageLoops(); 491 RunAllPendingInMessageLoops();
468 492
469 // The download item is currently in RESUMING_INTERNAL state, which maps to 493 // The download item is currently in RESUMING_INTERNAL state, which maps to
470 // IN_PROGRESS. 494 // IN_PROGRESS.
471 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); 495 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS);
472 } 496 }
473 497
474 // Same as above, but with a non-continuable interrupt. 498 // Test that automatic resumption doesn't happen after a non-continuable
499 // interrupt.
475 TEST_F(DownloadItemTest, RestartAfterInterrupted) { 500 TEST_F(DownloadItemTest, RestartAfterInterrupted) {
476 DownloadItemImpl* item = CreateDownloadItem(); 501 DownloadItemImpl* item = CreateDownloadItem();
477 TestDownloadItemObserver observer(item); 502 TestDownloadItemObserver observer(item);
478 MockDownloadFile* download_file = 503 MockDownloadFile* download_file =
479 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); 504 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
480 505
481 // Interrupt the download, using a restartable interrupt. 506 // Interrupt the download, using a restartable interrupt.
482 EXPECT_CALL(*download_file, Cancel()); 507 EXPECT_CALL(*download_file, Cancel());
483 item->DestinationObserverAsWeakPtr()->DestinationError( 508 item->DestinationObserverAsWeakPtr()->DestinationError(
484 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); 509 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED);
(...skipping 28 matching lines...) Expand all
513 538
514 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); 539 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
515 // Should not try to auto-resume. 540 // Should not try to auto-resume.
516 ASSERT_EQ(1, observer.interrupt_count()); 541 ASSERT_EQ(1, observer.interrupt_count());
517 ASSERT_EQ(0, observer.resume_count()); 542 ASSERT_EQ(0, observer.resume_count());
518 543
519 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); 544 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED);
520 } 545 }
521 546
522 TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) { 547 TEST_F(DownloadItemTest, LimitRestartsAfterInterrupted) {
523 TestBrowserContext test_browser_context;
524 DownloadItemImpl* item = CreateDownloadItem(); 548 DownloadItemImpl* item = CreateDownloadItem();
525 base::WeakPtr<DownloadDestinationObserver> as_observer( 549 base::WeakPtr<DownloadDestinationObserver> as_observer(
526 item->DestinationObserverAsWeakPtr()); 550 item->DestinationObserverAsWeakPtr());
527 TestDownloadItemObserver observer(item); 551 TestDownloadItemObserver observer(item);
528 MockDownloadFile* mock_download_file(nullptr); 552 MockDownloadFile* mock_download_file(nullptr);
529 scoped_ptr<DownloadFile> download_file; 553 scoped_ptr<DownloadFile> download_file;
530 MockRequestHandle* mock_request_handle(nullptr); 554 MockRequestHandle* mock_request_handle(nullptr);
531 scoped_ptr<DownloadRequestHandleInterface> request_handle; 555 scoped_ptr<DownloadRequestHandleInterface> request_handle;
532 DownloadItemImplDelegate::DownloadTargetCallback callback; 556 DownloadItemImplDelegate::DownloadTargetCallback callback;
533 557
534 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)) 558 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
535 .WillRepeatedly(SaveArg<1>(&callback)); 559 .WillRepeatedly(SaveArg<1>(&callback));
536 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) 560 EXPECT_CALL(*mock_delegate(), GetBrowserContext())
537 .WillRepeatedly(Return(&test_browser_context)); 561 .WillRepeatedly(Return(browser_context()));
538 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)) 562 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _))
539 .Times(DownloadItemImpl::kMaxAutoResumeAttempts); 563 .Times(DownloadItemImpl::kMaxAutoResumeAttempts);
540 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { 564 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) {
541 DVLOG(20) << "Loop iteration " << i; 565 SCOPED_TRACE(::testing::Message() << "Iteration " << i);
542 566
543 mock_download_file = new NiceMock<MockDownloadFile>; 567 mock_download_file = new NiceMock<MockDownloadFile>;
544 download_file.reset(mock_download_file); 568 download_file.reset(mock_download_file);
545 mock_request_handle = new NiceMock<MockRequestHandle>; 569 mock_request_handle = new NiceMock<MockRequestHandle>;
546 request_handle.reset(mock_request_handle); 570 request_handle.reset(mock_request_handle);
547 571
548 ON_CALL(*mock_download_file, FullPath()) 572 ON_CALL(*mock_download_file, FullPath())
549 .WillByDefault(Return(base::FilePath())); 573 .WillByDefault(Return(base::FilePath()));
550 574
551 // Copied key parts of DoIntermediateRename & CallDownloadItemStart 575 // Copied key parts of DoIntermediateRename & CallDownloadItemStart
552 // to allow for holding onto the request handle. 576 // to allow for holding onto the request handle.
553 item->Start(std::move(download_file), std::move(request_handle)); 577 item->Start(std::move(download_file), std::move(request_handle),
578 *create_info());
554 RunAllPendingInMessageLoops(); 579 RunAllPendingInMessageLoops();
555 580
556 base::FilePath target_path(kDummyTargetPath); 581 base::FilePath target_path(kDummyTargetPath);
557 base::FilePath intermediate_path(kDummyIntermediatePath); 582 base::FilePath intermediate_path(kDummyIntermediatePath);
558 if (i == 0) { 583 if (i == 0) {
559 // RenameAndUniquify is only called the first time. In all the subsequent 584 // RenameAndUniquify is only called the first time. In all the subsequent
560 // iterations, the intermediate file already has the correct name, hence 585 // iterations, the intermediate file already has the correct name, hence
561 // no rename is necessary. 586 // no rename is necessary.
562 EXPECT_CALL(*mock_download_file, RenameAndUniquify(intermediate_path, _)) 587 EXPECT_CALL(*mock_download_file, RenameAndUniquify(intermediate_path, _))
563 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, 588 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE,
564 intermediate_path)); 589 intermediate_path));
565 } 590 }
566 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, 591 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE,
567 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); 592 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path);
568 RunAllPendingInMessageLoops(); 593 RunAllPendingInMessageLoops();
569 594
570 // Use a continuable interrupt. 595 // Use a continuable interrupt.
571 item->DestinationObserverAsWeakPtr()->DestinationError( 596 item->DestinationObserverAsWeakPtr()->DestinationError(
572 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); 597 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR);
573 598
599 RunAllPendingInMessageLoops();
574 ::testing::Mock::VerifyAndClearExpectations(mock_download_file); 600 ::testing::Mock::VerifyAndClearExpectations(mock_download_file);
575 } 601 }
576 602
577 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); 603 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState());
578 EXPECT_EQ(1, observer.interrupt_count()); 604 EXPECT_EQ(1, observer.interrupt_count());
579 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); 605 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED);
580 } 606 }
581 607
608 // If the download attempts to resume and the resumption request fails, the
609 // subsequent Start() call shouldn't update the origin state (URL redirect
610 // chains, Content-Disposition, download URL, etc..)
611 TEST_F(DownloadItemTest, FailedResumptionDoesntUpdateOriginState) {
612 const char kContentDisposition[] = "attachment; filename=foo";
613 const char kFirstETag[] = "ABC";
614 const char kFirstLastModified[] = "Yesterday";
615 const char kFirstURL[] = "http://www.example.com/download";
616 create_info()->content_disposition = kContentDisposition;
617 create_info()->etag = kFirstETag;
618 create_info()->last_modified = kFirstLastModified;
619 create_info()->url_chain.push_back(GURL(kFirstURL));
620
621 DownloadItemImpl* item = CreateDownloadItem();
622 MockDownloadFile* download_file =
623 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
624 EXPECT_EQ(kContentDisposition, item->GetContentDisposition());
625 EXPECT_EQ(kFirstETag, item->GetETag());
626 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime());
627 EXPECT_EQ(kFirstURL, item->GetURL().spec());
628
629 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _));
630 EXPECT_CALL(*mock_delegate(), GetBrowserContext())
631 .WillRepeatedly(Return(browser_context()));
632 EXPECT_CALL(*download_file, Detach());
633 item->DestinationObserverAsWeakPtr()->DestinationError(
634 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR);
635 RunAllPendingInMessageLoops();
636 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
637
638 // Now change the create info. The changes should not cause the DownloadItem
639 // to be updated.
640 const char kSecondContentDisposition[] = "attachment; filename=bar";
641 const char kSecondETag[] = "123";
642 const char kSecondLastModified[] = "Today";
643 const char kSecondURL[] = "http://example.com/another-download";
644 create_info()->content_disposition = kSecondContentDisposition;
645 create_info()->etag = kSecondETag;
646 create_info()->last_modified = kSecondLastModified;
647 create_info()->url_chain.clear();
648 create_info()->url_chain.push_back(GURL(kSecondURL));
649 create_info()->result = DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED;
650
651 // The following ends up calling DownloadItem::Start(), but shouldn't result
652 // in an origin update.
653 download_file = CallDownloadItemStart(item, nullptr);
654
655 EXPECT_EQ(kContentDisposition, item->GetContentDisposition());
656 EXPECT_EQ(kFirstETag, item->GetETag());
657 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime());
658 EXPECT_EQ(kFirstURL, item->GetURL().spec());
659 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState());
660 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason());
661 }
662
582 // Test that resumption uses the final URL in a URL chain when resuming. 663 // Test that resumption uses the final URL in a URL chain when resuming.
583 TEST_F(DownloadItemTest, ResumeUsingFinalURL) { 664 TEST_F(DownloadItemTest, ResumeUsingFinalURL) {
584 TestBrowserContext test_browser_context; 665 create_info()->save_info->prompt_for_save_location = false;
585 scoped_ptr<DownloadCreateInfo> create_info(new DownloadCreateInfo); 666 create_info()->url_chain.clear();
586 create_info->save_info = scoped_ptr<DownloadSaveInfo>(new DownloadSaveInfo()); 667 create_info()->url_chain.push_back(GURL("http://example.com/a"));
587 create_info->save_info->prompt_for_save_location = false; 668 create_info()->url_chain.push_back(GURL("http://example.com/b"));
588 create_info->etag = "SomethingToSatisfyResumption"; 669 create_info()->url_chain.push_back(GURL("http://example.com/c"));
589 create_info->url_chain.push_back(GURL("http://example.com/a"));
590 create_info->url_chain.push_back(GURL("http://example.com/b"));
591 create_info->url_chain.push_back(GURL("http://example.com/c"));
592 670
593 DownloadItemImpl* item = 671 DownloadItemImpl* item = CreateDownloadItem();
594 CreateDownloadItemWithCreateInfo(std::move(create_info));
595 TestDownloadItemObserver observer(item); 672 TestDownloadItemObserver observer(item);
596 MockDownloadFile* download_file = 673 MockDownloadFile* download_file =
597 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); 674 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
598 675
599 // Interrupt the download, using a continuable interrupt. 676 // Interrupt the download, using a continuable interrupt.
600 EXPECT_CALL(*download_file, FullPath()).WillOnce(Return(base::FilePath())); 677 EXPECT_CALL(*download_file, FullPath()).WillOnce(Return(base::FilePath()));
601 EXPECT_CALL(*download_file, Detach()); 678 EXPECT_CALL(*download_file, Detach());
602 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) 679 EXPECT_CALL(*mock_delegate(), GetBrowserContext())
603 .WillRepeatedly(Return(&test_browser_context)); 680 .WillRepeatedly(Return(browser_context()));
604 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload( 681 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(
605 Property(&DownloadUrlParameters::url, 682 Property(&DownloadUrlParameters::url,
606 GURL("http://example.com/c")), 683 GURL("http://example.com/c")),
607 _)) 684 _))
608 .Times(1); 685 .Times(1);
609 item->DestinationObserverAsWeakPtr()->DestinationError( 686 item->DestinationObserverAsWeakPtr()->DestinationError(
610 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); 687 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR);
611 688
612 // Test expectations verify that ResumeInterruptedDownload() is called (by way 689 // Test expectations verify that ResumeInterruptedDownload() is called (by way
613 // of MockResumeInterruptedDownload) after the download is interrupted. But 690 // of MockResumeInterruptedDownload) after the download is interrupted. But
614 // the mock doesn't follow through with the resumption. 691 // the mock doesn't follow through with the resumption.
615 // ResumeInterruptedDownload() being called is sufficient for verifying that 692 // ResumeInterruptedDownload() being called is sufficient for verifying that
616 // the resumption was triggered. 693 // the resumption was triggered.
617 RunAllPendingInMessageLoops(); 694 RunAllPendingInMessageLoops();
618 695
619 // The download is currently in RESUMING_INTERNAL, which maps to IN_PROGRESS. 696 // The download is currently in RESUMING_INTERNAL, which maps to IN_PROGRESS.
620 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); 697 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS);
621 } 698 }
622 699
623 TEST_F(DownloadItemTest, NotificationAfterRemove) {
Randy Smith (Not in Mondays) 2016/02/12 22:09:23 Why removed?
asanka 2016/02/12 23:34:47 Whoops. Restored.
624 DownloadItemImpl* item = CreateDownloadItem();
625 MockDownloadFile* download_file = CallDownloadItemStart(item, nullptr);
626 EXPECT_CALL(*download_file, Cancel());
627 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_));
628 TestDownloadItemObserver observer(item);
629
630 item->Remove();
631 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
632 ASSERT_TRUE(observer.download_removed());
633 }
634
635 TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { 700 TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) {
636 // Setting to NOT_DANGEROUS does not trigger a notification. 701 // Setting to NOT_DANGEROUS does not trigger a notification.
637 DownloadItemImpl* safe_item = CreateDownloadItem(); 702 DownloadItemImpl* safe_item = CreateDownloadItem();
638 MockDownloadFile* download_file = 703 MockDownloadFile* download_file =
639 DoIntermediateRename(safe_item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); 704 DoIntermediateRename(safe_item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
640 TestDownloadItemObserver safe_observer(safe_item); 705 TestDownloadItemObserver safe_observer(safe_item);
641 706
642 safe_item->OnAllDataSaved(std::string()); 707 safe_item->OnAllDataSaved(std::string());
643 EXPECT_TRUE(safe_observer.CheckAndResetDownloadUpdated()); 708 EXPECT_TRUE(safe_observer.CheckAndResetDownloadUpdated());
644 safe_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); 709 safe_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 TEST_F(DownloadItemTest, NotificationAfterTogglePause) { 781 TEST_F(DownloadItemTest, NotificationAfterTogglePause) {
717 DownloadItemImpl* item = CreateDownloadItem(); 782 DownloadItemImpl* item = CreateDownloadItem();
718 TestDownloadItemObserver observer(item); 783 TestDownloadItemObserver observer(item);
719 MockDownloadFile* mock_download_file(new MockDownloadFile); 784 MockDownloadFile* mock_download_file(new MockDownloadFile);
720 scoped_ptr<DownloadFile> download_file(mock_download_file); 785 scoped_ptr<DownloadFile> download_file(mock_download_file);
721 scoped_ptr<DownloadRequestHandleInterface> request_handle( 786 scoped_ptr<DownloadRequestHandleInterface> request_handle(
722 new NiceMock<MockRequestHandle>); 787 new NiceMock<MockRequestHandle>);
723 788
724 EXPECT_CALL(*mock_download_file, Initialize(_)); 789 EXPECT_CALL(*mock_download_file, Initialize(_));
725 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _)); 790 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _));
726 item->Start(std::move(download_file), std::move(request_handle)); 791 item->Start(std::move(download_file), std::move(request_handle),
792 *create_info());
727 793
728 item->Pause(); 794 item->Pause();
729 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); 795 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
730 796
731 ASSERT_TRUE(item->IsPaused()); 797 ASSERT_TRUE(item->IsPaused());
732 798
733 item->Resume(); 799 item->Resume();
734 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); 800 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated());
735 801
736 RunAllPendingInMessageLoops(); 802 RunAllPendingInMessageLoops();
(...skipping 26 matching lines...) Expand all
763 829
764 // Test to make sure that Start method calls DF initialize properly. 830 // Test to make sure that Start method calls DF initialize properly.
765 TEST_F(DownloadItemTest, Start) { 831 TEST_F(DownloadItemTest, Start) {
766 MockDownloadFile* mock_download_file(new MockDownloadFile); 832 MockDownloadFile* mock_download_file(new MockDownloadFile);
767 scoped_ptr<DownloadFile> download_file(mock_download_file); 833 scoped_ptr<DownloadFile> download_file(mock_download_file);
768 DownloadItemImpl* item = CreateDownloadItem(); 834 DownloadItemImpl* item = CreateDownloadItem();
769 EXPECT_CALL(*mock_download_file, Initialize(_)); 835 EXPECT_CALL(*mock_download_file, Initialize(_));
770 scoped_ptr<DownloadRequestHandleInterface> request_handle( 836 scoped_ptr<DownloadRequestHandleInterface> request_handle(
771 new NiceMock<MockRequestHandle>); 837 new NiceMock<MockRequestHandle>);
772 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)); 838 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _));
773 item->Start(std::move(download_file), std::move(request_handle)); 839 item->Start(std::move(download_file), std::move(request_handle),
840 *create_info());
774 RunAllPendingInMessageLoops(); 841 RunAllPendingInMessageLoops();
775 842
776 CleanupItem(item, mock_download_file, DownloadItem::IN_PROGRESS); 843 CleanupItem(item, mock_download_file, DownloadItem::IN_PROGRESS);
777 } 844 }
778 845
779 // Download file and the request should be cancelled as a result of download 846 // Download file and the request should be cancelled as a result of download
780 // file initialization failing. 847 // file initialization failing.
781 TEST_F(DownloadItemTest, InitDownloadFileFails) { 848 TEST_F(DownloadItemTest, InitDownloadFileFails) {
849 DownloadItemImpl* item = CreateDownloadItem();
782 scoped_ptr<MockDownloadFile> file(new MockDownloadFile()); 850 scoped_ptr<MockDownloadFile> file(new MockDownloadFile());
783 scoped_ptr<MockRequestHandle> request_handle(new MockRequestHandle()); 851 scoped_ptr<MockRequestHandle> request_handle(new MockRequestHandle());
784 EXPECT_CALL(*file, Cancel()); 852 EXPECT_CALL(*file, Cancel());
785 EXPECT_CALL(*request_handle, CancelRequest()); 853 EXPECT_CALL(*request_handle, CancelRequest());
786 EXPECT_CALL(*file, Initialize(_)) 854 EXPECT_CALL(*file, Initialize(_))
787 .WillOnce(ScheduleCallbackWithParam( 855 .WillOnce(ScheduleCallbackWithParam(
788 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED)); 856 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED));
789 857
790 DownloadItemImpl* item = CreateDownloadItem(); 858 base::RunLoop start_download_loop;
791 item->Start(std::move(file), std::move(request_handle)); 859 DownloadItemImplDelegate::DownloadTargetCallback download_target_callback;
860 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
861 .WillOnce(DoAll(SaveArg<1>(&download_target_callback),
862 ScheduleClosure(start_download_loop.QuitClosure())));
863
864 item->Start(std::move(file), std::move(request_handle), *create_info());
865 start_download_loop.Run();
866
867 download_target_callback.Run(base::FilePath(kDummyTargetPath),
868 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
869 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
870 base::FilePath(kDummyIntermediatePath));
792 RunAllPendingInMessageLoops(); 871 RunAllPendingInMessageLoops();
793 872
794 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); 873 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState());
795 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, 874 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED,
796 item->GetLastReason()); 875 item->GetLastReason());
797 } 876 }
798 877
878 // Handling of downloads initiated via a failed request. In this case, Start()
879 // will get called with a DownloadCreateInfo with a non-zero interrupt_reason.
880 TEST_F(DownloadItemTest, StartFailedDownload) {
881 create_info()->result = DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED;
882 DownloadItemImpl* item = CreateDownloadItem();
883
884 // DownloadFile and DownloadRequestHandleInterface objects aren't created for
885 // failed downloads.
886 scoped_ptr<DownloadFile> null_download_file;
887 scoped_ptr<DownloadRequestHandleInterface> null_request_handle;
888 DownloadItemImplDelegate::DownloadTargetCallback download_target_callback;
889 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _))
890 .WillOnce(SaveArg<1>(&download_target_callback));
891 item->Start(std::move(null_download_file), std::move(null_request_handle),
892 *create_info());
893 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
894 RunAllPendingInMessageLoops();
895
896 // The DownloadItemImpl should attempt to determine a target path even if the
897 // download was interrupted.
898 ASSERT_FALSE(download_target_callback.is_null());
899 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
900 base::FilePath target_path(FILE_PATH_LITERAL("foo"));
901 download_target_callback.Run(target_path,
902 DownloadItem::TARGET_DISPOSITION_OVERWRITE,
903 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, target_path);
904 RunAllPendingInMessageLoops();
905
906 EXPECT_EQ(target_path, item->GetTargetFilePath());
907 CleanupItem(item, NULL, DownloadItem::INTERRUPTED);
908 }
909
799 // Test that the delegate is invoked after the download file is renamed. 910 // Test that the delegate is invoked after the download file is renamed.
800 TEST_F(DownloadItemTest, CallbackAfterRename) { 911 TEST_F(DownloadItemTest, CallbackAfterRename) {
801 DownloadItemImpl* item = CreateDownloadItem(); 912 DownloadItemImpl* item = CreateDownloadItem();
802 DownloadItemImplDelegate::DownloadTargetCallback callback; 913 DownloadItemImplDelegate::DownloadTargetCallback callback;
803 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); 914 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback);
804 base::FilePath final_path( 915 base::FilePath final_path(
805 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); 916 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar"));
806 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); 917 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x"));
807 base::FilePath new_intermediate_path( 918 base::FilePath new_intermediate_path(
808 final_path.InsertBeforeExtensionASCII("y")); 919 final_path.InsertBeforeExtensionASCII("y"));
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 ::testing::Mock::VerifyAndClearExpectations(download_file); 1082 ::testing::Mock::VerifyAndClearExpectations(download_file);
972 mock_delegate()->VerifyAndClearExpectations(); 1083 mock_delegate()->VerifyAndClearExpectations();
973 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); 1084 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState());
974 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason()); 1085 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason());
975 EXPECT_TRUE(item->GetFullPath().empty()); 1086 EXPECT_TRUE(item->GetFullPath().empty());
976 EXPECT_EQ(final_path, item->GetTargetFilePath()); 1087 EXPECT_EQ(final_path, item->GetTargetFilePath());
977 } 1088 }
978 1089
979 TEST_F(DownloadItemTest, Canceled) { 1090 TEST_F(DownloadItemTest, Canceled) {
980 DownloadItemImpl* item = CreateDownloadItem(); 1091 DownloadItemImpl* item = CreateDownloadItem();
981 MockDownloadFile* download_file = CallDownloadItemStart(item, nullptr); 1092 DownloadItemImplDelegate::DownloadTargetCallback target_callback;
1093 MockDownloadFile* download_file =
1094 CallDownloadItemStart(item, &target_callback);
982 1095
983 // Confirm cancel sets state properly. 1096 // Confirm cancel sets state properly.
984 EXPECT_CALL(*download_file, Cancel()); 1097 EXPECT_CALL(*download_file, Cancel());
985 item->Cancel(true); 1098 item->Cancel(true);
986 EXPECT_EQ(DownloadItem::CANCELLED, item->GetState()); 1099 EXPECT_EQ(DownloadItem::CANCELLED, item->GetState());
987 } 1100 }
988 1101
989 TEST_F(DownloadItemTest, FileRemoved) { 1102 TEST_F(DownloadItemTest, FileRemoved) {
990 DownloadItemImpl* item = CreateDownloadItem(); 1103 DownloadItemImpl* item = CreateDownloadItem();
991 1104
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); 1157 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED);
1045 mock_delegate()->VerifyAndClearExpectations(); 1158 mock_delegate()->VerifyAndClearExpectations();
1046 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); 1159 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated());
1047 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); 1160 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState());
1048 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, 1161 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED,
1049 item->GetLastReason()); 1162 item->GetLastReason());
1050 } 1163 }
1051 1164
1052 TEST_F(DownloadItemTest, DestinationCompleted) { 1165 TEST_F(DownloadItemTest, DestinationCompleted) {
1053 DownloadItemImpl* item = CreateDownloadItem(); 1166 DownloadItemImpl* item = CreateDownloadItem();
1054 MockDownloadFile* download_file = CallDownloadItemStart(item, nullptr); 1167 MockDownloadFile* download_file =
1168 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
1055 base::WeakPtr<DownloadDestinationObserver> as_observer( 1169 base::WeakPtr<DownloadDestinationObserver> as_observer(
1056 item->DestinationObserverAsWeakPtr()); 1170 item->DestinationObserverAsWeakPtr());
1057 TestDownloadItemObserver observer(item); 1171 TestDownloadItemObserver observer(item);
1058 1172
1059 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 1173 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
1060 EXPECT_EQ("", item->GetHash()); 1174 EXPECT_EQ("", item->GetHash());
1061 EXPECT_EQ("", item->GetHashState()); 1175 EXPECT_EQ("", item->GetHashState());
1062 EXPECT_FALSE(item->AllDataSaved()); 1176 EXPECT_FALSE(item->AllDataSaved());
1063 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); 1177 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated());
1064 1178
1065 as_observer->DestinationUpdate(10, 20, "deadbeef"); 1179 as_observer->DestinationUpdate(10, 20, "deadbeef");
1066 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); 1180 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated());
1067 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); // Confirm reset. 1181 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); // Confirm reset.
1068 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 1182 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
1069 EXPECT_EQ("", item->GetHash()); 1183 EXPECT_EQ("", item->GetHash());
1070 EXPECT_EQ("deadbeef", item->GetHashState()); 1184 EXPECT_EQ("deadbeef", item->GetHashState());
1071 EXPECT_FALSE(item->AllDataSaved()); 1185 EXPECT_FALSE(item->AllDataSaved());
1072 1186
1187 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _));
1073 as_observer->DestinationCompleted("livebeef"); 1188 as_observer->DestinationCompleted("livebeef");
1074 mock_delegate()->VerifyAndClearExpectations(); 1189 mock_delegate()->VerifyAndClearExpectations();
1075 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); 1190 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState());
1076 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); 1191 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated());
1077 EXPECT_EQ("livebeef", item->GetHash()); 1192 EXPECT_EQ("livebeef", item->GetHash());
1078 EXPECT_EQ("", item->GetHashState()); 1193 EXPECT_EQ("", item->GetHashState());
1079 EXPECT_TRUE(item->AllDataSaved()); 1194 EXPECT_TRUE(item->AllDataSaved());
1080 1195
1081 // Even though the DownloadItem receives a DestinationCompleted() event, 1196 // Even though the DownloadItem receives a DestinationCompleted() event,
1082 // target determination hasn't completed, hence the download item is stuck in 1197 // target determination hasn't completed, hence the download item is stuck in
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
1640 // Expect that the download file and the request will be cancelled as a 1755 // Expect that the download file and the request will be cancelled as a
1641 // result. 1756 // result.
1642 EXPECT_CALL(*file_, Cancel()); 1757 EXPECT_CALL(*file_, Cancel());
1643 EXPECT_CALL(*request_handle_, CancelRequest()); 1758 EXPECT_CALL(*request_handle_, CancelRequest());
1644 1759
1645 base::RunLoop download_start_loop; 1760 base::RunLoop download_start_loop;
1646 DownloadFile::InitializeCallback initialize_callback; 1761 DownloadFile::InitializeCallback initialize_callback;
1647 EXPECT_CALL(*file_, Initialize(_)) 1762 EXPECT_CALL(*file_, Initialize(_))
1648 .WillOnce(DoAll(SaveArg<0>(&initialize_callback), 1763 .WillOnce(DoAll(SaveArg<0>(&initialize_callback),
1649 ScheduleClosure(download_start_loop.QuitClosure()))); 1764 ScheduleClosure(download_start_loop.QuitClosure())));
1650 item_->Start(std::move(file_), std::move(request_handle_)); 1765 item_->Start(std::move(file_), std::move(request_handle_), *create_info());
1651 download_start_loop.Run(); 1766 download_start_loop.Run();
1652 1767
1653 base::WeakPtr<DownloadDestinationObserver> destination_observer = 1768 base::WeakPtr<DownloadDestinationObserver> destination_observer =
1654 item_->DestinationObserverAsWeakPtr(); 1769 item_->DestinationObserverAsWeakPtr();
1655 1770
1656 ScheduleObservations(PreInitializeFileObservations(), destination_observer); 1771 ScheduleObservations(PreInitializeFileObservations(), destination_observer);
1657 RunAllPendingInMessageLoops(); 1772 RunAllPendingInMessageLoops();
1658 1773
1659 base::RunLoop initialize_completion_loop; 1774 base::RunLoop initialize_completion_loop;
1660 DownloadItemImplDelegate::DownloadTargetCallback target_callback; 1775 DownloadItemImplDelegate::DownloadTargetCallback target_callback;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1693 EXPECT_CALL(*file_, RenameAndUniquify(_, _)) 1808 EXPECT_CALL(*file_, RenameAndUniquify(_, _))
1694 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback), 1809 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback),
1695 ScheduleClosure(intermediate_rename_loop.QuitClosure()))); 1810 ScheduleClosure(intermediate_rename_loop.QuitClosure())));
1696 1811
1697 base::RunLoop download_start_loop; 1812 base::RunLoop download_start_loop;
1698 DownloadFile::InitializeCallback initialize_callback; 1813 DownloadFile::InitializeCallback initialize_callback;
1699 EXPECT_CALL(*file_, Initialize(_)) 1814 EXPECT_CALL(*file_, Initialize(_))
1700 .WillOnce(DoAll(SaveArg<0>(&initialize_callback), 1815 .WillOnce(DoAll(SaveArg<0>(&initialize_callback),
1701 ScheduleClosure(download_start_loop.QuitClosure()))); 1816 ScheduleClosure(download_start_loop.QuitClosure())));
1702 1817
1703 item_->Start(std::move(file_), std::move(request_handle_)); 1818 item_->Start(std::move(file_), std::move(request_handle_), *create_info());
1704 download_start_loop.Run(); 1819 download_start_loop.Run();
1705 base::WeakPtr<DownloadDestinationObserver> destination_observer = 1820 base::WeakPtr<DownloadDestinationObserver> destination_observer =
1706 item_->DestinationObserverAsWeakPtr(); 1821 item_->DestinationObserverAsWeakPtr();
1707 1822
1708 ScheduleObservations(PreInitializeFileObservations(), destination_observer); 1823 ScheduleObservations(PreInitializeFileObservations(), destination_observer);
1709 RunAllPendingInMessageLoops(); 1824 RunAllPendingInMessageLoops();
1710 1825
1711 base::RunLoop initialize_completion_loop; 1826 base::RunLoop initialize_completion_loop;
1712 DownloadItemImplDelegate::DownloadTargetCallback target_callback; 1827 DownloadItemImplDelegate::DownloadTargetCallback target_callback;
1713 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _)) 1828 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _))
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 EXPECT_CALL(*file_, RenameAndUniquify(_, _)) 1877 EXPECT_CALL(*file_, RenameAndUniquify(_, _))
1763 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback), 1878 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback),
1764 ScheduleClosure(intermediate_rename_loop.QuitClosure()))); 1879 ScheduleClosure(intermediate_rename_loop.QuitClosure())));
1765 1880
1766 base::RunLoop download_start_loop; 1881 base::RunLoop download_start_loop;
1767 DownloadFile::InitializeCallback initialize_callback; 1882 DownloadFile::InitializeCallback initialize_callback;
1768 EXPECT_CALL(*file_, Initialize(_)) 1883 EXPECT_CALL(*file_, Initialize(_))
1769 .WillOnce(DoAll(SaveArg<0>(&initialize_callback), 1884 .WillOnce(DoAll(SaveArg<0>(&initialize_callback),
1770 ScheduleClosure(download_start_loop.QuitClosure()))); 1885 ScheduleClosure(download_start_loop.QuitClosure())));
1771 1886
1772 item_->Start(std::move(file_), std::move(request_handle_)); 1887 item_->Start(std::move(file_), std::move(request_handle_), *create_info());
1773 download_start_loop.Run(); 1888 download_start_loop.Run();
1774 base::WeakPtr<DownloadDestinationObserver> destination_observer = 1889 base::WeakPtr<DownloadDestinationObserver> destination_observer =
1775 item_->DestinationObserverAsWeakPtr(); 1890 item_->DestinationObserverAsWeakPtr();
1776 1891
1777 ScheduleObservations(PreInitializeFileObservations(), destination_observer); 1892 ScheduleObservations(PreInitializeFileObservations(), destination_observer);
1778 RunAllPendingInMessageLoops(); 1893 RunAllPendingInMessageLoops();
1779 1894
1780 base::RunLoop initialize_completion_loop; 1895 base::RunLoop initialize_completion_loop;
1781 DownloadItemImplDelegate::DownloadTargetCallback target_callback; 1896 DownloadItemImplDelegate::DownloadTargetCallback target_callback;
1782 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _)) 1897 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(_, _))
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1823 1938
1824 item_->Cancel(true); 1939 item_->Cancel(true);
1825 RunAllPendingInMessageLoops(); 1940 RunAllPendingInMessageLoops();
1826 } 1941 }
1827 1942
1828 TEST(MockDownloadItem, Compiles) { 1943 TEST(MockDownloadItem, Compiles) {
1829 MockDownloadItem mock_item; 1944 MockDownloadItem mock_item;
1830 } 1945 }
1831 1946
1832 } // namespace content 1947 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698