diff options
author | dmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-29 18:26:36 +0000 |
---|---|---|
committer | dmichael@chromium.org <dmichael@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-29 18:26:36 +0000 |
commit | 912f3d6c2193584bc9376ed17f3dd2b90e78a40e (patch) | |
tree | 98729e7a810cc29cdc414ea8e0e75e9967a0ac4c /ppapi/proxy/ppapi_proxy_test.h | |
parent | 0daefc769a7578184c1c57ef2b59970a41d8cf79 (diff) | |
download | chromium_src-912f3d6c2193584bc9376ed17f3dd2b90e78a40e.zip chromium_src-912f3d6c2193584bc9376ed17f3dd2b90e78a40e.tar.gz chromium_src-912f3d6c2193584bc9376ed17f3dd2b90e78a40e.tar.bz2 |
Make o.o.p. proxy handle PPP_Instance versions 0.4 and 0.5.
Move & tweak PPP_Instance_Combined to ppapi_shared so the proxy can use it. Use versioned PPP_Instance types only.
BUG=82606
TEST=run tests o.o.p.
Review URL: http://codereview.chromium.org/7189045
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90984 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/proxy/ppapi_proxy_test.h')
-rw-r--r-- | ppapi/proxy/ppapi_proxy_test.h | 169 |
1 files changed, 152 insertions, 17 deletions
diff --git a/ppapi/proxy/ppapi_proxy_test.h b/ppapi/proxy/ppapi_proxy_test.h index 2c1ae1f..5067c96 100644 --- a/ppapi/proxy/ppapi_proxy_test.h +++ b/ppapi/proxy/ppapi_proxy_test.h @@ -5,7 +5,10 @@ #include <map> #include <string> +#include "base/message_loop.h" #include "base/memory/scoped_ptr.h" +#include "base/synchronization/waitable_event.h" +#include "base/threading/thread.h" #include "ipc/ipc_test_sink.h" #include "ppapi/c/pp_instance.h" #include "ppapi/proxy/host_dispatcher.h" @@ -17,12 +20,12 @@ namespace pp { namespace proxy { -// Base class for plugin and host tests. Tests will not use this directly. -// Instead, use the Plugin or HostProxyTest. -class ProxyTestBase : public testing::Test { +// Base class for plugin and host test harnesses. Tests will not use this +// directly. Instead, use the PluginProxyTest, HostProxyTest, or TwoWayTest. +class ProxyTestHarnessBase { public: - ProxyTestBase(); - virtual ~ProxyTestBase(); + ProxyTestHarnessBase(); + virtual ~ProxyTestHarnessBase(); PP_Module pp_module() const { return pp_module_; } PP_Instance pp_instance() const { return pp_instance_; } @@ -31,6 +34,17 @@ class ProxyTestBase : public testing::Test { // Returns either the plugin or host dispatcher, depending on the test. virtual Dispatcher* GetDispatcher() = 0; + // Set up the harness using an IPC::TestSink to capture messages. + virtual void SetUpHarness() = 0; + + // Set up the harness using a real IPC channel. + virtual void SetUpHarnessWithChannel(const IPC::ChannelHandle& channel_handle, + base::MessageLoopProxy* ipc_message_loop, + base::WaitableEvent* shutdown_event, + bool is_client) = 0; + + virtual void TearDownHarness() = 0; + // Implementation of GetInterface for the dispatcher. This will // return NULL for all interfaces unless one is registered by calling // RegisterTestInterface(); @@ -58,44 +72,165 @@ class ProxyTestBase : public testing::Test { }; // Test harness for the plugin side of the proxy. -class PluginProxyTest : public ProxyTestBase { +class PluginProxyTestHarness : public ProxyTestHarnessBase { public: - PluginProxyTest(); - virtual ~PluginProxyTest(); + PluginProxyTestHarness(); + virtual ~PluginProxyTestHarness(); PluginDispatcher* plugin_dispatcher() { return plugin_dispatcher_.get(); } PluginResourceTracker& resource_tracker() { return resource_tracker_; } PluginVarTracker& var_tracker() { return var_tracker_; } - // ProxyTestBase implementation. + // ProxyTestHarnessBase implementation. virtual Dispatcher* GetDispatcher(); - - // testing::Test implementation. - virtual void SetUp(); - virtual void TearDown(); + virtual void SetUpHarness(); + virtual void SetUpHarnessWithChannel(const IPC::ChannelHandle& channel_handle, + base::MessageLoopProxy* ipc_message_loop, + base::WaitableEvent* shutdown_event, + bool is_client); + virtual void TearDownHarness(); + + class PluginDelegateMock : public PluginDispatcher::PluginDelegate { + public: + PluginDelegateMock() : ipc_message_loop_(NULL), shutdown_event_() {} + virtual ~PluginDelegateMock() {} + + void Init(base::MessageLoopProxy* ipc_message_loop, + base::WaitableEvent* shutdown_event) { + ipc_message_loop_ = ipc_message_loop; + shutdown_event_ = shutdown_event; + } + + // ProxyChannel::Delegate implementation. + virtual base::MessageLoopProxy* GetIPCMessageLoop(); + virtual base::WaitableEvent* GetShutdownEvent(); + + // PluginDispatcher::PluginDelegate implementation. + virtual std::set<PP_Instance>* GetGloballySeenInstanceIDSet(); + virtual ppapi::WebKitForwarding* GetWebKitForwarding(); + virtual void PostToWebKitThread(const tracked_objects::Location& from_here, + const base::Closure& task); + virtual bool SendToBrowser(IPC::Message* msg); + + private: + base::MessageLoopProxy* ipc_message_loop_; // Weak + base::WaitableEvent* shutdown_event_; // Weak + std::set<PP_Instance> instance_id_set_; + + DISALLOW_COPY_AND_ASSIGN(PluginDelegateMock); + }; private: PluginResourceTracker resource_tracker_; PluginVarTracker var_tracker_; scoped_ptr<PluginDispatcher> plugin_dispatcher_; + PluginDelegateMock plugin_delegate_mock_; }; -class HostProxyTest : public ProxyTestBase { +class PluginProxyTest : public PluginProxyTestHarness, public testing::Test { public: - HostProxyTest(); - virtual ~HostProxyTest(); + PluginProxyTest(); + virtual ~PluginProxyTest(); + + // testing::Test implementation. + virtual void SetUp(); + virtual void TearDown(); +}; + +class HostProxyTestHarness : public ProxyTestHarnessBase { + public: + HostProxyTestHarness(); + virtual ~HostProxyTestHarness(); HostDispatcher* host_dispatcher() { return host_dispatcher_.get(); } // ProxyTestBase implementation. virtual Dispatcher* GetDispatcher(); + virtual void SetUpHarness(); + virtual void SetUpHarnessWithChannel(const IPC::ChannelHandle& channel_handle, + base::MessageLoopProxy* ipc_message_loop, + base::WaitableEvent* shutdown_event, + bool is_client); + virtual void TearDownHarness(); + + class DelegateMock : public ProxyChannel::Delegate { + public: + DelegateMock() : ipc_message_loop_(NULL), shutdown_event_(NULL) { + } + virtual ~DelegateMock() {} + + void Init(base::MessageLoopProxy* ipc_message_loop, + base::WaitableEvent* shutdown_event) { + ipc_message_loop_ = ipc_message_loop; + shutdown_event_ = shutdown_event; + } + + // ProxyChannel::Delegate implementation. + virtual base::MessageLoopProxy* GetIPCMessageLoop(); + virtual base::WaitableEvent* GetShutdownEvent(); + + private: + base::MessageLoopProxy* ipc_message_loop_; // Weak + base::WaitableEvent* shutdown_event_; // Weak + + DISALLOW_COPY_AND_ASSIGN(DelegateMock); + }; + + private: + scoped_ptr<HostDispatcher> host_dispatcher_; + DelegateMock delegate_mock_; +}; + +class HostProxyTest : public HostProxyTestHarness, public testing::Test { + public: + HostProxyTest(); + virtual ~HostProxyTest(); + + // testing::Test implementation. + virtual void SetUp(); + virtual void TearDown(); +}; + +// Use this base class to test both sides of a proxy. +class TwoWayTest : public testing::Test { + public: + enum TwoWayTestMode { + TEST_PPP_INTERFACE, + TEST_PPB_INTERFACE + }; + TwoWayTest(TwoWayTestMode test_mode); + virtual ~TwoWayTest(); + + HostProxyTestHarness& host() { return host_; } + PluginProxyTestHarness& plugin() { return plugin_; } + PP_Module pp_module() const { return host_.pp_module(); } + PP_Instance pp_instance() const { return host_.pp_instance(); } + TwoWayTestMode test_mode() { return test_mode_; } // testing::Test implementation. virtual void SetUp(); virtual void TearDown(); private: - scoped_ptr<HostDispatcher> host_dispatcher_; + TwoWayTestMode test_mode_; + HostProxyTestHarness host_; + PluginProxyTestHarness plugin_; + // In order to use sync IPC, we need to have an IO thread. + base::Thread io_thread_; + // The plugin side of the proxy runs on its own thread. + base::Thread plugin_thread_; + // The message loop for the main (host) thread. + MessageLoop message_loop_; + + // Aliases for the host and plugin harnesses; if we're testing a PPP + // interface, remote_harness will point to plugin_, and local_harness + // will point to host_. This makes it convenient when we're starting and + // stopping the harnesses. + ProxyTestHarnessBase* remote_harness_; + ProxyTestHarnessBase* local_harness_; + + base::WaitableEvent channel_created_; + base::WaitableEvent shutdown_event_; }; } // namespace proxy |