Rent syncemove all uses of the global Dispatcher Get function.
This reqired reworking how plugin->host GetInterface works. Previously,
interface requests were symmetric where each side would first do a
SupportsInterface to see if the remote side supports the interface, then create
the proxy. Since the plugin may talk to multiple renderers, we don't know where
to send these requests. The solution is to make the assumption that the
renderer always supports all PPB interfaces (which is possible since the proxy
is compiled with the executable).
This also adds some better lookup for interfaces to avoid having multiple lists
of interfaces. We now have a list of interfaces and factory functions in
dispatcher.cc.
Add some additional testing infrastructure for the dispatchers with simple tests.
Review URL: http://codereview.chromium.org/6286070
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74121 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ppapi/proxy/plugin_dispatcher_unittest.cc b/ppapi/proxy/plugin_dispatcher_unittest.cc
new file mode 100644
index 0000000..f9b624e9
--- /dev/null
+++ b/ppapi/proxy/plugin_dispatcher_unittest.cc
@@ -0,0 +1,88 @@
+// 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 "base/scoped_ptr.h"
+#include "ipc/ipc_message_utils.h"
+#include "ppapi/c/ppb_audio.h"
+#include "ppapi/c/ppp_instance.h"
+#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/proxy/ppapi_proxy_test.h"
+
+namespace pp {
+namespace proxy {
+
+namespace {
+
+bool received_create = false;
+
+// Implement PPB_Audio since it's a relatively simple PPB interface and
+// includes bidirectional communication.
+PP_Resource Create(PP_Instance instance, PP_Resource config,
+ PPB_Audio_Callback audio_callback, void* user_data) {
+ received_create = true;
+ return 0;
+}
+PP_Bool IsAudio(PP_Resource resource) {
+ return PP_FALSE;
+}
+PP_Resource GetCurrentConfig(PP_Resource audio) {
+ return 0;
+}
+PP_Bool StartPlayback(PP_Resource audio) {
+ return PP_FALSE;
+}
+PP_Bool StopPlayback(PP_Resource audio) {
+ return PP_FALSE;
+}
+
+PPB_Audio dummy_audio_interface = {
+ &Create,
+ &IsAudio,
+ &GetCurrentConfig,
+ &StartPlayback,
+ &StopPlayback
+};
+
+} // namespace
+
+class PluginDispatcherTest : public PluginProxyTest {
+ public:
+ PluginDispatcherTest() {}
+
+ bool HasTargetProxy(InterfaceID id) {
+ return !!plugin_dispatcher()->target_proxies_[id].get();
+ }
+};
+
+TEST_F(PluginDispatcherTest, SupportsInterface) {
+ RegisterTestInterface(PPB_AUDIO_INTERFACE, &dummy_audio_interface);
+ RegisterTestInterface(PPP_INSTANCE_INTERFACE,
+ reinterpret_cast<void*>(0xdeadbeef));
+
+ // Sending a request for a random interface should fail.
+ EXPECT_FALSE(SupportsInterface("Random interface"));
+
+ // Sending a request for a PPB interface should fail even though we've
+ // registered it as existing in the GetInterface function (the plugin proxy
+ // should only respond to PPP interfaces when asked if it supports them).
+ EXPECT_FALSE(SupportsInterface(PPB_AUDIO_INTERFACE));
+
+ // Sending a request for a supported PPP interface should succeed.
+ EXPECT_TRUE(SupportsInterface(PPP_INSTANCE_INTERFACE));
+}
+
+TEST_F(PluginDispatcherTest, PPBCreation) {
+ // Sending a PPB message out of the blue should create a target proxy for
+ // that interface in the plugin.
+ EXPECT_FALSE(HasTargetProxy(INTERFACE_ID_PPB_AUDIO));
+ PpapiMsg_PPBAudio_NotifyAudioStreamCreated audio_msg(
+ INTERFACE_ID_PPB_AUDIO, HostResource(), 0,
+ IPC::PlatformFileForTransit(), base::SharedMemoryHandle(), 0);
+ plugin_dispatcher()->OnMessageReceived(audio_msg);
+ EXPECT_TRUE(HasTargetProxy(INTERFACE_ID_PPB_AUDIO));
+}
+
+} // namespace proxy
+} // namespace pp
+