| 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_file_manager.h" | 5 #include "content/browser/download/download_file_manager.h" |
| 6 | 6 |
| 7 #include "base/file_path.h" | 7 #include "base/file_path.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/scoped_temp_dir.h" | 10 #include "base/scoped_temp_dir.h" |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE, last_reason_); | 198 EXPECT_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE, last_reason_); |
| 199 } | 199 } |
| 200 | 200 |
| 201 // Renames the download file. | 201 // Renames the download file. |
| 202 // |id| is the download ID of the download file. | 202 // |id| is the download ID of the download file. |
| 203 // |new_path| is the new file path. | 203 // |new_path| is the new file path. |
| 204 // |unique_path| is the actual path that the download file will be | 204 // |unique_path| is the actual path that the download file will be |
| 205 // renamed to. If there is an existing file at | 205 // renamed to. If there is an existing file at |
| 206 // |new_path| and |replace| is false, then |new_path| | 206 // |new_path| and |replace| is false, then |new_path| |
| 207 // will be uniquified. | 207 // will be uniquified. |
| 208 // |rename_error| is the error to inject. For no error, use net::OK. | 208 // |rename_error| is the error to inject. For no error, |
| 209 // use content::DOWNLOAD_INTERRUPT_REASON_NONE. |
| 209 // |state| whether we are renaming an in-progress download or a | 210 // |state| whether we are renaming an in-progress download or a |
| 210 // completed download. | 211 // completed download. |
| 211 // |should_overwrite| indicates whether to replace or uniquify the file. | 212 // |should_overwrite| indicates whether to replace or uniquify the file. |
| 212 void RenameFile(const DownloadId& id, | 213 void RenameFile(const DownloadId& id, |
| 213 const FilePath& new_path, | 214 const FilePath& new_path, |
| 214 const FilePath& unique_path, | 215 const FilePath& unique_path, |
| 215 net::Error rename_error, | 216 content::DownloadInterruptReason rename_error, |
| 216 RenameFileState state, | 217 RenameFileState state, |
| 217 RenameFileOverwrite should_overwrite) { | 218 RenameFileOverwrite should_overwrite) { |
| 218 MockDownloadFile* file = download_file_factory_->GetExistingFile(id); | 219 MockDownloadFile* file = download_file_factory_->GetExistingFile(id); |
| 219 ASSERT_TRUE(file != NULL); | 220 ASSERT_TRUE(file != NULL); |
| 220 | 221 |
| 221 EXPECT_CALL(*file, Rename(unique_path)) | 222 EXPECT_CALL(*file, Rename(unique_path)) |
| 222 .Times(1) | 223 .Times(1) |
| 223 .WillOnce(Return(rename_error)); | 224 .WillOnce(Return(rename_error)); |
| 224 | 225 |
| 225 if (rename_error != net::OK) { | 226 if (rename_error != content::DOWNLOAD_INTERRUPT_REASON_NONE) { |
| 226 EXPECT_CALL(*file, BytesSoFar()) | 227 EXPECT_CALL(*file, BytesSoFar()) |
| 227 .Times(AtLeast(1)) | 228 .Times(AtLeast(1)) |
| 228 .WillRepeatedly(Return(byte_count_[id])); | 229 .WillRepeatedly(Return(byte_count_[id])); |
| 229 EXPECT_CALL(*file, GetHashState()) | 230 EXPECT_CALL(*file, GetHashState()) |
| 230 .Times(AtLeast(1)); | 231 .Times(AtLeast(1)); |
| 231 EXPECT_CALL(*file, GetDownloadManager()) | 232 EXPECT_CALL(*file, GetDownloadManager()) |
| 232 .Times(AtLeast(1)); | 233 .Times(AtLeast(1)); |
| 233 } | 234 } |
| 234 | 235 |
| 235 download_file_manager_->RenameDownloadFile( | 236 download_file_manager_->RenameDownloadFile( |
| 236 id, new_path, (should_overwrite == OVERWRITE), | 237 id, new_path, (should_overwrite == OVERWRITE), |
| 237 base::Bind(&TestDownloadManager::OnDownloadRenamed, | 238 base::Bind(&TestDownloadManager::OnDownloadRenamed, |
| 238 download_manager_, id.local())); | 239 download_manager_, id.local())); |
| 239 | 240 |
| 240 if (rename_error != net::OK) { | 241 if (rename_error != content::DOWNLOAD_INTERRUPT_REASON_NONE) { |
| 241 EXPECT_CALL(*download_manager_, | 242 EXPECT_CALL(*download_manager_, |
| 242 OnDownloadInterrupted( | 243 OnDownloadInterrupted( |
| 243 id.local(), | 244 id.local(), |
| 244 byte_count_[id], | 245 byte_count_[id], |
| 245 "", | 246 "", |
| 246 content::ConvertNetErrorToInterruptReason( | 247 rename_error)); |
| 247 rename_error, | |
| 248 content::DOWNLOAD_INTERRUPT_FROM_DISK))); | |
| 249 EXPECT_CALL(*download_manager_, | 248 EXPECT_CALL(*download_manager_, |
| 250 OnDownloadRenamed(id.local(), FilePath())); | 249 OnDownloadRenamed(id.local(), FilePath())); |
| 251 ProcessAllPendingMessages(); | 250 ProcessAllPendingMessages(); |
| 252 ++error_count_[id]; | 251 ++error_count_[id]; |
| 253 } else { | 252 } else { |
| 254 EXPECT_CALL(*download_manager_, | 253 EXPECT_CALL(*download_manager_, |
| 255 OnDownloadRenamed(id.local(), unique_path)); | 254 OnDownloadRenamed(id.local(), unique_path)); |
| 256 ProcessAllPendingMessages(); | 255 ProcessAllPendingMessages(); |
| 257 } | 256 } |
| 258 } | 257 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 TEST_F(DownloadFileManagerTest, RenameInProgress) { | 348 TEST_F(DownloadFileManagerTest, RenameInProgress) { |
| 350 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); | 349 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
| 351 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 350 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
| 352 info->download_id = dummy_id; | 351 info->download_id = dummy_id; |
| 353 ScopedTempDir download_dir; | 352 ScopedTempDir download_dir; |
| 354 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 353 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
| 355 | 354 |
| 356 CreateDownloadFile(info.Pass()); | 355 CreateDownloadFile(info.Pass()); |
| 357 | 356 |
| 358 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 357 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
| 359 RenameFile(dummy_id, foo, foo, net::OK, IN_PROGRESS, OVERWRITE); | 358 RenameFile(dummy_id, foo, foo, content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 359 IN_PROGRESS, OVERWRITE); |
| 360 | 360 |
| 361 CleanUp(dummy_id); | 361 CleanUp(dummy_id); |
| 362 } | 362 } |
| 363 | 363 |
| 364 TEST_F(DownloadFileManagerTest, RenameInProgressWithUniquification) { | 364 TEST_F(DownloadFileManagerTest, RenameInProgressWithUniquification) { |
| 365 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); | 365 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
| 366 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 366 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
| 367 info->download_id = dummy_id; | 367 info->download_id = dummy_id; |
| 368 ScopedTempDir download_dir; | 368 ScopedTempDir download_dir; |
| 369 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 369 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
| 370 | 370 |
| 371 CreateDownloadFile(info.Pass()); | 371 CreateDownloadFile(info.Pass()); |
| 372 | 372 |
| 373 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 373 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
| 374 FilePath unique_foo(foo.InsertBeforeExtension(FILE_PATH_LITERAL(" (1)"))); | 374 FilePath unique_foo(foo.InsertBeforeExtension(FILE_PATH_LITERAL(" (1)"))); |
| 375 ASSERT_EQ(0, file_util::WriteFile(foo, "", 0)); | 375 ASSERT_EQ(0, file_util::WriteFile(foo, "", 0)); |
| 376 RenameFile(dummy_id, foo, unique_foo, net::OK, IN_PROGRESS, DONT_OVERWRITE); | 376 RenameFile(dummy_id, foo, unique_foo, |
| 377 content::DOWNLOAD_INTERRUPT_REASON_NONE, IN_PROGRESS, |
| 378 DONT_OVERWRITE); |
| 377 | 379 |
| 378 CleanUp(dummy_id); | 380 CleanUp(dummy_id); |
| 379 } | 381 } |
| 380 | 382 |
| 381 TEST_F(DownloadFileManagerTest, RenameInProgressWithError) { | 383 TEST_F(DownloadFileManagerTest, RenameInProgressWithError) { |
| 382 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); | 384 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
| 383 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 385 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
| 384 info->download_id = dummy_id; | 386 info->download_id = dummy_id; |
| 385 ScopedTempDir download_dir; | 387 ScopedTempDir download_dir; |
| 386 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 388 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
| 387 | 389 |
| 388 CreateDownloadFile(info.Pass()); | 390 CreateDownloadFile(info.Pass()); |
| 389 | 391 |
| 390 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 392 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
| 391 RenameFile(dummy_id, foo, foo, net::ERR_FILE_PATH_TOO_LONG, | 393 RenameFile(dummy_id, foo, foo, |
| 394 content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, |
| 392 IN_PROGRESS, OVERWRITE); | 395 IN_PROGRESS, OVERWRITE); |
| 393 | 396 |
| 394 CleanUp(dummy_id); | 397 CleanUp(dummy_id); |
| 395 } | 398 } |
| 396 | 399 |
| 397 TEST_F(DownloadFileManagerTest, RenameWithUniquification) { | 400 TEST_F(DownloadFileManagerTest, RenameWithUniquification) { |
| 398 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); | 401 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
| 399 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 402 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
| 400 info->download_id = dummy_id; | 403 info->download_id = dummy_id; |
| 401 ScopedTempDir download_dir; | 404 ScopedTempDir download_dir; |
| 402 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 405 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
| 403 | 406 |
| 404 CreateDownloadFile(info.Pass()); | 407 CreateDownloadFile(info.Pass()); |
| 405 | 408 |
| 406 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 409 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
| 407 FilePath unique_foo(foo.InsertBeforeExtension(FILE_PATH_LITERAL(" (1)"))); | 410 FilePath unique_foo(foo.InsertBeforeExtension(FILE_PATH_LITERAL(" (1)"))); |
| 408 // Create a file at |foo|. Since we are specifying DONT_OVERWRITE, | 411 // Create a file at |foo|. Since we are specifying DONT_OVERWRITE, |
| 409 // RenameDownloadFile() should pick "foo (1).txt" instead of | 412 // RenameDownloadFile() should pick "foo (1).txt" instead of |
| 410 // overwriting this file. | 413 // overwriting this file. |
| 411 ASSERT_EQ(0, file_util::WriteFile(foo, "", 0)); | 414 ASSERT_EQ(0, file_util::WriteFile(foo, "", 0)); |
| 412 RenameFile(dummy_id, foo, unique_foo, net::OK, COMPLETE, DONT_OVERWRITE); | 415 RenameFile(dummy_id, foo, unique_foo, |
| 416 content::DOWNLOAD_INTERRUPT_REASON_NONE, COMPLETE, DONT_OVERWRITE); |
| 413 | 417 |
| 414 CleanUp(dummy_id); | 418 CleanUp(dummy_id); |
| 415 } | 419 } |
| 416 | 420 |
| 417 TEST_F(DownloadFileManagerTest, RenameTwice) { | 421 TEST_F(DownloadFileManagerTest, RenameTwice) { |
| 418 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); | 422 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
| 419 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 423 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
| 420 info->download_id = dummy_id; | 424 info->download_id = dummy_id; |
| 421 ScopedTempDir download_dir; | 425 ScopedTempDir download_dir; |
| 422 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 426 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
| 423 | 427 |
| 424 CreateDownloadFile(info.Pass()); | 428 CreateDownloadFile(info.Pass()); |
| 425 | 429 |
| 426 FilePath crfoo(download_dir.path().Append( | 430 FilePath crfoo(download_dir.path().Append( |
| 427 FILE_PATH_LITERAL("foo.txt.crdownload"))); | 431 FILE_PATH_LITERAL("foo.txt.crdownload"))); |
| 428 RenameFile(dummy_id, crfoo, crfoo, net::OK, IN_PROGRESS, OVERWRITE); | 432 RenameFile(dummy_id, crfoo, crfoo, content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 433 IN_PROGRESS, OVERWRITE); |
| 429 | 434 |
| 430 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 435 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
| 431 RenameFile(dummy_id, foo, foo, net::OK, COMPLETE, OVERWRITE); | 436 RenameFile(dummy_id, foo, foo, content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 437 COMPLETE, OVERWRITE); |
| 432 | 438 |
| 433 CleanUp(dummy_id); | 439 CleanUp(dummy_id); |
| 434 } | 440 } |
| 435 | 441 |
| 436 TEST_F(DownloadFileManagerTest, TwoDownloads) { | 442 TEST_F(DownloadFileManagerTest, TwoDownloads) { |
| 437 // Same as StartDownload, at first. | 443 // Same as StartDownload, at first. |
| 438 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); | 444 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
| 439 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 445 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
| 440 info->download_id = dummy_id; | 446 info->download_id = dummy_id; |
| 441 scoped_ptr<DownloadCreateInfo> info2(new DownloadCreateInfo); | 447 scoped_ptr<DownloadCreateInfo> info2(new DownloadCreateInfo); |
| 442 DownloadId dummy_id2(download_manager_.get(), kDummyDownloadId2); | 448 DownloadId dummy_id2(download_manager_.get(), kDummyDownloadId2); |
| 443 info2->download_id = dummy_id2; | 449 info2->download_id = dummy_id2; |
| 444 ScopedTempDir download_dir; | 450 ScopedTempDir download_dir; |
| 445 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 451 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
| 446 | 452 |
| 447 CreateDownloadFile(info.Pass()); | 453 CreateDownloadFile(info.Pass()); |
| 448 CreateDownloadFile(info2.Pass()); | 454 CreateDownloadFile(info2.Pass()); |
| 449 | 455 |
| 450 FilePath crbar(download_dir.path().Append( | 456 FilePath crbar(download_dir.path().Append( |
| 451 FILE_PATH_LITERAL("bar.txt.crdownload"))); | 457 FILE_PATH_LITERAL("bar.txt.crdownload"))); |
| 452 RenameFile(dummy_id2, crbar, crbar, net::OK, IN_PROGRESS, OVERWRITE); | 458 RenameFile(dummy_id2, crbar, crbar, content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 459 IN_PROGRESS, OVERWRITE); |
| 453 | 460 |
| 454 FilePath crfoo(download_dir.path().Append( | 461 FilePath crfoo(download_dir.path().Append( |
| 455 FILE_PATH_LITERAL("foo.txt.crdownload"))); | 462 FILE_PATH_LITERAL("foo.txt.crdownload"))); |
| 456 RenameFile(dummy_id, crfoo, crfoo, net::OK, IN_PROGRESS, OVERWRITE); | 463 RenameFile(dummy_id, crfoo, crfoo, content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 464 IN_PROGRESS, OVERWRITE); |
| 457 | 465 |
| 458 | 466 |
| 459 FilePath bar(download_dir.path().Append(FILE_PATH_LITERAL("bar.txt"))); | 467 FilePath bar(download_dir.path().Append(FILE_PATH_LITERAL("bar.txt"))); |
| 460 RenameFile(dummy_id2, bar, bar, net::OK, COMPLETE, OVERWRITE); | 468 RenameFile(dummy_id2, bar, bar, content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 469 COMPLETE, OVERWRITE); |
| 461 | 470 |
| 462 CleanUp(dummy_id2); | 471 CleanUp(dummy_id2); |
| 463 | 472 |
| 464 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 473 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
| 465 RenameFile(dummy_id, foo, foo, net::OK, COMPLETE, OVERWRITE); | 474 RenameFile(dummy_id, foo, foo, content::DOWNLOAD_INTERRUPT_REASON_NONE, |
| 475 COMPLETE, OVERWRITE); |
| 466 | 476 |
| 467 CleanUp(dummy_id); | 477 CleanUp(dummy_id); |
| 468 } | 478 } |
| 469 | 479 |
| 470 // TODO(ahendrickson) -- A test for download manager shutdown. | 480 // TODO(ahendrickson) -- A test for download manager shutdown. |
| 471 // Expected call sequence: | 481 // Expected call sequence: |
| 472 // OnDownloadManagerShutdown | 482 // OnDownloadManagerShutdown |
| 473 // DownloadFile::GetDownloadManager | 483 // DownloadFile::GetDownloadManager |
| 474 // DownloadFile::CancelDownloadRequest | 484 // DownloadFile::CancelDownloadRequest |
| 475 // DownloadFile::~DownloadFile | 485 // DownloadFile::~DownloadFile |
| OLD | NEW |