Home | History | Annotate | Download | only in plugins
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/plugins/plugin_installer.h"
      6 
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/run_loop.h"
      9 #include "chrome/browser/plugins/plugin_installer_observer.h"
     10 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
     11 #include "content/public/browser/download_url_parameters.h"
     12 #include "content/public/test/mock_download_item.h"
     13 #include "content/public/test/mock_download_manager.h"
     14 #include "testing/gmock/include/gmock/gmock.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 using ::testing::_;
     18 
     19 namespace {
     20 
     21 class PluginInstallerTest : public ChromeRenderViewHostTestHarness {
     22  public:
     23   PluginInstallerTest();
     24   virtual void SetUp() OVERRIDE;
     25   virtual void TearDown() OVERRIDE;
     26 
     27   PluginInstaller* installer() { return installer_.get(); }
     28 
     29   scoped_ptr<content::MockDownloadItem> CreateMockDownloadItem();
     30 
     31  private:
     32   scoped_ptr<PluginInstaller> installer_;
     33 };
     34 
     35 PluginInstallerTest::PluginInstallerTest() {
     36 }
     37 
     38 void PluginInstallerTest::SetUp() {
     39   content::RenderViewHostTestHarness::SetUp();
     40   installer_.reset(new PluginInstaller());
     41 }
     42 
     43 void PluginInstallerTest::TearDown() {
     44   installer_.reset();
     45   content::RenderViewHostTestHarness::TearDown();
     46 }
     47 
     48 scoped_ptr<content::MockDownloadItem>
     49 PluginInstallerTest::CreateMockDownloadItem() {
     50   scoped_ptr<content::MockDownloadItem> mock_download_item(
     51       new testing::StrictMock<content::MockDownloadItem>());
     52   ON_CALL(*mock_download_item, GetState())
     53       .WillByDefault(testing::Return(content::DownloadItem::IN_PROGRESS));
     54   return mock_download_item.Pass();
     55 }
     56 
     57 class TestPluginInstallerObserver : public PluginInstallerObserver {
     58  public:
     59   explicit TestPluginInstallerObserver(PluginInstaller* installer)
     60       : PluginInstallerObserver(installer),
     61         download_started_(false),
     62         download_finished_(false),
     63         download_cancelled_(false) {}
     64 
     65   bool download_started() const { return download_started_; }
     66   bool download_finished() const { return download_finished_; }
     67   bool download_cancelled() const { return download_cancelled_; }
     68   const std::string& download_error() const { return download_error_; }
     69 
     70  private:
     71   virtual void DownloadStarted() OVERRIDE { download_started_ = true; }
     72   virtual void DownloadFinished() OVERRIDE { download_finished_ = true; }
     73   virtual void DownloadError(const std::string& message) OVERRIDE {
     74     download_error_ = message;
     75   }
     76   virtual void DownloadCancelled() OVERRIDE { download_cancelled_ = true; }
     77 
     78   bool download_started_;
     79   bool download_finished_;
     80   std::string download_error_;
     81   bool download_cancelled_;
     82 };
     83 
     84 // Action for invoking the OnStartedCallback of DownloadURLParameters object
     85 // which is assumed to be pointed to by arg0.
     86 ACTION_P2(InvokeOnStartedCallback, download_item, interrupt_reason) {
     87   arg0->callback().Run(download_item, interrupt_reason);
     88 }
     89 
     90 ACTION_P(InvokeClosure, closure) {
     91   closure.Run();
     92 }
     93 
     94 const char kTestUrl[] = "http://example.com/some-url";
     95 
     96 }  // namespace
     97 
     98 // Test that DownloadStarted()/DownloadFinished() notifications are sent to
     99 // observers when a download initiated by PluginInstaller completes
    100 // successfully.
    101 TEST_F(PluginInstallerTest, StartInstalling_SuccessfulDownload) {
    102   content::MockDownloadManager mock_download_manager;
    103   base::RunLoop run_loop;
    104   scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem());
    105 
    106   EXPECT_CALL(mock_download_manager,
    107               DownloadUrlMock(testing::Property(
    108                   &content::DownloadUrlParameters::url, GURL(kTestUrl))))
    109       .WillOnce(testing::DoAll(
    110           InvokeOnStartedCallback(download_item.get(),
    111                                   content::DOWNLOAD_INTERRUPT_REASON_NONE),
    112           InvokeClosure(run_loop.QuitClosure())));
    113   EXPECT_CALL(*download_item, SetOpenWhenComplete(_));
    114 
    115   TestPluginInstallerObserver installer_observer(installer());
    116   installer()->StartInstallingWithDownloadManager(
    117       GURL(kTestUrl), web_contents(), &mock_download_manager);
    118   run_loop.Run();
    119 
    120   EXPECT_TRUE(installer_observer.download_started());
    121   EXPECT_FALSE(installer_observer.download_finished());
    122 
    123   EXPECT_CALL(*download_item, GetState())
    124       .WillOnce(testing::Return(content::DownloadItem::COMPLETE));
    125   download_item->NotifyObserversDownloadUpdated();
    126   EXPECT_TRUE(installer_observer.download_finished());
    127 }
    128 
    129 // Test that DownloadStarted()/DownloadError() notifications are sent to
    130 // observers when a download initiated by PluginInstaller fails to start.
    131 TEST_F(PluginInstallerTest, StartInstalling_FailedStart) {
    132   content::MockDownloadManager mock_download_manager;
    133   base::RunLoop run_loop;
    134   scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem());
    135 
    136   EXPECT_CALL(mock_download_manager,
    137               DownloadUrlMock(testing::Property(
    138                   &content::DownloadUrlParameters::url, GURL(kTestUrl))))
    139       .WillOnce(
    140           testing::DoAll(InvokeOnStartedCallback(
    141                              download_item.get(),
    142                              content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED),
    143                          InvokeClosure(run_loop.QuitClosure())));
    144 
    145   TestPluginInstallerObserver installer_observer(installer());
    146   installer()->StartInstallingWithDownloadManager(
    147       GURL(kTestUrl), web_contents(), &mock_download_manager);
    148   run_loop.Run();
    149 
    150   EXPECT_TRUE(installer_observer.download_started());
    151   EXPECT_FALSE(installer_observer.download_finished());
    152   EXPECT_EQ("Error 20: NETWORK_FAILED", installer_observer.download_error());
    153 }
    154 
    155 // Test that DownloadStarted()/DownloadError() notifications are sent to
    156 // observers when a download initiated by PluginInstaller starts successfully
    157 // but is interrupted later.
    158 TEST_F(PluginInstallerTest, StartInstalling_Interrupted) {
    159   content::MockDownloadManager mock_download_manager;
    160   base::RunLoop run_loop;
    161   scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem());
    162 
    163   EXPECT_CALL(mock_download_manager,
    164               DownloadUrlMock(testing::Property(
    165                   &content::DownloadUrlParameters::url, GURL(kTestUrl))))
    166       .WillOnce(testing::DoAll(
    167           InvokeOnStartedCallback(download_item.get(),
    168                                   content::DOWNLOAD_INTERRUPT_REASON_NONE),
    169           InvokeClosure(run_loop.QuitClosure())));
    170   EXPECT_CALL(*download_item, SetOpenWhenComplete(_));
    171 
    172   TestPluginInstallerObserver installer_observer(installer());
    173   installer()->StartInstallingWithDownloadManager(
    174       GURL(kTestUrl), web_contents(), &mock_download_manager);
    175   run_loop.Run();
    176 
    177   EXPECT_TRUE(installer_observer.download_started());
    178   EXPECT_FALSE(installer_observer.download_finished());
    179 
    180   EXPECT_CALL(*download_item, GetState())
    181       .WillOnce(testing::Return(content::DownloadItem::INTERRUPTED));
    182   EXPECT_CALL(*download_item, GetLastReason()).WillOnce(
    183       testing::Return(content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED));
    184   download_item->NotifyObserversDownloadUpdated();
    185 
    186   EXPECT_TRUE(installer_observer.download_started());
    187   EXPECT_FALSE(installer_observer.download_finished());
    188   EXPECT_EQ("NETWORK_FAILED", installer_observer.download_error());
    189 }
    190