| Index: chrome/browser/plugins/plugin_installer_unittest.cc
|
| diff --git a/chrome/browser/plugins/plugin_installer_unittest.cc b/chrome/browser/plugins/plugin_installer_unittest.cc
|
| index ea450d8c753a1a266cf549d774607104f2be0e48..cfd44d602b39eaf651bcf2ada355c515a67f660c 100644
|
| --- a/chrome/browser/plugins/plugin_installer_unittest.cc
|
| +++ b/chrome/browser/plugins/plugin_installer_unittest.cc
|
| @@ -4,55 +4,203 @@
|
|
|
| #include "chrome/browser/plugins/plugin_installer.h"
|
|
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "content/public/common/webplugininfo.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/run_loop.h"
|
| +#include "chrome/browser/plugins/plugin_installer_observer.h"
|
| +#include "chrome/test/base/chrome_render_view_host_test_harness.h"
|
| +#include "content/public/browser/download_url_parameters.h"
|
| +#include "content/public/test/mock_download_item.h"
|
| +#include "content/public/test/mock_download_manager.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +using ::testing::_;
|
| +
|
| namespace {
|
|
|
| -PluginInstaller::SecurityStatus GetSecurityStatus(PluginInstaller* installer,
|
| - const char* version) {
|
| - content:: WebPluginInfo plugin(
|
| - base::ASCIIToUTF16("Foo plug-in"),
|
| - base::FilePath(FILE_PATH_LITERAL("/tmp/plugin.so")),
|
| - base::ASCIIToUTF16(version),
|
| - base::ASCIIToUTF16("Foo plug-in."));
|
| - return installer->GetSecurityStatus(plugin);
|
| +class PluginInstallerTest : public ChromeRenderViewHostTestHarness {
|
| + public:
|
| + PluginInstallerTest();
|
| + virtual void SetUp() OVERRIDE;
|
| + virtual void TearDown() OVERRIDE;
|
| +
|
| + PluginInstaller* installer() { return installer_.get(); }
|
| + content::DownloadItem::Observer* last_download_item_observer() {
|
| + return last_download_item_observer_;
|
| + }
|
| +
|
| + scoped_ptr<content::MockDownloadItem> CreateMockDownloadItem();
|
| +
|
| + private:
|
| + scoped_ptr<PluginInstaller> installer_;
|
| + content::DownloadItem::Observer* last_download_item_observer_;
|
| +};
|
| +
|
| +PluginInstallerTest::PluginInstallerTest()
|
| + : last_download_item_observer_(NULL) {}
|
| +
|
| +void PluginInstallerTest::SetUp() {
|
| + content::RenderViewHostTestHarness::SetUp();
|
| + installer_.reset(new PluginInstaller());
|
| +}
|
| +
|
| +void PluginInstallerTest::TearDown() {
|
| + installer_.reset();
|
| + content::RenderViewHostTestHarness::TearDown();
|
| +}
|
| +
|
| +scoped_ptr<content::MockDownloadItem>
|
| +PluginInstallerTest::CreateMockDownloadItem() {
|
| + scoped_ptr<content::MockDownloadItem> mock_download_item(
|
| + new testing::StrictMock<content::MockDownloadItem>());
|
| + ON_CALL(*mock_download_item, AddObserver(_))
|
| + .WillByDefault(testing::SaveArg<0>(&last_download_item_observer_));
|
| + ON_CALL(*mock_download_item, RemoveObserver(_)).WillByDefault(
|
| + testing::Assign(&last_download_item_observer_,
|
| + static_cast<content::DownloadItem::Observer*>(NULL)));
|
| + ON_CALL(*mock_download_item, GetState())
|
| + .WillByDefault(testing::Return(content::DownloadItem::IN_PROGRESS));
|
| + return mock_download_item.Pass();
|
| +}
|
| +
|
| +class TestPluginInstallerObserver : public PluginInstallerObserver {
|
| + public:
|
| + explicit TestPluginInstallerObserver(PluginInstaller* installer)
|
| + : PluginInstallerObserver(installer),
|
| + download_started_(false),
|
| + download_finished_(false),
|
| + download_cancelled_(false) {}
|
| +
|
| + bool download_started() const { return download_started_; }
|
| + bool download_finished() const { return download_finished_; }
|
| + bool download_cancelled() const { return download_cancelled_; }
|
| + const std::string& download_error() const { return download_error_; }
|
| +
|
| + private:
|
| + virtual void DownloadStarted() OVERRIDE { download_started_ = true; }
|
| + virtual void DownloadFinished() OVERRIDE { download_finished_ = true; }
|
| + virtual void DownloadError(const std::string& message) OVERRIDE {
|
| + download_error_ = message;
|
| + }
|
| + virtual void DownloadCancelled() OVERRIDE { download_cancelled_ = true; }
|
| +
|
| + bool download_started_;
|
| + bool download_finished_;
|
| + std::string download_error_;
|
| + bool download_cancelled_;
|
| +};
|
| +
|
| +// Action for invoking the OnStartedCallback of DownloadURLParameters object
|
| +// which is assumed to be pointed to by arg0.
|
| +ACTION_P2(InvokeOnStartedCallback, download_item, interrupt_reason) {
|
| + arg0->callback().Run(download_item, interrupt_reason);
|
| +}
|
| +
|
| +ACTION_P(InvokeClosure, closure) {
|
| + closure.Run();
|
| }
|
|
|
| +const char kTestUrl[] = "http://example.com/some-url";
|
| +
|
| } // namespace
|
|
|
| -TEST(PluginInstallerTest, SecurityStatus) {
|
| - const PluginInstaller::SecurityStatus kUpToDate =
|
| - PluginInstaller::SECURITY_STATUS_UP_TO_DATE;
|
| - const PluginInstaller::SecurityStatus kOutOfDate =
|
| - PluginInstaller::SECURITY_STATUS_OUT_OF_DATE;
|
| - const PluginInstaller::SecurityStatus kRequiresAuthorization =
|
| - PluginInstaller::SECURITY_STATUS_REQUIRES_AUTHORIZATION;
|
| -
|
| - PluginInstaller installer("claybrick-writer",
|
| - base::ASCIIToUTF16("ClayBrick Writer"),
|
| - true, GURL(), GURL(),
|
| - base::ASCIIToUTF16("ClayBrick"));
|
| -
|
| -#if defined(OS_LINUX)
|
| - EXPECT_EQ(kRequiresAuthorization, GetSecurityStatus(&installer, "1.2.3"));
|
| -#else
|
| - EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "1.2.3"));
|
| -#endif
|
| -
|
| - installer.AddVersion(Version("9.4.1"), kRequiresAuthorization);
|
| - installer.AddVersion(Version("10"), kOutOfDate);
|
| - installer.AddVersion(Version("10.2.1"), kUpToDate);
|
| -
|
| - // Invalid version.
|
| - EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "foo"));
|
| -
|
| - EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "0"));
|
| - EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "1.2.3"));
|
| - EXPECT_EQ(kRequiresAuthorization, GetSecurityStatus(&installer, "9.4.1"));
|
| - EXPECT_EQ(kRequiresAuthorization, GetSecurityStatus(&installer, "9.4.2"));
|
| - EXPECT_EQ(kOutOfDate, GetSecurityStatus(&installer, "10.2.0"));
|
| - EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "10.2.1"));
|
| - EXPECT_EQ(kUpToDate, GetSecurityStatus(&installer, "11"));
|
| +// Test that DownloadStarted()/DownloadFinished() notifications are sent to
|
| +// observers when a download initiated by PluginInstaller completes
|
| +// successfully.
|
| +TEST_F(PluginInstallerTest, StartInstalling_SuccessfulDownload) {
|
| + content::MockDownloadManager mock_download_manager;
|
| + base::RunLoop run_loop;
|
| + scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem());
|
| +
|
| + EXPECT_CALL(mock_download_manager,
|
| + DownloadUrlMock(testing::Property(
|
| + &content::DownloadUrlParameters::url, GURL(kTestUrl))))
|
| + .WillOnce(testing::DoAll(
|
| + InvokeOnStartedCallback(download_item.get(),
|
| + content::DOWNLOAD_INTERRUPT_REASON_NONE),
|
| + InvokeClosure(run_loop.QuitClosure())));
|
| + EXPECT_CALL(*download_item, AddObserver(_));
|
| + EXPECT_CALL(*download_item, SetOpenWhenComplete(_));
|
| +
|
| + TestPluginInstallerObserver installer_observer(installer());
|
| + installer()->StartInstallingWithDownloadManager(
|
| + GURL(kTestUrl), web_contents(), &mock_download_manager);
|
| + run_loop.Run();
|
| +
|
| + ASSERT_TRUE(last_download_item_observer());
|
| + EXPECT_TRUE(installer_observer.download_started());
|
| + EXPECT_FALSE(installer_observer.download_finished());
|
| +
|
| + EXPECT_CALL(*download_item, GetState())
|
| + .WillOnce(testing::Return(content::DownloadItem::COMPLETE));
|
| + EXPECT_CALL(*download_item, RemoveObserver(_));
|
| + last_download_item_observer()->OnDownloadUpdated(download_item.get());
|
| + EXPECT_TRUE(installer_observer.download_finished());
|
| +}
|
| +
|
| +// Test that DownloadStarted()/DownloadError() notifications are sent to
|
| +// observers when a download initiated by PluginInstaller fails to start.
|
| +TEST_F(PluginInstallerTest, StartInstalling_FailedStart) {
|
| + content::MockDownloadManager mock_download_manager;
|
| + base::RunLoop run_loop;
|
| + scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem());
|
| +
|
| + EXPECT_CALL(mock_download_manager,
|
| + DownloadUrlMock(testing::Property(
|
| + &content::DownloadUrlParameters::url, GURL(kTestUrl))))
|
| + .WillOnce(
|
| + testing::DoAll(InvokeOnStartedCallback(
|
| + download_item.get(),
|
| + content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED),
|
| + InvokeClosure(run_loop.QuitClosure())));
|
| +
|
| + TestPluginInstallerObserver installer_observer(installer());
|
| + installer()->StartInstallingWithDownloadManager(
|
| + GURL(kTestUrl), web_contents(), &mock_download_manager);
|
| + run_loop.Run();
|
| +
|
| + EXPECT_FALSE(last_download_item_observer());
|
| + EXPECT_TRUE(installer_observer.download_started());
|
| + EXPECT_FALSE(installer_observer.download_finished());
|
| + EXPECT_EQ("Error 20: NETWORK_FAILED", installer_observer.download_error());
|
| +}
|
| +
|
| +// Test that DownloadStarted()/DownloadError() notifications are sent to
|
| +// observers when a download initiated by PluginInstaller starts successfully
|
| +// but is interrupted later.
|
| +TEST_F(PluginInstallerTest, StartInstalling_Interrupted) {
|
| + content::MockDownloadManager mock_download_manager;
|
| + base::RunLoop run_loop;
|
| + scoped_ptr<content::MockDownloadItem> download_item(CreateMockDownloadItem());
|
| +
|
| + EXPECT_CALL(mock_download_manager,
|
| + DownloadUrlMock(testing::Property(
|
| + &content::DownloadUrlParameters::url, GURL(kTestUrl))))
|
| + .WillOnce(testing::DoAll(
|
| + InvokeOnStartedCallback(download_item.get(),
|
| + content::DOWNLOAD_INTERRUPT_REASON_NONE),
|
| + InvokeClosure(run_loop.QuitClosure())));
|
| + EXPECT_CALL(*download_item, AddObserver(_));
|
| + EXPECT_CALL(*download_item, SetOpenWhenComplete(_));
|
| +
|
| + TestPluginInstallerObserver installer_observer(installer());
|
| + installer()->StartInstallingWithDownloadManager(
|
| + GURL(kTestUrl), web_contents(), &mock_download_manager);
|
| + run_loop.Run();
|
| +
|
| + ASSERT_TRUE(last_download_item_observer());
|
| + EXPECT_TRUE(installer_observer.download_started());
|
| + EXPECT_FALSE(installer_observer.download_finished());
|
| +
|
| + EXPECT_CALL(*download_item, GetState())
|
| + .WillOnce(testing::Return(content::DownloadItem::INTERRUPTED));
|
| + EXPECT_CALL(*download_item, RemoveObserver(_));
|
| + EXPECT_CALL(*download_item, GetLastReason()).WillOnce(
|
| + testing::Return(content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED));
|
| + last_download_item_observer()->OnDownloadUpdated(download_item.get());
|
| +
|
| + EXPECT_FALSE(last_download_item_observer());
|
| + EXPECT_TRUE(installer_observer.download_started());
|
| + EXPECT_FALSE(installer_observer.download_finished());
|
| + EXPECT_EQ("NETWORK_FAILED", installer_observer.download_error());
|
| }
|
|
|