| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 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 | 
|  | 3 // found in the LICENSE file. | 
|  | 4 | 
|  | 5 #include "base/rand_util.h" | 
|  | 6 #include "chrome/browser/download/download_history.h" | 
|  | 7 #include "chrome/browser/history/download_persistent_store_info.h" | 
|  | 8 #include "chrome/browser/history/history.h" | 
|  | 9 #include "chrome/test/base/in_process_browser_test.h" | 
|  | 10 #include "content/public/test/mock_download_item.h" | 
|  | 11 #include "content/public/test/mock_download_manager.h" | 
|  | 12 #include "content/public/test/test_utils.h" | 
|  | 13 | 
|  | 14 using content::BrowserThread; | 
|  | 15 using testing::DoAll; | 
|  | 16 using testing::Return; | 
|  | 17 using testing::ReturnRef; | 
|  | 18 using testing::_; | 
|  | 19 | 
|  | 20 namespace { | 
|  | 21 | 
|  | 22 bool InfoEqual(const DownloadPersistentStoreInfo& left, | 
|  | 23                const DownloadPersistentStoreInfo& right) { | 
|  | 24   if (left.path != right.path) { | 
|  | 25     LOG(ERROR) << left.path.value() << " != " << right.path.value(); | 
|  | 26     return false; | 
|  | 27   } else if (left.url != right.url) { | 
|  | 28     LOG(ERROR) << left.url.spec() << " != " << right.url.spec(); | 
|  | 29     return false; | 
|  | 30   } else if (left.referrer_url != right.referrer_url) { | 
|  | 31     LOG(ERROR) << left.referrer_url.spec() << " != " | 
|  | 32                << right.referrer_url.spec(); | 
|  | 33     return false; | 
|  | 34   } else if (left.start_time != right.start_time) { | 
|  | 35     LOG(ERROR) << left.start_time.ToTimeT() << " != " | 
|  | 36                << right.start_time.ToTimeT(); | 
|  | 37     return false; | 
|  | 38   } else if (left.end_time != right.end_time) { | 
|  | 39     LOG(ERROR) << left.end_time.ToTimeT() << " != " << right.end_time.ToTimeT(); | 
|  | 40     return false; | 
|  | 41   } else if (left.received_bytes != right.received_bytes) { | 
|  | 42     LOG(ERROR) << left.received_bytes << " != " << right.received_bytes; | 
|  | 43     return false; | 
|  | 44   } else if (left.total_bytes != right.total_bytes) { | 
|  | 45     LOG(ERROR) << left.total_bytes << " != " << right.total_bytes; | 
|  | 46     return false; | 
|  | 47   } else if (left.state != right.state) { | 
|  | 48     LOG(ERROR) << left.state << " != " << right.state; | 
|  | 49     return false; | 
|  | 50   } else if (left.db_handle != right.db_handle) { | 
|  | 51     LOG(ERROR) << left.db_handle << " != " << right.db_handle; | 
|  | 52     return false; | 
|  | 53   } else if (left.opened != right.opened) { | 
|  | 54     LOG(ERROR) << left.opened << " != " << right.opened; | 
|  | 55     return false; | 
|  | 56   } | 
|  | 57   return true; | 
|  | 58 } | 
|  | 59 | 
|  | 60 typedef std::set<int64> HandleSet; | 
|  | 61 typedef std::vector<DownloadPersistentStoreInfo> InfoVector; | 
|  | 62 | 
|  | 63 class FakeHistoryService | 
|  | 64   : public HistoryService{ | 
|  | 65  public: | 
|  | 66   FakeHistoryService() | 
|  | 67     : slow_create_download_(false), | 
|  | 68       handle_counter_(0) { | 
|  | 69   } | 
|  | 70 | 
|  | 71   virtual void QueryDownloads( | 
|  | 72       const HistoryService::DownloadQueryCallback& callback) OVERRIDE { | 
|  | 73     BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 
|  | 74         base::Bind(&FakeHistoryService::QueryDownloadsDone, | 
|  | 75             base::Unretained(this), callback)); | 
|  | 76   } | 
|  | 77 | 
|  | 78   void QueryDownloadsDone( | 
|  | 79       const HistoryService::DownloadQueryCallback& callback) { | 
|  | 80     CHECK(expect_query_downloads_.get()); | 
|  | 81     callback.Run(expect_query_downloads_.Pass()); | 
|  | 82   } | 
|  | 83 | 
|  | 84   virtual void GetVisibleVisitCountToHostSimple( | 
|  | 85       const GURL& referrer_url, | 
|  | 86       const HistoryService::GetVisibleVisitCountToHostSimpleCallback& | 
|  | 87         callback) OVERRIDE { | 
|  | 88     NOTIMPLEMENTED(); | 
|  | 89   } | 
|  | 90 | 
|  | 91   void set_slow_create_download(bool slow) { slow_create_download_ = slow; } | 
|  | 92 | 
|  | 93   virtual void CreateDownload( | 
|  | 94       const DownloadPersistentStoreInfo& info, | 
|  | 95       const HistoryService::DownloadCreateCallback& callback) OVERRIDE { | 
|  | 96     create_download_info_ = info; | 
|  | 97     create_download_callback_ = base::Bind(callback, handle_counter_++); | 
|  | 98     if (!slow_create_download_) { | 
|  | 99       FinishCreateDownload(); | 
|  | 100     } | 
|  | 101   } | 
|  | 102 | 
|  | 103   void FinishCreateDownload() { | 
|  | 104     create_download_callback_.Run(); | 
|  | 105     create_download_callback_.Reset(); | 
|  | 106   } | 
|  | 107 | 
|  | 108   virtual void UpdateDownload( | 
|  | 109       const DownloadPersistentStoreInfo& info) OVERRIDE { | 
|  | 110     update_download_ = info; | 
|  | 111   } | 
|  | 112 | 
|  | 113   virtual void RemoveDownloads( | 
|  | 114       const HandleSet& handles) OVERRIDE { | 
|  | 115     for (HandleSet::const_iterator it = handles.begin(); | 
|  | 116          it != handles.end(); ++it) { | 
|  | 117       remove_downloads_.insert(*it); | 
|  | 118     } | 
|  | 119   } | 
|  | 120 | 
|  | 121   void ExpectQueryDownloads(scoped_ptr<InfoVector> infos) { | 
|  | 122     expect_query_downloads_ = infos.Pass(); | 
|  | 123   } | 
|  | 124 | 
|  | 125   void ExpectQueryDownloadsDone() { | 
|  | 126     CHECK(NULL == expect_query_downloads_.get()); | 
|  | 127   } | 
|  | 128 | 
|  | 129   void ExpectCreateDownload( | 
|  | 130       const DownloadPersistentStoreInfo& info) { | 
|  | 131     content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 
|  | 132     CHECK(InfoEqual(info, create_download_info_)); | 
|  | 133     create_download_info_ = DownloadPersistentStoreInfo(); | 
|  | 134   } | 
|  | 135 | 
|  | 136   void ExpectNoCreateDownload() { | 
|  | 137     content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 
|  | 138     CHECK(InfoEqual(DownloadPersistentStoreInfo(), create_download_info_)); | 
|  | 139   } | 
|  | 140 | 
|  | 141   void ExpectUpdateDownload(const DownloadPersistentStoreInfo& info) { | 
|  | 142     content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 
|  | 143     CHECK(InfoEqual(update_download_, info)); | 
|  | 144     update_download_ = DownloadPersistentStoreInfo(); | 
|  | 145   } | 
|  | 146 | 
|  | 147   void ExpectNoUpdateDownload() { | 
|  | 148     content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 
|  | 149     CHECK(InfoEqual(DownloadPersistentStoreInfo(), update_download_)); | 
|  | 150   } | 
|  | 151   void ExpectNoRemoveDownloads() { | 
|  | 152     content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 
|  | 153     CHECK_EQ(0, static_cast<int>(remove_downloads_.size())); | 
|  | 154   } | 
|  | 155 | 
|  | 156   void ExpectRemoveDownloads(const HandleSet& handles) { | 
|  | 157     content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 
|  | 158     HandleSet difference; | 
|  | 159     std::insert_iterator<HandleSet> insert_it( | 
|  | 160         difference, difference.begin()); | 
|  | 161     std::set_difference(handles.begin(), handles.end(), | 
|  | 162                         remove_downloads_.begin(), | 
|  | 163                         remove_downloads_.end(), | 
|  | 164                         insert_it); | 
|  | 165     CHECK(difference.empty()); | 
|  | 166     remove_downloads_.clear(); | 
|  | 167   } | 
|  | 168 | 
|  | 169  private: | 
|  | 170   virtual ~FakeHistoryService() {} | 
|  | 171 | 
|  | 172   bool slow_create_download_; | 
|  | 173   base::Closure create_download_callback_; | 
|  | 174   int handle_counter_; | 
|  | 175   DownloadPersistentStoreInfo update_download_; | 
|  | 176   scoped_ptr<InfoVector> expect_query_downloads_; | 
|  | 177   HandleSet remove_downloads_; | 
|  | 178   DownloadPersistentStoreInfo create_download_info_; | 
|  | 179 | 
|  | 180   DISALLOW_COPY_AND_ASSIGN(FakeHistoryService); | 
|  | 181 }; | 
|  | 182 | 
|  | 183 class DownloadHistoryTest : public InProcessBrowserTest { | 
|  | 184  public: | 
|  | 185   DownloadHistoryTest() | 
|  | 186     : manager_(new content::MockDownloadManager()), | 
|  | 187       download_history_(NULL) { | 
|  | 188   } | 
|  | 189   virtual ~DownloadHistoryTest() {} | 
|  | 190 | 
|  | 191  protected: | 
|  | 192   virtual void CleanUpOnMainThread() OVERRIDE { | 
|  | 193     download_history_.reset(); | 
|  | 194   } | 
|  | 195 | 
|  | 196   DownloadHistory* download_history() { return download_history_.get(); } | 
|  | 197 | 
|  | 198   content::MockDownloadManager& manager() { return *manager_.get(); } | 
|  | 199   content::MockDownloadItem& item() { return item_; } | 
|  | 200 | 
|  | 201   void ExpectQueryDownloads(scoped_ptr<InfoVector> infos) { | 
|  | 202     CHECK(infos.get()); | 
|  | 203     EXPECT_CALL(manager(), AddObserver(_)); | 
|  | 204     EXPECT_CALL(manager(), RemoveObserver(_)); | 
|  | 205     if (infos->size() != 0) { | 
|  | 206       EXPECT_EQ(1, static_cast<int>(infos->size())); | 
|  | 207       EXPECT_CALL(manager(), CreateDownloadItem( | 
|  | 208           infos->at(0).path, | 
|  | 209           infos->at(0).url, | 
|  | 210           infos->at(0).referrer_url, | 
|  | 211           infos->at(0).start_time, | 
|  | 212           infos->at(0).end_time, | 
|  | 213           infos->at(0).received_bytes, | 
|  | 214           infos->at(0).total_bytes, | 
|  | 215           infos->at(0).state, | 
|  | 216           infos->at(0).opened)) | 
|  | 217         .WillOnce(DoAll( | 
|  | 218             InvokeWithoutArgs( | 
|  | 219                 this, &DownloadHistoryTest::CallOnDownloadCreated), | 
|  | 220             Return(&item()))); | 
|  | 221     } | 
|  | 222     EXPECT_CALL(manager(), CheckForHistoryFilesRemoval()); | 
|  | 223     history_ = new FakeHistoryService(); | 
|  | 224     history_->ExpectQueryDownloads(infos.Pass()); | 
|  | 225     download_history_.reset(new DownloadHistory(&manager(), history_.get())); | 
|  | 226     content::RunAllPendingInMessageLoop(content::BrowserThread::UI); | 
|  | 227     history_->ExpectQueryDownloadsDone(); | 
|  | 228   } | 
|  | 229 | 
|  | 230   void CallOnDownloadCreated() { | 
|  | 231     download_history_->OnDownloadCreated(&manager(), &item()); | 
|  | 232   } | 
|  | 233 | 
|  | 234   void set_slow_create_download(bool slow) { | 
|  | 235     history_->set_slow_create_download(slow); | 
|  | 236   } | 
|  | 237 | 
|  | 238   void FinishCreateDownload() { | 
|  | 239     history_->FinishCreateDownload(); | 
|  | 240   } | 
|  | 241 | 
|  | 242   void ExpectCreateDownload( | 
|  | 243       const DownloadPersistentStoreInfo& info) { | 
|  | 244     history_->ExpectCreateDownload(info); | 
|  | 245   } | 
|  | 246 | 
|  | 247   void ExpectNoCreateDownload() { | 
|  | 248     history_->ExpectNoCreateDownload(); | 
|  | 249   } | 
|  | 250 | 
|  | 251   void ExpectUpdateDownload(const DownloadPersistentStoreInfo& info) { | 
|  | 252     history_->ExpectUpdateDownload(info); | 
|  | 253   } | 
|  | 254 | 
|  | 255   void ExpectNoUpdateDownload() { | 
|  | 256     history_->ExpectNoUpdateDownload(); | 
|  | 257   } | 
|  | 258 | 
|  | 259   void ExpectNoRemoveDownloads() { | 
|  | 260     history_->ExpectNoRemoveDownloads(); | 
|  | 261   } | 
|  | 262 | 
|  | 263   void ExpectRemoveDownloads(const HandleSet& handles) { | 
|  | 264     history_->ExpectRemoveDownloads(handles); | 
|  | 265   } | 
|  | 266 | 
|  | 267   void InitItem( | 
|  | 268       int32 id, | 
|  | 269       const FilePath& path, | 
|  | 270       const GURL& url, | 
|  | 271       const GURL& referrer, | 
|  | 272       const base::Time& start_time, | 
|  | 273       const base::Time& end_time, | 
|  | 274       int64 received_bytes, | 
|  | 275       int64 total_bytes, | 
|  | 276       content::DownloadItem::DownloadState state, | 
|  | 277       int64 db_handle, | 
|  | 278       bool opened, | 
|  | 279       DownloadPersistentStoreInfo* info) { | 
|  | 280     info->path = path; | 
|  | 281     info->url = url; | 
|  | 282     info->referrer_url = referrer; | 
|  | 283     info->start_time = start_time; | 
|  | 284     info->end_time = end_time; | 
|  | 285     info->received_bytes = received_bytes; | 
|  | 286     info->total_bytes = total_bytes; | 
|  | 287     info->state = state; | 
|  | 288     info->db_handle = db_handle; | 
|  | 289     info->opened = opened; | 
|  | 290     EXPECT_CALL(item(), GetId()).WillRepeatedly(Return(id)); | 
|  | 291     EXPECT_CALL(item(), GetFullPath()).WillRepeatedly(ReturnRef(path)); | 
|  | 292     EXPECT_CALL(item(), GetURL()).WillRepeatedly(ReturnRef(url)); | 
|  | 293     EXPECT_CALL(item(), GetReferrerUrl()).WillRepeatedly(ReturnRef(referrer)); | 
|  | 294     EXPECT_CALL(item(), GetStartTime()).WillRepeatedly(Return(start_time)); | 
|  | 295     EXPECT_CALL(item(), GetEndTime()).WillRepeatedly(Return(end_time)); | 
|  | 296     EXPECT_CALL(item(), GetReceivedBytes()) | 
|  | 297       .WillRepeatedly(Return(received_bytes)); | 
|  | 298     EXPECT_CALL(item(), GetTotalBytes()).WillRepeatedly(Return(total_bytes)); | 
|  | 299     EXPECT_CALL(item(), GetState()).WillRepeatedly(Return(state)); | 
|  | 300     EXPECT_CALL(item(), GetOpened()).WillRepeatedly(Return(opened)); | 
|  | 301     EXPECT_CALL(item(), GetTargetDisposition()).WillRepeatedly(Return( | 
|  | 302           content::DownloadItem::TARGET_DISPOSITION_OVERWRITE)); | 
|  | 303     EXPECT_CALL(manager(), GetDownload(id)) | 
|  | 304       .WillRepeatedly(Return(&item())); | 
|  | 305     EXPECT_CALL(item(), AddObserver(_)); | 
|  | 306     EXPECT_CALL(item(), RemoveObserver(_)); | 
|  | 307   } | 
|  | 308 | 
|  | 309  private: | 
|  | 310   testing::NiceMock<content::MockDownloadItem> item_; | 
|  | 311   scoped_refptr<FakeHistoryService> history_; | 
|  | 312   scoped_refptr<content::MockDownloadManager> manager_; | 
|  | 313   scoped_ptr<DownloadHistory> download_history_; | 
|  | 314 | 
|  | 315   DISALLOW_COPY_AND_ASSIGN(DownloadHistoryTest); | 
|  | 316 }; | 
|  | 317 | 
|  | 318 }  // anonymous namespace | 
|  | 319 | 
|  | 320 IN_PROC_BROWSER_TEST_F(DownloadHistoryTest, | 
|  | 321     DownloadHistoryTest_Load) { | 
|  | 322   // Load a download from history, create the item, OnDownloadCreated, | 
|  | 323   // OnDownloadUpdated, OnDownloadRemoved, OnDownloadDestroyed. | 
|  | 324   DownloadPersistentStoreInfo info; | 
|  | 325   InitItem(base::RandInt(0, 1 << 20), | 
|  | 326            FilePath(FILE_PATH_LITERAL("/foo/bar.pdf")), | 
|  | 327            GURL("http://example.com/bar.pdf"), | 
|  | 328            GURL("http://example.com/referrer.html"), | 
|  | 329            (base::Time::Now() - base::TimeDelta::FromMinutes(10)), | 
|  | 330            (base::Time::Now() - base::TimeDelta::FromMinutes(1)), | 
|  | 331            100, | 
|  | 332            100, | 
|  | 333            content::DownloadItem::COMPLETE, | 
|  | 334            base::RandInt(0, 1 << 20), | 
|  | 335            false, | 
|  | 336            &info); | 
|  | 337   { | 
|  | 338     scoped_ptr<InfoVector> infos(new InfoVector()); | 
|  | 339     infos->push_back(info); | 
|  | 340     ExpectQueryDownloads(infos.Pass()); | 
|  | 341     ExpectNoCreateDownload(); | 
|  | 342   } | 
|  | 343 | 
|  | 344   // Pretend that something changed on the item. | 
|  | 345   EXPECT_CALL(item(), GetOpened()).WillRepeatedly(Return(true)); | 
|  | 346   download_history()->OnDownloadUpdated(&item()); | 
|  | 347   info.opened = true; | 
|  | 348   ExpectUpdateDownload(info); | 
|  | 349 | 
|  | 350   // Pretend that the user removed the item. | 
|  | 351   HandleSet handles; | 
|  | 352   handles.insert(info.db_handle); | 
|  | 353   download_history()->OnDownloadRemoved(&item()); | 
|  | 354   ExpectRemoveDownloads(handles); | 
|  | 355 | 
|  | 356   // Pretend that the browser is closing. | 
|  | 357   download_history()->ManagerGoingDown(&manager()); | 
|  | 358   download_history()->OnDownloadDestroyed(&item()); | 
|  | 359 } | 
|  | 360 | 
|  | 361 IN_PROC_BROWSER_TEST_F(DownloadHistoryTest, | 
|  | 362     DownloadHistoryTest_Create) { | 
|  | 363   // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated, | 
|  | 364   // OnDownloadRemoved, OnDownloadDestroyed. | 
|  | 365   ExpectQueryDownloads(scoped_ptr<InfoVector>(new InfoVector())); | 
|  | 366 | 
|  | 367   // Note that db_handle must be -1 at first because it isn't in the db yet. | 
|  | 368   DownloadPersistentStoreInfo info; | 
|  | 369   InitItem(base::RandInt(0, 1 << 20), | 
|  | 370            FilePath(FILE_PATH_LITERAL("/foo/bar.pdf")), | 
|  | 371            GURL("http://example.com/bar.pdf"), | 
|  | 372            GURL("http://example.com/referrer.html"), | 
|  | 373            (base::Time::Now() - base::TimeDelta::FromMinutes(10)), | 
|  | 374            (base::Time::Now() - base::TimeDelta::FromMinutes(1)), | 
|  | 375            100, | 
|  | 376            100, | 
|  | 377            content::DownloadItem::COMPLETE, | 
|  | 378            -1, | 
|  | 379            false, | 
|  | 380            &info); | 
|  | 381 | 
|  | 382   // Pretend the manager just created |item|. | 
|  | 383   download_history()->OnDownloadCreated(&manager(), &item()); | 
|  | 384   // CreateDownload() always gets db_handle=-1. | 
|  | 385   ExpectCreateDownload(info); | 
|  | 386   info.db_handle = 0; | 
|  | 387 | 
|  | 388   // Pretend that something changed on the item. | 
|  | 389   EXPECT_CALL(item(), GetOpened()).WillRepeatedly(Return(true)); | 
|  | 390   download_history()->OnDownloadUpdated(&item()); | 
|  | 391   info.opened = true; | 
|  | 392   ExpectUpdateDownload(info); | 
|  | 393 | 
|  | 394   // Pretend that the user removed the item. | 
|  | 395   HandleSet handles; | 
|  | 396   handles.insert(info.db_handle); | 
|  | 397   download_history()->OnDownloadRemoved(&item()); | 
|  | 398   ExpectRemoveDownloads(handles); | 
|  | 399 | 
|  | 400   // Pretend that the browser is closing. | 
|  | 401   download_history()->ManagerGoingDown(&manager()); | 
|  | 402   download_history()->OnDownloadDestroyed(&item()); | 
|  | 403 } | 
|  | 404 | 
|  | 405 IN_PROC_BROWSER_TEST_F(DownloadHistoryTest, | 
|  | 406     DownloadHistoryTest_Temporary) { | 
|  | 407   // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated, | 
|  | 408   // OnDownloadRemoved, OnDownloadDestroyed. | 
|  | 409   ExpectQueryDownloads(scoped_ptr<InfoVector>(new InfoVector())); | 
|  | 410 | 
|  | 411   // Note that db_handle must be -1 at first because it isn't in the db yet. | 
|  | 412   DownloadPersistentStoreInfo info; | 
|  | 413   InitItem(base::RandInt(0, 1 << 20), | 
|  | 414            FilePath(FILE_PATH_LITERAL("/foo/bar.pdf")), | 
|  | 415            GURL("http://example.com/bar.pdf"), | 
|  | 416            GURL("http://example.com/referrer.html"), | 
|  | 417            (base::Time::Now() - base::TimeDelta::FromMinutes(10)), | 
|  | 418            (base::Time::Now() - base::TimeDelta::FromMinutes(1)), | 
|  | 419            100, | 
|  | 420            100, | 
|  | 421            content::DownloadItem::COMPLETE, | 
|  | 422            -1, | 
|  | 423            false, | 
|  | 424            &info); | 
|  | 425 | 
|  | 426   // Pretend the manager just created |item|. | 
|  | 427   download_history()->OnDownloadCreated(&manager(), &item()); | 
|  | 428   // CreateDownload() always gets db_handle=-1. | 
|  | 429   ExpectCreateDownload(info); | 
|  | 430   info.db_handle = 0; | 
|  | 431 | 
|  | 432   // Pretend the item was marked temporary. DownloadHistory should remove it | 
|  | 433   // from history and start ignoring it. | 
|  | 434   EXPECT_CALL(item(), IsTemporary()).WillRepeatedly(Return(true)); | 
|  | 435   download_history()->OnDownloadUpdated(&item()); | 
|  | 436   HandleSet handles; | 
|  | 437   handles.insert(info.db_handle); | 
|  | 438   ExpectRemoveDownloads(handles); | 
|  | 439 | 
|  | 440   // Change something that would make DownloadHistory call UpdateDownload if the | 
|  | 441   // item weren't temporary. | 
|  | 442   EXPECT_CALL(item(), GetReceivedBytes()).WillRepeatedly(Return(4200)); | 
|  | 443   download_history()->OnDownloadUpdated(&item()); | 
|  | 444   ExpectNoUpdateDownload(); | 
|  | 445 | 
|  | 446   // Changing a temporary item back to a non-temporary item should make | 
|  | 447   // DownloadHistory call CreateDownload. | 
|  | 448   EXPECT_CALL(item(), IsTemporary()).WillRepeatedly(Return(false)); | 
|  | 449   download_history()->OnDownloadUpdated(&item()); | 
|  | 450   info.received_bytes = 4200; | 
|  | 451   info.db_handle = -1; | 
|  | 452   // CreateDownload() always gets db_handle=-1. | 
|  | 453   ExpectCreateDownload(info); | 
|  | 454   info.db_handle = 1; | 
|  | 455 | 
|  | 456   EXPECT_CALL(item(), GetReceivedBytes()).WillRepeatedly(Return(100)); | 
|  | 457   download_history()->OnDownloadUpdated(&item()); | 
|  | 458   info.received_bytes = 100; | 
|  | 459   ExpectUpdateDownload(info); | 
|  | 460 | 
|  | 461   // Pretend that the browser is closing. | 
|  | 462   download_history()->ManagerGoingDown(&manager()); | 
|  | 463   download_history()->OnDownloadDestroyed(&item()); | 
|  | 464 } | 
|  | 465 | 
|  | 466 IN_PROC_BROWSER_TEST_F(DownloadHistoryTest, | 
|  | 467     DownloadHistoryTest_RemoveWhileAdding) { | 
|  | 468   ExpectQueryDownloads(scoped_ptr<InfoVector>(new InfoVector())); | 
|  | 469 | 
|  | 470   // Note that db_handle must be -1 at first because it isn't in the db yet. | 
|  | 471   DownloadPersistentStoreInfo info; | 
|  | 472   InitItem(base::RandInt(0, 1 << 20), | 
|  | 473            FilePath(FILE_PATH_LITERAL("/foo/bar.pdf")), | 
|  | 474            GURL("http://example.com/bar.pdf"), | 
|  | 475            GURL("http://example.com/referrer.html"), | 
|  | 476            (base::Time::Now() - base::TimeDelta::FromMinutes(10)), | 
|  | 477            (base::Time::Now() - base::TimeDelta::FromMinutes(1)), | 
|  | 478            100, | 
|  | 479            100, | 
|  | 480            content::DownloadItem::COMPLETE, | 
|  | 481            -1, | 
|  | 482            false, | 
|  | 483            &info); | 
|  | 484 | 
|  | 485   // Instruct CreateDownload() to not callback to DownloadHistory immediately, | 
|  | 486   // but to wait for FinishCreateDownload(). | 
|  | 487   set_slow_create_download(true); | 
|  | 488 | 
|  | 489   // Pretend the manager just created |item|. | 
|  | 490   download_history()->OnDownloadCreated(&manager(), &item()); | 
|  | 491   // CreateDownload() always gets db_handle=-1. | 
|  | 492   ExpectCreateDownload(info); | 
|  | 493   info.db_handle = 0; | 
|  | 494 | 
|  | 495   // Call OnDownloadRemoved before calling back to DownloadHistory::ItemAdded(). | 
|  | 496   // Instead of calling RemoveDownloads() immediately, it should | 
|  | 497   download_history()->OnDownloadRemoved(&item()); | 
|  | 498   EXPECT_CALL(manager(), GetDownload(item().GetId())) | 
|  | 499     .WillRepeatedly(Return(static_cast<content::DownloadItem*>(NULL))); | 
|  | 500   ExpectNoRemoveDownloads(); | 
|  | 501 | 
|  | 502   // Now callback to DownloadHistory::ItemAdded(), and expect a call to | 
|  | 503   // RemoveDownloads() for the item that was removed while it was being added. | 
|  | 504   FinishCreateDownload(); | 
|  | 505   HandleSet handles; | 
|  | 506   handles.insert(info.db_handle); | 
|  | 507   ExpectRemoveDownloads(handles); | 
|  | 508 | 
|  | 509   // Pretend that the browser is closing. | 
|  | 510   download_history()->ManagerGoingDown(&manager()); | 
|  | 511   download_history()->OnDownloadDestroyed(&item()); | 
|  | 512 } | 
| OLD | NEW | 
|---|