blob: a23362615329491b148a645cb287efc7c390562c [file] [log] [blame]
[email protected]73097562012-01-12 19:38:551// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f24448db2011-01-27 20:40:392// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/proxy/ppapi_proxy_test.h"
6
[email protected]b75673fe2012-10-17 17:59:147#include <sstream>
8
[email protected]1f6581c2011-10-04 23:10:159#include "base/bind.h"
[email protected]7ef6b79b2013-01-17 02:38:2410#include "base/bind_helpers.h"
[email protected]7ccb7072013-06-10 20:56:2811#include "base/message_loop/message_loop_proxy.h"
[email protected]912f3d6c2011-06-29 18:26:3612#include "base/observer_list.h"
[email protected]7ef6b79b2013-01-17 02:38:2413#include "base/run_loop.h"
[email protected]912f3d6c2011-06-29 18:26:3614#include "ipc/ipc_sync_channel.h"
dmichael6b328f3d2014-09-29 23:49:0215#include "ipc/message_filter.h"
[email protected]f24448db2011-01-27 20:40:3916#include "ppapi/c/pp_errors.h"
[email protected]912f3d6c2011-06-29 18:26:3617#include "ppapi/c/private/ppb_proxy_private.h"
[email protected]465faa22011-02-08 16:31:4618#include "ppapi/proxy/ppapi_messages.h"
[email protected]7ef6b79b2013-01-17 02:38:2419#include "ppapi/proxy/ppb_message_loop_proxy.h"
20#include "ppapi/shared_impl/proxy_lock.h"
[email protected]f24448db2011-01-27 20:40:3921
[email protected]4d2efd22011-08-18 21:58:0222namespace ppapi {
[email protected]f24448db2011-01-27 20:40:3923namespace proxy {
24
25namespace {
[email protected]912f3d6c2011-06-29 18:26:3626// HostDispatcher requires a PPB_Proxy_Private, so we always provide a fallback
27// do-nothing implementation.
28void PluginCrashed(PP_Module module) {
29 NOTREACHED();
30};
[email protected]f24448db2011-01-27 20:40:3931
[email protected]912f3d6c2011-06-29 18:26:3632PP_Instance GetInstanceForResource(PP_Resource resource) {
33 // If a test relies on this, we need to implement it.
34 NOTREACHED();
35 return 0;
36}
37
38void SetReserveInstanceIDCallback(PP_Module module,
39 PP_Bool (*is_seen)(PP_Module, PP_Instance)) {
40 // This function gets called in HostDispatcher's constructor. We simply don't
41 // worry about Instance uniqueness in tests, so we can ignore the call.
42}
43
[email protected]912f3d6c2011-06-29 18:26:3644void AddRefModule(PP_Module module) {}
45void ReleaseModule(PP_Module module) {}
[email protected]fa4dd2912011-10-17 21:23:2946PP_Bool IsInModuleDestructor(PP_Module module) { return PP_FALSE; }
[email protected]912f3d6c2011-06-29 18:26:3647
[email protected]fa4dd2912011-10-17 21:23:2948PPB_Proxy_Private ppb_proxy_private = {
49 &PluginCrashed,
50 &GetInstanceForResource,
51 &SetReserveInstanceIDCallback,
[email protected]fa4dd2912011-10-17 21:23:2952 &AddRefModule,
53 &ReleaseModule,
54 &IsInModuleDestructor
55};
[email protected]912f3d6c2011-06-29 18:26:3656
57// We allow multiple harnesses at a time to respond to 'GetInterface' calls.
58// We assume that only 1 harness's GetInterface function will ever support a
59// given interface name. In practice, there will either be only 1 GetInterface
60// handler (for PluginProxyTest or HostProxyTest), or there will be only 2
61// GetInterface handlers (for TwoWayTest). In the latter case, one handler is
62// for the PluginProxyTestHarness and should only respond for PPP interfaces,
63// and the other handler is for the HostProxyTestHarness which should only
64// ever respond for PPB interfaces.
65ObserverList<ProxyTestHarnessBase> get_interface_handlers_;
[email protected]465faa22011-02-08 16:31:4666
67const void* MockGetInterface(const char* name) {
[email protected]912f3d6c2011-06-29 18:26:3668 ObserverList<ProxyTestHarnessBase>::Iterator it =
69 get_interface_handlers_;
70 while (ProxyTestHarnessBase* observer = it.GetNext()) {
71 const void* interface = observer->GetInterface(name);
72 if (interface)
73 return interface;
[email protected]465faa22011-02-08 16:31:4674 }
[email protected]912f3d6c2011-06-29 18:26:3675 if (strcmp(name, PPB_PROXY_PRIVATE_INTERFACE) == 0)
76 return &ppb_proxy_private;
77 return NULL;
78}
79
80void SetUpRemoteHarness(ProxyTestHarnessBase* harness,
81 const IPC::ChannelHandle& handle,
82 base::MessageLoopProxy* ipc_message_loop_proxy,
83 base::WaitableEvent* shutdown_event,
84 base::WaitableEvent* harness_set_up) {
85 harness->SetUpHarnessWithChannel(handle, ipc_message_loop_proxy,
86 shutdown_event, false);
87 harness_set_up->Signal();
88}
89
90void TearDownRemoteHarness(ProxyTestHarnessBase* harness,
91 base::WaitableEvent* harness_torn_down) {
92 harness->TearDownHarness();
93 harness_torn_down->Signal();
[email protected]f24448db2011-01-27 20:40:3994}
95
[email protected]d57fd382012-09-19 00:55:4296void RunTaskOnRemoteHarness(const base::Closure& task,
97 base::WaitableEvent* task_complete) {
98 task.Run();
99 task_complete->Signal();
100}
101
[email protected]f24448db2011-01-27 20:40:39102} // namespace
103
[email protected]912f3d6c2011-06-29 18:26:36104// ProxyTestHarnessBase --------------------------------------------------------
[email protected]465faa22011-02-08 16:31:46105
[email protected]912f3d6c2011-06-29 18:26:36106ProxyTestHarnessBase::ProxyTestHarnessBase() : pp_module_(0x98765),
107 pp_instance_(0x12345) {
108 get_interface_handlers_.AddObserver(this);
[email protected]465faa22011-02-08 16:31:46109}
110
[email protected]912f3d6c2011-06-29 18:26:36111ProxyTestHarnessBase::~ProxyTestHarnessBase() {
112 get_interface_handlers_.RemoveObserver(this);
[email protected]465faa22011-02-08 16:31:46113}
114
[email protected]912f3d6c2011-06-29 18:26:36115const void* ProxyTestHarnessBase::GetInterface(const char* name) {
[email protected]465faa22011-02-08 16:31:46116 return registered_interfaces_[name];
117}
118
[email protected]912f3d6c2011-06-29 18:26:36119void ProxyTestHarnessBase::RegisterTestInterface(const char* name,
[email protected]99ff9932011-09-07 14:14:54120 const void* test_interface) {
121 registered_interfaces_[name] = test_interface;
[email protected]465faa22011-02-08 16:31:46122}
123
[email protected]912f3d6c2011-06-29 18:26:36124bool ProxyTestHarnessBase::SupportsInterface(const char* name) {
[email protected]465faa22011-02-08 16:31:46125 sink().ClearMessages();
126
127 // IPC doesn't actually write to this when we send a message manually
128 // not actually using IPC.
129 bool unused_result = false;
130 PpapiMsg_SupportsInterface msg(name, &unused_result);
131 GetDispatcher()->OnMessageReceived(msg);
132
133 const IPC::Message* reply_msg =
134 sink().GetUniqueMessageMatching(IPC_REPLY_ID);
135 EXPECT_TRUE(reply_msg);
136 if (!reply_msg)
137 return false;
138
139 TupleTypes<PpapiMsg_SupportsInterface::ReplyParam>::ValueTuple reply_data;
140 EXPECT_TRUE(PpapiMsg_SupportsInterface::ReadReplyParam(
141 reply_msg, &reply_data));
142
143 sink().ClearMessages();
144 return reply_data.a;
145}
146
[email protected]912f3d6c2011-06-29 18:26:36147// PluginProxyTestHarness ------------------------------------------------------
[email protected]465faa22011-02-08 16:31:46148
[email protected]7ef6b79b2013-01-17 02:38:24149PluginProxyTestHarness::PluginProxyTestHarness(
150 GlobalsConfiguration globals_config)
151 : globals_config_(globals_config) {
[email protected]f24448db2011-01-27 20:40:39152}
153
[email protected]912f3d6c2011-06-29 18:26:36154PluginProxyTestHarness::~PluginProxyTestHarness() {
[email protected]f24448db2011-01-27 20:40:39155}
156
[email protected]d57fd382012-09-19 00:55:42157PpapiGlobals* PluginProxyTestHarness::GetGlobals() {
158 return plugin_globals_.get();
159}
160
[email protected]912f3d6c2011-06-29 18:26:36161Dispatcher* PluginProxyTestHarness::GetDispatcher() {
[email protected]465faa22011-02-08 16:31:46162 return plugin_dispatcher_.get();
163}
164
[email protected]912f3d6c2011-06-29 18:26:36165void PluginProxyTestHarness::SetUpHarness() {
[email protected]f24448db2011-01-27 20:40:39166 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24167 CreatePluginGlobals();
[email protected]b73c6592013-03-30 17:08:13168 // Some of the methods called during set-up check that the lock is held.
169 ProxyAutoLock lock;
[email protected]7ef6b79b2013-01-17 02:38:24170
[email protected]794d83cd2011-10-20 19:09:20171 resource_tracker().DidCreateInstance(pp_instance());
[email protected]f24448db2011-01-27 20:40:39172
[email protected]f24448db2011-01-27 20:40:39173 plugin_dispatcher_.reset(new PluginDispatcher(
[email protected]bc2eeb42012-05-02 22:35:53174 &MockGetInterface,
[email protected]195d4cde2012-10-02 18:12:41175 PpapiPermissions(),
[email protected]bc2eeb42012-05-02 22:35:53176 false));
[email protected]465faa22011-02-08 16:31:46177 plugin_dispatcher_->InitWithTestSink(&sink());
[email protected]d57fd382012-09-19 00:55:42178 // The plugin proxy delegate is needed for
179 // |PluginProxyDelegate::GetBrowserSender| which is used
180 // in |ResourceCreationProxy::GetConnection| to get the channel to the
181 // browser. In this case we just use the |plugin_dispatcher_| as the channel
182 // for test purposes.
183 plugin_delegate_mock_.set_browser_sender(plugin_dispatcher_.get());
dmichaelfee3a512014-09-18 21:32:13184 PluginGlobals::Get()->SetPluginProxyDelegate(&plugin_delegate_mock_);
[email protected]22fdaa62012-11-30 01:55:44185 plugin_dispatcher_->DidCreateInstance(pp_instance());
[email protected]f24448db2011-01-27 20:40:39186}
187
[email protected]912f3d6c2011-06-29 18:26:36188void PluginProxyTestHarness::SetUpHarnessWithChannel(
189 const IPC::ChannelHandle& channel_handle,
190 base::MessageLoopProxy* ipc_message_loop,
191 base::WaitableEvent* shutdown_event,
192 bool is_client) {
193 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24194 CreatePluginGlobals();
[email protected]b73c6592013-03-30 17:08:13195 // Some of the methods called during set-up check that the lock is held.
196 ProxyAutoLock lock;
[email protected]7ef6b79b2013-01-17 02:38:24197
[email protected]794d83cd2011-10-20 19:09:20198 resource_tracker().DidCreateInstance(pp_instance());
[email protected]912f3d6c2011-06-29 18:26:36199 plugin_delegate_mock_.Init(ipc_message_loop, shutdown_event);
200
201 plugin_dispatcher_.reset(new PluginDispatcher(
[email protected]bc2eeb42012-05-02 22:35:53202 &MockGetInterface,
[email protected]195d4cde2012-10-02 18:12:41203 PpapiPermissions(),
[email protected]bc2eeb42012-05-02 22:35:53204 false));
[email protected]912f3d6c2011-06-29 18:26:36205 plugin_dispatcher_->InitPluginWithChannel(&plugin_delegate_mock_,
[email protected]108fd342013-01-04 20:46:54206 base::kNullProcessId,
[email protected]912f3d6c2011-06-29 18:26:36207 channel_handle,
208 is_client);
[email protected]22fdaa62012-11-30 01:55:44209 plugin_delegate_mock_.set_browser_sender(plugin_dispatcher_.get());
dmichaelfee3a512014-09-18 21:32:13210 PluginGlobals::Get()->SetPluginProxyDelegate(&plugin_delegate_mock_);
[email protected]912f3d6c2011-06-29 18:26:36211 plugin_dispatcher_->DidCreateInstance(pp_instance());
212}
213
214void PluginProxyTestHarness::TearDownHarness() {
[email protected]b73c6592013-03-30 17:08:13215 {
216 // Some of the methods called during tear-down check that the lock is held.
217 ProxyAutoLock lock;
[email protected]f24448db2011-01-27 20:40:39218
[email protected]b73c6592013-03-30 17:08:13219 plugin_dispatcher_->DidDestroyInstance(pp_instance());
220 plugin_dispatcher_.reset();
221
222 resource_tracker().DidDeleteInstance(pp_instance());
223 }
[email protected]d57fd382012-09-19 00:55:42224 plugin_globals_.reset();
[email protected]f24448db2011-01-27 20:40:39225}
226
[email protected]7ef6b79b2013-01-17 02:38:24227void PluginProxyTestHarness::CreatePluginGlobals() {
228 if (globals_config_ == PER_THREAD_GLOBALS) {
229 plugin_globals_.reset(new PluginGlobals(PpapiGlobals::PerThreadForTest()));
230 PpapiGlobals::SetPpapiGlobalsOnThreadForTest(GetGlobals());
[email protected]b1d571af2013-09-17 23:30:00231 // Enable locking in case some other unit test ran before us and disabled
232 // locking.
233 ProxyLock::EnableLockingOnThreadForTest();
[email protected]7ef6b79b2013-01-17 02:38:24234 } else {
235 plugin_globals_.reset(new PluginGlobals());
[email protected]b1d571af2013-09-17 23:30:00236 ProxyLock::EnableLockingOnThreadForTest();
[email protected]7ef6b79b2013-01-17 02:38:24237 }
238}
239
[email protected]912f3d6c2011-06-29 18:26:36240base::MessageLoopProxy*
241PluginProxyTestHarness::PluginDelegateMock::GetIPCMessageLoop() {
242 return ipc_message_loop_;
243}
244
245base::WaitableEvent*
246PluginProxyTestHarness::PluginDelegateMock::GetShutdownEvent() {
247 return shutdown_event_;
248}
249
[email protected]f0ecb552012-05-11 22:09:11250IPC::PlatformFileForTransit
251PluginProxyTestHarness::PluginDelegateMock::ShareHandleWithRemote(
252 base::PlatformFile handle,
[email protected]108fd342013-01-04 20:46:54253 base::ProcessId /* remote_pid */,
[email protected]f0ecb552012-05-11 22:09:11254 bool should_close_source) {
255 return IPC::GetFileHandleForProcess(handle,
256 base::Process::Current().handle(),
257 should_close_source);
258}
259
[email protected]912f3d6c2011-06-29 18:26:36260std::set<PP_Instance>*
261PluginProxyTestHarness::PluginDelegateMock::GetGloballySeenInstanceIDSet() {
262 return &instance_id_set_;
263}
264
[email protected]6fc87e02011-12-20 19:18:45265uint32 PluginProxyTestHarness::PluginDelegateMock::Register(
266 PluginDispatcher* plugin_dispatcher) {
267 return 0;
268}
269
270void PluginProxyTestHarness::PluginDelegateMock::Unregister(
271 uint32 plugin_dispatcher_id) {
272}
273
[email protected]93df81e2012-08-10 22:22:46274IPC::Sender* PluginProxyTestHarness::PluginDelegateMock::GetBrowserSender() {
[email protected]d57fd382012-09-19 00:55:42275 return browser_sender_;
[email protected]93df81e2012-08-10 22:22:46276}
277
[email protected]2306303a2012-06-11 18:10:37278std::string PluginProxyTestHarness::PluginDelegateMock::GetUILanguage() {
279 return std::string("en-US");
280}
281
[email protected]6fc87e02011-12-20 19:18:45282void PluginProxyTestHarness::PluginDelegateMock::PreCacheFont(
283 const void* logfontw) {
[email protected]373a95a2011-07-01 16:58:14284}
[email protected]7f801d82011-07-08 23:30:11285
[email protected]72a10722012-06-27 19:30:58286void PluginProxyTestHarness::PluginDelegateMock::SetActiveURL(
287 const std::string& url) {
288}
289
[email protected]1d148062013-07-25 20:25:45290PP_Resource PluginProxyTestHarness::PluginDelegateMock::CreateBrowserFont(
291 Connection connection,
292 PP_Instance instance,
293 const PP_BrowserFont_Trusted_Description& desc,
294 const Preferences& prefs) {
295 return 0;
296}
297
[email protected]912f3d6c2011-06-29 18:26:36298// PluginProxyTest -------------------------------------------------------------
299
[email protected]7ef6b79b2013-01-17 02:38:24300PluginProxyTest::PluginProxyTest() : PluginProxyTestHarness(SINGLETON_GLOBALS) {
[email protected]912f3d6c2011-06-29 18:26:36301}
302
303PluginProxyTest::~PluginProxyTest() {
304}
305
306void PluginProxyTest::SetUp() {
307 SetUpHarness();
308}
309
310void PluginProxyTest::TearDown() {
311 TearDownHarness();
312}
313
[email protected]7ef6b79b2013-01-17 02:38:24314// PluginProxyMultiThreadTest --------------------------------------------------
315
316PluginProxyMultiThreadTest::PluginProxyMultiThreadTest() {
317}
318
319PluginProxyMultiThreadTest::~PluginProxyMultiThreadTest() {
320}
321
322void PluginProxyMultiThreadTest::RunTest() {
323 main_thread_message_loop_proxy_ =
324 PpapiGlobals::Get()->GetMainThreadMessageLoop();
325 ASSERT_EQ(main_thread_message_loop_proxy_.get(),
Daniel Cheng6d3ae972014-08-26 00:27:38326 base::MessageLoopProxy::current().get());
[email protected]7ef6b79b2013-01-17 02:38:24327 nested_main_thread_message_loop_.reset(new base::RunLoop());
328
329 secondary_thread_.reset(new base::DelegateSimpleThread(
330 this, "PluginProxyMultiThreadTest"));
331
332 {
333 ProxyAutoLock auto_lock;
334
335 // MessageLoopResource assumes that the proxy lock has been acquired.
336 secondary_thread_message_loop_ = new MessageLoopResource(pp_instance());
337
[email protected]7ef6b79b2013-01-17 02:38:24338 ASSERT_EQ(PP_OK,
339 secondary_thread_message_loop_->PostWork(
340 PP_MakeCompletionCallback(
341 &PluginProxyMultiThreadTest::InternalSetUpTestOnSecondaryThread,
342 this),
343 0));
344 }
345
346 SetUpTestOnMainThread();
347
348 secondary_thread_->Start();
349 nested_main_thread_message_loop_->Run();
350 secondary_thread_->Join();
351
352 {
353 ProxyAutoLock auto_lock;
354
355 // The destruction requires a valid PpapiGlobals instance, so we should
356 // explicitly release it.
357 secondary_thread_message_loop_ = NULL;
358 }
359
360 secondary_thread_.reset(NULL);
361 nested_main_thread_message_loop_.reset(NULL);
362 main_thread_message_loop_proxy_ = NULL;
363}
364
365void PluginProxyMultiThreadTest::CheckOnThread(ThreadType thread_type) {
366 ProxyAutoLock auto_lock;
367 if (thread_type == MAIN_THREAD) {
368 ASSERT_TRUE(MessageLoopResource::GetCurrent()->is_main_thread_loop());
369 } else {
370 ASSERT_EQ(secondary_thread_message_loop_.get(),
371 MessageLoopResource::GetCurrent());
372 }
373}
374
375void PluginProxyMultiThreadTest::PostQuitForMainThread() {
376 main_thread_message_loop_proxy_->PostTask(
377 FROM_HERE,
378 base::Bind(&PluginProxyMultiThreadTest::QuitNestedLoop,
379 base::Unretained(this)));
380}
381
382void PluginProxyMultiThreadTest::PostQuitForSecondaryThread() {
383 ProxyAutoLock auto_lock;
384 secondary_thread_message_loop_->PostQuit(PP_TRUE);
385}
386
387void PluginProxyMultiThreadTest::Run() {
388 ProxyAutoLock auto_lock;
389 ASSERT_EQ(PP_OK, secondary_thread_message_loop_->AttachToCurrentThread());
390 ASSERT_EQ(PP_OK, secondary_thread_message_loop_->Run());
[email protected]1b777012013-07-15 20:42:38391 secondary_thread_message_loop_->DetachFromThread();
[email protected]7ef6b79b2013-01-17 02:38:24392}
393
394void PluginProxyMultiThreadTest::QuitNestedLoop() {
395 nested_main_thread_message_loop_->Quit();
396}
397
398// static
399void PluginProxyMultiThreadTest::InternalSetUpTestOnSecondaryThread(
400 void* user_data,
401 int32_t result) {
402 EXPECT_EQ(PP_OK, result);
403 PluginProxyMultiThreadTest* thiz =
404 static_cast<PluginProxyMultiThreadTest*>(user_data);
405 thiz->CheckOnThread(SECONDARY_THREAD);
406 thiz->SetUpTestOnSecondaryThread();
407}
408
[email protected]912f3d6c2011-06-29 18:26:36409// HostProxyTestHarness --------------------------------------------------------
410
[email protected]7ef6b79b2013-01-17 02:38:24411HostProxyTestHarness::HostProxyTestHarness(GlobalsConfiguration globals_config)
dmichael6b328f3d2014-09-29 23:49:02412 : globals_config_(globals_config) {
[email protected]912f3d6c2011-06-29 18:26:36413}
414
415HostProxyTestHarness::~HostProxyTestHarness() {
416}
417
[email protected]d57fd382012-09-19 00:55:42418PpapiGlobals* HostProxyTestHarness::GetGlobals() {
419 return host_globals_.get();
420}
421
[email protected]912f3d6c2011-06-29 18:26:36422Dispatcher* HostProxyTestHarness::GetDispatcher() {
423 return host_dispatcher_.get();
424}
425
426void HostProxyTestHarness::SetUpHarness() {
[email protected]73097562012-01-12 19:38:55427 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24428 CreateHostGlobals();
429
[email protected]912f3d6c2011-06-29 18:26:36430 host_dispatcher_.reset(new HostDispatcher(
[email protected]912f3d6c2011-06-29 18:26:36431 pp_module(),
[email protected]8be45842012-04-13 19:49:29432 &MockGetInterface,
[email protected]73e20db2012-12-12 22:27:06433 PpapiPermissions::AllPermissions()));
[email protected]912f3d6c2011-06-29 18:26:36434 host_dispatcher_->InitWithTestSink(&sink());
435 HostDispatcher::SetForInstance(pp_instance(), host_dispatcher_.get());
436}
437
438void HostProxyTestHarness::SetUpHarnessWithChannel(
439 const IPC::ChannelHandle& channel_handle,
440 base::MessageLoopProxy* ipc_message_loop,
441 base::WaitableEvent* shutdown_event,
442 bool is_client) {
[email protected]73097562012-01-12 19:38:55443 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24444 CreateHostGlobals();
445
[email protected]912f3d6c2011-06-29 18:26:36446 delegate_mock_.Init(ipc_message_loop, shutdown_event);
[email protected]73097562012-01-12 19:38:55447
[email protected]912f3d6c2011-06-29 18:26:36448 host_dispatcher_.reset(new HostDispatcher(
[email protected]912f3d6c2011-06-29 18:26:36449 pp_module(),
[email protected]8be45842012-04-13 19:49:29450 &MockGetInterface,
[email protected]73e20db2012-12-12 22:27:06451 PpapiPermissions::AllPermissions()));
[email protected]912f3d6c2011-06-29 18:26:36452 ppapi::Preferences preferences;
[email protected]108fd342013-01-04 20:46:54453 host_dispatcher_->InitHostWithChannel(&delegate_mock_,
454 base::kNullProcessId, channel_handle,
[email protected]912f3d6c2011-06-29 18:26:36455 is_client, preferences);
456 HostDispatcher::SetForInstance(pp_instance(), host_dispatcher_.get());
457}
458
459void HostProxyTestHarness::TearDownHarness() {
460 HostDispatcher::RemoveForInstance(pp_instance());
461 host_dispatcher_.reset();
[email protected]d57fd382012-09-19 00:55:42462 host_globals_.reset();
[email protected]912f3d6c2011-06-29 18:26:36463}
464
[email protected]7ef6b79b2013-01-17 02:38:24465void HostProxyTestHarness::CreateHostGlobals() {
466 if (globals_config_ == PER_THREAD_GLOBALS) {
467 host_globals_.reset(new TestGlobals(PpapiGlobals::PerThreadForTest()));
468 PpapiGlobals::SetPpapiGlobalsOnThreadForTest(GetGlobals());
[email protected]b1d571af2013-09-17 23:30:00469 // The host side of the proxy does not lock.
470 ProxyLock::DisableLockingOnThreadForTest();
[email protected]7ef6b79b2013-01-17 02:38:24471 } else {
[email protected]b1d571af2013-09-17 23:30:00472 ProxyLock::DisableLockingOnThreadForTest();
[email protected]7ef6b79b2013-01-17 02:38:24473 host_globals_.reset(new TestGlobals());
474 }
475}
476
[email protected]912f3d6c2011-06-29 18:26:36477base::MessageLoopProxy*
478HostProxyTestHarness::DelegateMock::GetIPCMessageLoop() {
479 return ipc_message_loop_;
480}
481
482base::WaitableEvent* HostProxyTestHarness::DelegateMock::GetShutdownEvent() {
483 return shutdown_event_;
484}
485
[email protected]f0ecb552012-05-11 22:09:11486IPC::PlatformFileForTransit
487HostProxyTestHarness::DelegateMock::ShareHandleWithRemote(
488 base::PlatformFile handle,
[email protected]108fd342013-01-04 20:46:54489 base::ProcessId /* remote_pid */,
[email protected]f0ecb552012-05-11 22:09:11490 bool should_close_source) {
491 return IPC::GetFileHandleForProcess(handle,
492 base::Process::Current().handle(),
493 should_close_source);
494}
495
[email protected]912f3d6c2011-06-29 18:26:36496
[email protected]465faa22011-02-08 16:31:46497// HostProxyTest ---------------------------------------------------------------
498
[email protected]7ef6b79b2013-01-17 02:38:24499HostProxyTest::HostProxyTest() : HostProxyTestHarness(SINGLETON_GLOBALS) {
[email protected]465faa22011-02-08 16:31:46500}
501
502HostProxyTest::~HostProxyTest() {
503}
504
[email protected]465faa22011-02-08 16:31:46505void HostProxyTest::SetUp() {
[email protected]912f3d6c2011-06-29 18:26:36506 SetUpHarness();
[email protected]465faa22011-02-08 16:31:46507}
508
509void HostProxyTest::TearDown() {
[email protected]912f3d6c2011-06-29 18:26:36510 TearDownHarness();
[email protected]465faa22011-02-08 16:31:46511}
512
[email protected]912f3d6c2011-06-29 18:26:36513// TwoWayTest ---------------------------------------------------------------
514
515TwoWayTest::TwoWayTest(TwoWayTest::TwoWayTestMode test_mode)
516 : test_mode_(test_mode),
[email protected]7ef6b79b2013-01-17 02:38:24517 host_(ProxyTestHarnessBase::PER_THREAD_GLOBALS),
518 plugin_(ProxyTestHarnessBase::PER_THREAD_GLOBALS),
[email protected]912f3d6c2011-06-29 18:26:36519 io_thread_("TwoWayTest_IOThread"),
520 plugin_thread_("TwoWayTest_PluginThread"),
521 remote_harness_(NULL),
522 local_harness_(NULL),
523 channel_created_(true, false),
524 shutdown_event_(true, false) {
525 if (test_mode == TEST_PPP_INTERFACE) {
526 remote_harness_ = &plugin_;
527 local_harness_ = &host_;
528 } else {
529 remote_harness_ = &host_;
530 local_harness_ = &plugin_;
531 }
532}
533
534TwoWayTest::~TwoWayTest() {
535 shutdown_event_.Signal();
536}
537
538void TwoWayTest::SetUp() {
539 base::Thread::Options options;
[email protected]d2881d82013-05-06 19:23:08540 options.message_loop_type = base::MessageLoop::TYPE_IO;
[email protected]912f3d6c2011-06-29 18:26:36541 io_thread_.StartWithOptions(options);
542 plugin_thread_.Start();
543
[email protected]b75673fe2012-10-17 17:59:14544 // Construct the IPC handle name using the process ID so we can safely run
545 // multiple |TwoWayTest|s concurrently.
546 std::ostringstream handle_name;
547 handle_name << "TwoWayTestChannel" << base::GetCurrentProcId();
548 IPC::ChannelHandle handle(handle_name.str());
[email protected]912f3d6c2011-06-29 18:26:36549 base::WaitableEvent remote_harness_set_up(true, false);
550 plugin_thread_.message_loop_proxy()->PostTask(
551 FROM_HERE,
[email protected]1f6581c2011-10-04 23:10:15552 base::Bind(&SetUpRemoteHarness,
553 remote_harness_,
554 handle,
555 io_thread_.message_loop_proxy(),
556 &shutdown_event_,
557 &remote_harness_set_up));
[email protected]912f3d6c2011-06-29 18:26:36558 remote_harness_set_up.Wait();
559 local_harness_->SetUpHarnessWithChannel(handle,
[email protected]cadac622013-06-11 16:46:36560 io_thread_.message_loop_proxy().get(),
[email protected]912f3d6c2011-06-29 18:26:36561 &shutdown_event_,
562 true); // is_client
563}
564
565void TwoWayTest::TearDown() {
566 base::WaitableEvent remote_harness_torn_down(true, false);
567 plugin_thread_.message_loop_proxy()->PostTask(
568 FROM_HERE,
[email protected]1f6581c2011-10-04 23:10:15569 base::Bind(&TearDownRemoteHarness,
570 remote_harness_,
571 &remote_harness_torn_down));
[email protected]912f3d6c2011-06-29 18:26:36572 remote_harness_torn_down.Wait();
573
574 local_harness_->TearDownHarness();
575
576 io_thread_.Stop();
577}
578
[email protected]d57fd382012-09-19 00:55:42579void TwoWayTest::PostTaskOnRemoteHarness(const base::Closure& task) {
580 base::WaitableEvent task_complete(true, false);
581 plugin_thread_.message_loop_proxy()->PostTask(FROM_HERE,
582 base::Bind(&RunTaskOnRemoteHarness,
583 task,
584 &task_complete));
585 task_complete.Wait();
586}
587
588
[email protected]f24448db2011-01-27 20:40:39589} // namespace proxy
[email protected]4d2efd22011-08-18 21:58:02590} // namespace ppapi