15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_installer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/scoped_ptr.h" 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/run_loop.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/plugins/plugin_installer_observer.h" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/test/base/chrome_render_view_host_test_harness.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/browser/download_url_parameters.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/test/mock_download_item.h" 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/test/mock_download_manager.h" 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gmock/include/gmock/gmock.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing ::testing::_; 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass PluginInstallerTest : public ChromeRenderViewHostTestHarness { 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PluginInstallerTest(); 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void SetUp() OVERRIDE; 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void TearDown() OVERRIDE; 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PluginInstaller* installer() { return installer_.get(); } 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<content::MockDownloadItem> CreateMockDownloadItem(); 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<PluginInstaller> installer_; 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PluginInstallerTest::PluginInstallerTest() { 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid PluginInstallerTest::SetUp() { 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::RenderViewHostTestHarness::SetUp(); 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch installer_.reset(new PluginInstaller()); 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid PluginInstallerTest::TearDown() { 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch installer_.reset(); 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::RenderViewHostTestHarness::TearDown(); 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochscoped_ptr<content::MockDownloadItem> 490529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochPluginInstallerTest::CreateMockDownloadItem() { 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<content::MockDownloadItem> mock_download_item( 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new testing::StrictMock<content::MockDownloadItem>()); 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_CALL(*mock_download_item, GetState()) 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .WillByDefault(testing::Return(content::DownloadItem::IN_PROGRESS)); 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return mock_download_item.Pass(); 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass TestPluginInstallerObserver : public PluginInstallerObserver { 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch explicit TestPluginInstallerObserver(PluginInstaller* installer) 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : PluginInstallerObserver(installer), 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch download_started_(false), 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch download_finished_(false), 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch download_cancelled_(false) {} 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool download_started() const { return download_started_; } 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool download_finished() const { return download_finished_; } 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool download_cancelled() const { return download_cancelled_; } 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const std::string& download_error() const { return download_error_; } 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void DownloadStarted() OVERRIDE { download_started_ = true; } 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void DownloadFinished() OVERRIDE { download_finished_ = true; } 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void DownloadError(const std::string& message) OVERRIDE { 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch download_error_ = message; 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void DownloadCancelled() OVERRIDE { download_cancelled_ = true; } 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool download_started_; 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool download_finished_; 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string download_error_; 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool download_cancelled_; 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Action for invoking the OnStartedCallback of DownloadURLParameters object 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// which is assumed to be pointed to by arg0. 860529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochACTION_P2(InvokeOnStartedCallback, download_item, interrupt_reason) { 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch arg0->callback().Run(download_item, interrupt_reason); 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 900529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochACTION_P(InvokeClosure, closure) { 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch closure.Run(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kTestUrl[] = "http://example.com/some-url"; 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Test that DownloadStarted()/DownloadFinished() notifications are sent to 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// observers when a download initiated by PluginInstaller completes 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// successfully. 1010529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(PluginInstallerTest, StartInstalling_SuccessfulDownload) { 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::MockDownloadManager mock_download_manager; 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::RunLoop run_loop; 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem()); 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_CALL(mock_download_manager, 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DownloadUrlMock(testing::Property( 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &content::DownloadUrlParameters::url, GURL(kTestUrl)))) 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .WillOnce(testing::DoAll( 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch InvokeOnStartedCallback(download_item.get(), 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::DOWNLOAD_INTERRUPT_REASON_NONE), 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch InvokeClosure(run_loop.QuitClosure()))); 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_CALL(*download_item, SetOpenWhenComplete(_)); 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestPluginInstallerObserver installer_observer(installer()); 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch installer()->StartInstallingWithDownloadManager( 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GURL(kTestUrl), web_contents(), &mock_download_manager); 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch run_loop.Run(); 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(installer_observer.download_started()); 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(installer_observer.download_finished()); 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_CALL(*download_item, GetState()) 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .WillOnce(testing::Return(content::DownloadItem::COMPLETE)); 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) download_item->NotifyObserversDownloadUpdated(); 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(installer_observer.download_finished()); 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Test that DownloadStarted()/DownloadError() notifications are sent to 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// observers when a download initiated by PluginInstaller fails to start. 1310529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(PluginInstallerTest, StartInstalling_FailedStart) { 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::MockDownloadManager mock_download_manager; 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::RunLoop run_loop; 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem()); 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_CALL(mock_download_manager, 1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DownloadUrlMock(testing::Property( 1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &content::DownloadUrlParameters::url, GURL(kTestUrl)))) 1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .WillOnce( 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch testing::DoAll(InvokeOnStartedCallback( 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch download_item.get(), 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED), 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch InvokeClosure(run_loop.QuitClosure()))); 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestPluginInstallerObserver installer_observer(installer()); 1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch installer()->StartInstallingWithDownloadManager( 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GURL(kTestUrl), web_contents(), &mock_download_manager); 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch run_loop.Run(); 1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(installer_observer.download_started()); 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(installer_observer.download_finished()); 1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ("Error 20: NETWORK_FAILED", installer_observer.download_error()); 1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Test that DownloadStarted()/DownloadError() notifications are sent to 1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// observers when a download initiated by PluginInstaller starts successfully 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// but is interrupted later. 1580529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(PluginInstallerTest, StartInstalling_Interrupted) { 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::MockDownloadManager mock_download_manager; 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::RunLoop run_loop; 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem()); 1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_CALL(mock_download_manager, 1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DownloadUrlMock(testing::Property( 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &content::DownloadUrlParameters::url, GURL(kTestUrl)))) 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .WillOnce(testing::DoAll( 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch InvokeOnStartedCallback(download_item.get(), 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::DOWNLOAD_INTERRUPT_REASON_NONE), 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch InvokeClosure(run_loop.QuitClosure()))); 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_CALL(*download_item, SetOpenWhenComplete(_)); 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch TestPluginInstallerObserver installer_observer(installer()); 1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch installer()->StartInstallingWithDownloadManager( 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GURL(kTestUrl), web_contents(), &mock_download_manager); 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch run_loop.Run(); 1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(installer_observer.download_started()); 1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(installer_observer.download_finished()); 1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_CALL(*download_item, GetState()) 1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch .WillOnce(testing::Return(content::DownloadItem::INTERRUPTED)); 1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_CALL(*download_item, GetLastReason()).WillOnce( 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch testing::Return(content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED)); 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) download_item->NotifyObserversDownloadUpdated(); 1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(installer_observer.download_started()); 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(installer_observer.download_finished()); 1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ("NETWORK_FAILED", installer_observer.download_error()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 190