| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..eb18428531b8462c48639912da8d56ab4194ffe2
|
| --- /dev/null
|
| +++ b/content/browser/plugin_loader_posix_unittest.cc
|
| @@ -0,0 +1,278 @@
|
| +// Copyright (c) 2011 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 "base/bind.h"
|
| +#include "base/file_path.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/utf_string_conversions.h"
|
| +#include "content/browser/browser_thread.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "webkit/plugins/webplugininfo.h"
|
| +
|
| +class MockPluginLoaderPosix : public PluginLoaderPosix {
|
| + public:
|
| + MOCK_METHOD0(LoadPluginsInternal, void(void));
|
| +
|
| + size_t number_of_pending_callbacks() {
|
| + return callbacks_.size();
|
| + }
|
| +
|
| + std::vector<FilePath>* canonical_list() {
|
| + return &canonical_list_;
|
| + }
|
| +
|
| + size_t next_load_index() {
|
| + return next_load_index_;
|
| + }
|
| +
|
| + const std::vector<webkit::WebPluginInfo>& loaded_plugins() {
|
| + return loaded_plugins_;
|
| + }
|
| +
|
| + std::vector<webkit::WebPluginInfo>* internal_plugins() {
|
| + return &internal_plugins_;
|
| + }
|
| +
|
| + void TestOnPluginLoaded(const webkit::WebPluginInfo& plugin) {
|
| + OnPluginLoaded(plugin);
|
| + }
|
| +
|
| + void TestOnPluginLoadFailed(const FilePath& path) {
|
| + OnPluginLoadFailed(path);
|
| + }
|
| +};
|
| +
|
| +void VerifyCallback(int* run_count, const std::vector<webkit::WebPluginInfo>&) {
|
| + ++(*run_count);
|
| +}
|
| +
|
| +class PluginLoaderPosixTest : public testing::Test {
|
| + public:
|
| + PluginLoaderPosixTest()
|
| + : plugin1_(ASCIIToUTF16("plugin1"), FilePath("/tmp/one.plugin"),
|
| + ASCIIToUTF16("1.0"), string16()),
|
| + plugin2_(ASCIIToUTF16("plugin2"), FilePath("/tmp/two.plugin"),
|
| + ASCIIToUTF16("2.0"), string16()),
|
| + plugin3_(ASCIIToUTF16("plugin3"), FilePath("/tmp/three.plugin"),
|
| + ASCIIToUTF16("3.0"), string16()),
|
| + file_thread_(BrowserThread::FILE, &message_loop_),
|
| + io_thread_(BrowserThread::IO, &message_loop_),
|
| + plugin_loader_(new MockPluginLoaderPosix) {
|
| + }
|
| +
|
| + 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.
|
| + webkit::WebPluginInfo plugin1_;
|
| + webkit::WebPluginInfo plugin2_;
|
| + webkit::WebPluginInfo plugin3_;
|
| +
|
| + private:
|
| + MessageLoopForIO message_loop_;
|
| + BrowserThread file_thread_;
|
| + BrowserThread 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));
|
| +
|
| + EXPECT_EQ(0u, plugin_loader()->number_of_pending_callbacks());
|
| + plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback);
|
| + EXPECT_EQ(1u, plugin_loader()->number_of_pending_callbacks());
|
| +
|
| + plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback);
|
| + EXPECT_EQ(2u, plugin_loader()->number_of_pending_callbacks());
|
| +
|
| + EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| + message_loop()->RunAllPending();
|
| +
|
| + plugin_loader()->canonical_list()->clear();
|
| + plugin_loader()->canonical_list()->push_back(plugin1_.path);
|
| +
|
| + EXPECT_EQ(0, did_callback);
|
| +
|
| + plugin_loader()->TestOnPluginLoaded(plugin1_);
|
| + message_loop()->RunAllPending();
|
| +
|
| + EXPECT_EQ(2, did_callback);
|
| + EXPECT_EQ(0u, plugin_loader()->number_of_pending_callbacks());
|
| +}
|
| +
|
| +TEST_F(PluginLoaderPosixTest, ThreeSuccessfulLoads) {
|
| + int did_callback = 0;
|
| + PluginService::GetPluginsCallback callback =
|
| + base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| +
|
| + plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback);
|
| +
|
| + EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| + message_loop()->RunAllPending();
|
| +
|
| + AddThreePlugins();
|
| +
|
| + EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| +
|
| + const std::vector<webkit::WebPluginInfo>& plugins(
|
| + plugin_loader()->loaded_plugins());
|
| +
|
| + plugin_loader()->TestOnPluginLoaded(plugin1_);
|
| + EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| + EXPECT_EQ(1u, plugins.size());
|
| + EXPECT_EQ(plugin1_.name, plugins[0].name);
|
| +
|
| + message_loop()->RunAllPending();
|
| + EXPECT_EQ(0, did_callback);
|
| +
|
| + plugin_loader()->TestOnPluginLoaded(plugin2_);
|
| + EXPECT_EQ(2u, plugin_loader()->next_load_index());
|
| + EXPECT_EQ(2u, plugins.size());
|
| + EXPECT_EQ(plugin2_.name, plugins[1].name);
|
| +
|
| + message_loop()->RunAllPending();
|
| + EXPECT_EQ(0, did_callback);
|
| +
|
| + plugin_loader()->TestOnPluginLoaded(plugin3_);
|
| + EXPECT_EQ(3u, plugins.size());
|
| + EXPECT_EQ(plugin3_.name, plugins[2].name);
|
| +
|
| + message_loop()->RunAllPending();
|
| + EXPECT_EQ(1, did_callback);
|
| +}
|
| +
|
| +TEST_F(PluginLoaderPosixTest, TwoFailures) {
|
| + int did_callback = 0;
|
| + PluginService::GetPluginsCallback callback =
|
| + base::Bind(&VerifyCallback, base::Unretained(&did_callback));
|
| +
|
| + plugin_loader()->LoadPlugins(message_loop()->message_loop_proxy(), callback);
|
| +
|
| + EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| + message_loop()->RunAllPending();
|
| +
|
| + AddThreePlugins();
|
| +
|
| + EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| +
|
| + const std::vector<webkit::WebPluginInfo>& plugins(
|
| + plugin_loader()->loaded_plugins());
|
| +
|
| + plugin_loader()->TestOnPluginLoadFailed(plugin1_.path);
|
| + EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| + EXPECT_EQ(0u, plugins.size());
|
| +
|
| + message_loop()->RunAllPending();
|
| + EXPECT_EQ(0, did_callback);
|
| +
|
| + plugin_loader()->TestOnPluginLoaded(plugin2_);
|
| + EXPECT_EQ(2u, plugin_loader()->next_load_index());
|
| + EXPECT_EQ(1u, plugins.size());
|
| + EXPECT_EQ(plugin2_.name, plugins[0].name);
|
| +
|
| + message_loop()->RunAllPending();
|
| + EXPECT_EQ(0, did_callback);
|
| +
|
| + plugin_loader()->TestOnPluginLoadFailed(plugin3_.path);
|
| + EXPECT_EQ(1u, plugins.size());
|
| +
|
| + message_loop()->RunAllPending();
|
| + 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()->LoadPlugins(message_loop()->message_loop_proxy(), callback);
|
| +
|
| + EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| + message_loop()->RunAllPending();
|
| +
|
| + AddThreePlugins();
|
| +
|
| + EXPECT_EQ(0u, plugin_loader()->next_load_index());
|
| +
|
| + const std::vector<webkit::WebPluginInfo>& plugins(
|
| + plugin_loader()->loaded_plugins());
|
| +
|
| + plugin_loader()->TestOnPluginLoaded(plugin1_);
|
| + EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| + EXPECT_EQ(1u, plugins.size());
|
| + EXPECT_EQ(plugin1_.name, plugins[0].name);
|
| +
|
| + message_loop()->RunAllPending();
|
| + 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()->LoadPlugins(message_loop()->message_loop_proxy(), callback);
|
| +
|
| + EXPECT_CALL(*plugin_loader(), LoadPluginsInternal()).Times(1);
|
| + message_loop()->RunAllPending();
|
| +
|
| + plugin2_.path = 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<webkit::WebPluginInfo>& plugins(
|
| + plugin_loader()->loaded_plugins());
|
| +
|
| + plugin_loader()->TestOnPluginLoaded(plugin1_);
|
| + EXPECT_EQ(1u, plugin_loader()->next_load_index());
|
| + EXPECT_EQ(1u, plugins.size());
|
| + EXPECT_EQ(plugin1_.name, plugins[0].name);
|
| +
|
| + message_loop()->RunAllPending();
|
| + EXPECT_EQ(0, did_callback);
|
| +
|
| + // Internal plugins can fail to load if they're built-in with manual
|
| + // entrypoint functions.
|
| + plugin_loader()->TestOnPluginLoadFailed(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()->RunAllPending();
|
| + EXPECT_EQ(0, did_callback);
|
| +
|
| + plugin_loader()->TestOnPluginLoaded(plugin3_);
|
| + EXPECT_EQ(3u, plugins.size());
|
| + EXPECT_EQ(plugin3_.name, plugins[2].name);
|
| +
|
| + message_loop()->RunAllPending();
|
| + EXPECT_EQ(1, did_callback);
|
| +}
|
|
|