12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/weak_ptr.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/rand_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/download/download_history.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_database.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/mock_download_item.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/mock_download_manager.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_browser_thread.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/extensions/api/downloads/downloads_api.h"
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::DoAll;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Invoke;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Return;
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing testing::ReturnRefOfCopy;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::SetArgPointee;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::WithArg;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckInfoEqual(const history::DownloadRow& left,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const history::DownloadRow& right) {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.current_path.value(), right.current_path.value());
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.target_path.value(), right.target_path.value());
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.url_chain.size(), right.url_chain.size());
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (unsigned int i = 0;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       i < left.url_chain.size() && i < right.url_chain.size();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++i) {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(left.url_chain[i].spec(), right.url_chain[i].spec());
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.referrer_url.spec(), right.referrer_url.spec());
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(left.mime_type, right.mime_type);
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(left.original_mime_type, right.original_mime_type);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.start_time.ToTimeT(), right.start_time.ToTimeT());
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.end_time.ToTimeT(), right.end_time.ToTimeT());
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(left.etag, right.etag);
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(left.last_modified, right.last_modified);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.received_bytes, right.received_bytes);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.total_bytes, right.total_bytes);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.state, right.state);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.danger_type, right.danger_type);
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(left.id, right.id);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(left.opened, right.opened);
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(left.by_ext_id, right.by_ext_id);
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(left.by_ext_name, right.by_ext_name);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtypedef DownloadHistory::IdSet IdSet;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::vector<history::DownloadRow> InfoVector;
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochtypedef testing::StrictMock<content::MockDownloadItem> StrictMockDownloadItem;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeHistoryAdapter : public DownloadHistory::HistoryAdapter {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeHistoryAdapter()
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : DownloadHistory::HistoryAdapter(NULL),
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      slow_create_download_(false),
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      fail_create_download_(false) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FakeHistoryAdapter() {}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void QueryDownloads(
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const HistoryService::DownloadQueryCallback& callback) OVERRIDE {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&FakeHistoryAdapter::QueryDownloadsDone,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::Unretained(this), callback));
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void QueryDownloadsDone(
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const HistoryService::DownloadQueryCallback& callback) {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(expect_query_downloads_.get());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    callback.Run(expect_query_downloads_.Pass());
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_slow_create_download(bool slow) { slow_create_download_ = slow; }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CreateDownload(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const history::DownloadRow& info,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const HistoryService::DownloadCreateCallback& callback) OVERRIDE {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    create_download_info_ = info;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Must not call CreateDownload() again before FinishCreateDownload()!
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(create_download_callback_.is_null());
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    create_download_callback_ = base::Bind(callback, !fail_create_download_);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fail_create_download_ = false;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!slow_create_download_)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FinishCreateDownload();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FinishCreateDownload() {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    create_download_callback_.Run();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    create_download_callback_.Reset();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateDownload(
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const history::DownloadRow& info) OVERRIDE {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    update_download_ = info;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void RemoveDownloads(const IdSet& ids) OVERRIDE {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for (IdSet::const_iterator it = ids.begin();
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch         it != ids.end(); ++it) {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      remove_downloads_.insert(*it);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectWillQueryDownloads(scoped_ptr<InfoVector> infos) {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    expect_query_downloads_ = infos.Pass();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectQueryDownloadsDone() {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(NULL == expect_query_downloads_.get());
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FailCreateDownload() {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    fail_create_download_ = true;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectDownloadCreated(
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const history::DownloadRow& info) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunAllPendingInMessageLoop(content::BrowserThread::UI);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckInfoEqual(info, create_download_info_);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    create_download_info_ = history::DownloadRow();
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectNoDownloadCreated() {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunAllPendingInMessageLoop(content::BrowserThread::UI);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckInfoEqual(history::DownloadRow(), create_download_info_);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectDownloadUpdated(const history::DownloadRow& info) {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunAllPendingInMessageLoop(content::BrowserThread::UI);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckInfoEqual(update_download_, info);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    update_download_ = history::DownloadRow();
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectNoDownloadUpdated() {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunAllPendingInMessageLoop(content::BrowserThread::UI);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckInfoEqual(history::DownloadRow(), update_download_);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectNoDownloadsRemoved() {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunAllPendingInMessageLoop(content::BrowserThread::UI);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0, static_cast<int>(remove_downloads_.size()));
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ExpectDownloadsRemoved(const IdSet& ids) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunAllPendingInMessageLoop(content::BrowserThread::UI);
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    IdSet differences = base::STLSetDifference<IdSet>(ids, remove_downloads_);
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for (IdSet::const_iterator different = differences.begin();
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         different != differences.end(); ++different) {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_TRUE(false) << *different;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    remove_downloads_.clear();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool slow_create_download_;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fail_create_download_;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure create_download_callback_;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow update_download_;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<InfoVector> expect_query_downloads_;
1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IdSet remove_downloads_;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow create_download_info_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeHistoryAdapter);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadHistoryTest : public testing::Test {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Generic callback that receives a pointer to a StrictMockDownloadItem.
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::Callback<void(content::MockDownloadItem*)> DownloadItemCallback;
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DownloadHistoryTest()
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : ui_thread_(content::BrowserThread::UI, &loop_),
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        manager_(new content::MockDownloadManager()),
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        history_(NULL),
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        manager_observer_(NULL),
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        download_created_index_(0) {}
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DownloadHistoryTest() {
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    STLDeleteElements(&items_);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_history_.reset();
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::MockDownloadManager& manager() { return *manager_.get(); }
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::MockDownloadItem& item(size_t index) { return *items_[index]; }
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DownloadHistory* download_history() { return download_history_.get(); }
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetManagerObserver(
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadManager::Observer* manager_observer) {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_observer_ = manager_observer;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::DownloadManager::Observer* manager_observer() {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return manager_observer_;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void CreateDownloadHistory(scoped_ptr<InfoVector> infos) {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(infos.get());
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(manager(), AddObserver(_)).WillOnce(WithArg<0>(Invoke(
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this, &DownloadHistoryTest::SetManagerObserver)));
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(manager(), RemoveObserver(_));
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_created_index_ = 0;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t index = 0; index < infos->size(); ++index) {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::MockDownloadManager::CreateDownloadItemAdapter adapter(
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          infos->at(index).id,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).current_path,
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).target_path,
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).url_chain,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).referrer_url,
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          infos->at(index).mime_type,
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          infos->at(index).original_mime_type,
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).start_time,
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).end_time,
246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          infos->at(index).etag,
247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          infos->at(index).last_modified,
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).received_bytes,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).total_bytes,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).state,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).danger_type,
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).interrupt_reason,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          infos->at(index).opened);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(manager(), MockCreateDownloadItem(adapter))
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillOnce(DoAll(
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            InvokeWithoutArgs(
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                this, &DownloadHistoryTest::CallOnDownloadCreatedInOrder),
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            Return(&item(index))));
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(manager(), CheckForHistoryFilesRemoval());
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_ = new FakeHistoryAdapter();
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->ExpectWillQueryDownloads(infos.Pass());
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*manager_.get(), GetAllDownloads(_)).WillRepeatedly(Return());
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    download_history_.reset(new DownloadHistory(
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &manager(), scoped_ptr<DownloadHistory::HistoryAdapter>(history_)));
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RunAllPendingInMessageLoop(content::BrowserThread::UI);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->ExpectQueryDownloadsDone();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CallOnDownloadCreated(size_t index) {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!pre_on_create_handler_.is_null())
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pre_on_create_handler_.Run(&item(index));
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_observer()->OnDownloadCreated(&manager(), &item(index));
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!post_on_create_handler_.is_null())
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      post_on_create_handler_.Run(&item(index));
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CallOnDownloadCreatedInOrder() {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Gmock doesn't appear to support something like InvokeWithTheseArgs. Maybe
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // gmock needs to learn about base::Callback.
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CallOnDownloadCreated(download_created_index_++);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_slow_create_download(bool slow) {
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->set_slow_create_download(slow);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FinishCreateDownload() {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->FinishCreateDownload();
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FailCreateDownload() {
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->FailCreateDownload();
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectDownloadCreated(
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const history::DownloadRow& info) {
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->ExpectDownloadCreated(info);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectNoDownloadCreated() {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->ExpectNoDownloadCreated();
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectDownloadUpdated(const history::DownloadRow& info) {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->ExpectDownloadUpdated(info);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectNoDownloadUpdated() {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->ExpectNoDownloadUpdated();
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExpectNoDownloadsRemoved() {
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history_->ExpectNoDownloadsRemoved();
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ExpectDownloadsRemoved(const IdSet& ids) {
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    history_->ExpectDownloadsRemoved(ids);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void ExpectDownloadsRestoredFromHistory(bool expected_value) {
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pre_on_create_handler_ =
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(&DownloadHistoryTest::CheckDownloadWasRestoredFromHistory,
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   base::Unretained(this),
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   expected_value);
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    post_on_create_handler_ =
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        base::Bind(&DownloadHistoryTest::CheckDownloadWasRestoredFromHistory,
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   base::Unretained(this),
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   expected_value);
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void InitBasicItem(const base::FilePath::CharType* path,
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     const char* url_string,
346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     const char* referrer_string,
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     history::DownloadRow* info) {
348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GURL url(url_string);
349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GURL referrer(referrer_string);
350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<GURL> url_chain;
351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    url_chain.push_back(url);
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    InitItem(static_cast<uint32>(items_.size() + 1),
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             base::FilePath(path),
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             base::FilePath(path),
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             url_chain,
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             referrer,
357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)             "application/octet-stream",
358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)             "application/octet-stream",
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             (base::Time::Now() - base::TimeDelta::FromMinutes(10)),
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             (base::Time::Now() - base::TimeDelta::FromMinutes(1)),
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             "Etag",
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             "abc",
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             100,
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             100,
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             content::DownloadItem::COMPLETE,
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             content::DOWNLOAD_INTERRUPT_REASON_NONE,
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             false,
369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             std::string(),
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             std::string(),
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch             info);
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void InitItem(
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 id,
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& current_path,
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& target_path,
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<GURL>& url_chain,
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& referrer,
380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& mime_type,
381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& original_mime_type,
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time& start_time,
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time& end_time,
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const std::string& etag,
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const std::string& last_modified,
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 received_bytes,
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 total_bytes,
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadItem::DownloadState state,
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadDangerType danger_type,
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::DownloadInterruptReason interrupt_reason,
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool opened,
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const std::string& by_extension_id,
393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const std::string& by_extension_name,
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history::DownloadRow* info) {
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    size_t index = items_.size();
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    StrictMockDownloadItem* mock_item = new StrictMockDownloadItem();
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    items_.push_back(mock_item);
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->current_path = current_path;
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->target_path = target_path;
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->url_chain = url_chain;
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->referrer_url = referrer;
405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    info->mime_type = mime_type;
406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    info->original_mime_type = original_mime_type;
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->start_time = start_time;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->end_time = end_time;
409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    info->etag = etag;
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    info->last_modified = last_modified;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->received_bytes = received_bytes;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->total_bytes = total_bytes;
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->state = state;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->danger_type = danger_type;
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->interrupt_reason = interrupt_reason;
4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    info->id = id;
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->opened = opened;
418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    info->by_ext_id = by_extension_id;
419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    info->by_ext_name = by_extension_name;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(item(index), GetId()).WillRepeatedly(Return(id));
422ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetFullPath())
423ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(ReturnRefOfCopy(current_path));
424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetTargetFilePath())
425ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(ReturnRefOfCopy(target_path));
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_LE(1u, url_chain.size());
427ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetURL())
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(ReturnRefOfCopy(url_chain[0]));
429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetUrlChain())
430ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(ReturnRefOfCopy(url_chain));
431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_CALL(item(index), GetMimeType()).WillRepeatedly(Return(mime_type));
432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_CALL(item(index), GetOriginalMimeType()).WillRepeatedly(Return(
433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        original_mime_type));
434ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetReferrerUrl())
435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(ReturnRefOfCopy(referrer));
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(item(index), GetStartTime()).WillRepeatedly(Return(start_time));
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(item(index), GetEndTime()).WillRepeatedly(Return(end_time));
438ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetETag()).WillRepeatedly(ReturnRefOfCopy(etag));
439ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetLastModifiedTime())
440ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(ReturnRefOfCopy(last_modified));
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(item(index), GetReceivedBytes())
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(Return(received_bytes));
443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetTotalBytes())
444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(Return(total_bytes));
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(item(index), GetState()).WillRepeatedly(Return(state));
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(item(index), GetDangerType())
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(Return(danger_type));
448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetLastReason())
449ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(Return(interrupt_reason));
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(item(index), GetOpened()).WillRepeatedly(Return(opened));
451ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), GetTargetDisposition())
452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(
453ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            Return(content::DownloadItem::TARGET_DISPOSITION_OVERWRITE));
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(manager(), GetDownload(id))
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillRepeatedly(Return(&item(index)));
456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_CALL(item(index), IsTemporary()).WillRepeatedly(Return(false));
45746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    new extensions::DownloadedByExtension(
4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        &item(index), by_extension_id, by_extension_name);
460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<content::DownloadItem*> items;
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < items_.size(); ++i) {
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      items.push_back(&item(i));
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*manager_.get(), GetAllDownloads(_))
467ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        .WillRepeatedly(SetArgPointee<0>(items));
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void CheckDownloadWasRestoredFromHistory(bool expected_value,
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           content::MockDownloadItem* item) {
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_TRUE(download_history_.get());
474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(expected_value, download_history_->WasRestoredFromHistory(item));
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI loop_;
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::TestBrowserThread ui_thread_;
479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<StrictMockDownloadItem*> items_;
48090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<content::MockDownloadManager> manager_;
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeHistoryAdapter* history_;
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DownloadHistory> download_history_;
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::DownloadManager::Observer* manager_observer_;
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t download_created_index_;
485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DownloadItemCallback pre_on_create_handler_;
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DownloadItemCallback post_on_create_handler_;
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DownloadHistoryTest);
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test loading an item from the database, changing it, saving it back, removing
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// it.
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DownloadHistoryTest, DownloadHistoryTest_Load) {
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load a download from history, create the item, OnDownloadCreated,
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnDownloadUpdated, OnDownloadRemoved.
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow info;
497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/bar.pdf",
499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer.html",
500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info);
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<InfoVector> infos(new InfoVector());
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    infos->push_back(info);
504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CreateDownloadHistory(infos.Pass());
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExpectNoDownloadCreated();
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend that something changed on the item.
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(item(0), GetOpened()).WillRepeatedly(Return(true));
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.opened = true;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadUpdated(info);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend that the user removed the item.
5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IdSet ids;
5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ids.insert(info.id);
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadRemoved();
5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ExpectDownloadsRemoved(ids);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that WasRestoredFromHistory accurately identifies downloads that were
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// created from history, even during an OnDownloadCreated() handler.
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DownloadHistoryTest, DownloadHistoryTest_WasRestoredFromHistory_True) {
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This sets DownloadHistoryTest to call DH::WasRestoredFromHistory() both
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // before and after DH::OnDownloadCreated() is called. At each call, the
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // expected return value is |true| since the download was restored from
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // history.
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExpectDownloadsRestoredFromHistory(true);
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Construct a DownloadHistory with a single history download. This results in
532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // DownloadManager::CreateDownload() being called for the restored download.
533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The above test expectation should verify that the value of
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // WasRestoredFromHistory is correct for this download.
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  history::DownloadRow info;
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                "http://example.com/bar.pdf",
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                "http://example.com/referrer.html",
539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                &info);
540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<InfoVector> infos(new InfoVector());
541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  infos->push_back(info);
542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateDownloadHistory(infos.Pass());
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that WasRestoredFromHistory accurately identifies downloads that were
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// not created from history.
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DownloadHistoryTest, DownloadHistoryTest_WasRestoredFromHistory_False) {
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This sets DownloadHistoryTest to call DH::WasRestoredFromHistory() both
551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // before and after DH::OnDownloadCreated() is called. At each call, the
552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // expected return value is |true| since the download was restored from
553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // history.
554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExpectDownloadsRestoredFromHistory(false);
555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Create a DownloadHistory with no history downloads. No
557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // DownloadManager::CreateDownload() calls are expected.
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector()));
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Notify DownloadHistory that a new download was created. The above test
561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // expecation should verify that WasRestoredFromHistory is correct for this
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // download.
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  history::DownloadRow info;
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                "http://example.com/bar.pdf",
566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                "http://example.com/referrer.html",
567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                &info);
568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CallOnDownloadCreated(0);
569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExpectDownloadCreated(info);
570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test creating an item, saving it to the database, changing it, saving it
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// back, removing it.
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DownloadHistoryTest, DownloadHistoryTest_Create) {
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated,
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnDownloadRemoved.
577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector()));
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow info;
580ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
581ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/bar.pdf",
582ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer.html",
583ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info);
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend the manager just created |item|.
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CallOnDownloadCreated(0);
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadCreated(info);
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend that something changed on the item.
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(item(0), GetOpened()).WillRepeatedly(Return(true));
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.opened = true;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadUpdated(info);
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend that the user removed the item.
5977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IdSet ids;
5987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ids.insert(info.id);
599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadRemoved();
6007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ExpectDownloadsRemoved(ids);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
603ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test that changes to persisted fields in a DownloadItem triggers database
604ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// updates.
605ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(DownloadHistoryTest, DownloadHistoryTest_Update) {
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector()));
607ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
608ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  history::DownloadRow info;
609ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
610ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/bar.pdf",
611ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer.html",
612ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info);
613ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CallOnDownloadCreated(0);
614ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadCreated(info);
615ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
616ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
617ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::FilePath new_path(FILE_PATH_LITERAL("/foo/baz.txt"));
618ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Time new_time(base::Time::Now());
619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string new_etag("new etag");
620ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string new_last_modifed("new last modified");
621ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
622ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // current_path
623ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetFullPath()).WillRepeatedly(ReturnRefOfCopy(new_path));
624ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.current_path = new_path;
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
626ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
627ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
628ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // target_path
629ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetTargetFilePath())
630ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      .WillRepeatedly(ReturnRefOfCopy(new_path));
631ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.target_path = new_path;
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
633ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
634ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
635ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // end_time
636ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetEndTime()).WillRepeatedly(Return(new_time));
637ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.end_time = new_time;
638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
639ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
640ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
641ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // received_bytes
642ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetReceivedBytes()).WillRepeatedly(Return(101));
643ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.received_bytes = 101;
644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
645ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
646ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
647ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // total_bytes
648ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetTotalBytes()).WillRepeatedly(Return(102));
649ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.total_bytes = 102;
650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
651ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
652ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
653ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // etag
654ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetETag()).WillRepeatedly(ReturnRefOfCopy(new_etag));
655ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.etag = new_etag;
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
657ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
658ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
659ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // last_modified
660ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetLastModifiedTime())
661ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      .WillRepeatedly(ReturnRefOfCopy(new_last_modifed));
662ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.last_modified = new_last_modifed;
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
664ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
665ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
666ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // state
667ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetState())
668ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      .WillRepeatedly(Return(content::DownloadItem::INTERRUPTED));
669ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.state = content::DownloadItem::INTERRUPTED;
670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
671ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
672ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
673ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // danger_type
674ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetDangerType())
675ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      .WillRepeatedly(Return(content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT));
676ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.danger_type = content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT;
677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
678ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
679ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
680ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // interrupt_reason
681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetLastReason())
682ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      .WillRepeatedly(Return(content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED));
683ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.interrupt_reason = content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED;
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
685ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
686ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // opened
688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_CALL(item(0), GetOpened()).WillRepeatedly(Return(true));
689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  info.opened = true;
690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ExpectDownloadUpdated(info);
692ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
693ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test creating a new item, saving it, removing it by setting it Temporary,
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// changing it without saving it back because it's Temporary, clearing
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// IsTemporary, saving it back, changing it, saving it back because it isn't
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Temporary anymore.
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DownloadHistoryTest, DownloadHistoryTest_Temporary) {
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated,
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnDownloadRemoved.
701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector()));
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow info;
704ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
705ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/bar.pdf",
706ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer.html",
707ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend the manager just created |item|.
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CallOnDownloadCreated(0);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadCreated(info);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend the item was marked temporary. DownloadHistory should remove it
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from history and start ignoring it.
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(item(0), IsTemporary()).WillRepeatedly(Return(true));
717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
7187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IdSet ids;
7197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ids.insert(info.id);
7207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ExpectDownloadsRemoved(ids);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Change something that would make DownloadHistory call UpdateDownload if the
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // item weren't temporary.
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(item(0), GetReceivedBytes()).WillRepeatedly(Return(4200));
725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectNoDownloadUpdated();
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Changing a temporary item back to a non-temporary item should make
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DownloadHistory call CreateDownload.
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(item(0), IsTemporary()).WillRepeatedly(Return(false));
731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.received_bytes = 4200;
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadCreated(info);
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(item(0), GetReceivedBytes()).WillRepeatedly(Return(100));
737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.received_bytes = 100;
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadUpdated(info);
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test removing downloads while they're still being added.
743ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(DownloadHistoryTest, DownloadHistoryTest_RemoveWhileAdding) {
744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector()));
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow info;
747ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
748ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/bar.pdf",
749ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer.html",
750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info);
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Instruct CreateDownload() to not callback to DownloadHistory immediately,
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but to wait for FinishCreateDownload().
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_slow_create_download(true);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend the manager just created |item|.
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CallOnDownloadCreated(0);
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadCreated(info);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DownloadHistory::IsPersisted(&item(0)));
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Call OnDownloadRemoved before calling back to DownloadHistory::ItemAdded().
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Instead of calling RemoveDownloads() immediately, DownloadHistory should
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // add the item's id to removed_while_adding_. Then, ItemAdded should
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // immediately remove the item's record from history.
765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadRemoved();
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(manager(), GetDownload(item(0).GetId()))
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    .WillRepeatedly(Return(static_cast<content::DownloadItem*>(NULL)));
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectNoDownloadsRemoved();
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DownloadHistory::IsPersisted(&item(0)));
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now callback to DownloadHistory::ItemAdded(), and expect a call to
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RemoveDownloads() for the item that was removed while it was being added.
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FinishCreateDownload();
7747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IdSet ids;
7757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ids.insert(info.id);
7767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ExpectDownloadsRemoved(ids);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DownloadHistory::IsPersisted(&item(0)));
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test loading multiple items from the database and removing them all.
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DownloadHistoryTest, DownloadHistoryTest_Multiple) {
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load a download from history, create the item, OnDownloadCreated,
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnDownloadUpdated, OnDownloadRemoved.
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow info0, info1;
785ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
786ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/bar.pdf",
787ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer.html",
788ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info0);
789ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/qux.pdf"),
790ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/qux.pdf",
791ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer1.html",
792ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info1);
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<InfoVector> infos(new InfoVector());
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    infos->push_back(info0);
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    infos->push_back(info1);
797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CreateDownloadHistory(infos.Pass());
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExpectNoDownloadCreated();
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(1)));
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend that the user removed both items.
8057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  IdSet ids;
8067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ids.insert(info0.id);
8077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ids.insert(info1.id);
808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadRemoved();
809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(1).NotifyObserversDownloadRemoved();
8107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ExpectDownloadsRemoved(ids);
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test what happens when HistoryService/CreateDownload::CreateDownload() fails.
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DownloadHistoryTest, DownloadHistoryTest_CreateFailed) {
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated,
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnDownloadRemoved.
817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector()));
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow info;
820ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
821ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/bar.pdf",
822ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer.html",
823ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info);
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FailCreateDownload();
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend the manager just created |item|.
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CallOnDownloadCreated(0);
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadCreated(info);
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DownloadHistory::IsPersisted(&item(0)));
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(item(0), GetReceivedBytes()).WillRepeatedly(Return(100));
832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.received_bytes = 100;
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadCreated(info);
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
838ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(DownloadHistoryTest, DownloadHistoryTest_UpdateWhileAdding) {
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a fresh item not from history, OnDownloadCreated, OnDownloadUpdated,
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnDownloadRemoved.
841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CreateDownloadHistory(scoped_ptr<InfoVector>(new InfoVector()));
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history::DownloadRow info;
844ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  InitBasicItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
845ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/bar.pdf",
846ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                "http://example.com/referrer.html",
847ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                &info);
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Instruct CreateDownload() to not callback to DownloadHistory immediately,
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but to wait for FinishCreateDownload().
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_slow_create_download(true);
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend the manager just created |item|.
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CallOnDownloadCreated(0);
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadCreated(info);
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DownloadHistory::IsPersisted(&item(0)));
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pretend that something changed on the item.
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(item(0), GetOpened()).WillRepeatedly(Return(true));
860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  item(0).NotifyObserversDownloadUpdated();
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FinishCreateDownload();
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DownloadHistory::IsPersisted(&item(0)));
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ItemAdded should call OnDownloadUpdated, which should detect that the item
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // changed while it was being added and call UpdateDownload immediately.
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  info.opened = true;
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectDownloadUpdated(info);
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
871cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // anonymous namespace
872