blob: 2b0667c6dbbee332408df8ec354cbcd42c208256 [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"
rvargas079d1842014-10-17 22:32:1613#include "base/process/process_handle.h"
[email protected]7ef6b79b2013-01-17 02:38:2414#include "base/run_loop.h"
[email protected]912f3d6c2011-06-29 18:26:3615#include "ipc/ipc_sync_channel.h"
dmichael6b328f3d2014-09-29 23:49:0216#include "ipc/message_filter.h"
[email protected]f24448db2011-01-27 20:40:3917#include "ppapi/c/pp_errors.h"
[email protected]912f3d6c2011-06-29 18:26:3618#include "ppapi/c/private/ppb_proxy_private.h"
[email protected]465faa22011-02-08 16:31:4619#include "ppapi/proxy/ppapi_messages.h"
[email protected]7ef6b79b2013-01-17 02:38:2420#include "ppapi/proxy/ppb_message_loop_proxy.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) {
danakj4ef352d2015-03-09 17:45:3968 ObserverList<ProxyTestHarnessBase>::Iterator it(&get_interface_handlers_);
[email protected]912f3d6c2011-06-29 18:26:3669 while (ProxyTestHarnessBase* observer = it.GetNext()) {
70 const void* interface = observer->GetInterface(name);
71 if (interface)
72 return interface;
[email protected]465faa22011-02-08 16:31:4673 }
[email protected]912f3d6c2011-06-29 18:26:3674 if (strcmp(name, PPB_PROXY_PRIVATE_INTERFACE) == 0)
75 return &ppb_proxy_private;
76 return NULL;
77}
78
79void SetUpRemoteHarness(ProxyTestHarnessBase* harness,
80 const IPC::ChannelHandle& handle,
81 base::MessageLoopProxy* ipc_message_loop_proxy,
82 base::WaitableEvent* shutdown_event,
83 base::WaitableEvent* harness_set_up) {
84 harness->SetUpHarnessWithChannel(handle, ipc_message_loop_proxy,
85 shutdown_event, false);
86 harness_set_up->Signal();
87}
88
89void TearDownRemoteHarness(ProxyTestHarnessBase* harness,
90 base::WaitableEvent* harness_torn_down) {
91 harness->TearDownHarness();
92 harness_torn_down->Signal();
[email protected]f24448db2011-01-27 20:40:3993}
94
[email protected]d57fd382012-09-19 00:55:4295void RunTaskOnRemoteHarness(const base::Closure& task,
96 base::WaitableEvent* task_complete) {
97 task.Run();
98 task_complete->Signal();
99}
100
[email protected]f24448db2011-01-27 20:40:39101} // namespace
102
[email protected]912f3d6c2011-06-29 18:26:36103// ProxyTestHarnessBase --------------------------------------------------------
[email protected]465faa22011-02-08 16:31:46104
[email protected]912f3d6c2011-06-29 18:26:36105ProxyTestHarnessBase::ProxyTestHarnessBase() : pp_module_(0x98765),
106 pp_instance_(0x12345) {
107 get_interface_handlers_.AddObserver(this);
[email protected]465faa22011-02-08 16:31:46108}
109
[email protected]912f3d6c2011-06-29 18:26:36110ProxyTestHarnessBase::~ProxyTestHarnessBase() {
111 get_interface_handlers_.RemoveObserver(this);
[email protected]465faa22011-02-08 16:31:46112}
113
[email protected]912f3d6c2011-06-29 18:26:36114const void* ProxyTestHarnessBase::GetInterface(const char* name) {
[email protected]465faa22011-02-08 16:31:46115 return registered_interfaces_[name];
116}
117
[email protected]912f3d6c2011-06-29 18:26:36118void ProxyTestHarnessBase::RegisterTestInterface(const char* name,
[email protected]99ff9932011-09-07 14:14:54119 const void* test_interface) {
120 registered_interfaces_[name] = test_interface;
[email protected]465faa22011-02-08 16:31:46121}
122
kareng1c62eeb2014-11-08 16:35:03123bool ProxyTestHarnessBase::SupportsInterface(const char* name) {
[email protected]465faa22011-02-08 16:31:46124 sink().ClearMessages();
125
126 // IPC doesn't actually write to this when we send a message manually
127 // not actually using IPC.
128 bool unused_result = false;
kareng1c62eeb2014-11-08 16:35:03129 PpapiMsg_SupportsInterface msg(name, &unused_result);
[email protected]465faa22011-02-08 16:31:46130 GetDispatcher()->OnMessageReceived(msg);
131
132 const IPC::Message* reply_msg =
133 sink().GetUniqueMessageMatching(IPC_REPLY_ID);
134 EXPECT_TRUE(reply_msg);
135 if (!reply_msg)
136 return false;
137
brettwd5ca2bc2015-05-29 22:15:47138 base::TupleTypes<PpapiMsg_SupportsInterface::ReplyParam>::ValueTuple
139 reply_data;
kareng1c62eeb2014-11-08 16:35:03140 EXPECT_TRUE(PpapiMsg_SupportsInterface::ReadReplyParam(
[email protected]465faa22011-02-08 16:31:46141 reply_msg, &reply_data));
142
143 sink().ClearMessages();
brettwd5ca2bc2015-05-29 22:15:47144 return base::get<0>(reply_data);
[email protected]465faa22011-02-08 16:31:46145}
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.
dmichaelb11ca7b2015-04-02 16:59:40167 CreatePluginGlobals(nullptr /* ipc_task_runner */);
[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.
dmichaelb11ca7b2015-04-02 16:59:40194 scoped_refptr<base::TaskRunner> ipc_task_runner(ipc_message_loop);
195 CreatePluginGlobals(ipc_message_loop);
[email protected]b73c6592013-03-30 17:08:13196 // Some of the methods called during set-up check that the lock is held.
197 ProxyAutoLock lock;
[email protected]7ef6b79b2013-01-17 02:38:24198
[email protected]794d83cd2011-10-20 19:09:20199 resource_tracker().DidCreateInstance(pp_instance());
[email protected]912f3d6c2011-06-29 18:26:36200 plugin_delegate_mock_.Init(ipc_message_loop, shutdown_event);
201
202 plugin_dispatcher_.reset(new PluginDispatcher(
[email protected]bc2eeb42012-05-02 22:35:53203 &MockGetInterface,
[email protected]195d4cde2012-10-02 18:12:41204 PpapiPermissions(),
[email protected]bc2eeb42012-05-02 22:35:53205 false));
[email protected]912f3d6c2011-06-29 18:26:36206 plugin_dispatcher_->InitPluginWithChannel(&plugin_delegate_mock_,
[email protected]108fd342013-01-04 20:46:54207 base::kNullProcessId,
[email protected]912f3d6c2011-06-29 18:26:36208 channel_handle,
209 is_client);
[email protected]22fdaa62012-11-30 01:55:44210 plugin_delegate_mock_.set_browser_sender(plugin_dispatcher_.get());
dmichaelfee3a512014-09-18 21:32:13211 PluginGlobals::Get()->SetPluginProxyDelegate(&plugin_delegate_mock_);
[email protected]912f3d6c2011-06-29 18:26:36212 plugin_dispatcher_->DidCreateInstance(pp_instance());
213}
214
215void PluginProxyTestHarness::TearDownHarness() {
[email protected]b73c6592013-03-30 17:08:13216 {
217 // Some of the methods called during tear-down check that the lock is held.
218 ProxyAutoLock lock;
[email protected]f24448db2011-01-27 20:40:39219
[email protected]b73c6592013-03-30 17:08:13220 plugin_dispatcher_->DidDestroyInstance(pp_instance());
221 plugin_dispatcher_.reset();
222
223 resource_tracker().DidDeleteInstance(pp_instance());
224 }
[email protected]d57fd382012-09-19 00:55:42225 plugin_globals_.reset();
[email protected]f24448db2011-01-27 20:40:39226}
227
dmichaelb11ca7b2015-04-02 16:59:40228void PluginProxyTestHarness::CreatePluginGlobals(
229 const scoped_refptr<base::TaskRunner>& ipc_task_runner) {
[email protected]7ef6b79b2013-01-17 02:38:24230 if (globals_config_ == PER_THREAD_GLOBALS) {
dmichaelb11ca7b2015-04-02 16:59:40231 plugin_globals_.reset(new PluginGlobals(PpapiGlobals::PerThreadForTest(),
232 ipc_task_runner));
[email protected]7ef6b79b2013-01-17 02:38:24233 PpapiGlobals::SetPpapiGlobalsOnThreadForTest(GetGlobals());
234 } else {
dmichaelb11ca7b2015-04-02 16:59:40235 plugin_globals_.reset(new PluginGlobals(ipc_task_runner));
[email protected]7ef6b79b2013-01-17 02:38:24236 }
237}
238
skyostil12262cf2015-05-21 14:49:31239base::SingleThreadTaskRunner*
240PluginProxyTestHarness::PluginDelegateMock::GetIPCTaskRunner() {
[email protected]912f3d6c2011-06-29 18:26:36241 return ipc_message_loop_;
242}
243
244base::WaitableEvent*
245PluginProxyTestHarness::PluginDelegateMock::GetShutdownEvent() {
246 return shutdown_event_;
247}
248
[email protected]f0ecb552012-05-11 22:09:11249IPC::PlatformFileForTransit
250PluginProxyTestHarness::PluginDelegateMock::ShareHandleWithRemote(
251 base::PlatformFile handle,
[email protected]108fd342013-01-04 20:46:54252 base::ProcessId /* remote_pid */,
[email protected]f0ecb552012-05-11 22:09:11253 bool should_close_source) {
254 return IPC::GetFileHandleForProcess(handle,
rvargas079d1842014-10-17 22:32:16255 base::GetCurrentProcessHandle(),
[email protected]f0ecb552012-05-11 22:09:11256 should_close_source);
257}
258
erikchen4fc32d52015-06-02 02:16:38259base::SharedMemoryHandle
260PluginProxyTestHarness::PluginDelegateMock::ShareSharedMemoryHandleWithRemote(
261 const base::SharedMemoryHandle& handle,
262 base::ProcessId remote_pid) {
263#if defined(OS_POSIX)
264 return ShareHandleWithRemote(handle.fd, remote_pid, false);
265#elif defined(OS_WIN)
266 return ShareHandleWithRemote(handle, remote_pid, false);
267#else
268#error Not implemented.
269#endif
270}
271
[email protected]912f3d6c2011-06-29 18:26:36272std::set<PP_Instance>*
273PluginProxyTestHarness::PluginDelegateMock::GetGloballySeenInstanceIDSet() {
274 return &instance_id_set_;
275}
276
[email protected]6fc87e02011-12-20 19:18:45277uint32 PluginProxyTestHarness::PluginDelegateMock::Register(
278 PluginDispatcher* plugin_dispatcher) {
279 return 0;
280}
281
282void PluginProxyTestHarness::PluginDelegateMock::Unregister(
283 uint32 plugin_dispatcher_id) {
284}
285
[email protected]93df81e2012-08-10 22:22:46286IPC::Sender* PluginProxyTestHarness::PluginDelegateMock::GetBrowserSender() {
[email protected]d57fd382012-09-19 00:55:42287 return browser_sender_;
[email protected]93df81e2012-08-10 22:22:46288}
289
[email protected]2306303a2012-06-11 18:10:37290std::string PluginProxyTestHarness::PluginDelegateMock::GetUILanguage() {
291 return std::string("en-US");
292}
293
[email protected]6fc87e02011-12-20 19:18:45294void PluginProxyTestHarness::PluginDelegateMock::PreCacheFont(
295 const void* logfontw) {
[email protected]373a95a2011-07-01 16:58:14296}
[email protected]7f801d82011-07-08 23:30:11297
[email protected]72a10722012-06-27 19:30:58298void PluginProxyTestHarness::PluginDelegateMock::SetActiveURL(
299 const std::string& url) {
300}
301
[email protected]1d148062013-07-25 20:25:45302PP_Resource PluginProxyTestHarness::PluginDelegateMock::CreateBrowserFont(
303 Connection connection,
304 PP_Instance instance,
305 const PP_BrowserFont_Trusted_Description& desc,
306 const Preferences& prefs) {
307 return 0;
308}
309
[email protected]912f3d6c2011-06-29 18:26:36310// PluginProxyTest -------------------------------------------------------------
311
[email protected]7ef6b79b2013-01-17 02:38:24312PluginProxyTest::PluginProxyTest() : PluginProxyTestHarness(SINGLETON_GLOBALS) {
[email protected]912f3d6c2011-06-29 18:26:36313}
314
315PluginProxyTest::~PluginProxyTest() {
316}
317
318void PluginProxyTest::SetUp() {
319 SetUpHarness();
320}
321
322void PluginProxyTest::TearDown() {
323 TearDownHarness();
324}
325
[email protected]7ef6b79b2013-01-17 02:38:24326// PluginProxyMultiThreadTest --------------------------------------------------
327
328PluginProxyMultiThreadTest::PluginProxyMultiThreadTest() {
329}
330
331PluginProxyMultiThreadTest::~PluginProxyMultiThreadTest() {
332}
333
334void PluginProxyMultiThreadTest::RunTest() {
335 main_thread_message_loop_proxy_ =
336 PpapiGlobals::Get()->GetMainThreadMessageLoop();
337 ASSERT_EQ(main_thread_message_loop_proxy_.get(),
Daniel Cheng6d3ae972014-08-26 00:27:38338 base::MessageLoopProxy::current().get());
[email protected]7ef6b79b2013-01-17 02:38:24339 nested_main_thread_message_loop_.reset(new base::RunLoop());
340
341 secondary_thread_.reset(new base::DelegateSimpleThread(
342 this, "PluginProxyMultiThreadTest"));
343
344 {
345 ProxyAutoLock auto_lock;
346
347 // MessageLoopResource assumes that the proxy lock has been acquired.
348 secondary_thread_message_loop_ = new MessageLoopResource(pp_instance());
349
[email protected]7ef6b79b2013-01-17 02:38:24350 ASSERT_EQ(PP_OK,
351 secondary_thread_message_loop_->PostWork(
352 PP_MakeCompletionCallback(
353 &PluginProxyMultiThreadTest::InternalSetUpTestOnSecondaryThread,
354 this),
355 0));
356 }
357
358 SetUpTestOnMainThread();
359
360 secondary_thread_->Start();
361 nested_main_thread_message_loop_->Run();
362 secondary_thread_->Join();
363
364 {
365 ProxyAutoLock auto_lock;
366
367 // The destruction requires a valid PpapiGlobals instance, so we should
368 // explicitly release it.
369 secondary_thread_message_loop_ = NULL;
370 }
371
372 secondary_thread_.reset(NULL);
373 nested_main_thread_message_loop_.reset(NULL);
374 main_thread_message_loop_proxy_ = NULL;
375}
376
377void PluginProxyMultiThreadTest::CheckOnThread(ThreadType thread_type) {
378 ProxyAutoLock auto_lock;
379 if (thread_type == MAIN_THREAD) {
380 ASSERT_TRUE(MessageLoopResource::GetCurrent()->is_main_thread_loop());
381 } else {
382 ASSERT_EQ(secondary_thread_message_loop_.get(),
383 MessageLoopResource::GetCurrent());
384 }
385}
386
387void PluginProxyMultiThreadTest::PostQuitForMainThread() {
388 main_thread_message_loop_proxy_->PostTask(
389 FROM_HERE,
390 base::Bind(&PluginProxyMultiThreadTest::QuitNestedLoop,
391 base::Unretained(this)));
392}
393
394void PluginProxyMultiThreadTest::PostQuitForSecondaryThread() {
395 ProxyAutoLock auto_lock;
396 secondary_thread_message_loop_->PostQuit(PP_TRUE);
397}
398
399void PluginProxyMultiThreadTest::Run() {
400 ProxyAutoLock auto_lock;
401 ASSERT_EQ(PP_OK, secondary_thread_message_loop_->AttachToCurrentThread());
402 ASSERT_EQ(PP_OK, secondary_thread_message_loop_->Run());
[email protected]1b777012013-07-15 20:42:38403 secondary_thread_message_loop_->DetachFromThread();
[email protected]7ef6b79b2013-01-17 02:38:24404}
405
406void PluginProxyMultiThreadTest::QuitNestedLoop() {
407 nested_main_thread_message_loop_->Quit();
408}
409
410// static
411void PluginProxyMultiThreadTest::InternalSetUpTestOnSecondaryThread(
412 void* user_data,
413 int32_t result) {
414 EXPECT_EQ(PP_OK, result);
415 PluginProxyMultiThreadTest* thiz =
416 static_cast<PluginProxyMultiThreadTest*>(user_data);
417 thiz->CheckOnThread(SECONDARY_THREAD);
418 thiz->SetUpTestOnSecondaryThread();
419}
420
[email protected]912f3d6c2011-06-29 18:26:36421// HostProxyTestHarness --------------------------------------------------------
422
[email protected]7ef6b79b2013-01-17 02:38:24423HostProxyTestHarness::HostProxyTestHarness(GlobalsConfiguration globals_config)
dmichael6b328f3d2014-09-29 23:49:02424 : globals_config_(globals_config) {
[email protected]912f3d6c2011-06-29 18:26:36425}
426
427HostProxyTestHarness::~HostProxyTestHarness() {
428}
429
[email protected]d57fd382012-09-19 00:55:42430PpapiGlobals* HostProxyTestHarness::GetGlobals() {
431 return host_globals_.get();
432}
433
[email protected]912f3d6c2011-06-29 18:26:36434Dispatcher* HostProxyTestHarness::GetDispatcher() {
435 return host_dispatcher_.get();
436}
437
438void HostProxyTestHarness::SetUpHarness() {
[email protected]73097562012-01-12 19:38:55439 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24440 CreateHostGlobals();
441
[email protected]912f3d6c2011-06-29 18:26:36442 host_dispatcher_.reset(new HostDispatcher(
[email protected]912f3d6c2011-06-29 18:26:36443 pp_module(),
[email protected]8be45842012-04-13 19:49:29444 &MockGetInterface,
[email protected]73e20db2012-12-12 22:27:06445 PpapiPermissions::AllPermissions()));
[email protected]912f3d6c2011-06-29 18:26:36446 host_dispatcher_->InitWithTestSink(&sink());
447 HostDispatcher::SetForInstance(pp_instance(), host_dispatcher_.get());
448}
449
450void HostProxyTestHarness::SetUpHarnessWithChannel(
451 const IPC::ChannelHandle& channel_handle,
452 base::MessageLoopProxy* ipc_message_loop,
453 base::WaitableEvent* shutdown_event,
454 bool is_client) {
[email protected]73097562012-01-12 19:38:55455 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24456 CreateHostGlobals();
457
[email protected]912f3d6c2011-06-29 18:26:36458 delegate_mock_.Init(ipc_message_loop, shutdown_event);
[email protected]73097562012-01-12 19:38:55459
[email protected]912f3d6c2011-06-29 18:26:36460 host_dispatcher_.reset(new HostDispatcher(
[email protected]912f3d6c2011-06-29 18:26:36461 pp_module(),
[email protected]8be45842012-04-13 19:49:29462 &MockGetInterface,
[email protected]73e20db2012-12-12 22:27:06463 PpapiPermissions::AllPermissions()));
[email protected]912f3d6c2011-06-29 18:26:36464 ppapi::Preferences preferences;
[email protected]108fd342013-01-04 20:46:54465 host_dispatcher_->InitHostWithChannel(&delegate_mock_,
466 base::kNullProcessId, channel_handle,
[email protected]912f3d6c2011-06-29 18:26:36467 is_client, preferences);
468 HostDispatcher::SetForInstance(pp_instance(), host_dispatcher_.get());
469}
470
471void HostProxyTestHarness::TearDownHarness() {
472 HostDispatcher::RemoveForInstance(pp_instance());
473 host_dispatcher_.reset();
[email protected]d57fd382012-09-19 00:55:42474 host_globals_.reset();
[email protected]912f3d6c2011-06-29 18:26:36475}
476
[email protected]7ef6b79b2013-01-17 02:38:24477void HostProxyTestHarness::CreateHostGlobals() {
dmichaelbd96c1e2015-02-12 00:58:08478 disable_locking_.reset(new ProxyLock::LockingDisablerForTest);
[email protected]7ef6b79b2013-01-17 02:38:24479 if (globals_config_ == PER_THREAD_GLOBALS) {
480 host_globals_.reset(new TestGlobals(PpapiGlobals::PerThreadForTest()));
481 PpapiGlobals::SetPpapiGlobalsOnThreadForTest(GetGlobals());
482 } else {
483 host_globals_.reset(new TestGlobals());
484 }
485}
486
skyostil12262cf2015-05-21 14:49:31487base::MessageLoopProxy* HostProxyTestHarness::DelegateMock::GetIPCTaskRunner() {
[email protected]912f3d6c2011-06-29 18:26:36488 return ipc_message_loop_;
489}
490
491base::WaitableEvent* HostProxyTestHarness::DelegateMock::GetShutdownEvent() {
492 return shutdown_event_;
493}
494
[email protected]f0ecb552012-05-11 22:09:11495IPC::PlatformFileForTransit
496HostProxyTestHarness::DelegateMock::ShareHandleWithRemote(
497 base::PlatformFile handle,
[email protected]108fd342013-01-04 20:46:54498 base::ProcessId /* remote_pid */,
[email protected]f0ecb552012-05-11 22:09:11499 bool should_close_source) {
500 return IPC::GetFileHandleForProcess(handle,
rvargas079d1842014-10-17 22:32:16501 base::GetCurrentProcessHandle(),
[email protected]f0ecb552012-05-11 22:09:11502 should_close_source);
503}
504
erikchen4fc32d52015-06-02 02:16:38505base::SharedMemoryHandle
506HostProxyTestHarness::DelegateMock::ShareSharedMemoryHandleWithRemote(
507 const base::SharedMemoryHandle& handle,
508 base::ProcessId remote_pid) {
509#if defined(OS_POSIX)
510 return ShareHandleWithRemote(handle.fd, remote_pid, false);
511#elif defined(OS_WIN)
512 return ShareHandleWithRemote(handle, remote_pid, false);
513#else
514#error Not implemented.
515#endif
516}
[email protected]912f3d6c2011-06-29 18:26:36517
[email protected]465faa22011-02-08 16:31:46518// HostProxyTest ---------------------------------------------------------------
519
[email protected]7ef6b79b2013-01-17 02:38:24520HostProxyTest::HostProxyTest() : HostProxyTestHarness(SINGLETON_GLOBALS) {
[email protected]465faa22011-02-08 16:31:46521}
522
523HostProxyTest::~HostProxyTest() {
524}
525
[email protected]465faa22011-02-08 16:31:46526void HostProxyTest::SetUp() {
[email protected]912f3d6c2011-06-29 18:26:36527 SetUpHarness();
[email protected]465faa22011-02-08 16:31:46528}
529
530void HostProxyTest::TearDown() {
[email protected]912f3d6c2011-06-29 18:26:36531 TearDownHarness();
[email protected]465faa22011-02-08 16:31:46532}
533
[email protected]912f3d6c2011-06-29 18:26:36534// TwoWayTest ---------------------------------------------------------------
535
536TwoWayTest::TwoWayTest(TwoWayTest::TwoWayTestMode test_mode)
537 : test_mode_(test_mode),
[email protected]7ef6b79b2013-01-17 02:38:24538 host_(ProxyTestHarnessBase::PER_THREAD_GLOBALS),
539 plugin_(ProxyTestHarnessBase::PER_THREAD_GLOBALS),
[email protected]912f3d6c2011-06-29 18:26:36540 io_thread_("TwoWayTest_IOThread"),
541 plugin_thread_("TwoWayTest_PluginThread"),
542 remote_harness_(NULL),
543 local_harness_(NULL),
544 channel_created_(true, false),
545 shutdown_event_(true, false) {
546 if (test_mode == TEST_PPP_INTERFACE) {
547 remote_harness_ = &plugin_;
548 local_harness_ = &host_;
549 } else {
550 remote_harness_ = &host_;
551 local_harness_ = &plugin_;
552 }
553}
554
555TwoWayTest::~TwoWayTest() {
556 shutdown_event_.Signal();
557}
558
559void TwoWayTest::SetUp() {
560 base::Thread::Options options;
[email protected]d2881d82013-05-06 19:23:08561 options.message_loop_type = base::MessageLoop::TYPE_IO;
[email protected]912f3d6c2011-06-29 18:26:36562 io_thread_.StartWithOptions(options);
563 plugin_thread_.Start();
564
[email protected]b75673fe2012-10-17 17:59:14565 // Construct the IPC handle name using the process ID so we can safely run
566 // multiple |TwoWayTest|s concurrently.
567 std::ostringstream handle_name;
568 handle_name << "TwoWayTestChannel" << base::GetCurrentProcId();
569 IPC::ChannelHandle handle(handle_name.str());
[email protected]912f3d6c2011-06-29 18:26:36570 base::WaitableEvent remote_harness_set_up(true, false);
571 plugin_thread_.message_loop_proxy()->PostTask(
572 FROM_HERE,
[email protected]1f6581c2011-10-04 23:10:15573 base::Bind(&SetUpRemoteHarness,
574 remote_harness_,
575 handle,
576 io_thread_.message_loop_proxy(),
577 &shutdown_event_,
578 &remote_harness_set_up));
[email protected]912f3d6c2011-06-29 18:26:36579 remote_harness_set_up.Wait();
580 local_harness_->SetUpHarnessWithChannel(handle,
[email protected]cadac622013-06-11 16:46:36581 io_thread_.message_loop_proxy().get(),
[email protected]912f3d6c2011-06-29 18:26:36582 &shutdown_event_,
583 true); // is_client
584}
585
586void TwoWayTest::TearDown() {
587 base::WaitableEvent remote_harness_torn_down(true, false);
588 plugin_thread_.message_loop_proxy()->PostTask(
589 FROM_HERE,
[email protected]1f6581c2011-10-04 23:10:15590 base::Bind(&TearDownRemoteHarness,
591 remote_harness_,
592 &remote_harness_torn_down));
[email protected]912f3d6c2011-06-29 18:26:36593 remote_harness_torn_down.Wait();
594
595 local_harness_->TearDownHarness();
596
597 io_thread_.Stop();
598}
599
[email protected]d57fd382012-09-19 00:55:42600void TwoWayTest::PostTaskOnRemoteHarness(const base::Closure& task) {
601 base::WaitableEvent task_complete(true, false);
602 plugin_thread_.message_loop_proxy()->PostTask(FROM_HERE,
603 base::Bind(&RunTaskOnRemoteHarness,
604 task,
605 &task_complete));
606 task_complete.Wait();
607}
608
609
[email protected]f24448db2011-01-27 20:40:39610} // namespace proxy
[email protected]4d2efd22011-08-18 21:58:02611} // namespace ppapi