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" |
11 #include "base/string_number_conversions.h" | 11 #include "base/string_number_conversions.h" |
12 #include "content/browser/browser_thread_impl.h" | 12 #include "content/browser/browser_thread_impl.h" |
13 #include "content/browser/download/download_buffer.h" | 13 #include "content/browser/download/byte_stream.h" |
14 #include "content/browser/download/download_create_info.h" | 14 #include "content/browser/download/download_create_info.h" |
15 #include "content/browser/download/download_interrupt_reasons_impl.h" | 15 #include "content/browser/download/download_interrupt_reasons_impl.h" |
16 #include "content/browser/download/download_request_handle.h" | 16 #include "content/browser/download/download_request_handle.h" |
17 #include "content/browser/download/mock_download_file.h" | 17 #include "content/browser/download/mock_download_file.h" |
18 #include "content/public/browser/download_id.h" | 18 #include "content/public/browser/download_id.h" |
19 #include "content/public/test/mock_download_manager.h" | 19 #include "content/public/test/mock_download_manager.h" |
20 #include "net/base/io_buffer.h" | 20 #include "net/base/io_buffer.h" |
21 #include "net/base/net_errors.h" | 21 #include "net/base/net_errors.h" |
22 #include "testing/gmock/include/gmock/gmock.h" | 22 #include "testing/gmock/include/gmock/gmock.h" |
23 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 22 matching lines...) Expand all Loading... |
46 | 46 |
47 class MockDownloadFileFactory : | 47 class MockDownloadFileFactory : |
48 public DownloadFileManager::DownloadFileFactory { | 48 public DownloadFileManager::DownloadFileFactory { |
49 | 49 |
50 public: | 50 public: |
51 MockDownloadFileFactory() {} | 51 MockDownloadFileFactory() {} |
52 virtual ~MockDownloadFileFactory() {} | 52 virtual ~MockDownloadFileFactory() {} |
53 | 53 |
54 virtual content::DownloadFile* CreateFile( | 54 virtual content::DownloadFile* CreateFile( |
55 DownloadCreateInfo* info, | 55 DownloadCreateInfo* info, |
| 56 scoped_ptr<content::ByteStreamReader> stream, |
56 const DownloadRequestHandle& request_handle, | 57 const DownloadRequestHandle& request_handle, |
57 content::DownloadManager* download_manager, | 58 content::DownloadManager* download_manager, |
58 bool calculate_hash, | 59 bool calculate_hash, |
59 const net::BoundNetLog& bound_net_log) OVERRIDE; | 60 const net::BoundNetLog& bound_net_log) OVERRIDE; |
60 | 61 |
61 MockDownloadFile* GetExistingFile(const DownloadId& id); | 62 MockDownloadFile* GetExistingFile(const DownloadId& id); |
62 | 63 |
63 private: | 64 private: |
64 std::map<DownloadId, MockDownloadFile*> files_; | 65 std::map<DownloadId, MockDownloadFile*> files_; |
65 }; | 66 }; |
66 | 67 |
67 content::DownloadFile* MockDownloadFileFactory::CreateFile( | 68 content::DownloadFile* MockDownloadFileFactory::CreateFile( |
68 DownloadCreateInfo* info, | 69 DownloadCreateInfo* info, |
| 70 scoped_ptr<content::ByteStreamReader> stream, |
69 const DownloadRequestHandle& request_handle, | 71 const DownloadRequestHandle& request_handle, |
70 content::DownloadManager* download_manager, | 72 content::DownloadManager* download_manager, |
71 bool calculate_hash, | 73 bool calculate_hash, |
72 const net::BoundNetLog& bound_net_log) { | 74 const net::BoundNetLog& bound_net_log) { |
73 DCHECK(files_.end() == files_.find(info->download_id)); | 75 DCHECK(files_.end() == files_.find(info->download_id)); |
74 MockDownloadFile* created_file = new MockDownloadFile(); | 76 MockDownloadFile* created_file = new MockDownloadFile(); |
75 files_[info->download_id] = created_file; | 77 files_[info->download_id] = created_file; |
76 | 78 |
77 ON_CALL(*created_file, GetDownloadManager()) | 79 ON_CALL(*created_file, GetDownloadManager()) |
78 .WillByDefault(Return(download_manager)); | 80 .WillByDefault(Return(download_manager)); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 static const int32 kDummyDownloadId; | 131 static const int32 kDummyDownloadId; |
130 static const int32 kDummyDownloadId2; | 132 static const int32 kDummyDownloadId2; |
131 static const int kDummyChildId; | 133 static const int kDummyChildId; |
132 static const int kDummyRequestId; | 134 static const int kDummyRequestId; |
133 | 135 |
134 // We need a UI |BrowserThread| in order to destruct |download_manager_|, | 136 // We need a UI |BrowserThread| in order to destruct |download_manager_|, |
135 // which has trait |BrowserThread::DeleteOnUIThread|. Without this, | 137 // which has trait |BrowserThread::DeleteOnUIThread|. Without this, |
136 // calling Release() on |download_manager_| won't ever result in its | 138 // calling Release() on |download_manager_| won't ever result in its |
137 // destructor being called and we get a leak. | 139 // destructor being called and we get a leak. |
138 DownloadFileManagerTest() | 140 DownloadFileManagerTest() |
139 : download_buffer_(new content::DownloadBuffer()), | 141 : ui_thread_(BrowserThread::UI, &loop_), |
140 ui_thread_(BrowserThread::UI, &loop_), | |
141 file_thread_(BrowserThread::FILE, &loop_) { | 142 file_thread_(BrowserThread::FILE, &loop_) { |
142 } | 143 } |
143 | 144 |
144 ~DownloadFileManagerTest() { | 145 ~DownloadFileManagerTest() { |
145 } | 146 } |
146 | 147 |
147 virtual void SetUp() { | 148 virtual void SetUp() { |
148 download_manager_ = new TestDownloadManager(); | 149 download_manager_ = new TestDownloadManager(); |
149 request_handle_.reset(new MockDownloadRequestHandle(download_manager_)); | 150 request_handle_.reset(new MockDownloadRequestHandle(download_manager_)); |
150 download_file_factory_ = new MockDownloadFileFactory; | 151 download_file_factory_ = new MockDownloadFileFactory; |
(...skipping 17 matching lines...) Expand all Loading... |
168 // Clears all gmock expectations for the download file |id| and the manager. | 169 // Clears all gmock expectations for the download file |id| and the manager. |
169 void ClearExpectations(DownloadId id) { | 170 void ClearExpectations(DownloadId id) { |
170 MockDownloadFile* file = download_file_factory_->GetExistingFile(id); | 171 MockDownloadFile* file = download_file_factory_->GetExistingFile(id); |
171 Mock::VerifyAndClearExpectations(file); | 172 Mock::VerifyAndClearExpectations(file); |
172 Mock::VerifyAndClearExpectations(download_manager_); | 173 Mock::VerifyAndClearExpectations(download_manager_); |
173 } | 174 } |
174 | 175 |
175 // Start a download. | 176 // Start a download. |
176 // |info| is the information needed to create a new download file. | 177 // |info| is the information needed to create a new download file. |
177 // |id| is the download ID of the new download file. | 178 // |id| is the download ID of the new download file. |
178 void StartDownload(DownloadCreateInfo* info, const DownloadId& id) { | 179 void StartDownload(scoped_ptr<DownloadCreateInfo> info, |
| 180 const DownloadId& id) { |
179 // Expected call sequence: | 181 // Expected call sequence: |
180 // StartDownload | 182 // StartDownload |
181 // DownloadManager::CreateDownloadItem | 183 // DownloadManager::CreateDownloadItem |
182 // DownloadManagerDelegate::GenerateFileHash | 184 // DownloadManagerDelegate::GenerateFileHash |
183 // Process one message in the message loop | 185 // Process one message in the message loop |
184 // CreateDownloadFile | 186 // CreateDownloadFile |
185 // new MockDownloadFile, add to downloads_[id] | 187 // new MockDownloadFile, add to downloads_[id] |
186 // DownloadRequestHandle::ResumeRequest | 188 // DownloadRequestHandle::ResumeRequest |
187 // StartUpdateTimer | 189 // StartUpdateTimer |
188 // DownloadCreateInfo is destroyed | 190 // DownloadCreateInfo is destroyed |
189 // Process one message in the message loop | 191 // Process one message in the message loop |
190 // DownloadManager::StartDownload | 192 // DownloadManager::StartDownload |
191 info->download_id = id; | 193 info->download_id = id; |
192 | 194 |
193 // Set expectations and return values. | 195 // Set expectations and return values. |
194 EXPECT_CALL(*download_manager_, CreateDownloadItem(info, _)) | 196 EXPECT_CALL(*download_manager_, CreateDownloadItem(info.get(), _)) |
195 .Times(1) | 197 .Times(1) |
196 .WillOnce(Return(net::BoundNetLog())); | 198 .WillOnce(Return(net::BoundNetLog())); |
197 EXPECT_CALL(*download_manager_, GenerateFileHash()) | 199 EXPECT_CALL(*download_manager_, GenerateFileHash()) |
198 .Times(AtLeast(1)) | 200 .Times(AtLeast(1)) |
199 .WillRepeatedly(Return(false)); | 201 .WillRepeatedly(Return(false)); |
200 EXPECT_CALL(*download_manager_, StartDownload(id.local())); | 202 EXPECT_CALL(*download_manager_, StartDownload(id.local())); |
201 | 203 |
202 download_file_manager_->StartDownload(info, *request_handle_); | 204 download_file_manager_->StartDownload( |
| 205 info.Pass(), scoped_ptr<content::ByteStreamReader>(), *request_handle_); |
203 ProcessAllPendingMessages(); | 206 ProcessAllPendingMessages(); |
204 | 207 |
205 ClearExpectations(id); | 208 ClearExpectations(id); |
206 } | 209 } |
207 | 210 |
208 // Creates a new |net::IOBuffer| of size |length| with |data|, and attaches | |
209 // it to the download buffer. | |
210 bool UpdateBuffer(const char* data, size_t length) { | |
211 // We are passing ownership of this buffer to the download file manager. | |
212 // NOTE: we are padding io_buffer with one extra character so that the | |
213 // mock testing framework can treat it as a NULL-delimited string. | |
214 net::IOBuffer* io_buffer = new net::IOBuffer(length + 1); | |
215 // We need |AddRef()| because we do a |Release()| in |UpdateDownload()|. | |
216 io_buffer->AddRef(); | |
217 memcpy(io_buffer->data(), data, length); | |
218 io_buffer->data()[length] = 0; | |
219 | |
220 download_buffer_->AddData(io_buffer, length); | |
221 | |
222 return true; | |
223 } | |
224 | |
225 // Updates the download file. | |
226 // |id| is the download ID of the download file. | |
227 // |data| is the buffer containing the data. | |
228 // |length| is the length of the data buffer. | |
229 // |error_to_insert| is the error to simulate. For no error, use net::OK. | |
230 void UpdateDownload(const DownloadId& id, | |
231 const char* data, | |
232 size_t length, | |
233 net::Error error_to_insert) { | |
234 // Expected call sequence: | |
235 // Create DownloadBuffer | |
236 // UpdateDownload | |
237 // GetDownloadFile | |
238 // DownloadFile::AppendDataToFile | |
239 // | |
240 // On error: | |
241 // DownloadFile::GetDownloadManager | |
242 // DownloadFile::BytesSoFar | |
243 // CancelDownload | |
244 // Process one message in the message loop | |
245 // DownloadManager::OnDownloadInterrupted | |
246 EXPECT_TRUE(UpdateBuffer(data, length)); | |
247 MockDownloadFile* file = download_file_factory_->GetExistingFile(id); | |
248 ASSERT_TRUE(file != NULL); | |
249 byte_count_[id] += length; | |
250 | |
251 // Make sure our comparison string is NULL-terminated. | |
252 char* expected_data = new char[length + 1]; | |
253 memcpy(expected_data, data, length); | |
254 expected_data[length] = 0; | |
255 | |
256 EXPECT_CALL(*file, AppendDataToFile(StrEq(expected_data), length)) | |
257 .Times(1) | |
258 .WillOnce(Return(error_to_insert)); | |
259 | |
260 if (error_to_insert != net::OK) { | |
261 EXPECT_CALL(*file, GetDownloadManager()) | |
262 .Times(AtLeast(1)); | |
263 EXPECT_CALL(*file, BytesSoFar()) | |
264 .Times(AtLeast(1)) | |
265 .WillRepeatedly(Return(byte_count_[id])); | |
266 EXPECT_CALL(*file, GetHashState()) | |
267 .Times(AtLeast(1)); | |
268 EXPECT_CALL(*file, Cancel()); | |
269 } | |
270 | |
271 download_file_manager_->UpdateDownload(id, download_buffer_.get()); | |
272 | |
273 if (error_to_insert != net::OK) { | |
274 EXPECT_CALL(*download_manager_, | |
275 OnDownloadInterrupted( | |
276 id.local(), | |
277 byte_count_[id], | |
278 "", | |
279 content::ConvertNetErrorToInterruptReason( | |
280 error_to_insert, content::DOWNLOAD_INTERRUPT_FROM_DISK))); | |
281 | |
282 ProcessAllPendingMessages(); | |
283 ++error_count_[id]; | |
284 } | |
285 | |
286 ClearExpectations(id); | |
287 delete [] expected_data; | |
288 } | |
289 | |
290 // Renames the download file. | 211 // Renames the download file. |
291 // |id| is the download ID of the download file. | 212 // |id| is the download ID of the download file. |
292 // |new_path| is the new file path. | 213 // |new_path| is the new file path. |
293 // |unique_path| is the actual path that the download file will be | 214 // |unique_path| is the actual path that the download file will be |
294 // renamed to. If there is an existing file at | 215 // renamed to. If there is an existing file at |
295 // |new_path| and |replace| is false, then |new_path| | 216 // |new_path| and |replace| is false, then |new_path| |
296 // will be uniquified. | 217 // will be uniquified. |
297 // |rename_error| is the error to inject. For no error, use net::OK. | 218 // |rename_error| is the error to inject. For no error, use net::OK. |
298 // |state| whether we are renaming an in-progress download or a | 219 // |state| whether we are renaming an in-progress download or a |
299 // completed download. | 220 // completed download. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 OnDownloadRenamed(id.local(), FilePath())); | 271 OnDownloadRenamed(id.local(), FilePath())); |
351 ProcessAllPendingMessages(); | 272 ProcessAllPendingMessages(); |
352 ++error_count_[id]; | 273 ++error_count_[id]; |
353 } else { | 274 } else { |
354 EXPECT_CALL(*download_manager_, | 275 EXPECT_CALL(*download_manager_, |
355 OnDownloadRenamed(id.local(), unique_path)); | 276 OnDownloadRenamed(id.local(), unique_path)); |
356 ProcessAllPendingMessages(); | 277 ProcessAllPendingMessages(); |
357 } | 278 } |
358 } | 279 } |
359 | 280 |
360 // Finish the download operation. | |
361 // |id| is the download ID of the download file. | |
362 // |reason| is the interrupt reason to inject. For no interrupt, use | |
363 // DOWNLOAD_INTERRUPT_REASON_NONE. | |
364 // |security_string| is the extra security information, if interrupted. | |
365 void OnResponseCompleted(const DownloadId& id, | |
366 content::DownloadInterruptReason reason, | |
367 const std::string& security_string) { | |
368 // OnResponseCompleted | |
369 // GetDownloadFile | |
370 // DownloadFile::Finish | |
371 // DownloadFile::GetDownloadManager | |
372 // DownloadFile::BytesSoFar | |
373 // Process one message in the message loop | |
374 // | |
375 // OK: | |
376 // DownloadFile::GetHash | |
377 // DownloadManager::OnResponseCompleted | |
378 // | |
379 // On Error: | |
380 // DownloadManager::OnDownloadInterrupted | |
381 MockDownloadFile* file = download_file_factory_->GetExistingFile(id); | |
382 ASSERT_TRUE(file != NULL); | |
383 | |
384 EXPECT_CALL(*file, Finish()); | |
385 EXPECT_CALL(*file, GetDownloadManager()); | |
386 if (reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) { | |
387 EXPECT_CALL(*file, GetHash(_)) | |
388 .WillOnce(Return(false)); | |
389 } else { | |
390 EXPECT_CALL(*file, GetHashState()); | |
391 } | |
392 EXPECT_CALL(*file, BytesSoFar()) | |
393 .Times(AtLeast(1)) | |
394 .WillRepeatedly(Return(byte_count_[id])); | |
395 | |
396 download_file_manager_->OnResponseCompleted(id, reason, security_string); | |
397 | |
398 if (reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) { | |
399 EXPECT_CALL(*download_manager_, | |
400 OnResponseCompleted(id.local(), byte_count_[id], "")) | |
401 .Times(1); | |
402 } else { | |
403 EXPECT_EQ(0, error_count_[id]); | |
404 | |
405 EXPECT_CALL(*download_manager_, | |
406 OnDownloadInterrupted(id.local(), | |
407 byte_count_[id], | |
408 "", | |
409 reason)) | |
410 .Times(1); | |
411 } | |
412 | |
413 ProcessAllPendingMessages(); | |
414 | |
415 if (reason != content::DOWNLOAD_INTERRUPT_REASON_NONE) | |
416 ++error_count_[id]; | |
417 | |
418 ClearExpectations(id); | |
419 } | |
420 | |
421 void CleanUp(DownloadId id) { | 281 void CleanUp(DownloadId id) { |
422 // Expected calls: | 282 // Expected calls: |
423 // DownloadFileManager::CancelDownload | 283 // DownloadFileManager::CancelDownload |
424 // DownloadFile::Cancel | 284 // DownloadFile::Cancel |
425 // DownloadFileManager::EraseDownload | 285 // DownloadFileManager::EraseDownload |
426 // if no more downloads: | 286 // if no more downloads: |
427 // DownloadFileManager::StopUpdateTimer | 287 // DownloadFileManager::StopUpdateTimer |
428 MockDownloadFile* file = download_file_factory_->GetExistingFile(id); | 288 MockDownloadFile* file = download_file_factory_->GetExistingFile(id); |
429 ASSERT_TRUE(file != NULL); | 289 ASSERT_TRUE(file != NULL); |
430 | 290 |
431 EXPECT_CALL(*file, Cancel()); | 291 EXPECT_CALL(*file, Cancel()); |
432 | 292 |
433 download_file_manager_->CancelDownload(id); | 293 download_file_manager_->CancelDownload(id); |
434 | 294 |
435 EXPECT_TRUE(NULL == download_file_manager_->GetDownloadFile(id)); | 295 EXPECT_TRUE(NULL == download_file_manager_->GetDownloadFile(id)); |
436 } | 296 } |
437 | 297 |
438 protected: | 298 protected: |
439 scoped_refptr<TestDownloadManager> download_manager_; | 299 scoped_refptr<TestDownloadManager> download_manager_; |
440 scoped_ptr<MockDownloadRequestHandle> request_handle_; | 300 scoped_ptr<MockDownloadRequestHandle> request_handle_; |
441 MockDownloadFileFactory* download_file_factory_; | 301 MockDownloadFileFactory* download_file_factory_; |
442 scoped_refptr<DownloadFileManager> download_file_manager_; | 302 scoped_refptr<DownloadFileManager> download_file_manager_; |
443 scoped_refptr<content::DownloadBuffer> download_buffer_; | |
444 | 303 |
445 // Per-download statistics. | 304 // Per-download statistics. |
446 std::map<DownloadId, int64> byte_count_; | 305 std::map<DownloadId, int64> byte_count_; |
447 std::map<DownloadId, int> error_count_; | 306 std::map<DownloadId, int> error_count_; |
448 | 307 |
449 private: | 308 private: |
450 MessageLoop loop_; | 309 MessageLoop loop_; |
451 | 310 |
452 // UI thread. | 311 // UI thread. |
453 BrowserThreadImpl ui_thread_; | 312 BrowserThreadImpl ui_thread_; |
454 | 313 |
455 // File thread to satisfy debug checks in DownloadFile. | 314 // File thread to satisfy debug checks in DownloadFile. |
456 BrowserThreadImpl file_thread_; | 315 BrowserThreadImpl file_thread_; |
457 }; | 316 }; |
458 | 317 |
459 const char* DownloadFileManagerTest::kTestData1 = | 318 const char* DownloadFileManagerTest::kTestData1 = |
460 "Let's write some data to the file!\n"; | 319 "Let's write some data to the file!\n"; |
461 const char* DownloadFileManagerTest::kTestData2 = "Writing more data.\n"; | 320 const char* DownloadFileManagerTest::kTestData2 = "Writing more data.\n"; |
462 const char* DownloadFileManagerTest::kTestData3 = "Final line."; | 321 const char* DownloadFileManagerTest::kTestData3 = "Final line."; |
463 const char* DownloadFileManagerTest::kTestData4 = "Writing, writing, writing\n"; | 322 const char* DownloadFileManagerTest::kTestData4 = "Writing, writing, writing\n"; |
464 const char* DownloadFileManagerTest::kTestData5 = "All we do is writing,\n"; | 323 const char* DownloadFileManagerTest::kTestData5 = "All we do is writing,\n"; |
465 const char* DownloadFileManagerTest::kTestData6 = "Rawhide!"; | 324 const char* DownloadFileManagerTest::kTestData6 = "Rawhide!"; |
466 | 325 |
467 const int32 DownloadFileManagerTest::kDummyDownloadId = 23; | 326 const int32 DownloadFileManagerTest::kDummyDownloadId = 23; |
468 const int32 DownloadFileManagerTest::kDummyDownloadId2 = 77; | 327 const int32 DownloadFileManagerTest::kDummyDownloadId2 = 77; |
469 const int DownloadFileManagerTest::kDummyChildId = 3; | 328 const int DownloadFileManagerTest::kDummyChildId = 3; |
470 const int DownloadFileManagerTest::kDummyRequestId = 67; | 329 const int DownloadFileManagerTest::kDummyRequestId = 67; |
471 | 330 |
472 TEST_F(DownloadFileManagerTest, CancelAtStart) { | 331 TEST_F(DownloadFileManagerTest, CancelAtStart) { |
473 DownloadCreateInfo* info = new DownloadCreateInfo; | 332 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
474 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 333 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
475 | 334 |
476 StartDownload(info, dummy_id); | 335 StartDownload(info.Pass(), dummy_id); |
477 | 336 |
478 CleanUp(dummy_id); | 337 CleanUp(dummy_id); |
479 } | 338 } |
480 | 339 |
481 TEST_F(DownloadFileManagerTest, CancelBeforeFinished) { | 340 TEST_F(DownloadFileManagerTest, CancelBeforeFinished) { |
482 // Same as StartDownload, at first. | 341 // Same as StartDownload, at first. |
483 DownloadCreateInfo* info = new DownloadCreateInfo; | 342 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
484 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 343 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
485 | 344 |
486 StartDownload(info, dummy_id); | 345 StartDownload(info.Pass(), dummy_id); |
487 | |
488 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
489 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
490 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
491 | |
492 CleanUp(dummy_id); | |
493 } | |
494 | |
495 TEST_F(DownloadFileManagerTest, DownloadWithError) { | |
496 // Same as StartDownload, at first. | |
497 DownloadCreateInfo* info = new DownloadCreateInfo; | |
498 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | |
499 | |
500 StartDownload(info, dummy_id); | |
501 | |
502 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
503 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), | |
504 net::ERR_FILE_NO_SPACE); | |
505 } | |
506 | |
507 TEST_F(DownloadFileManagerTest, CompleteDownload) { | |
508 // Same as StartDownload, at first. | |
509 DownloadCreateInfo* info = new DownloadCreateInfo; | |
510 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | |
511 | |
512 StartDownload(info, dummy_id); | |
513 | |
514 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
515 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
516 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
517 | |
518 OnResponseCompleted(dummy_id, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
519 | |
520 CleanUp(dummy_id); | |
521 } | |
522 | |
523 TEST_F(DownloadFileManagerTest, CompleteDownloadWithError) { | |
524 // Same as StartDownload, at first. | |
525 DownloadCreateInfo* info = new DownloadCreateInfo; | |
526 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | |
527 | |
528 StartDownload(info, dummy_id); | |
529 | |
530 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
531 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
532 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
533 | |
534 OnResponseCompleted(dummy_id, | |
535 content::DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED, | |
536 ""); | |
537 | 346 |
538 CleanUp(dummy_id); | 347 CleanUp(dummy_id); |
539 } | 348 } |
540 | 349 |
541 TEST_F(DownloadFileManagerTest, RenameInProgress) { | 350 TEST_F(DownloadFileManagerTest, RenameInProgress) { |
542 // Same as StartDownload, at first. | 351 // Same as StartDownload, at first. |
543 DownloadCreateInfo* info = new DownloadCreateInfo; | 352 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
544 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 353 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
545 ScopedTempDir download_dir; | 354 ScopedTempDir download_dir; |
546 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 355 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
547 | 356 |
548 StartDownload(info, dummy_id); | 357 StartDownload(info.Pass(), dummy_id); |
549 | 358 |
550 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
551 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
552 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 359 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
553 RenameFile(dummy_id, foo, foo, net::OK, IN_PROGRESS, OVERWRITE); | 360 RenameFile(dummy_id, foo, foo, net::OK, IN_PROGRESS, OVERWRITE); |
554 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
555 | |
556 OnResponseCompleted(dummy_id, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
557 | 361 |
558 CleanUp(dummy_id); | 362 CleanUp(dummy_id); |
559 } | 363 } |
560 | 364 |
561 TEST_F(DownloadFileManagerTest, RenameInProgressWithUniquification) { | 365 TEST_F(DownloadFileManagerTest, RenameInProgressWithUniquification) { |
562 // Same as StartDownload, at first. | 366 // Same as StartDownload, at first. |
563 DownloadCreateInfo* info = new DownloadCreateInfo; | 367 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
564 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 368 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
565 ScopedTempDir download_dir; | 369 ScopedTempDir download_dir; |
566 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 370 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
567 | 371 |
568 StartDownload(info, dummy_id); | 372 StartDownload(info.Pass(), dummy_id); |
569 | 373 |
570 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
571 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
572 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 374 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
573 FilePath unique_foo(foo.InsertBeforeExtension(FILE_PATH_LITERAL(" (1)"))); | 375 FilePath unique_foo(foo.InsertBeforeExtension(FILE_PATH_LITERAL(" (1)"))); |
574 ASSERT_EQ(0, file_util::WriteFile(foo, "", 0)); | 376 ASSERT_EQ(0, file_util::WriteFile(foo, "", 0)); |
575 RenameFile(dummy_id, foo, unique_foo, net::OK, IN_PROGRESS, DONT_OVERWRITE); | 377 RenameFile(dummy_id, foo, unique_foo, net::OK, IN_PROGRESS, DONT_OVERWRITE); |
576 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
577 | |
578 OnResponseCompleted(dummy_id, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
579 | 378 |
580 CleanUp(dummy_id); | 379 CleanUp(dummy_id); |
581 } | 380 } |
582 | 381 |
583 TEST_F(DownloadFileManagerTest, RenameInProgressWithError) { | 382 TEST_F(DownloadFileManagerTest, RenameInProgressWithError) { |
584 // Same as StartDownload, at first. | 383 // Same as StartDownload, at first. |
585 DownloadCreateInfo* info = new DownloadCreateInfo; | 384 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
586 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 385 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
587 ScopedTempDir download_dir; | 386 ScopedTempDir download_dir; |
588 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 387 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
589 | 388 |
590 StartDownload(info, dummy_id); | 389 StartDownload(info.Pass(), dummy_id); |
591 | 390 |
592 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
593 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
594 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 391 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
595 RenameFile(dummy_id, foo, foo, net::ERR_FILE_PATH_TOO_LONG, | 392 RenameFile(dummy_id, foo, foo, net::ERR_FILE_PATH_TOO_LONG, |
596 IN_PROGRESS, OVERWRITE); | 393 IN_PROGRESS, OVERWRITE); |
597 | 394 |
598 CleanUp(dummy_id); | 395 CleanUp(dummy_id); |
599 } | 396 } |
600 | 397 |
601 TEST_F(DownloadFileManagerTest, RenameCompleting) { | 398 TEST_F(DownloadFileManagerTest, RenameWithUniquification) { |
602 // Same as StartDownload, at first. | 399 // Same as StartDownload, at first. |
603 DownloadCreateInfo* info = new DownloadCreateInfo; | 400 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
604 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 401 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
605 ScopedTempDir download_dir; | 402 ScopedTempDir download_dir; |
606 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 403 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
607 | 404 |
608 StartDownload(info, dummy_id); | 405 StartDownload(info.Pass(), dummy_id); |
609 | |
610 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
611 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
612 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
613 | |
614 OnResponseCompleted(dummy_id, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
615 | |
616 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | |
617 RenameFile(dummy_id, foo, foo, net::OK, COMPLETE, OVERWRITE); | |
618 | |
619 CleanUp(dummy_id); | |
620 } | |
621 | |
622 TEST_F(DownloadFileManagerTest, RenameCompletingWithUniquification) { | |
623 // Same as StartDownload, at first. | |
624 DownloadCreateInfo* info = new DownloadCreateInfo; | |
625 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | |
626 ScopedTempDir download_dir; | |
627 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | |
628 | |
629 StartDownload(info, dummy_id); | |
630 | |
631 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
632 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
633 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
634 | |
635 OnResponseCompleted(dummy_id, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
636 | 406 |
637 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 407 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
638 FilePath unique_foo(foo.InsertBeforeExtension(FILE_PATH_LITERAL(" (1)"))); | 408 FilePath unique_foo(foo.InsertBeforeExtension(FILE_PATH_LITERAL(" (1)"))); |
639 // Create a file at |foo|. Since we are specifying DONT_OVERWRITE, | 409 // Create a file at |foo|. Since we are specifying DONT_OVERWRITE, |
640 // RenameCompletingDownloadFile() should pick "foo (1).txt" instead of | 410 // RenameCompletingDownloadFile() should pick "foo (1).txt" instead of |
641 // overwriting this file. | 411 // overwriting this file. |
642 ASSERT_EQ(0, file_util::WriteFile(foo, "", 0)); | 412 ASSERT_EQ(0, file_util::WriteFile(foo, "", 0)); |
643 RenameFile(dummy_id, foo, unique_foo, net::OK, COMPLETE, DONT_OVERWRITE); | 413 RenameFile(dummy_id, foo, unique_foo, net::OK, COMPLETE, DONT_OVERWRITE); |
644 | 414 |
645 CleanUp(dummy_id); | 415 CleanUp(dummy_id); |
646 } | 416 } |
647 | 417 |
648 TEST_F(DownloadFileManagerTest, RenameCompletingWithError) { | |
649 // Same as StartDownload, at first. | |
650 DownloadCreateInfo* info = new DownloadCreateInfo; | |
651 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | |
652 ScopedTempDir download_dir; | |
653 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | |
654 | |
655 StartDownload(info, dummy_id); | |
656 | |
657 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
658 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
659 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
660 | |
661 OnResponseCompleted(dummy_id, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
662 | |
663 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | |
664 RenameFile(dummy_id, foo, foo, net::ERR_FILE_PATH_TOO_LONG, | |
665 COMPLETE, OVERWRITE); | |
666 | |
667 CleanUp(dummy_id); | |
668 } | |
669 | |
670 TEST_F(DownloadFileManagerTest, RenameTwice) { | 418 TEST_F(DownloadFileManagerTest, RenameTwice) { |
671 // Same as StartDownload, at first. | 419 // Same as StartDownload, at first. |
672 DownloadCreateInfo* info = new DownloadCreateInfo; | 420 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
673 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 421 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
674 ScopedTempDir download_dir; | 422 ScopedTempDir download_dir; |
675 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 423 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
676 | 424 |
677 StartDownload(info, dummy_id); | 425 StartDownload(info.Pass(), dummy_id); |
678 | 426 |
679 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | |
680 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
681 FilePath crfoo(download_dir.path().Append( | 427 FilePath crfoo(download_dir.path().Append( |
682 FILE_PATH_LITERAL("foo.txt.crdownload"))); | 428 FILE_PATH_LITERAL("foo.txt.crdownload"))); |
683 RenameFile(dummy_id, crfoo, crfoo, net::OK, IN_PROGRESS, OVERWRITE); | 429 RenameFile(dummy_id, crfoo, crfoo, net::OK, IN_PROGRESS, OVERWRITE); |
684 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
685 | |
686 OnResponseCompleted(dummy_id, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
687 | 430 |
688 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 431 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
689 RenameFile(dummy_id, foo, foo, net::OK, COMPLETE, OVERWRITE); | 432 RenameFile(dummy_id, foo, foo, net::OK, COMPLETE, OVERWRITE); |
690 | 433 |
691 CleanUp(dummy_id); | 434 CleanUp(dummy_id); |
692 } | 435 } |
693 | 436 |
694 TEST_F(DownloadFileManagerTest, TwoDownloads) { | 437 TEST_F(DownloadFileManagerTest, TwoDownloads) { |
695 // Same as StartDownload, at first. | 438 // Same as StartDownload, at first. |
696 DownloadCreateInfo* info = new DownloadCreateInfo; | 439 scoped_ptr<DownloadCreateInfo> info(new DownloadCreateInfo); |
697 DownloadCreateInfo* info2 = new DownloadCreateInfo; | 440 scoped_ptr<DownloadCreateInfo> info2(new DownloadCreateInfo); |
698 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); | 441 DownloadId dummy_id(download_manager_.get(), kDummyDownloadId); |
699 DownloadId dummy_id2(download_manager_.get(), kDummyDownloadId2); | 442 DownloadId dummy_id2(download_manager_.get(), kDummyDownloadId2); |
700 ScopedTempDir download_dir; | 443 ScopedTempDir download_dir; |
701 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); | 444 ASSERT_TRUE(download_dir.CreateUniqueTempDir()); |
702 | 445 |
703 StartDownload(info, dummy_id); | 446 StartDownload(info.Pass(), dummy_id); |
704 | 447 |
705 UpdateDownload(dummy_id, kTestData1, strlen(kTestData1), net::OK); | 448 StartDownload(info2.Pass(), dummy_id2); |
706 | 449 |
707 StartDownload(info2, dummy_id2); | |
708 | |
709 UpdateDownload(dummy_id, kTestData2, strlen(kTestData2), net::OK); | |
710 | |
711 UpdateDownload(dummy_id2, kTestData4, strlen(kTestData4), net::OK); | |
712 FilePath crbar(download_dir.path().Append( | 450 FilePath crbar(download_dir.path().Append( |
713 FILE_PATH_LITERAL("bar.txt.crdownload"))); | 451 FILE_PATH_LITERAL("bar.txt.crdownload"))); |
714 RenameFile(dummy_id2, crbar, crbar, net::OK, IN_PROGRESS, OVERWRITE); | 452 RenameFile(dummy_id2, crbar, crbar, net::OK, IN_PROGRESS, OVERWRITE); |
715 | 453 |
716 FilePath crfoo(download_dir.path().Append( | 454 FilePath crfoo(download_dir.path().Append( |
717 FILE_PATH_LITERAL("foo.txt.crdownload"))); | 455 FILE_PATH_LITERAL("foo.txt.crdownload"))); |
718 RenameFile(dummy_id, crfoo, crfoo, net::OK, IN_PROGRESS, OVERWRITE); | 456 RenameFile(dummy_id, crfoo, crfoo, net::OK, IN_PROGRESS, OVERWRITE); |
719 | 457 |
720 UpdateDownload(dummy_id, kTestData3, strlen(kTestData3), net::OK); | |
721 | |
722 UpdateDownload(dummy_id2, kTestData5, strlen(kTestData5), net::OK); | |
723 UpdateDownload(dummy_id2, kTestData6, strlen(kTestData6), net::OK); | |
724 | |
725 OnResponseCompleted(dummy_id2, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
726 | |
727 OnResponseCompleted(dummy_id, content::DOWNLOAD_INTERRUPT_REASON_NONE, ""); | |
728 | 458 |
729 FilePath bar(download_dir.path().Append(FILE_PATH_LITERAL("bar.txt"))); | 459 FilePath bar(download_dir.path().Append(FILE_PATH_LITERAL("bar.txt"))); |
730 RenameFile(dummy_id2, bar, bar, net::OK, COMPLETE, OVERWRITE); | 460 RenameFile(dummy_id2, bar, bar, net::OK, COMPLETE, OVERWRITE); |
731 | 461 |
732 CleanUp(dummy_id2); | 462 CleanUp(dummy_id2); |
733 | 463 |
734 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); | 464 FilePath foo(download_dir.path().Append(FILE_PATH_LITERAL("foo.txt"))); |
735 RenameFile(dummy_id, foo, foo, net::OK, COMPLETE, OVERWRITE); | 465 RenameFile(dummy_id, foo, foo, net::OK, COMPLETE, OVERWRITE); |
736 | 466 |
737 CleanUp(dummy_id); | 467 CleanUp(dummy_id); |
738 } | 468 } |
739 | 469 |
740 | 470 |
741 // TODO(ahendrickson) -- A test for updating progress. | 471 // TODO(ahendrickson) -- A test for updating progress. |
742 // Expected call sequence: | 472 // Expected call sequence: |
743 // UpdateInProgressDownloads | 473 // UpdateInProgressDownloads |
744 // DownloadFile::GetDownloadFile | 474 // DownloadFile::GetDownloadFile |
745 // Process one message in the message loop | 475 // Process one message in the message loop |
746 // DownloadManager::UpdateDownload | 476 // DownloadManager::UpdateDownload |
747 | 477 |
748 // TODO(ahendrickson) -- A test for download manager shutdown. | 478 // TODO(ahendrickson) -- A test for download manager shutdown. |
749 // Expected call sequence: | 479 // Expected call sequence: |
750 // OnDownloadManagerShutdown | 480 // OnDownloadManagerShutdown |
751 // DownloadFile::GetDownloadManager | 481 // DownloadFile::GetDownloadManager |
752 // DownloadFile::CancelDownloadRequest | 482 // DownloadFile::CancelDownloadRequest |
753 // DownloadFile::~DownloadFile | 483 // DownloadFile::~DownloadFile |
OLD | NEW |