| Index: content/browser/plugin_loader_posix_unittest.cc
|
| diff --git a/content/browser/plugin_loader_posix_unittest.cc b/content/browser/plugin_loader_posix_unittest.cc
|
| deleted file mode 100644
|
| index ec1fa0b51f7d707221b88a414e2253ee1bf5e256..0000000000000000000000000000000000000000
|
| --- a/content/browser/plugin_loader_posix_unittest.cc
|
| +++ /dev/null
|
| @@ -1,426 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/plugin_loader_posix.h"
|
| -
|
| -#include <stddef.h>
|
| -#include <stdint.h>
|
| -
|
| -#include "base/at_exit.h"
|
| -#include "base/bind.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "content/browser/browser_thread_impl.h"
|
| -#include "content/common/plugin_list.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using base::ASCIIToUTF16;
|
| -
|
| -namespace content {
|
| -
|
| -class MockPluginLoaderPosix : public PluginLoaderPosix {
|
| - public:
|
| - MOCK_METHOD0(LoadPluginsInternal, void(void));
|
| -
|
| - size_t number_of_pending_callbacks() {
|
| - return callbacks_.size();
|
| - }
|
| -
|
| - std::vector<base::FilePath>* canonical_list() {
|
| - return &canonical_list_;
|
| - }
|
| -
|
| - size_t next_load_index() {
|
| - return next_load_index_;
|
| - }
|
| -
|
| - const std::vector<WebPluginInfo>& loaded_plugins() {
|
| - return loaded_plugins_;
|
| - }
|
| -
|
| - std::vector<WebPluginInfo>* internal_plugins() {
|
| - return &internal_plugins_;
|
| - }
|
| -
|
| - void RealLoadPluginsInternal() {
|
| - PluginLoaderPosix::LoadPluginsInternal();
|
| - }
|
| -
|
| - bool LaunchUtilityProcess() override {
|
| - // This method always does nothing and returns false. The actual
|
| - // implementation of this method launches another process, which is not
|
| - // very unit_test friendly.
|
| - return false;
|
| - }
|
| -
|
| - void TestOnPluginLoaded(uint32_t index, const WebPluginInfo& plugin) {
|
| - OnPluginLoaded(index, plugin);
|
| - }
|
| -
|
| - void TestOnPluginLoadFailed(uint32_t index, const base::FilePath& path) {
|
| - OnPluginLoadFailed(index, path);
|
| - }
|
| -
|
| - protected:
|
| - virtual ~MockPluginLoaderPosix() {}
|
| -};
|
| -
|
| -void VerifyCallback(int* run_count, const std::vector<WebPluginInfo>&) {
|
| - ++(*run_count);
|
| -}
|
| -
|
| -class PluginLoaderPosixTest : public testing::Test {
|
| - public:
|
| - PluginLoaderPosixTest()
|
| - : plugin1_(ASCIIToUTF16("plugin1"), base::FilePath("/tmp/one.plugin"),
|
| - ASCIIToUTF16("1.0"), base::string16()),
|
| - plugin2_(ASCIIToUTF16("plugin2"), base::FilePath("/tmp/two.plugin"),
|
| - ASCIIToUTF16("2.0"), base::string16()),
|
| - plugin3_(ASCIIToUTF16("plugin3"), base::FilePath("/tmp/three.plugin"),
|
| - ASCIIToUTF16("3.0"), base::string16()),
|
| - file_thread_(BrowserThread::FILE, &message_loop_),
|
| - io_thread_(BrowserThread::IO, &message_loop_),
|
| - plugin_loader_(new MockPluginLoaderPosix) {
|
| - }
|
| -
|
| - void SetUp() override { PluginServiceImpl::GetInstance()->Init(); }
|
| -
|
| - base::MessageLoop* message_loop() { return &message_loop_; }
|
| - MockPluginLoaderPosix* plugin_loader() { return plugin_loader_.get(); }
|
| -
|
| - void AddThreePlugins() {
|
| - plugin_loader_->canonical_list()->clear();
|
| - plugin_loader_->canonical_list()->push_back(plugin1_.path);
|
| - plugin_loader_->canonical_list()->push_back(plugin2_.path);
|
| - plugin_loader_->canonical_list()->push_back(plugin3_.path);
|
| - }
|
| -
|
| - // Data used for testing.
|
| - WebPluginInfo plugin1_;
|
| - WebPluginInfo plugin2_;
|
| - WebPluginInfo plugin3_;
|
| -
|
| - private:
|
| - // Destroys PluginService and PluginList.
|
| - base::ShadowingAtExitManager at_exit_manager_;
|
| -
|
| - base::MessageLoopForIO message_loop_;
|
| - BrowserThreadImpl file_thread_;
|
| - BrowserThreadImpl io_thread_;
|
| -
|
| - scoped_refptr<MockPluginLoaderPosix> plugin_loader_;
|
| -};
|
| -
|
| -TEST_F(PluginLoaderPosixTest, QueueRequests) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - plugin_loader()->canonical_list()->clear();
|
| - plugin_loader()->canonical_list()->push_back(plugin1_.path);
|
| - plugin_loader()->TestOnPluginLoaded(0, plugin1_);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - EXPECT_EQ(2, did_callback);
|
| -}
|
| -
|
| -TEST_F(PluginLoaderPosixTest, QueueRequestsAndInvalidate) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - EXPECT_EQ(0, did_callback);
|
| - ::testing::Mock::VerifyAndClearExpectations(plugin_loader());
|
| -
|
| - // Invalidate the plugin list, then queue up another request.
|
| - PluginList::Singleton()->RefreshPlugins();
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| -
|
| - plugin_loader()->canonical_list()->clear();
|
| - plugin_loader()->canonical_list()->push_back(plugin1_.path);
|
| - plugin_loader()->TestOnPluginLoaded(0, plugin1_);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - // Only the first request should have been fulfilled.
|
| - EXPECT_EQ(1, did_callback);
|
| -
|
| - plugin_loader()->canonical_list()->clear();
|
| - plugin_loader()->canonical_list()->push_back(plugin1_.path);
|
| - plugin_loader()->TestOnPluginLoaded(0, plugin1_);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - EXPECT_EQ(2, did_callback);
|
| -}
|
| -
|
| -TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoads) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - AddThreePlugins();
|
| -
|
| - EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| -
|
| - const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins());
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(0, plugin1_);
|
| - EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(1u, plugins.size());
|
| - EXPECT_EQ(plugin1_.name, plugins[0].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(1, plugin2_);
|
| - EXPECT_EQ(2u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(2u, plugins.size());
|
| - EXPECT_EQ(plugin2_.name, plugins[1].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(2, plugin3_);
|
| - EXPECT_EQ(3u, plugins.size());
|
| - EXPECT_EQ(plugin3_.name, plugins[2].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(1, did_callback);
|
| -}
|
| -
|
| -TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoadsThenCrash) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(2);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - AddThreePlugins();
|
| -
|
| - EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| -
|
| - const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins());
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(0, plugin1_);
|
| - EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(1u, plugins.size());
|
| - EXPECT_EQ(plugin1_.name, plugins[0].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(1, plugin2_);
|
| - EXPECT_EQ(2u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(2u, plugins.size());
|
| - EXPECT_EQ(plugin2_.name, plugins[1].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(2, plugin3_);
|
| - EXPECT_EQ(3u, plugins.size());
|
| - EXPECT_EQ(plugin3_.name, plugins[2].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(1, did_callback);
|
| -
|
| - plugin_loader()->OnProcessCrashed(42);
|
| -}
|
| -
|
| -TEST_F(PluginLoaderPosixTest, TwoFailures) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - AddThreePlugins();
|
| -
|
| - EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| -
|
| - const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins());
|
| -
|
| - plugin_loader()->TestOnPluginLoadFailed(0, plugin1_.path);
|
| - EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(0u, plugins.size());
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(1, plugin2_);
|
| - EXPECT_EQ(2u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(1u, plugins.size());
|
| - EXPECT_EQ(plugin2_.name, plugins[0].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - plugin_loader()->TestOnPluginLoadFailed(2, plugin3_.path);
|
| - EXPECT_EQ(1u, plugins.size());
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(1, did_callback);
|
| -}
|
| -
|
| -TEST_F(PluginLoaderPosixTest, CrashedProcess) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - AddThreePlugins();
|
| -
|
| - EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| -
|
| - const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins());
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(0, plugin1_);
|
| - EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(1u, plugins.size());
|
| - EXPECT_EQ(plugin1_.name, plugins[0].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| - plugin_loader()->OnProcessCrashed(42);
|
| - EXPECT_EQ(1u, plugin_loader()->canonical_list()->size());
|
| - EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(plugin3_.path.value(),
|
| - plugin_loader()->canonical_list()->at(0).value());
|
| -}
|
| -
|
| -TEST_F(PluginLoaderPosixTest, InternalPlugin) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| - message_loop()->RunUntilIdle();
|
| -
|
| - plugin2_.path = base::FilePath("/internal/plugin.plugin");
|
| -
|
| - AddThreePlugins();
|
| -
|
| - plugin_loader()->internal_plugins()->clear();
|
| - plugin_loader()->internal_plugins()->push_back(plugin2_);
|
| -
|
| - EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| -
|
| - const std::vector<WebPluginInfo>& plugins(plugin_loader()->loaded_plugins());
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(0, plugin1_);
|
| - EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(1u, plugins.size());
|
| - EXPECT_EQ(plugin1_.name, plugins[0].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - // Internal plugins can fail to load if they're built-in with manual
|
| - // entrypoint functions.
|
| - plugin_loader()->TestOnPluginLoadFailed(1, plugin2_.path);
|
| - EXPECT_EQ(2u, plugin_loader()->next_load_index());
|
| - EXPECT_EQ(2u, plugins.size());
|
| - EXPECT_EQ(plugin2_.name, plugins[1].name);
|
| - EXPECT_EQ(0u, plugin_loader()->internal_plugins()->size());
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(0, did_callback);
|
| -
|
| - plugin_loader()->TestOnPluginLoaded(2, plugin3_);
|
| - EXPECT_EQ(3u, plugins.size());
|
| - EXPECT_EQ(plugin3_.name, plugins[2].name);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(1, did_callback);
|
| -}
|
| -
|
| -TEST_F(PluginLoaderPosixTest, AllCrashed) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| -
|
| - // Spin the loop so that the canonical list of plugins can be set.
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| - message_loop()->RunUntilIdle();
|
| - AddThreePlugins();
|
| -
|
| - EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| -
|
| - // Mock the first two calls like normal.
|
| - testing::Expectation first =
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(2);
|
| - // On the last call, go through the default impl.
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal())
|
| - .After(first)
|
| - .WillOnce(
|
| - testing::Invoke(plugin_loader(),
|
| - &MockPluginLoaderPosix::RealLoadPluginsInternal));
|
| - plugin_loader()->OnProcessCrashed(42);
|
| - plugin_loader()->OnProcessCrashed(42);
|
| - plugin_loader()->OnProcessCrashed(42);
|
| -
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(1, did_callback);
|
| -
|
| - EXPECT_EQ(0u, plugin_loader()->loaded_plugins().size());
|
| -}
|
| -
|
| -TEST_F(PluginLoaderPosixTest, PluginLaunchFailed) {
|
| - int did_callback = 0;
|
| - PluginService::GetPluginsCallback callback =
|
| - base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| -
|
| - EXPECT_CALL(*plugin_loader(), LoadPluginsInternal())
|
| - .WillOnce(testing::Invoke(
|
| - plugin_loader(), &MockPluginLoaderPosix::RealLoadPluginsInternal));
|
| -
|
| - plugin_loader()->GetPlugins(callback);
|
| - message_loop()->RunUntilIdle();
|
| - EXPECT_EQ(1, did_callback);
|
| - EXPECT_EQ(0u, plugin_loader()->loaded_plugins().size());
|
| -
|
| - // TODO(erikchen): This is a genuine leak that should be fixed.
|
| - // https://code.google.com/p/chromium/issues/detail?id=431906
|
| - testing::Mock::AllowLeak(plugin_loader());
|
| -}
|
| -
|
| -} // namespace content
|
|
|