OLD | NEW |
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> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
14 #include "base/feature_list.h" | 14 #include "base/feature_list.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
17 #include "base/stl_util.h" | 17 #include "base/stl_util.h" |
18 #include "base/threading/thread.h" | 18 #include "base/threading/thread.h" |
19 #include "content/browser/byte_stream.h" | 19 #include "content/browser/byte_stream.h" |
20 #include "content/browser/download/download_create_info.h" | 20 #include "content/browser/download/download_create_info.h" |
| 21 #include "content/browser/download/download_destination_observer.h" |
21 #include "content/browser/download/download_file_factory.h" | 22 #include "content/browser/download/download_file_factory.h" |
22 #include "content/browser/download/download_item_impl_delegate.h" | 23 #include "content/browser/download/download_item_impl_delegate.h" |
23 #include "content/browser/download/download_request_handle.h" | 24 #include "content/browser/download/download_request_handle.h" |
24 #include "content/browser/download/mock_download_file.h" | 25 #include "content/browser/download/mock_download_file.h" |
25 #include "content/public/browser/browser_thread.h" | 26 #include "content/public/browser/browser_thread.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" | 31 #include "content/public/test/mock_download_item.h" |
32 #include "content/public/test/test_browser_context.h" | 32 #include "content/public/test/test_browser_context.h" |
33 #include "content/public/test/test_browser_context.h" | 33 #include "content/public/test/test_browser_context.h" |
34 #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" | 35 #include "content/public/test/web_contents_tester.h" |
| 36 #include "crypto/secure_hash.h" |
36 #include "testing/gmock/include/gmock/gmock.h" | 37 #include "testing/gmock/include/gmock/gmock.h" |
37 #include "testing/gtest/include/gtest/gtest.h" | 38 #include "testing/gtest/include/gtest/gtest.h" |
38 | 39 |
39 using ::testing::DoAll; | 40 using ::testing::DoAll; |
40 using ::testing::NiceMock; | 41 using ::testing::NiceMock; |
41 using ::testing::Property; | 42 using ::testing::Property; |
42 using ::testing::Return; | 43 using ::testing::Return; |
| 44 using ::testing::ReturnRefOfCopy; |
43 using ::testing::SaveArg; | 45 using ::testing::SaveArg; |
44 using ::testing::StrictMock; | 46 using ::testing::StrictMock; |
45 using ::testing::WithArg; | 47 using ::testing::WithArg; |
46 using ::testing::_; | 48 using ::testing::_; |
47 | 49 |
48 const int kDownloadChunkSize = 1000; | 50 const int kDownloadChunkSize = 1000; |
49 const int kDownloadSpeed = 1000; | 51 const int kDownloadSpeed = 1000; |
50 const base::FilePath::CharType kDummyTargetPath[] = | 52 const base::FilePath::CharType kDummyTargetPath[] = |
51 FILE_PATH_LITERAL("/testpath"); | 53 FILE_PATH_LITERAL("/testpath"); |
52 const base::FilePath::CharType kDummyIntermediatePath[] = | 54 const base::FilePath::CharType kDummyIntermediatePath[] = |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 DownloadItem::DownloadState last_state_; | 180 DownloadItem::DownloadState last_state_; |
179 bool removed_; | 181 bool removed_; |
180 bool destroyed_; | 182 bool destroyed_; |
181 bool updated_; | 183 bool updated_; |
182 int interrupt_count_; | 184 int interrupt_count_; |
183 int resume_count_; | 185 int resume_count_; |
184 }; | 186 }; |
185 | 187 |
186 // Schedules a task to invoke the RenameCompletionCallback with |new_path| on | 188 // Schedules a task to invoke the RenameCompletionCallback with |new_path| on |
187 // the UI thread. Should only be used as the action for | 189 // the UI thread. Should only be used as the action for |
188 // MockDownloadFile::Rename as follows: | 190 // MockDownloadFile::RenameAndUniquify as follows: |
189 // EXPECT_CALL(download_file, Rename*(_,_)) | 191 // EXPECT_CALL(download_file, RenameAndUniquify(_,_)) |
190 // .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 192 // .WillOnce(ScheduleRenameAndUniquifyCallback( |
191 // new_path)); | 193 // DOWNLOAD_INTERRUPT_REASON_NONE, new_path)); |
192 ACTION_P2(ScheduleRenameCallback, interrupt_reason, new_path) { | 194 ACTION_P2(ScheduleRenameAndUniquifyCallback, interrupt_reason, new_path) { |
193 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 195 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
194 base::Bind(arg1, interrupt_reason, new_path)); | 196 base::Bind(arg1, interrupt_reason, new_path)); |
195 } | 197 } |
196 | 198 |
| 199 // Schedules a task to invoke the RenameCompletionCallback with |new_path| on |
| 200 // the UI thread. Should only be used as the action for |
| 201 // MockDownloadFile::RenameAndAnnotate as follows: |
| 202 // EXPECT_CALL(download_file, RenameAndAnnotate(_,_,_,_,_)) |
| 203 // .WillOnce(ScheduleRenameAndAnnotateCallback( |
| 204 // DOWNLOAD_INTERRUPT_REASON_NONE, new_path)); |
| 205 ACTION_P2(ScheduleRenameAndAnnotateCallback, interrupt_reason, new_path) { |
| 206 BrowserThread::PostTask(BrowserThread::UI, |
| 207 FROM_HERE, |
| 208 base::Bind(arg4, interrupt_reason, new_path)); |
| 209 } |
| 210 |
197 // Schedules a task to invoke a callback that's bound to the specified | 211 // Schedules a task to invoke a callback that's bound to the specified |
198 // parameter. | 212 // parameter. |
199 // E.g.: | 213 // E.g.: |
200 // | 214 // |
201 // EXPECT_CALL(foo, Bar(1, _)) | 215 // EXPECT_CALL(foo, Bar(1, _)) |
202 // .WithArg<1>(ScheduleCallbackWithParam(0)); | 216 // .WithArg<1>(ScheduleCallbackWithParam(0)); |
203 // | 217 // |
204 // .. will invoke the second argument to Bar with 0 as the parameter. | 218 // .. will invoke the second argument to Bar with 0 as the parameter. |
205 ACTION_P(ScheduleCallbackWithParam, param) { | 219 ACTION_P(ScheduleCallbackWithParam, param) { |
206 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 220 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
207 base::Bind(arg0, param)); | 221 base::Bind(arg0, param)); |
208 } | 222 } |
209 | 223 |
| 224 // Schedules a task to invoke a closure. |
| 225 // E.g.: |
| 226 // |
| 227 // EXPECT_CALL(foo, Bar(1, _)) |
| 228 // .WillOnce(ScheduleClosure(some_closure)); |
210 ACTION_P(ScheduleClosure, closure) { | 229 ACTION_P(ScheduleClosure, closure) { |
211 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, closure); | 230 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, closure); |
212 } | 231 } |
213 | 232 |
| 233 const char kTestData1[] = {'M', 'a', 'r', 'y', ' ', 'h', 'a', 'd', |
| 234 ' ', 'a', ' ', 'l', 'i', 't', 't', 'l', |
| 235 'e', ' ', 'l', 'a', 'm', 'b', '.'}; |
| 236 |
| 237 // SHA256 hash of TestData1 |
| 238 const uint8_t kHashOfTestData1[] = { |
| 239 0xd2, 0xfc, 0x16, 0xa1, 0xf5, 0x1a, 0x65, 0x3a, 0xa0, 0x19, 0x64, |
| 240 0xef, 0x9c, 0x92, 0x33, 0x36, 0xe1, 0x06, 0x53, 0xfe, 0xc1, 0x95, |
| 241 0xf4, 0x93, 0x45, 0x8b, 0x3b, 0x21, 0x89, 0x0e, 0x1b, 0x97}; |
| 242 |
214 } // namespace | 243 } // namespace |
215 | 244 |
216 class DownloadItemTest : public testing::Test { | 245 class DownloadItemTest : public testing::Test { |
217 public: | 246 public: |
218 DownloadItemTest() | 247 DownloadItemTest() |
219 : delegate_(), next_download_id_(DownloadItem::kInvalidId + 1) { | 248 : delegate_(), next_download_id_(DownloadItem::kInvalidId + 1) { |
220 base::FeatureList::ClearInstanceForTesting(); | 249 base::FeatureList::ClearInstanceForTesting(); |
221 scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); | 250 scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); |
222 feature_list->InitializeFromCommandLine(features::kDownloadResumption.name, | 251 feature_list->InitializeFromCommandLine(features::kDownloadResumption.name, |
223 std::string()); | 252 std::string()); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)).Times(0); | 299 EXPECT_CALL(*mock_delegate(), DetermineDownloadTarget(item, _)).Times(0); |
271 } | 300 } |
272 | 301 |
273 // Only create a DownloadFile if the request was successful. | 302 // Only create a DownloadFile if the request was successful. |
274 if (create_info_->result == DOWNLOAD_INTERRUPT_REASON_NONE) { | 303 if (create_info_->result == DOWNLOAD_INTERRUPT_REASON_NONE) { |
275 mock_download_file = new StrictMock<MockDownloadFile>; | 304 mock_download_file = new StrictMock<MockDownloadFile>; |
276 download_file.reset(mock_download_file); | 305 download_file.reset(mock_download_file); |
277 EXPECT_CALL(*mock_download_file, Initialize(_)) | 306 EXPECT_CALL(*mock_download_file, Initialize(_)) |
278 .WillOnce(ScheduleCallbackWithParam(DOWNLOAD_INTERRUPT_REASON_NONE)); | 307 .WillOnce(ScheduleCallbackWithParam(DOWNLOAD_INTERRUPT_REASON_NONE)); |
279 EXPECT_CALL(*mock_download_file, FullPath()) | 308 EXPECT_CALL(*mock_download_file, FullPath()) |
280 .WillRepeatedly(Return(base::FilePath())); | 309 .WillRepeatedly(ReturnRefOfCopy(base::FilePath())); |
281 } | 310 } |
282 | 311 |
283 scoped_ptr<MockRequestHandle> request_handle( | 312 scoped_ptr<MockRequestHandle> request_handle( |
284 new NiceMock<MockRequestHandle>); | 313 new NiceMock<MockRequestHandle>); |
285 item->Start(std::move(download_file), std::move(request_handle), | 314 item->Start(std::move(download_file), std::move(request_handle), |
286 *create_info_); | 315 *create_info_); |
287 RunAllPendingInMessageLoops(); | 316 RunAllPendingInMessageLoops(); |
288 | 317 |
289 // So that we don't have a function writing to a stack variable | 318 // So that we don't have a function writing to a stack variable |
290 // lying around if the above failed. | 319 // lying around if the above failed. |
(...skipping 13 matching lines...) Expand all Loading... |
304 // that was added to the DownloadItem. | 333 // that was added to the DownloadItem. |
305 MockDownloadFile* DoIntermediateRename(DownloadItemImpl* item, | 334 MockDownloadFile* DoIntermediateRename(DownloadItemImpl* item, |
306 DownloadDangerType danger_type) { | 335 DownloadDangerType danger_type) { |
307 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 336 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
308 EXPECT_TRUE(item->GetTargetFilePath().empty()); | 337 EXPECT_TRUE(item->GetTargetFilePath().empty()); |
309 DownloadItemImplDelegate::DownloadTargetCallback callback; | 338 DownloadItemImplDelegate::DownloadTargetCallback callback; |
310 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 339 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
311 base::FilePath target_path(kDummyTargetPath); | 340 base::FilePath target_path(kDummyTargetPath); |
312 base::FilePath intermediate_path(kDummyIntermediatePath); | 341 base::FilePath intermediate_path(kDummyIntermediatePath); |
313 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 342 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
314 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 343 .WillOnce(ScheduleRenameAndUniquifyCallback( |
315 intermediate_path)); | 344 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); |
316 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 345 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
317 danger_type, intermediate_path); | 346 danger_type, intermediate_path); |
318 RunAllPendingInMessageLoops(); | 347 RunAllPendingInMessageLoops(); |
319 return download_file; | 348 return download_file; |
320 } | 349 } |
321 | 350 |
322 void DoDestinationComplete(DownloadItemImpl* item, | 351 void DoDestinationComplete(DownloadItemImpl* item, |
323 MockDownloadFile* download_file) { | 352 MockDownloadFile* download_file) { |
324 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) | 353 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) |
325 .WillOnce(Return(true)); | 354 .WillOnce(Return(true)); |
326 base::FilePath final_path(kDummyTargetPath); | 355 base::FilePath final_path(kDummyTargetPath); |
327 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)) | 356 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)) |
328 .WillOnce( | 357 .WillOnce(ScheduleRenameAndAnnotateCallback( |
329 ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, final_path)); | 358 DOWNLOAD_INTERRUPT_REASON_NONE, final_path)); |
330 EXPECT_CALL(*download_file, FullPath()) | 359 EXPECT_CALL(*download_file, FullPath()) |
331 .WillRepeatedly(Return(base::FilePath(kDummyTargetPath))); | 360 .WillRepeatedly(ReturnRefOfCopy(base::FilePath(kDummyTargetPath))); |
332 EXPECT_CALL(*download_file, Detach()); | 361 EXPECT_CALL(*download_file, Detach()); |
333 | 362 |
334 item->DestinationObserverAsWeakPtr()->DestinationCompleted(""); | 363 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 364 0, scoped_ptr<crypto::SecureHash>()); |
335 RunAllPendingInMessageLoops(); | 365 RunAllPendingInMessageLoops(); |
336 } | 366 } |
337 | 367 |
338 // Cleanup a download item (specifically get rid of the DownloadFile on it). | 368 // Cleanup a download item (specifically get rid of the DownloadFile on it). |
339 // The item must be in the expected state. | 369 // The item must be in the expected state. |
340 void CleanupItem(DownloadItemImpl* item, | 370 void CleanupItem(DownloadItemImpl* item, |
341 MockDownloadFile* download_file, | 371 MockDownloadFile* download_file, |
342 DownloadItem::DownloadState expected_state) { | 372 DownloadItem::DownloadState expected_state) { |
343 EXPECT_EQ(expected_state, item->GetState()); | 373 EXPECT_EQ(expected_state, item->GetState()); |
344 | 374 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 // void CompleteDelayedDownload(); | 418 // void CompleteDelayedDownload(); |
389 // set_* mutators | 419 // set_* mutators |
390 | 420 |
391 TEST_F(DownloadItemTest, NotificationAfterUpdate) { | 421 TEST_F(DownloadItemTest, NotificationAfterUpdate) { |
392 DownloadItemImpl* item = CreateDownloadItem(); | 422 DownloadItemImpl* item = CreateDownloadItem(); |
393 MockDownloadFile* file = | 423 MockDownloadFile* file = |
394 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 424 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
395 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 425 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
396 TestDownloadItemObserver observer(item); | 426 TestDownloadItemObserver observer(item); |
397 | 427 |
398 item->DestinationUpdate(kDownloadChunkSize, kDownloadSpeed, std::string()); | 428 item->DestinationUpdate(kDownloadChunkSize, kDownloadSpeed); |
399 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 429 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
400 EXPECT_EQ(kDownloadSpeed, item->CurrentSpeed()); | 430 EXPECT_EQ(kDownloadSpeed, item->CurrentSpeed()); |
401 CleanupItem(item, file, DownloadItem::IN_PROGRESS); | 431 CleanupItem(item, file, DownloadItem::IN_PROGRESS); |
402 } | 432 } |
403 | 433 |
404 TEST_F(DownloadItemTest, NotificationAfterCancel) { | 434 TEST_F(DownloadItemTest, NotificationAfterCancel) { |
405 DownloadItemImpl* user_cancel = CreateDownloadItem(); | 435 DownloadItemImpl* user_cancel = CreateDownloadItem(); |
406 DownloadItemImplDelegate::DownloadTargetCallback target_callback; | 436 DownloadItemImplDelegate::DownloadTargetCallback target_callback; |
407 MockDownloadFile* download_file = | 437 MockDownloadFile* download_file = |
408 CallDownloadItemStart(user_cancel, &target_callback); | 438 CallDownloadItemStart(user_cancel, &target_callback); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 DownloadItemImpl* item = CreateDownloadItem(); | 473 DownloadItemImpl* item = CreateDownloadItem(); |
444 MockDownloadFile* download_file = | 474 MockDownloadFile* download_file = |
445 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 475 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
446 EXPECT_CALL(*download_file, Cancel()); | 476 EXPECT_CALL(*download_file, Cancel()); |
447 TestDownloadItemObserver observer(item); | 477 TestDownloadItemObserver observer(item); |
448 | 478 |
449 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_,_)) | 479 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_,_)) |
450 .Times(0); | 480 .Times(0); |
451 | 481 |
452 item->DestinationObserverAsWeakPtr()->DestinationError( | 482 item->DestinationObserverAsWeakPtr()->DestinationError( |
453 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); | 483 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 484 0, |
| 485 scoped_ptr<crypto::SecureHash>()); |
454 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 486 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
455 } | 487 } |
456 | 488 |
457 TEST_F(DownloadItemTest, NotificationAfterDestroyed) { | 489 TEST_F(DownloadItemTest, NotificationAfterDestroyed) { |
458 DownloadItemImpl* item = CreateDownloadItem(); | 490 DownloadItemImpl* item = CreateDownloadItem(); |
459 TestDownloadItemObserver observer(item); | 491 TestDownloadItemObserver observer(item); |
460 | 492 |
461 DestroyDownloadItem(item); | 493 DestroyDownloadItem(item); |
462 ASSERT_TRUE(observer.download_destroyed()); | 494 ASSERT_TRUE(observer.download_destroyed()); |
463 } | 495 } |
464 | 496 |
465 // Test that a download is resumed automatcially after a continuable interrupt. | 497 // Test that a download is resumed automatcially after a continuable interrupt. |
466 TEST_F(DownloadItemTest, ContinueAfterInterrupted) { | 498 TEST_F(DownloadItemTest, ContinueAfterInterrupted) { |
467 DownloadItemImpl* item = CreateDownloadItem(); | 499 DownloadItemImpl* item = CreateDownloadItem(); |
468 TestDownloadItemObserver observer(item); | 500 TestDownloadItemObserver observer(item); |
469 MockDownloadFile* download_file = | 501 MockDownloadFile* download_file = |
470 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 502 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
471 | 503 |
472 // Interrupt the download, using a continuable interrupt. | 504 // Interrupt the download, using a continuable interrupt. |
473 EXPECT_CALL(*download_file, FullPath()) | 505 EXPECT_CALL(*download_file, FullPath()) |
474 .WillOnce(Return(base::FilePath())); | 506 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
475 EXPECT_CALL(*download_file, Detach()); | 507 EXPECT_CALL(*download_file, Detach()); |
476 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) | 508 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) |
477 .WillRepeatedly(Return(browser_context())); | 509 .WillRepeatedly(Return(browser_context())); |
478 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)).Times(1); | 510 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)).Times(1); |
479 item->DestinationObserverAsWeakPtr()->DestinationError( | 511 item->DestinationObserverAsWeakPtr()->DestinationError( |
480 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); | 512 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, |
| 513 0, |
| 514 scoped_ptr<crypto::SecureHash>()); |
481 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 515 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
482 // Since the download is resumed automatically, the interrupt count doesn't | 516 // Since the download is resumed automatically, the interrupt count doesn't |
483 // increase. | 517 // increase. |
484 ASSERT_EQ(0, observer.interrupt_count()); | 518 ASSERT_EQ(0, observer.interrupt_count()); |
485 | 519 |
486 // Test expectations verify that ResumeInterruptedDownload() is called (by way | 520 // Test expectations verify that ResumeInterruptedDownload() is called (by way |
487 // of MockResumeInterruptedDownload) after the download is interrupted. But | 521 // of MockResumeInterruptedDownload) after the download is interrupted. But |
488 // the mock doesn't follow through with the resumption. | 522 // the mock doesn't follow through with the resumption. |
489 // ResumeInterruptedDownload() being called is sufficient for verifying that | 523 // ResumeInterruptedDownload() being called is sufficient for verifying that |
490 // the automatic resumption was triggered. | 524 // the automatic resumption was triggered. |
491 RunAllPendingInMessageLoops(); | 525 RunAllPendingInMessageLoops(); |
492 | 526 |
493 // The download item is currently in RESUMING_INTERNAL state, which maps to | 527 // The download item is currently in RESUMING_INTERNAL state, which maps to |
494 // IN_PROGRESS. | 528 // IN_PROGRESS. |
495 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); | 529 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); |
496 } | 530 } |
497 | 531 |
498 // Test that automatic resumption doesn't happen after a non-continuable | 532 // Test that automatic resumption doesn't happen after a non-continuable |
499 // interrupt. | 533 // interrupt. |
500 TEST_F(DownloadItemTest, RestartAfterInterrupted) { | 534 TEST_F(DownloadItemTest, RestartAfterInterrupted) { |
501 DownloadItemImpl* item = CreateDownloadItem(); | 535 DownloadItemImpl* item = CreateDownloadItem(); |
502 TestDownloadItemObserver observer(item); | 536 TestDownloadItemObserver observer(item); |
503 MockDownloadFile* download_file = | 537 MockDownloadFile* download_file = |
504 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 538 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
505 | 539 |
506 // Interrupt the download, using a restartable interrupt. | 540 // Interrupt the download, using a restartable interrupt. |
507 EXPECT_CALL(*download_file, Cancel()); | 541 EXPECT_CALL(*download_file, Cancel()); |
508 item->DestinationObserverAsWeakPtr()->DestinationError( | 542 item->DestinationObserverAsWeakPtr()->DestinationError( |
509 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); | 543 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 544 0, |
| 545 scoped_ptr<crypto::SecureHash>()); |
510 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 546 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
511 // Should not try to auto-resume. | 547 // Should not try to auto-resume. |
512 ASSERT_EQ(1, observer.interrupt_count()); | 548 ASSERT_EQ(1, observer.interrupt_count()); |
513 ASSERT_EQ(0, observer.resume_count()); | 549 ASSERT_EQ(0, observer.resume_count()); |
514 RunAllPendingInMessageLoops(); | 550 RunAllPendingInMessageLoops(); |
515 | 551 |
516 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); | 552 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); |
517 } | 553 } |
518 | 554 |
519 // Check we do correct cleanup for RESUME_MODE_INVALID interrupts. | 555 // Check we do correct cleanup for RESUME_MODE_INVALID interrupts. |
520 TEST_F(DownloadItemTest, UnresumableInterrupt) { | 556 TEST_F(DownloadItemTest, UnresumableInterrupt) { |
521 DownloadItemImpl* item = CreateDownloadItem(); | 557 DownloadItemImpl* item = CreateDownloadItem(); |
522 TestDownloadItemObserver observer(item); | 558 TestDownloadItemObserver observer(item); |
523 MockDownloadFile* download_file = | 559 MockDownloadFile* download_file = |
524 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 560 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
525 | 561 |
526 // Fail final rename with unresumable reason. | 562 // Fail final rename with unresumable reason. |
527 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 563 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
528 .WillOnce(Return(true)); | 564 .WillOnce(Return(true)); |
529 EXPECT_CALL(*download_file, | 565 EXPECT_CALL(*download_file, |
530 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _)) | 566 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) |
531 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED, | 567 .WillOnce(ScheduleRenameAndAnnotateCallback( |
532 base::FilePath())); | 568 DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED, base::FilePath())); |
533 EXPECT_CALL(*download_file, Cancel()); | 569 EXPECT_CALL(*download_file, Cancel()); |
534 | 570 |
535 // Complete download to trigger final rename. | 571 // Complete download to trigger final rename. |
536 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 572 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 573 0, scoped_ptr<crypto::SecureHash>()); |
537 RunAllPendingInMessageLoops(); | 574 RunAllPendingInMessageLoops(); |
538 | 575 |
539 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); | 576 ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); |
540 // Should not try to auto-resume. | 577 // Should not try to auto-resume. |
541 ASSERT_EQ(1, observer.interrupt_count()); | 578 ASSERT_EQ(1, observer.interrupt_count()); |
542 ASSERT_EQ(0, observer.resume_count()); | 579 ASSERT_EQ(0, observer.resume_count()); |
543 | 580 |
544 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); | 581 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); |
545 } | 582 } |
546 | 583 |
(...skipping 16 matching lines...) Expand all Loading... |
563 .Times(DownloadItemImpl::kMaxAutoResumeAttempts); | 600 .Times(DownloadItemImpl::kMaxAutoResumeAttempts); |
564 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { | 601 for (int i = 0; i < (DownloadItemImpl::kMaxAutoResumeAttempts + 1); ++i) { |
565 SCOPED_TRACE(::testing::Message() << "Iteration " << i); | 602 SCOPED_TRACE(::testing::Message() << "Iteration " << i); |
566 | 603 |
567 mock_download_file = new NiceMock<MockDownloadFile>; | 604 mock_download_file = new NiceMock<MockDownloadFile>; |
568 download_file.reset(mock_download_file); | 605 download_file.reset(mock_download_file); |
569 mock_request_handle = new NiceMock<MockRequestHandle>; | 606 mock_request_handle = new NiceMock<MockRequestHandle>; |
570 request_handle.reset(mock_request_handle); | 607 request_handle.reset(mock_request_handle); |
571 | 608 |
572 ON_CALL(*mock_download_file, FullPath()) | 609 ON_CALL(*mock_download_file, FullPath()) |
573 .WillByDefault(Return(base::FilePath())); | 610 .WillByDefault(ReturnRefOfCopy(base::FilePath())); |
574 | 611 |
575 // Copied key parts of DoIntermediateRename & CallDownloadItemStart | 612 // Copied key parts of DoIntermediateRename & CallDownloadItemStart |
576 // to allow for holding onto the request handle. | 613 // to allow for holding onto the request handle. |
577 item->Start(std::move(download_file), std::move(request_handle), | 614 item->Start(std::move(download_file), std::move(request_handle), |
578 *create_info()); | 615 *create_info()); |
579 RunAllPendingInMessageLoops(); | 616 RunAllPendingInMessageLoops(); |
580 | 617 |
581 base::FilePath target_path(kDummyTargetPath); | 618 base::FilePath target_path(kDummyTargetPath); |
582 base::FilePath intermediate_path(kDummyIntermediatePath); | 619 base::FilePath intermediate_path(kDummyIntermediatePath); |
583 if (i == 0) { | 620 if (i == 0) { |
584 // RenameAndUniquify is only called the first time. In all the subsequent | 621 // RenameAndUniquify is only called the first time. In all the subsequent |
585 // iterations, the intermediate file already has the correct name, hence | 622 // iterations, the intermediate file already has the correct name, hence |
586 // no rename is necessary. | 623 // no rename is necessary. |
587 EXPECT_CALL(*mock_download_file, RenameAndUniquify(intermediate_path, _)) | 624 EXPECT_CALL(*mock_download_file, RenameAndUniquify(intermediate_path, _)) |
588 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 625 .WillOnce(ScheduleRenameAndUniquifyCallback( |
589 intermediate_path)); | 626 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); |
590 } | 627 } |
591 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 628 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
592 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 629 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
593 RunAllPendingInMessageLoops(); | 630 RunAllPendingInMessageLoops(); |
594 | 631 |
595 // Use a continuable interrupt. | 632 // Use a continuable interrupt. |
596 item->DestinationObserverAsWeakPtr()->DestinationError( | 633 item->DestinationObserverAsWeakPtr()->DestinationError( |
597 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); | 634 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, |
| 635 0, |
| 636 scoped_ptr<crypto::SecureHash>()); |
598 | 637 |
599 RunAllPendingInMessageLoops(); | 638 RunAllPendingInMessageLoops(); |
600 ::testing::Mock::VerifyAndClearExpectations(mock_download_file); | 639 ::testing::Mock::VerifyAndClearExpectations(mock_download_file); |
601 } | 640 } |
602 | 641 |
603 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 642 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
604 EXPECT_EQ(1, observer.interrupt_count()); | 643 EXPECT_EQ(1, observer.interrupt_count()); |
605 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); | 644 CleanupItem(item, nullptr, DownloadItem::INTERRUPTED); |
606 } | 645 } |
607 | 646 |
(...skipping 16 matching lines...) Expand all Loading... |
624 EXPECT_EQ(kContentDisposition, item->GetContentDisposition()); | 663 EXPECT_EQ(kContentDisposition, item->GetContentDisposition()); |
625 EXPECT_EQ(kFirstETag, item->GetETag()); | 664 EXPECT_EQ(kFirstETag, item->GetETag()); |
626 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime()); | 665 EXPECT_EQ(kFirstLastModified, item->GetLastModifiedTime()); |
627 EXPECT_EQ(kFirstURL, item->GetURL().spec()); | 666 EXPECT_EQ(kFirstURL, item->GetURL().spec()); |
628 | 667 |
629 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)); | 668 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload(_, _)); |
630 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) | 669 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) |
631 .WillRepeatedly(Return(browser_context())); | 670 .WillRepeatedly(Return(browser_context())); |
632 EXPECT_CALL(*download_file, Detach()); | 671 EXPECT_CALL(*download_file, Detach()); |
633 item->DestinationObserverAsWeakPtr()->DestinationError( | 672 item->DestinationObserverAsWeakPtr()->DestinationError( |
634 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); | 673 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, |
| 674 0, |
| 675 scoped_ptr<crypto::SecureHash>()); |
635 RunAllPendingInMessageLoops(); | 676 RunAllPendingInMessageLoops(); |
636 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 677 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
637 | 678 |
638 // Now change the create info. The changes should not cause the DownloadItem | 679 // Now change the create info. The changes should not cause the DownloadItem |
639 // to be updated. | 680 // to be updated. |
640 const char kSecondContentDisposition[] = "attachment; filename=bar"; | 681 const char kSecondContentDisposition[] = "attachment; filename=bar"; |
641 const char kSecondETag[] = "123"; | 682 const char kSecondETag[] = "123"; |
642 const char kSecondLastModified[] = "Today"; | 683 const char kSecondLastModified[] = "Today"; |
643 const char kSecondURL[] = "http://example.com/another-download"; | 684 const char kSecondURL[] = "http://example.com/another-download"; |
644 create_info()->content_disposition = kSecondContentDisposition; | 685 create_info()->content_disposition = kSecondContentDisposition; |
(...skipping 22 matching lines...) Expand all Loading... |
667 create_info()->url_chain.push_back(GURL("http://example.com/a")); | 708 create_info()->url_chain.push_back(GURL("http://example.com/a")); |
668 create_info()->url_chain.push_back(GURL("http://example.com/b")); | 709 create_info()->url_chain.push_back(GURL("http://example.com/b")); |
669 create_info()->url_chain.push_back(GURL("http://example.com/c")); | 710 create_info()->url_chain.push_back(GURL("http://example.com/c")); |
670 | 711 |
671 DownloadItemImpl* item = CreateDownloadItem(); | 712 DownloadItemImpl* item = CreateDownloadItem(); |
672 TestDownloadItemObserver observer(item); | 713 TestDownloadItemObserver observer(item); |
673 MockDownloadFile* download_file = | 714 MockDownloadFile* download_file = |
674 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 715 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
675 | 716 |
676 // Interrupt the download, using a continuable interrupt. | 717 // Interrupt the download, using a continuable interrupt. |
677 EXPECT_CALL(*download_file, FullPath()).WillOnce(Return(base::FilePath())); | 718 EXPECT_CALL(*download_file, FullPath()) |
| 719 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
678 EXPECT_CALL(*download_file, Detach()); | 720 EXPECT_CALL(*download_file, Detach()); |
679 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) | 721 EXPECT_CALL(*mock_delegate(), GetBrowserContext()) |
680 .WillRepeatedly(Return(browser_context())); | 722 .WillRepeatedly(Return(browser_context())); |
681 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload( | 723 EXPECT_CALL(*mock_delegate(), MockResumeInterruptedDownload( |
682 Property(&DownloadUrlParameters::url, | 724 Property(&DownloadUrlParameters::url, |
683 GURL("http://example.com/c")), | 725 GURL("http://example.com/c")), |
684 _)) | 726 _)) |
685 .Times(1); | 727 .Times(1); |
686 item->DestinationObserverAsWeakPtr()->DestinationError( | 728 item->DestinationObserverAsWeakPtr()->DestinationError( |
687 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR); | 729 DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, |
| 730 0, |
| 731 scoped_ptr<crypto::SecureHash>()); |
688 | 732 |
689 // Test expectations verify that ResumeInterruptedDownload() is called (by way | 733 // Test expectations verify that ResumeInterruptedDownload() is called (by way |
690 // of MockResumeInterruptedDownload) after the download is interrupted. But | 734 // of MockResumeInterruptedDownload) after the download is interrupted. But |
691 // the mock doesn't follow through with the resumption. | 735 // the mock doesn't follow through with the resumption. |
692 // ResumeInterruptedDownload() being called is sufficient for verifying that | 736 // ResumeInterruptedDownload() being called is sufficient for verifying that |
693 // the resumption was triggered. | 737 // the resumption was triggered. |
694 RunAllPendingInMessageLoops(); | 738 RunAllPendingInMessageLoops(); |
695 | 739 |
696 // The download is currently in RESUMING_INTERNAL, which maps to IN_PROGRESS. | 740 // The download is currently in RESUMING_INTERNAL, which maps to IN_PROGRESS. |
697 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); | 741 CleanupItem(item, nullptr, DownloadItem::IN_PROGRESS); |
(...skipping 13 matching lines...) Expand all Loading... |
711 ASSERT_TRUE(observer.download_removed()); | 755 ASSERT_TRUE(observer.download_removed()); |
712 } | 756 } |
713 | 757 |
714 TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { | 758 TEST_F(DownloadItemTest, NotificationAfterOnContentCheckCompleted) { |
715 // Setting to NOT_DANGEROUS does not trigger a notification. | 759 // Setting to NOT_DANGEROUS does not trigger a notification. |
716 DownloadItemImpl* safe_item = CreateDownloadItem(); | 760 DownloadItemImpl* safe_item = CreateDownloadItem(); |
717 MockDownloadFile* download_file = | 761 MockDownloadFile* download_file = |
718 DoIntermediateRename(safe_item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 762 DoIntermediateRename(safe_item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
719 TestDownloadItemObserver safe_observer(safe_item); | 763 TestDownloadItemObserver safe_observer(safe_item); |
720 | 764 |
721 safe_item->OnAllDataSaved(std::string()); | 765 safe_item->OnAllDataSaved(0, scoped_ptr<crypto::SecureHash>()); |
722 EXPECT_TRUE(safe_observer.CheckAndResetDownloadUpdated()); | 766 EXPECT_TRUE(safe_observer.CheckAndResetDownloadUpdated()); |
723 safe_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 767 safe_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
724 EXPECT_TRUE(safe_observer.CheckAndResetDownloadUpdated()); | 768 EXPECT_TRUE(safe_observer.CheckAndResetDownloadUpdated()); |
725 CleanupItem(safe_item, download_file, DownloadItem::IN_PROGRESS); | 769 CleanupItem(safe_item, download_file, DownloadItem::IN_PROGRESS); |
726 | 770 |
727 // Setting to unsafe url or unsafe file should trigger a notification. | 771 // Setting to unsafe url or unsafe file should trigger a notification. |
728 DownloadItemImpl* unsafeurl_item = | 772 DownloadItemImpl* unsafeurl_item = |
729 CreateDownloadItem(); | 773 CreateDownloadItem(); |
730 download_file = | 774 download_file = |
731 DoIntermediateRename(unsafeurl_item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 775 DoIntermediateRename(unsafeurl_item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
732 TestDownloadItemObserver unsafeurl_observer(unsafeurl_item); | 776 TestDownloadItemObserver unsafeurl_observer(unsafeurl_item); |
733 | 777 |
734 unsafeurl_item->OnAllDataSaved(std::string()); | 778 unsafeurl_item->OnAllDataSaved(0, scoped_ptr<crypto::SecureHash>()); |
735 EXPECT_TRUE(unsafeurl_observer.CheckAndResetDownloadUpdated()); | 779 EXPECT_TRUE(unsafeurl_observer.CheckAndResetDownloadUpdated()); |
736 unsafeurl_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_URL); | 780 unsafeurl_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_URL); |
737 EXPECT_TRUE(unsafeurl_observer.CheckAndResetDownloadUpdated()); | 781 EXPECT_TRUE(unsafeurl_observer.CheckAndResetDownloadUpdated()); |
738 | 782 |
739 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) | 783 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) |
740 .WillOnce(Return(true)); | 784 .WillOnce(Return(true)); |
741 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)); | 785 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)); |
742 unsafeurl_item->ValidateDangerousDownload(); | 786 unsafeurl_item->ValidateDangerousDownload(); |
743 EXPECT_TRUE(unsafeurl_observer.CheckAndResetDownloadUpdated()); | 787 EXPECT_TRUE(unsafeurl_observer.CheckAndResetDownloadUpdated()); |
744 CleanupItem(unsafeurl_item, download_file, DownloadItem::IN_PROGRESS); | 788 CleanupItem(unsafeurl_item, download_file, DownloadItem::IN_PROGRESS); |
745 | 789 |
746 DownloadItemImpl* unsafefile_item = | 790 DownloadItemImpl* unsafefile_item = |
747 CreateDownloadItem(); | 791 CreateDownloadItem(); |
748 download_file = | 792 download_file = |
749 DoIntermediateRename(unsafefile_item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 793 DoIntermediateRename(unsafefile_item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
750 TestDownloadItemObserver unsafefile_observer(unsafefile_item); | 794 TestDownloadItemObserver unsafefile_observer(unsafefile_item); |
751 | 795 |
752 unsafefile_item->OnAllDataSaved(std::string()); | 796 unsafefile_item->OnAllDataSaved(0, scoped_ptr<crypto::SecureHash>()); |
753 EXPECT_TRUE(unsafefile_observer.CheckAndResetDownloadUpdated()); | 797 EXPECT_TRUE(unsafefile_observer.CheckAndResetDownloadUpdated()); |
754 unsafefile_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 798 unsafefile_item->OnContentCheckCompleted(DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
755 EXPECT_TRUE(unsafefile_observer.CheckAndResetDownloadUpdated()); | 799 EXPECT_TRUE(unsafefile_observer.CheckAndResetDownloadUpdated()); |
756 | 800 |
757 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) | 801 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)) |
758 .WillOnce(Return(true)); | 802 .WillOnce(Return(true)); |
759 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)); | 803 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)); |
760 unsafefile_item->ValidateDangerousDownload(); | 804 unsafefile_item->ValidateDangerousDownload(); |
761 EXPECT_TRUE(unsafefile_observer.CheckAndResetDownloadUpdated()); | 805 EXPECT_TRUE(unsafefile_observer.CheckAndResetDownloadUpdated()); |
762 CleanupItem(unsafefile_item, download_file, DownloadItem::IN_PROGRESS); | 806 CleanupItem(unsafefile_item, download_file, DownloadItem::IN_PROGRESS); |
763 } | 807 } |
764 | 808 |
765 // DownloadItemImpl::OnDownloadTargetDetermined will schedule a task to run | 809 // DownloadItemImpl::OnDownloadTargetDetermined will schedule a task to run |
766 // DownloadFile::Rename(). Once the rename | 810 // DownloadFile::Rename(). Once the rename |
767 // completes, DownloadItemImpl receives a notification with the new file | 811 // completes, DownloadItemImpl receives a notification with the new file |
768 // name. Check that observers are updated when the new filename is available and | 812 // name. Check that observers are updated when the new filename is available and |
769 // not before. | 813 // not before. |
770 TEST_F(DownloadItemTest, NotificationAfterOnDownloadTargetDetermined) { | 814 TEST_F(DownloadItemTest, NotificationAfterOnDownloadTargetDetermined) { |
771 DownloadItemImpl* item = CreateDownloadItem(); | 815 DownloadItemImpl* item = CreateDownloadItem(); |
772 DownloadItemImplDelegate::DownloadTargetCallback callback; | 816 DownloadItemImplDelegate::DownloadTargetCallback callback; |
773 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 817 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
774 TestDownloadItemObserver observer(item); | 818 TestDownloadItemObserver observer(item); |
775 base::FilePath target_path(kDummyTargetPath); | 819 base::FilePath target_path(kDummyTargetPath); |
776 base::FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x")); | 820 base::FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x")); |
777 base::FilePath new_intermediate_path( | 821 base::FilePath new_intermediate_path( |
778 target_path.InsertBeforeExtensionASCII("y")); | 822 target_path.InsertBeforeExtensionASCII("y")); |
779 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 823 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
780 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 824 .WillOnce(ScheduleRenameAndUniquifyCallback( |
781 new_intermediate_path)); | 825 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); |
782 | 826 |
783 // Currently, a notification would be generated if the danger type is anything | 827 // Currently, a notification would be generated if the danger type is anything |
784 // other than NOT_DANGEROUS. | 828 // other than NOT_DANGEROUS. |
785 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 829 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
786 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 830 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
787 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); | 831 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); |
788 RunAllPendingInMessageLoops(); | 832 RunAllPendingInMessageLoops(); |
789 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 833 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
790 EXPECT_EQ(new_intermediate_path, item->GetFullPath()); | 834 EXPECT_EQ(new_intermediate_path, item->GetFullPath()); |
791 | 835 |
(...skipping 29 matching lines...) Expand all Loading... |
821 TEST_F(DownloadItemTest, DisplayName) { | 865 TEST_F(DownloadItemTest, DisplayName) { |
822 DownloadItemImpl* item = CreateDownloadItem(); | 866 DownloadItemImpl* item = CreateDownloadItem(); |
823 DownloadItemImplDelegate::DownloadTargetCallback callback; | 867 DownloadItemImplDelegate::DownloadTargetCallback callback; |
824 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 868 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
825 base::FilePath target_path( | 869 base::FilePath target_path( |
826 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 870 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
827 base::FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x")); | 871 base::FilePath intermediate_path(target_path.InsertBeforeExtensionASCII("x")); |
828 EXPECT_EQ(FILE_PATH_LITERAL(""), | 872 EXPECT_EQ(FILE_PATH_LITERAL(""), |
829 item->GetFileNameToReportUser().value()); | 873 item->GetFileNameToReportUser().value()); |
830 EXPECT_CALL(*download_file, RenameAndUniquify(_, _)) | 874 EXPECT_CALL(*download_file, RenameAndUniquify(_, _)) |
831 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 875 .WillOnce(ScheduleRenameAndUniquifyCallback( |
832 intermediate_path)); | 876 DOWNLOAD_INTERRUPT_REASON_NONE, intermediate_path)); |
833 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 877 callback.Run(target_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
834 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 878 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
835 RunAllPendingInMessageLoops(); | 879 RunAllPendingInMessageLoops(); |
836 EXPECT_EQ(FILE_PATH_LITERAL("foo.bar"), | 880 EXPECT_EQ(FILE_PATH_LITERAL("foo.bar"), |
837 item->GetFileNameToReportUser().value()); | 881 item->GetFileNameToReportUser().value()); |
838 item->SetDisplayName(base::FilePath(FILE_PATH_LITERAL("new.name"))); | 882 item->SetDisplayName(base::FilePath(FILE_PATH_LITERAL("new.name"))); |
839 EXPECT_EQ(FILE_PATH_LITERAL("new.name"), | 883 EXPECT_EQ(FILE_PATH_LITERAL("new.name"), |
840 item->GetFileNameToReportUser().value()); | 884 item->GetFileNameToReportUser().value()); |
841 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); | 885 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); |
842 } | 886 } |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 TEST_F(DownloadItemTest, CallbackAfterRename) { | 969 TEST_F(DownloadItemTest, CallbackAfterRename) { |
926 DownloadItemImpl* item = CreateDownloadItem(); | 970 DownloadItemImpl* item = CreateDownloadItem(); |
927 DownloadItemImplDelegate::DownloadTargetCallback callback; | 971 DownloadItemImplDelegate::DownloadTargetCallback callback; |
928 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 972 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
929 base::FilePath final_path( | 973 base::FilePath final_path( |
930 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 974 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
931 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 975 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
932 base::FilePath new_intermediate_path( | 976 base::FilePath new_intermediate_path( |
933 final_path.InsertBeforeExtensionASCII("y")); | 977 final_path.InsertBeforeExtensionASCII("y")); |
934 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 978 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
935 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 979 .WillOnce(ScheduleRenameAndUniquifyCallback( |
936 new_intermediate_path)); | 980 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); |
937 | 981 |
938 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 982 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
939 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 983 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
940 RunAllPendingInMessageLoops(); | 984 RunAllPendingInMessageLoops(); |
941 // All the callbacks should have happened by now. | 985 // All the callbacks should have happened by now. |
942 ::testing::Mock::VerifyAndClearExpectations(download_file); | 986 ::testing::Mock::VerifyAndClearExpectations(download_file); |
943 mock_delegate()->VerifyAndClearExpectations(); | 987 mock_delegate()->VerifyAndClearExpectations(); |
944 | 988 |
945 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 989 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
946 .WillOnce(Return(true)); | 990 .WillOnce(Return(true)); |
947 EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _)) | 991 EXPECT_CALL(*download_file, RenameAndAnnotate(final_path, _, _, _, _)) |
948 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 992 .WillOnce(ScheduleRenameAndAnnotateCallback( |
949 final_path)); | 993 DOWNLOAD_INTERRUPT_REASON_NONE, final_path)); |
950 EXPECT_CALL(*download_file, FullPath()) | 994 EXPECT_CALL(*download_file, FullPath()) |
951 .WillOnce(Return(base::FilePath())); | 995 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
952 EXPECT_CALL(*download_file, Detach()); | 996 EXPECT_CALL(*download_file, Detach()); |
953 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 997 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 998 0, scoped_ptr<crypto::SecureHash>()); |
954 RunAllPendingInMessageLoops(); | 999 RunAllPendingInMessageLoops(); |
955 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1000 ::testing::Mock::VerifyAndClearExpectations(download_file); |
956 mock_delegate()->VerifyAndClearExpectations(); | 1001 mock_delegate()->VerifyAndClearExpectations(); |
957 } | 1002 } |
958 | 1003 |
959 // Test that the delegate is invoked after the download file is renamed and the | 1004 // Test that the delegate is invoked after the download file is renamed and the |
960 // download item is in an interrupted state. | 1005 // download item is in an interrupted state. |
961 TEST_F(DownloadItemTest, CallbackAfterInterruptedRename) { | 1006 TEST_F(DownloadItemTest, CallbackAfterInterruptedRename) { |
962 DownloadItemImpl* item = CreateDownloadItem(); | 1007 DownloadItemImpl* item = CreateDownloadItem(); |
963 DownloadItemImplDelegate::DownloadTargetCallback callback; | 1008 DownloadItemImplDelegate::DownloadTargetCallback callback; |
964 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 1009 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
965 base::FilePath final_path( | 1010 base::FilePath final_path( |
966 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 1011 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
967 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1012 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
968 base::FilePath new_intermediate_path( | 1013 base::FilePath new_intermediate_path( |
969 final_path.InsertBeforeExtensionASCII("y")); | 1014 final_path.InsertBeforeExtensionASCII("y")); |
970 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1015 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
971 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 1016 .WillOnce(ScheduleRenameAndUniquifyCallback( |
972 new_intermediate_path)); | 1017 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, new_intermediate_path)); |
973 EXPECT_CALL(*download_file, Cancel()) | 1018 EXPECT_CALL(*download_file, Cancel()) |
974 .Times(1); | 1019 .Times(1); |
975 | 1020 |
976 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1021 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
977 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1022 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
978 RunAllPendingInMessageLoops(); | 1023 RunAllPendingInMessageLoops(); |
979 // All the callbacks should have happened by now. | 1024 // All the callbacks should have happened by now. |
980 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1025 ::testing::Mock::VerifyAndClearExpectations(download_file); |
981 mock_delegate()->VerifyAndClearExpectations(); | 1026 mock_delegate()->VerifyAndClearExpectations(); |
982 } | 1027 } |
983 | 1028 |
984 TEST_F(DownloadItemTest, Interrupted) { | 1029 TEST_F(DownloadItemTest, Interrupted) { |
985 DownloadItemImpl* item = CreateDownloadItem(); | 1030 DownloadItemImpl* item = CreateDownloadItem(); |
986 MockDownloadFile* download_file = | 1031 MockDownloadFile* download_file = |
987 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1032 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
988 | 1033 |
989 const DownloadInterruptReason reason( | 1034 const DownloadInterruptReason reason( |
990 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); | 1035 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); |
991 | 1036 |
992 // Confirm interrupt sets state properly. | 1037 // Confirm interrupt sets state properly. |
993 EXPECT_CALL(*download_file, Cancel()); | 1038 EXPECT_CALL(*download_file, Cancel()); |
994 item->DestinationObserverAsWeakPtr()->DestinationError(reason); | 1039 item->DestinationObserverAsWeakPtr()->DestinationError( |
| 1040 reason, 0, scoped_ptr<crypto::SecureHash>()); |
995 RunAllPendingInMessageLoops(); | 1041 RunAllPendingInMessageLoops(); |
996 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1042 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
997 EXPECT_EQ(reason, item->GetLastReason()); | 1043 EXPECT_EQ(reason, item->GetLastReason()); |
998 | 1044 |
999 // Cancel should kill it. | 1045 // Cancel should kill it. |
1000 item->Cancel(true); | 1046 item->Cancel(true); |
1001 EXPECT_EQ(DownloadItem::CANCELLED, item->GetState()); | 1047 EXPECT_EQ(DownloadItem::CANCELLED, item->GetState()); |
1002 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_USER_CANCELED, item->GetLastReason()); | 1048 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_USER_CANCELED, item->GetLastReason()); |
1003 } | 1049 } |
1004 | 1050 |
1005 // Destination errors that occur before the intermediate rename shouldn't cause | 1051 // Destination errors that occur before the intermediate rename shouldn't cause |
1006 // the download to be marked as interrupted until after the intermediate rename. | 1052 // the download to be marked as interrupted until after the intermediate rename. |
1007 TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Restart) { | 1053 TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Restart) { |
1008 DownloadItemImpl* item = CreateDownloadItem(); | 1054 DownloadItemImpl* item = CreateDownloadItem(); |
1009 DownloadItemImplDelegate::DownloadTargetCallback callback; | 1055 DownloadItemImplDelegate::DownloadTargetCallback callback; |
1010 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 1056 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
1011 item->DestinationObserverAsWeakPtr()->DestinationError( | 1057 item->DestinationObserverAsWeakPtr()->DestinationError( |
1012 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); | 1058 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 1059 0, |
| 1060 scoped_ptr<crypto::SecureHash>()); |
1013 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1061 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1014 | 1062 |
1015 base::FilePath final_path( | 1063 base::FilePath final_path( |
1016 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 1064 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
1017 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1065 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
1018 base::FilePath new_intermediate_path( | 1066 base::FilePath new_intermediate_path( |
1019 final_path.InsertBeforeExtensionASCII("y")); | 1067 final_path.InsertBeforeExtensionASCII("y")); |
1020 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1068 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
1021 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1069 .WillOnce(ScheduleRenameAndUniquifyCallback( |
1022 new_intermediate_path)); | 1070 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); |
1023 EXPECT_CALL(*download_file, Cancel()) | 1071 EXPECT_CALL(*download_file, Cancel()) |
1024 .Times(1); | 1072 .Times(1); |
1025 | 1073 |
1026 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1074 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
1027 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1075 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
1028 RunAllPendingInMessageLoops(); | 1076 RunAllPendingInMessageLoops(); |
1029 // All the callbacks should have happened by now. | 1077 // All the callbacks should have happened by now. |
1030 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1078 ::testing::Mock::VerifyAndClearExpectations(download_file); |
1031 mock_delegate()->VerifyAndClearExpectations(); | 1079 mock_delegate()->VerifyAndClearExpectations(); |
1032 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1080 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
1033 EXPECT_TRUE(item->GetFullPath().empty()); | 1081 EXPECT_TRUE(item->GetFullPath().empty()); |
1034 EXPECT_EQ(final_path, item->GetTargetFilePath()); | 1082 EXPECT_EQ(final_path, item->GetTargetFilePath()); |
1035 } | 1083 } |
1036 | 1084 |
1037 // As above. But if the download can be resumed by continuing, then the | 1085 // As above. But if the download can be resumed by continuing, then the |
1038 // intermediate path should be retained when the download is interrupted after | 1086 // intermediate path should be retained when the download is interrupted after |
1039 // the intermediate rename succeeds. | 1087 // the intermediate rename succeeds. |
1040 TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Continue) { | 1088 TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Continue) { |
1041 DownloadItemImpl* item = CreateDownloadItem(); | 1089 DownloadItemImpl* item = CreateDownloadItem(); |
1042 DownloadItemImplDelegate::DownloadTargetCallback callback; | 1090 DownloadItemImplDelegate::DownloadTargetCallback callback; |
1043 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 1091 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
1044 item->DestinationObserverAsWeakPtr()->DestinationError( | 1092 item->DestinationObserverAsWeakPtr()->DestinationError( |
1045 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); | 1093 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 1094 0, |
| 1095 scoped_ptr<crypto::SecureHash>()); |
1046 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1096 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1047 | 1097 |
1048 base::FilePath final_path( | 1098 base::FilePath final_path( |
1049 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 1099 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
1050 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1100 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
1051 base::FilePath new_intermediate_path( | 1101 base::FilePath new_intermediate_path( |
1052 final_path.InsertBeforeExtensionASCII("y")); | 1102 final_path.InsertBeforeExtensionASCII("y")); |
1053 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1103 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
1054 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1104 .WillOnce(ScheduleRenameAndUniquifyCallback( |
1055 new_intermediate_path)); | 1105 DOWNLOAD_INTERRUPT_REASON_NONE, new_intermediate_path)); |
1056 EXPECT_CALL(*download_file, FullPath()) | 1106 EXPECT_CALL(*download_file, FullPath()) |
1057 .WillOnce(Return(base::FilePath(new_intermediate_path))); | 1107 .WillOnce(ReturnRefOfCopy(base::FilePath(new_intermediate_path))); |
1058 EXPECT_CALL(*download_file, Detach()); | 1108 EXPECT_CALL(*download_file, Detach()); |
1059 | 1109 |
1060 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1110 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
1061 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1111 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
1062 RunAllPendingInMessageLoops(); | 1112 RunAllPendingInMessageLoops(); |
1063 // All the callbacks should have happened by now. | 1113 // All the callbacks should have happened by now. |
1064 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1114 ::testing::Mock::VerifyAndClearExpectations(download_file); |
1065 mock_delegate()->VerifyAndClearExpectations(); | 1115 mock_delegate()->VerifyAndClearExpectations(); |
1066 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1116 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
1067 EXPECT_EQ(new_intermediate_path, item->GetFullPath()); | 1117 EXPECT_EQ(new_intermediate_path, item->GetFullPath()); |
1068 EXPECT_EQ(final_path, item->GetTargetFilePath()); | 1118 EXPECT_EQ(final_path, item->GetTargetFilePath()); |
1069 } | 1119 } |
1070 | 1120 |
1071 // As above. If the intermediate rename fails, then the interrupt reason should | 1121 // As above. If the intermediate rename fails, then the interrupt reason should |
1072 // be set to the destination error and the intermediate path should be empty. | 1122 // be set to the file error and the intermediate path should be empty. |
1073 TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Failed) { | 1123 TEST_F(DownloadItemTest, InterruptedBeforeIntermediateRename_Failed) { |
1074 DownloadItemImpl* item = CreateDownloadItem(); | 1124 DownloadItemImpl* item = CreateDownloadItem(); |
1075 DownloadItemImplDelegate::DownloadTargetCallback callback; | 1125 DownloadItemImplDelegate::DownloadTargetCallback callback; |
1076 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); | 1126 MockDownloadFile* download_file = CallDownloadItemStart(item, &callback); |
1077 item->DestinationObserverAsWeakPtr()->DestinationError( | 1127 item->DestinationObserverAsWeakPtr()->DestinationError( |
1078 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); | 1128 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 1129 0, |
| 1130 scoped_ptr<crypto::SecureHash>()); |
1079 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1131 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1080 | 1132 |
1081 base::FilePath final_path( | 1133 base::FilePath final_path( |
1082 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); | 1134 base::FilePath(kDummyTargetPath).AppendASCII("foo.bar")); |
1083 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); | 1135 base::FilePath intermediate_path(final_path.InsertBeforeExtensionASCII("x")); |
1084 base::FilePath new_intermediate_path( | 1136 base::FilePath new_intermediate_path( |
1085 final_path.InsertBeforeExtensionASCII("y")); | 1137 final_path.InsertBeforeExtensionASCII("y")); |
1086 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) | 1138 EXPECT_CALL(*download_file, RenameAndUniquify(intermediate_path, _)) |
1087 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, | 1139 .WillOnce(ScheduleRenameAndUniquifyCallback( |
1088 new_intermediate_path)); | 1140 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, new_intermediate_path)); |
1089 EXPECT_CALL(*download_file, Cancel()) | 1141 EXPECT_CALL(*download_file, Cancel()) |
1090 .Times(1); | 1142 .Times(1); |
1091 | 1143 |
1092 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, | 1144 callback.Run(final_path, DownloadItem::TARGET_DISPOSITION_OVERWRITE, |
1093 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); | 1145 DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, intermediate_path); |
1094 RunAllPendingInMessageLoops(); | 1146 RunAllPendingInMessageLoops(); |
1095 // All the callbacks should have happened by now. | 1147 // All the callbacks should have happened by now. |
1096 ::testing::Mock::VerifyAndClearExpectations(download_file); | 1148 ::testing::Mock::VerifyAndClearExpectations(download_file); |
1097 mock_delegate()->VerifyAndClearExpectations(); | 1149 mock_delegate()->VerifyAndClearExpectations(); |
1098 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1150 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
1099 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason()); | 1151 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, item->GetLastReason()); |
1100 EXPECT_TRUE(item->GetFullPath().empty()); | 1152 EXPECT_TRUE(item->GetFullPath().empty()); |
1101 EXPECT_EQ(final_path, item->GetTargetFilePath()); | 1153 EXPECT_EQ(final_path, item->GetTargetFilePath()); |
1102 } | 1154 } |
1103 | 1155 |
1104 TEST_F(DownloadItemTest, Canceled) { | 1156 TEST_F(DownloadItemTest, Canceled) { |
1105 DownloadItemImpl* item = CreateDownloadItem(); | 1157 DownloadItemImpl* item = CreateDownloadItem(); |
1106 DownloadItemImplDelegate::DownloadTargetCallback target_callback; | 1158 DownloadItemImplDelegate::DownloadTargetCallback target_callback; |
1107 MockDownloadFile* download_file = | 1159 MockDownloadFile* download_file = |
1108 CallDownloadItemStart(item, &target_callback); | 1160 CallDownloadItemStart(item, &target_callback); |
1109 | 1161 |
(...skipping 13 matching lines...) Expand all Loading... |
1123 | 1175 |
1124 TEST_F(DownloadItemTest, DestinationUpdate) { | 1176 TEST_F(DownloadItemTest, DestinationUpdate) { |
1125 DownloadItemImpl* item = CreateDownloadItem(); | 1177 DownloadItemImpl* item = CreateDownloadItem(); |
1126 MockDownloadFile* file = | 1178 MockDownloadFile* file = |
1127 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1179 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1128 base::WeakPtr<DownloadDestinationObserver> as_observer( | 1180 base::WeakPtr<DownloadDestinationObserver> as_observer( |
1129 item->DestinationObserverAsWeakPtr()); | 1181 item->DestinationObserverAsWeakPtr()); |
1130 TestDownloadItemObserver observer(item); | 1182 TestDownloadItemObserver observer(item); |
1131 | 1183 |
1132 EXPECT_EQ(0l, item->CurrentSpeed()); | 1184 EXPECT_EQ(0l, item->CurrentSpeed()); |
1133 EXPECT_EQ("", item->GetHashState()); | |
1134 EXPECT_EQ(0l, item->GetReceivedBytes()); | 1185 EXPECT_EQ(0l, item->GetReceivedBytes()); |
1135 EXPECT_EQ(0l, item->GetTotalBytes()); | 1186 EXPECT_EQ(0l, item->GetTotalBytes()); |
1136 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); | 1187 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); |
1137 item->SetTotalBytes(100l); | 1188 item->SetTotalBytes(100l); |
1138 EXPECT_EQ(100l, item->GetTotalBytes()); | 1189 EXPECT_EQ(100l, item->GetTotalBytes()); |
1139 | 1190 |
1140 as_observer->DestinationUpdate(10, 20, "deadbeef"); | 1191 as_observer->DestinationUpdate(10, 20); |
1141 EXPECT_EQ(20l, item->CurrentSpeed()); | 1192 EXPECT_EQ(20l, item->CurrentSpeed()); |
1142 EXPECT_EQ("deadbeef", item->GetHashState()); | |
1143 EXPECT_EQ(10l, item->GetReceivedBytes()); | 1193 EXPECT_EQ(10l, item->GetReceivedBytes()); |
1144 EXPECT_EQ(100l, item->GetTotalBytes()); | 1194 EXPECT_EQ(100l, item->GetTotalBytes()); |
1145 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 1195 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
1146 | 1196 |
1147 as_observer->DestinationUpdate(200, 20, "livebeef"); | 1197 as_observer->DestinationUpdate(200, 20); |
1148 EXPECT_EQ(20l, item->CurrentSpeed()); | 1198 EXPECT_EQ(20l, item->CurrentSpeed()); |
1149 EXPECT_EQ("livebeef", item->GetHashState()); | |
1150 EXPECT_EQ(200l, item->GetReceivedBytes()); | 1199 EXPECT_EQ(200l, item->GetReceivedBytes()); |
1151 EXPECT_EQ(0l, item->GetTotalBytes()); | 1200 EXPECT_EQ(0l, item->GetTotalBytes()); |
1152 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 1201 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
1153 | 1202 |
1154 CleanupItem(item, file, DownloadItem::IN_PROGRESS); | 1203 CleanupItem(item, file, DownloadItem::IN_PROGRESS); |
1155 } | 1204 } |
1156 | 1205 |
1157 TEST_F(DownloadItemTest, DestinationError) { | 1206 TEST_F(DownloadItemTest, DestinationError_NoRestartRequired) { |
1158 DownloadItemImpl* item = CreateDownloadItem(); | 1207 DownloadItemImpl* item = CreateDownloadItem(); |
1159 MockDownloadFile* download_file = | 1208 MockDownloadFile* download_file = |
1160 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1209 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1161 base::WeakPtr<DownloadDestinationObserver> as_observer( | 1210 base::WeakPtr<DownloadDestinationObserver> as_observer( |
1162 item->DestinationObserverAsWeakPtr()); | 1211 item->DestinationObserverAsWeakPtr()); |
1163 TestDownloadItemObserver observer(item); | 1212 TestDownloadItemObserver observer(item); |
1164 | 1213 |
1165 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1214 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1166 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); | 1215 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); |
1167 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); | 1216 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); |
1168 | 1217 |
1169 EXPECT_CALL(*download_file, Cancel()); | 1218 scoped_ptr<crypto::SecureHash> hash( |
| 1219 crypto::SecureHash::Create(crypto::SecureHash::SHA256)); |
| 1220 hash->Update(kTestData1, sizeof(kTestData1)); |
| 1221 |
| 1222 EXPECT_CALL(*download_file, Detach()); |
1170 as_observer->DestinationError( | 1223 as_observer->DestinationError( |
1171 DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED); | 1224 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 0, std::move(hash)); |
1172 mock_delegate()->VerifyAndClearExpectations(); | 1225 mock_delegate()->VerifyAndClearExpectations(); |
1173 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 1226 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
1174 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1227 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
1175 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, | 1228 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, item->GetLastReason()); |
1176 item->GetLastReason()); | 1229 EXPECT_EQ( |
| 1230 std::string(std::begin(kHashOfTestData1), std::end(kHashOfTestData1)), |
| 1231 item->GetHash()); |
| 1232 } |
| 1233 TEST_F(DownloadItemTest, DestinationError_RestartRequired) { |
| 1234 DownloadItemImpl* item = CreateDownloadItem(); |
| 1235 MockDownloadFile* download_file = |
| 1236 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
| 1237 base::WeakPtr<DownloadDestinationObserver> as_observer( |
| 1238 item->DestinationObserverAsWeakPtr()); |
| 1239 TestDownloadItemObserver observer(item); |
| 1240 |
| 1241 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
| 1242 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_NONE, item->GetLastReason()); |
| 1243 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); |
| 1244 |
| 1245 scoped_ptr<crypto::SecureHash> hash( |
| 1246 crypto::SecureHash::Create(crypto::SecureHash::SHA256)); |
| 1247 hash->Update(kTestData1, sizeof(kTestData1)); |
| 1248 |
| 1249 EXPECT_CALL(*download_file, Cancel()); |
| 1250 as_observer->DestinationError( |
| 1251 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 0, std::move(hash)); |
| 1252 mock_delegate()->VerifyAndClearExpectations(); |
| 1253 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
| 1254 EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
| 1255 EXPECT_EQ(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, item->GetLastReason()); |
| 1256 EXPECT_EQ(std::string(), item->GetHash()); |
1177 } | 1257 } |
1178 | 1258 |
1179 TEST_F(DownloadItemTest, DestinationCompleted) { | 1259 TEST_F(DownloadItemTest, DestinationCompleted) { |
1180 DownloadItemImpl* item = CreateDownloadItem(); | 1260 DownloadItemImpl* item = CreateDownloadItem(); |
1181 MockDownloadFile* download_file = | 1261 MockDownloadFile* download_file = |
1182 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1262 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1183 base::WeakPtr<DownloadDestinationObserver> as_observer( | 1263 base::WeakPtr<DownloadDestinationObserver> as_observer( |
1184 item->DestinationObserverAsWeakPtr()); | 1264 item->DestinationObserverAsWeakPtr()); |
1185 TestDownloadItemObserver observer(item); | 1265 TestDownloadItemObserver observer(item); |
1186 | 1266 |
1187 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1267 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1188 EXPECT_EQ("", item->GetHash()); | 1268 EXPECT_EQ("", item->GetHash()); |
1189 EXPECT_EQ("", item->GetHashState()); | |
1190 EXPECT_FALSE(item->AllDataSaved()); | 1269 EXPECT_FALSE(item->AllDataSaved()); |
1191 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); | 1270 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); |
1192 | 1271 |
1193 as_observer->DestinationUpdate(10, 20, "deadbeef"); | 1272 as_observer->DestinationUpdate(10, 20); |
1194 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 1273 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
1195 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); // Confirm reset. | 1274 EXPECT_FALSE(observer.CheckAndResetDownloadUpdated()); // Confirm reset. |
1196 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1275 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1197 EXPECT_EQ("", item->GetHash()); | 1276 EXPECT_EQ("", item->GetHash()); |
1198 EXPECT_EQ("deadbeef", item->GetHashState()); | |
1199 EXPECT_FALSE(item->AllDataSaved()); | 1277 EXPECT_FALSE(item->AllDataSaved()); |
1200 | 1278 |
| 1279 scoped_ptr<crypto::SecureHash> hash( |
| 1280 crypto::SecureHash::Create(crypto::SecureHash::SHA256)); |
| 1281 hash->Update(kTestData1, sizeof(kTestData1)); |
| 1282 |
1201 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)); | 1283 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(_, _)); |
1202 as_observer->DestinationCompleted("livebeef"); | 1284 as_observer->DestinationCompleted(10, std::move(hash)); |
1203 mock_delegate()->VerifyAndClearExpectations(); | 1285 mock_delegate()->VerifyAndClearExpectations(); |
1204 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1286 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1205 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); | 1287 EXPECT_TRUE(observer.CheckAndResetDownloadUpdated()); |
1206 EXPECT_EQ("livebeef", item->GetHash()); | 1288 EXPECT_EQ( |
1207 EXPECT_EQ("", item->GetHashState()); | 1289 std::string(std::begin(kHashOfTestData1), std::end(kHashOfTestData1)), |
| 1290 item->GetHash()); |
1208 EXPECT_TRUE(item->AllDataSaved()); | 1291 EXPECT_TRUE(item->AllDataSaved()); |
1209 | 1292 |
1210 // Even though the DownloadItem receives a DestinationCompleted() event, | 1293 // Even though the DownloadItem receives a DestinationCompleted() event, |
1211 // target determination hasn't completed, hence the download item is stuck in | 1294 // target determination hasn't completed, hence the download item is stuck in |
1212 // TARGET_PENDING. | 1295 // TARGET_PENDING. |
1213 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); | 1296 CleanupItem(item, download_file, DownloadItem::IN_PROGRESS); |
1214 } | 1297 } |
1215 | 1298 |
1216 TEST_F(DownloadItemTest, EnabledActionsForNormalDownload) { | 1299 TEST_F(DownloadItemTest, EnabledActionsForNormalDownload) { |
1217 DownloadItemImpl* item = CreateDownloadItem(); | 1300 DownloadItemImpl* item = CreateDownloadItem(); |
1218 MockDownloadFile* download_file = | 1301 MockDownloadFile* download_file = |
1219 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1302 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1220 | 1303 |
1221 // InProgress | 1304 // InProgress |
1222 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1305 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1223 ASSERT_FALSE(item->GetTargetFilePath().empty()); | 1306 ASSERT_FALSE(item->GetTargetFilePath().empty()); |
1224 EXPECT_TRUE(item->CanShowInFolder()); | 1307 EXPECT_TRUE(item->CanShowInFolder()); |
1225 EXPECT_TRUE(item->CanOpenDownload()); | 1308 EXPECT_TRUE(item->CanOpenDownload()); |
1226 | 1309 |
1227 // Complete | 1310 // Complete |
1228 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)) | 1311 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)) |
1229 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1312 .WillOnce(ScheduleRenameAndAnnotateCallback( |
1230 base::FilePath(kDummyTargetPath))); | 1313 DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath))); |
1231 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1314 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
1232 .WillOnce(Return(true)); | 1315 .WillOnce(Return(true)); |
1233 EXPECT_CALL(*download_file, FullPath()) | 1316 EXPECT_CALL(*download_file, FullPath()) |
1234 .WillOnce(Return(base::FilePath())); | 1317 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
1235 EXPECT_CALL(*download_file, Detach()); | 1318 EXPECT_CALL(*download_file, Detach()); |
1236 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 1319 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 1320 0, scoped_ptr<crypto::SecureHash>()); |
1237 RunAllPendingInMessageLoops(); | 1321 RunAllPendingInMessageLoops(); |
1238 | 1322 |
1239 ASSERT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1323 ASSERT_EQ(DownloadItem::COMPLETE, item->GetState()); |
1240 EXPECT_TRUE(item->CanShowInFolder()); | 1324 EXPECT_TRUE(item->CanShowInFolder()); |
1241 EXPECT_TRUE(item->CanOpenDownload()); | 1325 EXPECT_TRUE(item->CanOpenDownload()); |
1242 } | 1326 } |
1243 | 1327 |
1244 TEST_F(DownloadItemTest, EnabledActionsForTemporaryDownload) { | 1328 TEST_F(DownloadItemTest, EnabledActionsForTemporaryDownload) { |
1245 DownloadItemImpl* item = CreateDownloadItem(); | 1329 DownloadItemImpl* item = CreateDownloadItem(); |
1246 MockDownloadFile* download_file = | 1330 MockDownloadFile* download_file = |
1247 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1331 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1248 item->SetIsTemporary(true); | 1332 item->SetIsTemporary(true); |
1249 | 1333 |
1250 // InProgress Temporary | 1334 // InProgress Temporary |
1251 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1335 ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1252 ASSERT_FALSE(item->GetTargetFilePath().empty()); | 1336 ASSERT_FALSE(item->GetTargetFilePath().empty()); |
1253 ASSERT_TRUE(item->IsTemporary()); | 1337 ASSERT_TRUE(item->IsTemporary()); |
1254 EXPECT_FALSE(item->CanShowInFolder()); | 1338 EXPECT_FALSE(item->CanShowInFolder()); |
1255 EXPECT_FALSE(item->CanOpenDownload()); | 1339 EXPECT_FALSE(item->CanOpenDownload()); |
1256 | 1340 |
1257 // Complete Temporary | 1341 // Complete Temporary |
1258 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1342 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
1259 .WillOnce(Return(true)); | 1343 .WillOnce(Return(true)); |
1260 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _)) | 1344 EXPECT_CALL(*download_file, RenameAndAnnotate(_, _, _, _, _)) |
1261 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1345 .WillOnce(ScheduleRenameAndAnnotateCallback( |
1262 base::FilePath(kDummyTargetPath))); | 1346 DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath))); |
1263 EXPECT_CALL(*download_file, FullPath()) | 1347 EXPECT_CALL(*download_file, FullPath()) |
1264 .WillOnce(Return(base::FilePath())); | 1348 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
1265 EXPECT_CALL(*download_file, Detach()); | 1349 EXPECT_CALL(*download_file, Detach()); |
1266 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 1350 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 1351 0, scoped_ptr<crypto::SecureHash>()); |
1267 RunAllPendingInMessageLoops(); | 1352 RunAllPendingInMessageLoops(); |
1268 | 1353 |
1269 ASSERT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1354 ASSERT_EQ(DownloadItem::COMPLETE, item->GetState()); |
1270 EXPECT_FALSE(item->CanShowInFolder()); | 1355 EXPECT_FALSE(item->CanShowInFolder()); |
1271 EXPECT_FALSE(item->CanOpenDownload()); | 1356 EXPECT_FALSE(item->CanOpenDownload()); |
1272 } | 1357 } |
1273 | 1358 |
1274 TEST_F(DownloadItemTest, EnabledActionsForInterruptedDownload) { | 1359 TEST_F(DownloadItemTest, EnabledActionsForInterruptedDownload) { |
1275 DownloadItemImpl* item = CreateDownloadItem(); | 1360 DownloadItemImpl* item = CreateDownloadItem(); |
1276 MockDownloadFile* download_file = | 1361 MockDownloadFile* download_file = |
1277 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1362 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1278 | 1363 |
1279 EXPECT_CALL(*download_file, Cancel()); | 1364 EXPECT_CALL(*download_file, Cancel()); |
1280 item->DestinationObserverAsWeakPtr()->DestinationError( | 1365 item->DestinationObserverAsWeakPtr()->DestinationError( |
1281 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); | 1366 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 1367 0, |
| 1368 scoped_ptr<crypto::SecureHash>()); |
1282 RunAllPendingInMessageLoops(); | 1369 RunAllPendingInMessageLoops(); |
1283 | 1370 |
1284 ASSERT_EQ(DownloadItem::INTERRUPTED, item->GetState()); | 1371 ASSERT_EQ(DownloadItem::INTERRUPTED, item->GetState()); |
1285 ASSERT_FALSE(item->GetTargetFilePath().empty()); | 1372 ASSERT_FALSE(item->GetTargetFilePath().empty()); |
1286 EXPECT_FALSE(item->CanShowInFolder()); | 1373 EXPECT_FALSE(item->CanShowInFolder()); |
1287 EXPECT_TRUE(item->CanOpenDownload()); | 1374 EXPECT_TRUE(item->CanOpenDownload()); |
1288 } | 1375 } |
1289 | 1376 |
1290 TEST_F(DownloadItemTest, EnabledActionsForCancelledDownload) { | 1377 TEST_F(DownloadItemTest, EnabledActionsForCancelledDownload) { |
1291 DownloadItemImpl* item = CreateDownloadItem(); | 1378 DownloadItemImpl* item = CreateDownloadItem(); |
(...skipping 15 matching lines...) Expand all Loading... |
1307 TEST_F(DownloadItemTest, CompleteDelegate_ReturnTrue) { | 1394 TEST_F(DownloadItemTest, CompleteDelegate_ReturnTrue) { |
1308 // Test to confirm that if we have a callback that returns true, | 1395 // Test to confirm that if we have a callback that returns true, |
1309 // we complete immediately. | 1396 // we complete immediately. |
1310 DownloadItemImpl* item = CreateDownloadItem(); | 1397 DownloadItemImpl* item = CreateDownloadItem(); |
1311 MockDownloadFile* download_file = | 1398 MockDownloadFile* download_file = |
1312 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1399 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1313 | 1400 |
1314 // Drive the delegate interaction. | 1401 // Drive the delegate interaction. |
1315 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1402 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
1316 .WillOnce(Return(true)); | 1403 .WillOnce(Return(true)); |
1317 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 1404 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 1405 0, scoped_ptr<crypto::SecureHash>()); |
1318 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1406 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1319 EXPECT_FALSE(item->IsDangerous()); | 1407 EXPECT_FALSE(item->IsDangerous()); |
1320 | 1408 |
1321 // Make sure the download can complete. | 1409 // Make sure the download can complete. |
1322 EXPECT_CALL(*download_file, | 1410 EXPECT_CALL(*download_file, |
1323 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _)) | 1411 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) |
1324 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1412 .WillOnce(ScheduleRenameAndAnnotateCallback( |
1325 base::FilePath(kDummyTargetPath))); | 1413 DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath))); |
1326 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) | 1414 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
1327 .WillOnce(Return(true)); | 1415 .WillOnce(Return(true)); |
1328 EXPECT_CALL(*download_file, FullPath()) | 1416 EXPECT_CALL(*download_file, FullPath()) |
1329 .WillOnce(Return(base::FilePath())); | 1417 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
1330 EXPECT_CALL(*download_file, Detach()); | 1418 EXPECT_CALL(*download_file, Detach()); |
1331 RunAllPendingInMessageLoops(); | 1419 RunAllPendingInMessageLoops(); |
1332 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1420 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
1333 } | 1421 } |
1334 | 1422 |
1335 // Just delaying completion. | 1423 // Just delaying completion. |
1336 TEST_F(DownloadItemTest, CompleteDelegate_BlockOnce) { | 1424 TEST_F(DownloadItemTest, CompleteDelegate_BlockOnce) { |
1337 // Test to confirm that if we have a callback that returns true, | 1425 // Test to confirm that if we have a callback that returns true, |
1338 // we complete immediately. | 1426 // we complete immediately. |
1339 DownloadItemImpl* item = CreateDownloadItem(); | 1427 DownloadItemImpl* item = CreateDownloadItem(); |
1340 MockDownloadFile* download_file = | 1428 MockDownloadFile* download_file = |
1341 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1429 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1342 | 1430 |
1343 // Drive the delegate interaction. | 1431 // Drive the delegate interaction. |
1344 base::Closure delegate_callback; | 1432 base::Closure delegate_callback; |
1345 base::Closure copy_delegate_callback; | 1433 base::Closure copy_delegate_callback; |
1346 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1434 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
1347 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), | 1435 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), |
1348 Return(false))) | 1436 Return(false))) |
1349 .WillOnce(Return(true)); | 1437 .WillOnce(Return(true)); |
1350 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 1438 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 1439 0, scoped_ptr<crypto::SecureHash>()); |
1351 ASSERT_FALSE(delegate_callback.is_null()); | 1440 ASSERT_FALSE(delegate_callback.is_null()); |
1352 copy_delegate_callback = delegate_callback; | 1441 copy_delegate_callback = delegate_callback; |
1353 delegate_callback.Reset(); | 1442 delegate_callback.Reset(); |
1354 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1443 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1355 copy_delegate_callback.Run(); | 1444 copy_delegate_callback.Run(); |
1356 ASSERT_TRUE(delegate_callback.is_null()); | 1445 ASSERT_TRUE(delegate_callback.is_null()); |
1357 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1446 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1358 EXPECT_FALSE(item->IsDangerous()); | 1447 EXPECT_FALSE(item->IsDangerous()); |
1359 | 1448 |
1360 // Make sure the download can complete. | 1449 // Make sure the download can complete. |
1361 EXPECT_CALL(*download_file, | 1450 EXPECT_CALL(*download_file, |
1362 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _)) | 1451 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) |
1363 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1452 .WillOnce(ScheduleRenameAndAnnotateCallback( |
1364 base::FilePath(kDummyTargetPath))); | 1453 DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath))); |
1365 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) | 1454 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
1366 .WillOnce(Return(true)); | 1455 .WillOnce(Return(true)); |
1367 EXPECT_CALL(*download_file, FullPath()) | 1456 EXPECT_CALL(*download_file, FullPath()) |
1368 .WillOnce(Return(base::FilePath())); | 1457 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
1369 EXPECT_CALL(*download_file, Detach()); | 1458 EXPECT_CALL(*download_file, Detach()); |
1370 RunAllPendingInMessageLoops(); | 1459 RunAllPendingInMessageLoops(); |
1371 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1460 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
1372 } | 1461 } |
1373 | 1462 |
1374 // Delay and set danger. | 1463 // Delay and set danger. |
1375 TEST_F(DownloadItemTest, CompleteDelegate_SetDanger) { | 1464 TEST_F(DownloadItemTest, CompleteDelegate_SetDanger) { |
1376 // Test to confirm that if we have a callback that returns true, | 1465 // Test to confirm that if we have a callback that returns true, |
1377 // we complete immediately. | 1466 // we complete immediately. |
1378 DownloadItemImpl* item = CreateDownloadItem(); | 1467 DownloadItemImpl* item = CreateDownloadItem(); |
1379 MockDownloadFile* download_file = | 1468 MockDownloadFile* download_file = |
1380 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1469 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1381 | 1470 |
1382 // Drive the delegate interaction. | 1471 // Drive the delegate interaction. |
1383 base::Closure delegate_callback; | 1472 base::Closure delegate_callback; |
1384 base::Closure copy_delegate_callback; | 1473 base::Closure copy_delegate_callback; |
1385 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1474 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
1386 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), | 1475 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), |
1387 Return(false))) | 1476 Return(false))) |
1388 .WillOnce(Return(true)); | 1477 .WillOnce(Return(true)); |
1389 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 1478 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 1479 0, scoped_ptr<crypto::SecureHash>()); |
1390 ASSERT_FALSE(delegate_callback.is_null()); | 1480 ASSERT_FALSE(delegate_callback.is_null()); |
1391 copy_delegate_callback = delegate_callback; | 1481 copy_delegate_callback = delegate_callback; |
1392 delegate_callback.Reset(); | 1482 delegate_callback.Reset(); |
1393 EXPECT_FALSE(item->IsDangerous()); | 1483 EXPECT_FALSE(item->IsDangerous()); |
1394 item->OnContentCheckCompleted( | 1484 item->OnContentCheckCompleted( |
1395 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 1485 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
1396 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1486 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1397 copy_delegate_callback.Run(); | 1487 copy_delegate_callback.Run(); |
1398 ASSERT_TRUE(delegate_callback.is_null()); | 1488 ASSERT_TRUE(delegate_callback.is_null()); |
1399 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1489 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1400 EXPECT_TRUE(item->IsDangerous()); | 1490 EXPECT_TRUE(item->IsDangerous()); |
1401 | 1491 |
1402 // Make sure the download doesn't complete until we've validated it. | 1492 // Make sure the download doesn't complete until we've validated it. |
1403 EXPECT_CALL(*download_file, | 1493 EXPECT_CALL(*download_file, |
1404 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _)) | 1494 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) |
1405 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1495 .WillOnce(ScheduleRenameAndAnnotateCallback( |
1406 base::FilePath(kDummyTargetPath))); | 1496 DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath))); |
1407 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) | 1497 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
1408 .WillOnce(Return(true)); | 1498 .WillOnce(Return(true)); |
1409 EXPECT_CALL(*download_file, FullPath()) | 1499 EXPECT_CALL(*download_file, FullPath()) |
1410 .WillOnce(Return(base::FilePath())); | 1500 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
1411 EXPECT_CALL(*download_file, Detach()); | 1501 EXPECT_CALL(*download_file, Detach()); |
1412 RunAllPendingInMessageLoops(); | 1502 RunAllPendingInMessageLoops(); |
1413 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1503 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1414 EXPECT_TRUE(item->IsDangerous()); | 1504 EXPECT_TRUE(item->IsDangerous()); |
1415 | 1505 |
1416 item->ValidateDangerousDownload(); | 1506 item->ValidateDangerousDownload(); |
1417 EXPECT_EQ(DOWNLOAD_DANGER_TYPE_USER_VALIDATED, item->GetDangerType()); | 1507 EXPECT_EQ(DOWNLOAD_DANGER_TYPE_USER_VALIDATED, item->GetDangerType()); |
1418 RunAllPendingInMessageLoops(); | 1508 RunAllPendingInMessageLoops(); |
1419 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1509 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
1420 } | 1510 } |
1421 | 1511 |
1422 // Just delaying completion twice. | 1512 // Just delaying completion twice. |
1423 TEST_F(DownloadItemTest, CompleteDelegate_BlockTwice) { | 1513 TEST_F(DownloadItemTest, CompleteDelegate_BlockTwice) { |
1424 // Test to confirm that if we have a callback that returns true, | 1514 // Test to confirm that if we have a callback that returns true, |
1425 // we complete immediately. | 1515 // we complete immediately. |
1426 DownloadItemImpl* item = CreateDownloadItem(); | 1516 DownloadItemImpl* item = CreateDownloadItem(); |
1427 MockDownloadFile* download_file = | 1517 MockDownloadFile* download_file = |
1428 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); | 1518 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS); |
1429 | 1519 |
1430 // Drive the delegate interaction. | 1520 // Drive the delegate interaction. |
1431 base::Closure delegate_callback; | 1521 base::Closure delegate_callback; |
1432 base::Closure copy_delegate_callback; | 1522 base::Closure copy_delegate_callback; |
1433 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) | 1523 EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload(item, _)) |
1434 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), | 1524 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), |
1435 Return(false))) | 1525 Return(false))) |
1436 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), | 1526 .WillOnce(DoAll(SaveArg<1>(&delegate_callback), |
1437 Return(false))) | 1527 Return(false))) |
1438 .WillOnce(Return(true)); | 1528 .WillOnce(Return(true)); |
1439 item->DestinationObserverAsWeakPtr()->DestinationCompleted(std::string()); | 1529 item->DestinationObserverAsWeakPtr()->DestinationCompleted( |
| 1530 0, scoped_ptr<crypto::SecureHash>()); |
1440 ASSERT_FALSE(delegate_callback.is_null()); | 1531 ASSERT_FALSE(delegate_callback.is_null()); |
1441 copy_delegate_callback = delegate_callback; | 1532 copy_delegate_callback = delegate_callback; |
1442 delegate_callback.Reset(); | 1533 delegate_callback.Reset(); |
1443 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1534 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1444 copy_delegate_callback.Run(); | 1535 copy_delegate_callback.Run(); |
1445 ASSERT_FALSE(delegate_callback.is_null()); | 1536 ASSERT_FALSE(delegate_callback.is_null()); |
1446 copy_delegate_callback = delegate_callback; | 1537 copy_delegate_callback = delegate_callback; |
1447 delegate_callback.Reset(); | 1538 delegate_callback.Reset(); |
1448 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1539 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1449 copy_delegate_callback.Run(); | 1540 copy_delegate_callback.Run(); |
1450 ASSERT_TRUE(delegate_callback.is_null()); | 1541 ASSERT_TRUE(delegate_callback.is_null()); |
1451 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); | 1542 EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); |
1452 EXPECT_FALSE(item->IsDangerous()); | 1543 EXPECT_FALSE(item->IsDangerous()); |
1453 | 1544 |
1454 // Make sure the download can complete. | 1545 // Make sure the download can complete. |
1455 EXPECT_CALL(*download_file, | 1546 EXPECT_CALL(*download_file, |
1456 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _)) | 1547 RenameAndAnnotate(base::FilePath(kDummyTargetPath), _, _, _, _)) |
1457 .WillOnce(ScheduleRenameCallback(DOWNLOAD_INTERRUPT_REASON_NONE, | 1548 .WillOnce(ScheduleRenameAndAnnotateCallback( |
1458 base::FilePath(kDummyTargetPath))); | 1549 DOWNLOAD_INTERRUPT_REASON_NONE, base::FilePath(kDummyTargetPath))); |
1459 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) | 1550 EXPECT_CALL(*mock_delegate(), ShouldOpenDownload(item, _)) |
1460 .WillOnce(Return(true)); | 1551 .WillOnce(Return(true)); |
1461 EXPECT_CALL(*download_file, FullPath()) | 1552 EXPECT_CALL(*download_file, FullPath()) |
1462 .WillOnce(Return(base::FilePath())); | 1553 .WillOnce(ReturnRefOfCopy(base::FilePath())); |
1463 EXPECT_CALL(*download_file, Detach()); | 1554 EXPECT_CALL(*download_file, Detach()); |
1464 RunAllPendingInMessageLoops(); | 1555 RunAllPendingInMessageLoops(); |
1465 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); | 1556 EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); |
1466 } | 1557 } |
1467 | 1558 |
1468 TEST_F(DownloadItemTest, StealDangerousDownload) { | 1559 TEST_F(DownloadItemTest, StealDangerousDownload) { |
1469 DownloadItemImpl* item = CreateDownloadItem(); | 1560 DownloadItemImpl* item = CreateDownloadItem(); |
1470 MockDownloadFile* download_file = | 1561 MockDownloadFile* download_file = |
1471 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 1562 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
1472 ASSERT_TRUE(item->IsDangerous()); | 1563 ASSERT_TRUE(item->IsDangerous()); |
1473 base::FilePath full_path(FILE_PATH_LITERAL("foo.txt")); | 1564 base::FilePath full_path(FILE_PATH_LITERAL("foo.txt")); |
1474 base::FilePath returned_path; | 1565 base::FilePath returned_path; |
1475 | 1566 |
1476 EXPECT_CALL(*download_file, FullPath()) | 1567 EXPECT_CALL(*download_file, FullPath()).WillOnce(ReturnRefOfCopy(full_path)); |
1477 .WillOnce(Return(full_path)); | |
1478 EXPECT_CALL(*download_file, Detach()); | 1568 EXPECT_CALL(*download_file, Detach()); |
1479 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); | 1569 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
1480 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); | 1570 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
1481 item->StealDangerousDownload( | 1571 item->StealDangerousDownload( |
1482 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, | 1572 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
1483 weak_ptr_factory.GetWeakPtr(), | 1573 weak_ptr_factory.GetWeakPtr(), |
1484 base::Unretained(&returned_path))); | 1574 base::Unretained(&returned_path))); |
1485 RunAllPendingInMessageLoops(); | 1575 RunAllPendingInMessageLoops(); |
1486 EXPECT_EQ(full_path, returned_path); | 1576 EXPECT_EQ(full_path, returned_path); |
1487 } | 1577 } |
1488 | 1578 |
1489 TEST_F(DownloadItemTest, StealInterruptedDangerousDownload) { | 1579 TEST_F(DownloadItemTest, StealInterruptedDangerousDownload) { |
1490 base::FilePath returned_path; | 1580 base::FilePath returned_path; |
1491 DownloadItemImpl* item = CreateDownloadItem(); | 1581 DownloadItemImpl* item = CreateDownloadItem(); |
1492 MockDownloadFile* download_file = | 1582 MockDownloadFile* download_file = |
1493 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 1583 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
1494 base::FilePath full_path = item->GetFullPath(); | 1584 base::FilePath full_path = item->GetFullPath(); |
1495 EXPECT_FALSE(full_path.empty()); | 1585 EXPECT_FALSE(full_path.empty()); |
1496 EXPECT_CALL(*download_file, FullPath()) | 1586 EXPECT_CALL(*download_file, FullPath()).WillOnce(ReturnRefOfCopy(full_path)); |
1497 .WillOnce(Return(full_path)); | |
1498 EXPECT_CALL(*download_file, Detach()); | 1587 EXPECT_CALL(*download_file, Detach()); |
1499 item->DestinationObserverAsWeakPtr()->DestinationError( | 1588 item->DestinationObserverAsWeakPtr()->DestinationError( |
1500 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); | 1589 DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, |
| 1590 0, |
| 1591 scoped_ptr<crypto::SecureHash>()); |
1501 ASSERT_TRUE(item->IsDangerous()); | 1592 ASSERT_TRUE(item->IsDangerous()); |
1502 | 1593 |
1503 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); | 1594 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
1504 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); | 1595 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
1505 item->StealDangerousDownload( | 1596 item->StealDangerousDownload( |
1506 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, | 1597 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
1507 weak_ptr_factory.GetWeakPtr(), | 1598 weak_ptr_factory.GetWeakPtr(), |
1508 base::Unretained(&returned_path))); | 1599 base::Unretained(&returned_path))); |
1509 RunAllPendingInMessageLoops(); | 1600 RunAllPendingInMessageLoops(); |
1510 EXPECT_EQ(full_path, returned_path); | 1601 EXPECT_EQ(full_path, returned_path); |
1511 } | 1602 } |
1512 | 1603 |
1513 TEST_F(DownloadItemTest, StealInterruptedNonResumableDangerousDownload) { | 1604 TEST_F(DownloadItemTest, StealInterruptedNonResumableDangerousDownload) { |
1514 base::FilePath returned_path; | 1605 base::FilePath returned_path; |
1515 DownloadItemImpl* item = CreateDownloadItem(); | 1606 DownloadItemImpl* item = CreateDownloadItem(); |
1516 MockDownloadFile* download_file = | 1607 MockDownloadFile* download_file = |
1517 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); | 1608 DoIntermediateRename(item, DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE); |
1518 EXPECT_CALL(*download_file, Cancel()); | 1609 EXPECT_CALL(*download_file, Cancel()); |
1519 item->DestinationObserverAsWeakPtr()->DestinationError( | 1610 item->DestinationObserverAsWeakPtr()->DestinationError( |
1520 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); | 1611 DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, |
| 1612 0, |
| 1613 scoped_ptr<crypto::SecureHash>()); |
1521 ASSERT_TRUE(item->IsDangerous()); | 1614 ASSERT_TRUE(item->IsDangerous()); |
1522 | 1615 |
1523 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); | 1616 EXPECT_CALL(*mock_delegate(), DownloadRemoved(_)); |
1524 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); | 1617 base::WeakPtrFactory<DownloadItemTest> weak_ptr_factory(this); |
1525 item->StealDangerousDownload( | 1618 item->StealDangerousDownload( |
1526 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, | 1619 base::Bind(&DownloadItemTest::OnDownloadFileAcquired, |
1527 weak_ptr_factory.GetWeakPtr(), | 1620 weak_ptr_factory.GetWeakPtr(), |
1528 base::Unretained(&returned_path))); | 1621 base::Unretained(&returned_path))); |
1529 RunAllPendingInMessageLoops(); | 1622 RunAllPendingInMessageLoops(); |
1530 EXPECT_TRUE(returned_path.empty()); | 1623 EXPECT_TRUE(returned_path.empty()); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1597 // above. | 1690 // above. |
1598 const int kEventCount = 4; | 1691 const int kEventCount = 4; |
1599 | 1692 |
1600 // The following functions help us with currying the calls to | 1693 // The following functions help us with currying the calls to |
1601 // DownloadDestinationObserver. If std::bind was allowed along with | 1694 // DownloadDestinationObserver. If std::bind was allowed along with |
1602 // std::placeholders, it is possible to avoid these functions, but currently | 1695 // std::placeholders, it is possible to avoid these functions, but currently |
1603 // Chromium doesn't allow using std::bind for good reasons. | 1696 // Chromium doesn't allow using std::bind for good reasons. |
1604 void DestinationUpdateInvoker( | 1697 void DestinationUpdateInvoker( |
1605 int64_t bytes_so_far, | 1698 int64_t bytes_so_far, |
1606 int64_t bytes_per_sec, | 1699 int64_t bytes_per_sec, |
1607 const std::string& hash_state, | |
1608 base::WeakPtr<DownloadDestinationObserver> observer) { | 1700 base::WeakPtr<DownloadDestinationObserver> observer) { |
1609 DVLOG(20) << "DestinationUpdate(bytes_so_far:" << bytes_so_far | 1701 DVLOG(20) << "DestinationUpdate(bytes_so_far:" << bytes_so_far |
1610 << ", bytes_per_sec:" << bytes_per_sec | 1702 << ", bytes_per_sec:" << bytes_per_sec |
1611 << ", hash_state:" << hash_state << ") observer:" << !!observer; | 1703 << ") observer:" << !!observer; |
1612 if (observer) | 1704 if (observer) |
1613 observer->DestinationUpdate(bytes_so_far, bytes_per_sec, hash_state); | 1705 observer->DestinationUpdate(bytes_so_far, bytes_per_sec); |
1614 } | 1706 } |
1615 | 1707 |
1616 void DestinationErrorInvoker( | 1708 void DestinationErrorInvoker( |
1617 DownloadInterruptReason reason, | 1709 DownloadInterruptReason reason, |
| 1710 int64_t bytes_so_far, |
1618 base::WeakPtr<DownloadDestinationObserver> observer) { | 1711 base::WeakPtr<DownloadDestinationObserver> observer) { |
1619 DVLOG(20) << "DestinationError(reason:" | 1712 DVLOG(20) << "DestinationError(reason:" |
1620 << DownloadInterruptReasonToString(reason) | 1713 << DownloadInterruptReasonToString(reason) |
1621 << ") observer:" << !!observer; | 1714 << ", bytes_so_far:" << bytes_so_far << ") observer:" << !!observer; |
1622 if (observer) | 1715 if (observer) |
1623 observer->DestinationError(reason); | 1716 observer->DestinationError( |
| 1717 reason, bytes_so_far, scoped_ptr<crypto::SecureHash>()); |
1624 } | 1718 } |
1625 | 1719 |
1626 void DestinationCompletedInvoker( | 1720 void DestinationCompletedInvoker( |
1627 const std::string& final_hash, | 1721 int64_t total_bytes, |
1628 base::WeakPtr<DownloadDestinationObserver> observer) { | 1722 base::WeakPtr<DownloadDestinationObserver> observer) { |
1629 DVLOG(20) << "DestinationComplete(final_hash:" << final_hash | 1723 DVLOG(20) << "DestinationComplete(total_bytes:" << total_bytes |
1630 << ") observer:" << !!observer; | 1724 << ") observer:" << !!observer; |
1631 if (observer) | 1725 if (observer) |
1632 observer->DestinationCompleted(final_hash); | 1726 observer->DestinationCompleted(total_bytes, |
| 1727 scoped_ptr<crypto::SecureHash>()); |
1633 } | 1728 } |
1634 | 1729 |
1635 // Given a set of observations (via the range |begin|..|end|), constructs a list | 1730 // Given a set of observations (via the range |begin|..|end|), constructs a list |
1636 // of EventLists such that: | 1731 // of EventLists such that: |
1637 // | 1732 // |
1638 // * There are exactly |event_count| ObservationSets in each EventList. | 1733 // * There are exactly |event_count| ObservationSets in each EventList. |
1639 // | 1734 // |
1640 // * Each ObservationList in each EventList contains a subrange (possibly empty) | 1735 // * Each ObservationList in each EventList contains a subrange (possibly empty) |
1641 // of observations from the input range, in the same order as the input range. | 1736 // of observations from the input range, in the same order as the input range. |
1642 // | 1737 // |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1679 // 2. Immediately after the DownloadTargetCallback is invoked. | 1774 // 2. Immediately after the DownloadTargetCallback is invoked. |
1680 // 3. Immediately after the intermediate file is renamed. | 1775 // 3. Immediately after the intermediate file is renamed. |
1681 // | 1776 // |
1682 // We are going to take a couple of sets of DownloadDestinationObserver events | 1777 // We are going to take a couple of sets of DownloadDestinationObserver events |
1683 // and distribute them into the three events described above. And then we are | 1778 // and distribute them into the three events described above. And then we are |
1684 // going to invoke the observations while a DownloadItemImpl is carefully | 1779 // going to invoke the observations while a DownloadItemImpl is carefully |
1685 // stepped through its stages. | 1780 // stepped through its stages. |
1686 | 1781 |
1687 std::vector<EventList> GenerateSuccessfulEventLists() { | 1782 std::vector<EventList> GenerateSuccessfulEventLists() { |
1688 std::vector<CurriedObservation> all_observations; | 1783 std::vector<CurriedObservation> all_observations; |
1689 all_observations.push_back( | 1784 all_observations.push_back(base::Bind(&DestinationUpdateInvoker, 100, 100)); |
1690 base::Bind(&DestinationUpdateInvoker, 100, 100, "abc")); | 1785 all_observations.push_back(base::Bind(&DestinationUpdateInvoker, 200, 100)); |
1691 all_observations.push_back( | 1786 all_observations.push_back(base::Bind(&DestinationCompletedInvoker, 200)); |
1692 base::Bind(&DestinationUpdateInvoker, 200, 100, "def")); | |
1693 all_observations.push_back( | |
1694 base::Bind(&DestinationCompletedInvoker, "final-hash-1")); | |
1695 return DistributeObservationsIntoEvents(all_observations.begin(), | 1787 return DistributeObservationsIntoEvents(all_observations.begin(), |
1696 all_observations.end(), kEventCount); | 1788 all_observations.end(), kEventCount); |
1697 } | 1789 } |
1698 | 1790 |
1699 std::vector<EventList> GenerateFailingEventLists() { | 1791 std::vector<EventList> GenerateFailingEventLists() { |
1700 std::vector<CurriedObservation> all_observations; | 1792 std::vector<CurriedObservation> all_observations; |
1701 all_observations.push_back( | 1793 all_observations.push_back(base::Bind(&DestinationUpdateInvoker, 100, 100)); |
1702 base::Bind(&DestinationUpdateInvoker, 100, 100, "abc")); | |
1703 all_observations.push_back(base::Bind( | 1794 all_observations.push_back(base::Bind( |
1704 &DestinationErrorInvoker, DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED)); | 1795 &DestinationErrorInvoker, DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 100)); |
1705 return DistributeObservationsIntoEvents(all_observations.begin(), | 1796 return DistributeObservationsIntoEvents(all_observations.begin(), |
1706 all_observations.end(), kEventCount); | 1797 all_observations.end(), kEventCount); |
1707 } | 1798 } |
1708 | 1799 |
1709 class DownloadItemDestinationUpdateRaceTest | 1800 class DownloadItemDestinationUpdateRaceTest |
1710 : public DownloadItemTest, | 1801 : public DownloadItemTest, |
1711 public ::testing::WithParamInterface<EventList> { | 1802 public ::testing::WithParamInterface<EventList> { |
1712 public: | 1803 public: |
1713 DownloadItemDestinationUpdateRaceTest() | 1804 DownloadItemDestinationUpdateRaceTest() |
1714 : DownloadItemTest(), | 1805 : DownloadItemTest(), |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1874 TEST_P(DownloadItemDestinationUpdateRaceTest, IntermediateRenameSucceeds) { | 1965 TEST_P(DownloadItemDestinationUpdateRaceTest, IntermediateRenameSucceeds) { |
1875 // We expect either that the download will fail (in which case the request and | 1966 // We expect either that the download will fail (in which case the request and |
1876 // the download file will be cancelled), or it will succeed (in which case the | 1967 // the download file will be cancelled), or it will succeed (in which case the |
1877 // DownloadFile will Detach()). It depends on the list of observations that | 1968 // DownloadFile will Detach()). It depends on the list of observations that |
1878 // are given to us. | 1969 // are given to us. |
1879 EXPECT_CALL(*file_, Cancel()).Times(::testing::AnyNumber()); | 1970 EXPECT_CALL(*file_, Cancel()).Times(::testing::AnyNumber()); |
1880 EXPECT_CALL(*request_handle_, CancelRequest()).Times(::testing::AnyNumber()); | 1971 EXPECT_CALL(*request_handle_, CancelRequest()).Times(::testing::AnyNumber()); |
1881 EXPECT_CALL(*file_, Detach()).Times(::testing::AnyNumber()); | 1972 EXPECT_CALL(*file_, Detach()).Times(::testing::AnyNumber()); |
1882 | 1973 |
1883 EXPECT_CALL(*file_, FullPath()) | 1974 EXPECT_CALL(*file_, FullPath()) |
1884 .WillRepeatedly(Return(base::FilePath(kDummyIntermediatePath))); | 1975 .WillRepeatedly(ReturnRefOfCopy(base::FilePath(kDummyIntermediatePath))); |
1885 | 1976 |
1886 // Intermediate rename loop is not used immediately, but let's set up the | 1977 // Intermediate rename loop is not used immediately, but let's set up the |
1887 // DownloadFile expectations since we are about to transfer its ownership to | 1978 // DownloadFile expectations since we are about to transfer its ownership to |
1888 // the DownloadItem. | 1979 // the DownloadItem. |
1889 base::RunLoop intermediate_rename_loop; | 1980 base::RunLoop intermediate_rename_loop; |
1890 DownloadFile::RenameCompletionCallback intermediate_rename_callback; | 1981 DownloadFile::RenameCompletionCallback intermediate_rename_callback; |
1891 EXPECT_CALL(*file_, RenameAndUniquify(_, _)) | 1982 EXPECT_CALL(*file_, RenameAndUniquify(_, _)) |
1892 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback), | 1983 .WillOnce(DoAll(SaveArg<1>(&intermediate_rename_callback), |
1893 ScheduleClosure(intermediate_rename_loop.QuitClosure()))); | 1984 ScheduleClosure(intermediate_rename_loop.QuitClosure()))); |
1894 | 1985 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1952 | 2043 |
1953 item_->Cancel(true); | 2044 item_->Cancel(true); |
1954 RunAllPendingInMessageLoops(); | 2045 RunAllPendingInMessageLoops(); |
1955 } | 2046 } |
1956 | 2047 |
1957 TEST(MockDownloadItem, Compiles) { | 2048 TEST(MockDownloadItem, Compiles) { |
1958 MockDownloadItem mock_item; | 2049 MockDownloadItem mock_item; |
1959 } | 2050 } |
1960 | 2051 |
1961 } // namespace content | 2052 } // namespace content |
OLD | NEW |