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

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

Issue 10344024: Rewrite download manager unit to be actual unit tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Modified creation comment. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/download/download_manager_impl.h" 5 #include "content/browser/download/download_manager_impl.h"
6 6
7 #include <iterator> 7 #include <iterator>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 129
130 void EnsureNoPendingDownloadJobsOnIO(bool* result) { 130 void EnsureNoPendingDownloadJobsOnIO(bool* result) {
131 scoped_refptr<DownloadFileManager> download_file_manager = 131 scoped_refptr<DownloadFileManager> download_file_manager =
132 ResourceDispatcherHostImpl::Get()->download_file_manager(); 132 ResourceDispatcherHostImpl::Get()->download_file_manager();
133 BrowserThread::PostTask( 133 BrowserThread::PostTask(
134 BrowserThread::FILE, FROM_HERE, 134 BrowserThread::FILE, FROM_HERE,
135 base::Bind(&EnsureNoPendingDownloadsOnFile, 135 base::Bind(&EnsureNoPendingDownloadsOnFile,
136 download_file_manager, result)); 136 download_file_manager, result));
137 } 137 }
138 138
139 class DownloadItemFactoryImpl
140 : public DownloadManagerImpl::DownloadItemFactory {
141 public:
142 DownloadItemFactoryImpl() {}
143 virtual ~DownloadItemFactoryImpl() {}
144
145 virtual content::DownloadItem* CreatePersistedItem(
146 DownloadItemImpl::Delegate* delegate,
147 content::DownloadId download_id,
148 const content::DownloadPersistentStoreInfo& info,
149 const net::BoundNetLog& bound_net_log) OVERRIDE;
150
151 virtual content::DownloadItem* CreateActiveItem(
152 DownloadItemImpl::Delegate* delegate,
153 const DownloadCreateInfo& info,
154 DownloadRequestHandleInterface* request_handle,
155 bool is_otr,
156 const net::BoundNetLog& bound_net_log) OVERRIDE;
157
158 virtual content::DownloadItem* CreateSavePageItem(
159 DownloadItemImpl::Delegate* delegate,
160 const FilePath& path,
161 const GURL& url,
162 bool is_otr,
163 content::DownloadId download_id,
164 const std::string& mime_type,
165 const net::BoundNetLog& bound_net_log) OVERRIDE;
166 };
167
168
169 content::DownloadItem* DownloadItemFactoryImpl::CreatePersistedItem(
170 DownloadItemImpl::Delegate* delegate,
171 content::DownloadId download_id,
172 const content::DownloadPersistentStoreInfo& info,
173 const net::BoundNetLog& bound_net_log) {
174 return new DownloadItemImpl(delegate, download_id, info, bound_net_log);
175 }
176
177 content::DownloadItem* DownloadItemFactoryImpl::CreateActiveItem(
178 DownloadItemImpl::Delegate* delegate,
179 const DownloadCreateInfo& info,
180 DownloadRequestHandleInterface* request_handle,
181 bool is_otr,
182 const net::BoundNetLog& bound_net_log) {
183 return new DownloadItemImpl(delegate, info, request_handle, is_otr,
184 bound_net_log);
185 }
186
187 content::DownloadItem* DownloadItemFactoryImpl::CreateSavePageItem(
188 DownloadItemImpl::Delegate* delegate,
189 const FilePath& path,
190 const GURL& url,
191 bool is_otr,
192 content::DownloadId download_id,
193 const std::string& mime_type,
194 const net::BoundNetLog& bound_net_log) {
195 return new DownloadItemImpl(delegate, path, url, is_otr, download_id,
196 mime_type, bound_net_log);
197 }
198
139 } // namespace 199 } // namespace
140 200
141 namespace content { 201 namespace content {
142 202
143 // static 203 // static
144 DownloadManager* DownloadManager::Create( 204 DownloadManager* DownloadManager::Create(
145 content::DownloadManagerDelegate* delegate, 205 content::DownloadManagerDelegate* delegate,
146 net::NetLog* net_log) { 206 net::NetLog* net_log) {
147 return new DownloadManagerImpl(delegate, net_log); 207 // Find the DownloadFileManager for use when creating the DownloadManager.
208 // Note that unit tests should construct based on the underlying
209 // constructor, so ResourceDispatcherHostImpl & DownloadFileManager
210 // should always be present when using this code.
211 ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get();
212 DownloadFileManager* file_manager = NULL;
213 DCHECK(rdh);
214 file_manager = rdh->download_file_manager();
215 DCHECK(file_manager);
216
217 return new DownloadManagerImpl(delegate, file_manager, NULL, net_log);
asanka 2012/06/07 17:04:53 Why not create the DownloadItemFactoryImpl instanc
Randy Smith (Not in Mondays) 2012/06/07 23:27:21 Fair question, and I'll try to implement the spirt
148 } 218 }
149 219
150 bool DownloadManager::EnsureNoPendingDownloadsForTesting() { 220 bool DownloadManager::EnsureNoPendingDownloadsForTesting() {
151 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 221 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
152 bool result = true; 222 bool result = true;
153 BrowserThread::PostTask( 223 BrowserThread::PostTask(
154 BrowserThread::IO, FROM_HERE, 224 BrowserThread::IO, FROM_HERE,
155 base::Bind(&EnsureNoPendingDownloadJobsOnIO, &result)); 225 base::Bind(&EnsureNoPendingDownloadJobsOnIO, &result));
156 MessageLoop::current()->Run(); 226 MessageLoop::current()->Run();
157 return result; 227 return result;
158 } 228 }
159 229
160 } // namespace content 230 } // namespace content
161 231
162 DownloadManagerImpl::DownloadManagerImpl( 232 DownloadManagerImpl::DownloadManagerImpl(
163 content::DownloadManagerDelegate* delegate, 233 content::DownloadManagerDelegate* delegate,
234 DownloadFileManager* file_manager,
235 DownloadManagerImpl::DownloadItemFactory *factory,
164 net::NetLog* net_log) 236 net::NetLog* net_log)
165 : shutdown_needed_(false), 237 : factory_(factory),
166 browser_context_(NULL), 238 shutdown_needed_(false),
167 file_manager_(NULL), 239 browser_context_(NULL),
168 delegate_(delegate), 240 file_manager_(file_manager),
169 net_log_(net_log) { 241 delegate_(delegate),
242 net_log_(net_log) {
243 if (!factory_.get())
244 factory_.reset(new DownloadItemFactoryImpl());
170 } 245 }
171 246
172 DownloadManagerImpl::~DownloadManagerImpl() { 247 DownloadManagerImpl::~DownloadManagerImpl() {
173 DCHECK(!shutdown_needed_); 248 DCHECK(!shutdown_needed_);
174 } 249 }
175 250
176 DownloadId DownloadManagerImpl::GetNextId() { 251 DownloadId DownloadManagerImpl::GetNextId() {
177 return delegate_->GetNextId(); 252 return delegate_->GetNextId();
178 } 253 }
179 254
180 bool DownloadManagerImpl::ShouldOpenDownload(DownloadItem* item) { 255 bool DownloadManagerImpl::ShouldOpenDownload(DownloadItem* item) {
181 return delegate_->ShouldOpenDownload(item); 256 return delegate_->ShouldOpenDownload(item);
182 } 257 }
183 258
184 bool DownloadManagerImpl::ShouldOpenFileBasedOnExtension(const FilePath& path) { 259 bool DownloadManagerImpl::ShouldOpenFileBasedOnExtension(const FilePath& path) {
185 return delegate_->ShouldOpenFileBasedOnExtension(path); 260 return delegate_->ShouldOpenFileBasedOnExtension(path);
186 } 261 }
187 262
188 void DownloadManagerImpl::Shutdown() { 263 void DownloadManagerImpl::Shutdown() {
189 VLOG(20) << __FUNCTION__ << "()" 264 VLOG(20) << __FUNCTION__ << "()"
190 << " shutdown_needed_ = " << shutdown_needed_; 265 << " shutdown_needed_ = " << shutdown_needed_;
191 if (!shutdown_needed_) 266 if (!shutdown_needed_)
192 return; 267 return;
193 shutdown_needed_ = false; 268 shutdown_needed_ = false;
194 269
195 FOR_EACH_OBSERVER(Observer, observers_, ManagerGoingDown(this)); 270 FOR_EACH_OBSERVER(Observer, observers_, ManagerGoingDown(this));
196 // TODO(benjhayden): Consider clearing observers_. 271 // TODO(benjhayden): Consider clearing observers_.
197 272
198 if (file_manager_) { 273 DCHECK(file_manager_);
199 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 274 BrowserThread::PostTask(
200 base::Bind(&DownloadFileManager::OnDownloadManagerShutdown, 275 BrowserThread::FILE, FROM_HERE,
201 file_manager_, make_scoped_refptr(this))); 276 base::Bind(&DownloadFileManager::OnDownloadManagerShutdown,
202 } 277 file_manager_, make_scoped_refptr(this)));
203 278
204 AssertContainersConsistent(); 279 AssertContainersConsistent();
205 280
206 // Go through all downloads in downloads_. Dangerous ones we need to 281 // Go through all downloads in downloads_. Dangerous ones we need to
207 // remove on disk, and in progress ones we need to cancel. 282 // remove on disk, and in progress ones we need to cancel.
208 for (DownloadSet::iterator it = downloads_.begin(); it != downloads_.end();) { 283 for (DownloadSet::iterator it = downloads_.begin(); it != downloads_.end();) {
209 DownloadItem* download = *it; 284 DownloadItem* download = *it;
210 285
211 // Save iterator from potential erases in this set done by called code. 286 // Save iterator from potential erases in this set done by called code.
212 // Iterators after an erasure point are still valid for lists and 287 // Iterators after an erasure point are still valid for lists and
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 // The Incognito Downloads page will get the list of non-Incognito downloads 368 // The Incognito Downloads page will get the list of non-Incognito downloads
294 // from its parent profile. 369 // from its parent profile.
295 if (browser_context_->IsOffTheRecord() != download_item->IsOtr()) 370 if (browser_context_->IsOffTheRecord() != download_item->IsOtr())
296 continue; 371 continue;
297 372
298 if (download_item->MatchesQuery(query_lower)) 373 if (download_item->MatchesQuery(query_lower))
299 result->push_back(download_item); 374 result->push_back(download_item);
300 } 375 }
301 } 376 }
302 377
303 // Query the history service for information about all persisted downloads.
304 bool DownloadManagerImpl::Init(content::BrowserContext* browser_context) { 378 bool DownloadManagerImpl::Init(content::BrowserContext* browser_context) {
305 DCHECK(browser_context); 379 DCHECK(browser_context);
306 DCHECK(!shutdown_needed_) << "DownloadManager already initialized."; 380 DCHECK(!shutdown_needed_) << "DownloadManager already initialized.";
307 shutdown_needed_ = true; 381 shutdown_needed_ = true;
308 382
309 browser_context_ = browser_context; 383 browser_context_ = browser_context;
310 384
311 // In test mode, there may be no ResourceDispatcherHostImpl. In this case
312 // it's safe to avoid setting |file_manager_| because we only call a small
313 // set of functions, none of which need it.
314 ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get();
315 if (rdh) {
316 file_manager_ = rdh->download_file_manager();
317 DCHECK(file_manager_);
318 }
319
320 return true; 385 return true;
321 } 386 }
322 387
323 // We have received a message from DownloadFileManager about a new download. 388 // We have received a message from DownloadFileManager about a new download.
324 void DownloadManagerImpl::StartDownload(int32 download_id) { 389 void DownloadManagerImpl::StartDownload(int32 download_id) {
325 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 390 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
326 391
327 if (delegate_->ShouldStartDownload(download_id)) 392 if (delegate_->ShouldStartDownload(download_id))
328 RestartDownload(download_id); 393 RestartDownload(download_id);
329 } 394 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 FilePath DownloadManagerImpl::LastDownloadPath() { 466 FilePath DownloadManagerImpl::LastDownloadPath() {
402 return last_download_path_; 467 return last_download_path_;
403 } 468 }
404 469
405 net::BoundNetLog DownloadManagerImpl::CreateDownloadItem( 470 net::BoundNetLog DownloadManagerImpl::CreateDownloadItem(
406 DownloadCreateInfo* info, const DownloadRequestHandle& request_handle) { 471 DownloadCreateInfo* info, const DownloadRequestHandle& request_handle) {
407 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 472 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
408 473
409 net::BoundNetLog bound_net_log = 474 net::BoundNetLog bound_net_log =
410 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD); 475 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD);
411 DownloadItem* download = new DownloadItemImpl( 476 DownloadItem* download = factory_->CreateActiveItem(
412 this, *info, new DownloadRequestHandle(request_handle), 477 this, *info, new DownloadRequestHandle(request_handle),
413 browser_context_->IsOffTheRecord(), bound_net_log); 478 browser_context_->IsOffTheRecord(), bound_net_log);
414 int32 download_id = info->download_id.local(); 479 int32 download_id = info->download_id.local();
415 480
416 DCHECK(!ContainsKey(active_downloads_, download_id)); 481 DCHECK(!ContainsKey(active_downloads_, download_id));
417 downloads_.insert(download); 482 downloads_.insert(download);
418 active_downloads_[download_id] = download; 483 active_downloads_[download_id] = download;
419 484
420 return bound_net_log; 485 return bound_net_log;
421 } 486 }
422 487
423 DownloadItem* DownloadManagerImpl::CreateSavePackageDownloadItem( 488 DownloadItem* DownloadManagerImpl::CreateSavePackageDownloadItem(
424 const FilePath& main_file_path, 489 const FilePath& main_file_path,
425 const GURL& page_url, 490 const GURL& page_url,
426 bool is_otr, 491 bool is_otr,
427 const std::string& mime_type, 492 const std::string& mime_type,
428 DownloadItem::Observer* observer) { 493 DownloadItem::Observer* observer) {
429 net::BoundNetLog bound_net_log = 494 net::BoundNetLog bound_net_log =
430 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD); 495 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD);
431 DownloadItem* download = new DownloadItemImpl( 496 DownloadItem* download = factory_->CreateSavePageItem(
432 this, 497 this,
433 main_file_path, 498 main_file_path,
434 page_url, 499 page_url,
435 is_otr, 500 is_otr,
436 GetNextId(), 501 GetNextId(),
437 mime_type, 502 mime_type,
438 bound_net_log); 503 bound_net_log);
439 504
440 download->AddObserver(observer); 505 download->AddObserver(observer);
441 506
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 711 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
647 712
648 VLOG(20) << __FUNCTION__ << "()" 713 VLOG(20) << __FUNCTION__ << "()"
649 << " download = " << download->DebugString(true); 714 << " download = " << download->DebugString(true);
650 715
651 RemoveFromActiveList(download); 716 RemoveFromActiveList(download);
652 // This function is called from the DownloadItem, so DI state 717 // This function is called from the DownloadItem, so DI state
653 // should already have been updated. 718 // should already have been updated.
654 AssertStateConsistent(download); 719 AssertStateConsistent(download);
655 720
656 if (file_manager_) 721 DCHECK(file_manager_);
657 download->OffThreadCancel(file_manager_); 722 download->OffThreadCancel(file_manager_);
658 } 723 }
659 724
660 void DownloadManagerImpl::OnDownloadInterrupted( 725 void DownloadManagerImpl::OnDownloadInterrupted(
661 int32 download_id, 726 int32 download_id,
662 int64 size, 727 int64 size,
663 const std::string& hash_state, 728 const std::string& hash_state,
664 content::DownloadInterruptReason reason) { 729 content::DownloadInterruptReason reason) {
665 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 730 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
666 731
667 DownloadItem* download = GetActiveDownload(download_id); 732 DownloadItem* download = GetActiveDownload(download_id);
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 // 'DownloadPersistentStoreInfo's in sorted order (by ascending start_time). 917 // 'DownloadPersistentStoreInfo's in sorted order (by ascending start_time).
853 void DownloadManagerImpl::OnPersistentStoreQueryComplete( 918 void DownloadManagerImpl::OnPersistentStoreQueryComplete(
854 std::vector<DownloadPersistentStoreInfo>* entries) { 919 std::vector<DownloadPersistentStoreInfo>* entries) {
855 for (size_t i = 0; i < entries->size(); ++i) { 920 for (size_t i = 0; i < entries->size(); ++i) {
856 int64 db_handle = entries->at(i).db_handle; 921 int64 db_handle = entries->at(i).db_handle;
857 base::debug::Alias(&db_handle); 922 base::debug::Alias(&db_handle);
858 DCHECK(!ContainsKey(history_downloads_, db_handle)); 923 DCHECK(!ContainsKey(history_downloads_, db_handle));
859 924
860 net::BoundNetLog bound_net_log = 925 net::BoundNetLog bound_net_log =
861 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD); 926 net::BoundNetLog::Make(net_log_, net::NetLog::SOURCE_DOWNLOAD);
862 DownloadItem* download = new DownloadItemImpl( 927 DownloadItem* download = factory_->CreatePersistedItem(
863 this, GetNextId(), entries->at(i), bound_net_log); 928 this, GetNextId(), entries->at(i), bound_net_log);
864 downloads_.insert(download); 929 downloads_.insert(download);
865 history_downloads_[download->GetDbHandle()] = download; 930 history_downloads_[download->GetDbHandle()] = download;
866 VLOG(20) << __FUNCTION__ << "()" << i << ">" 931 VLOG(20) << __FUNCTION__ << "()" << i << ">"
867 << " download = " << download->DebugString(true); 932 << " download = " << download->DebugString(true);
868 } 933 }
869 NotifyModelChanged(); 934 NotifyModelChanged();
870 CheckForHistoryFilesRemoval(); 935 CheckForHistoryFilesRemoval();
871 } 936 }
872 937
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 } 1181 }
1117 1182
1118 void DownloadManagerImpl::DownloadRenamedToFinalName( 1183 void DownloadManagerImpl::DownloadRenamedToFinalName(
1119 DownloadItem* download) { 1184 DownloadItem* download) {
1120 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1185 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1121 // If the rename failed, we receive an OnDownloadInterrupted() call before we 1186 // If the rename failed, we receive an OnDownloadInterrupted() call before we
1122 // receive the DownloadRenamedToFinalName() call. 1187 // receive the DownloadRenamedToFinalName() call.
1123 delegate_->UpdatePathForItemInPersistentStore(download, 1188 delegate_->UpdatePathForItemInPersistentStore(download,
1124 download->GetFullPath()); 1189 download->GetFullPath());
1125 } 1190 }
1126
1127 void DownloadManagerImpl::SetFileManagerForTesting(
1128 DownloadFileManager* file_manager) {
1129 file_manager_ = file_manager;
1130 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698