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