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