blob: 0cf09cc8bdcd36861fd3835c873bb5bed3a724c7 [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
tzika0f614d2016-03-08 00:35:157#include <tuple>
[email protected]b75673fe2012-10-17 17:59:148
[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"
skyostil23490d42015-06-12 12:54:2611#include "base/location.h"
Carlos Caballerodd8bf7b042019-07-30 14:14:1512#include "base/message_loop/message_pump_type.h"
[email protected]912f3d6c2011-06-29 18:26:3613#include "base/observer_list.h"
rvargas079d1842014-10-17 22:32:1614#include "base/process/process_handle.h"
[email protected]7ef6b79b2013-01-17 02:38:2415#include "base/run_loop.h"
skyostil23490d42015-06-12 12:54:2616#include "base/single_thread_task_runner.h"
gabb19326e2016-05-11 18:10:3117#include "base/threading/thread_task_runner_handle.h"
[email protected]912f3d6c2011-06-29 18:26:3618#include "ipc/ipc_sync_channel.h"
dmichael6b328f3d2014-09-29 23:49:0219#include "ipc/message_filter.h"
[email protected]f24448db2011-01-27 20:40:3920#include "ppapi/c/pp_errors.h"
[email protected]912f3d6c2011-06-29 18:26:3621#include "ppapi/c/private/ppb_proxy_private.h"
[email protected]465faa22011-02-08 16:31:4622#include "ppapi/proxy/ppapi_messages.h"
[email protected]7ef6b79b2013-01-17 02:38:2423#include "ppapi/proxy/ppb_message_loop_proxy.h"
[email protected]f24448db2011-01-27 20:40:3924
[email protected]4d2efd22011-08-18 21:58:0225namespace ppapi {
[email protected]f24448db2011-01-27 20:40:3926namespace proxy {
27
28namespace {
[email protected]912f3d6c2011-06-29 18:26:3629// HostDispatcher requires a PPB_Proxy_Private, so we always provide a fallback
30// do-nothing implementation.
31void PluginCrashed(PP_Module module) {
32 NOTREACHED();
Nico Webere779c822019-02-12 20:19:0833}
[email protected]f24448db2011-01-27 20:40:3934
[email protected]912f3d6c2011-06-29 18:26:3635PP_Instance GetInstanceForResource(PP_Resource resource) {
36 // If a test relies on this, we need to implement it.
37 NOTREACHED();
38 return 0;
39}
40
41void SetReserveInstanceIDCallback(PP_Module module,
42 PP_Bool (*is_seen)(PP_Module, PP_Instance)) {
43 // This function gets called in HostDispatcher's constructor. We simply don't
44 // worry about Instance uniqueness in tests, so we can ignore the call.
45}
46
[email protected]912f3d6c2011-06-29 18:26:3647void AddRefModule(PP_Module module) {}
48void ReleaseModule(PP_Module module) {}
[email protected]fa4dd2912011-10-17 21:23:2949PP_Bool IsInModuleDestructor(PP_Module module) { return PP_FALSE; }
[email protected]912f3d6c2011-06-29 18:26:3650
[email protected]fa4dd2912011-10-17 21:23:2951PPB_Proxy_Private ppb_proxy_private = {
52 &PluginCrashed,
53 &GetInstanceForResource,
54 &SetReserveInstanceIDCallback,
[email protected]fa4dd2912011-10-17 21:23:2955 &AddRefModule,
56 &ReleaseModule,
57 &IsInModuleDestructor
58};
[email protected]912f3d6c2011-06-29 18:26:3659
60// We allow multiple harnesses at a time to respond to 'GetInterface' calls.
61// We assume that only 1 harness's GetInterface function will ever support a
62// given interface name. In practice, there will either be only 1 GetInterface
63// handler (for PluginProxyTest or HostProxyTest), or there will be only 2
64// GetInterface handlers (for TwoWayTest). In the latter case, one handler is
65// for the PluginProxyTestHarness and should only respond for PPP interfaces,
66// and the other handler is for the HostProxyTestHarness which should only
67// ever respond for PPB interfaces.
Trent Apteda250ec3ab2018-08-19 08:52:1968base::ObserverList<ProxyTestHarnessBase>::Unchecked get_interface_handlers_;
[email protected]465faa22011-02-08 16:31:4669
70const void* MockGetInterface(const char* name) {
dcheng9fae50222016-10-14 03:21:0471 for (auto& observer : get_interface_handlers_) {
72 const void* interface = observer.GetInterface(name);
[email protected]912f3d6c2011-06-29 18:26:3673 if (interface)
74 return interface;
[email protected]465faa22011-02-08 16:31:4675 }
[email protected]912f3d6c2011-06-29 18:26:3676 if (strcmp(name, PPB_PROXY_PRIVATE_INTERFACE) == 0)
77 return &ppb_proxy_private;
78 return NULL;
79}
80
81void SetUpRemoteHarness(ProxyTestHarnessBase* harness,
82 const IPC::ChannelHandle& handle,
skyostil23490d42015-06-12 12:54:2683 base::SingleThreadTaskRunner* ipc_task_runner,
[email protected]912f3d6c2011-06-29 18:26:3684 base::WaitableEvent* shutdown_event,
85 base::WaitableEvent* harness_set_up) {
skyostil23490d42015-06-12 12:54:2686 harness->SetUpHarnessWithChannel(handle, ipc_task_runner, shutdown_event,
87 false);
[email protected]912f3d6c2011-06-29 18:26:3688 harness_set_up->Signal();
89}
90
91void TearDownRemoteHarness(ProxyTestHarnessBase* harness,
92 base::WaitableEvent* harness_torn_down) {
93 harness->TearDownHarness();
94 harness_torn_down->Signal();
[email protected]f24448db2011-01-27 20:40:3995}
96
[email protected]d57fd382012-09-19 00:55:4297void RunTaskOnRemoteHarness(const base::Closure& task,
98 base::WaitableEvent* task_complete) {
99 task.Run();
100 task_complete->Signal();
101}
102
[email protected]f24448db2011-01-27 20:40:39103} // namespace
104
[email protected]912f3d6c2011-06-29 18:26:36105// ProxyTestHarnessBase --------------------------------------------------------
[email protected]465faa22011-02-08 16:31:46106
[email protected]912f3d6c2011-06-29 18:26:36107ProxyTestHarnessBase::ProxyTestHarnessBase() : pp_module_(0x98765),
108 pp_instance_(0x12345) {
109 get_interface_handlers_.AddObserver(this);
[email protected]465faa22011-02-08 16:31:46110}
111
[email protected]912f3d6c2011-06-29 18:26:36112ProxyTestHarnessBase::~ProxyTestHarnessBase() {
113 get_interface_handlers_.RemoveObserver(this);
[email protected]465faa22011-02-08 16:31:46114}
115
[email protected]912f3d6c2011-06-29 18:26:36116const void* ProxyTestHarnessBase::GetInterface(const char* name) {
[email protected]465faa22011-02-08 16:31:46117 return registered_interfaces_[name];
118}
119
[email protected]912f3d6c2011-06-29 18:26:36120void ProxyTestHarnessBase::RegisterTestInterface(const char* name,
[email protected]99ff9932011-09-07 14:14:54121 const void* test_interface) {
122 registered_interfaces_[name] = test_interface;
[email protected]465faa22011-02-08 16:31:46123}
124
kareng1c62eeb2014-11-08 16:35:03125bool ProxyTestHarnessBase::SupportsInterface(const char* name) {
[email protected]465faa22011-02-08 16:31:46126 sink().ClearMessages();
127
128 // IPC doesn't actually write to this when we send a message manually
129 // not actually using IPC.
130 bool unused_result = false;
kareng1c62eeb2014-11-08 16:35:03131 PpapiMsg_SupportsInterface msg(name, &unused_result);
[email protected]465faa22011-02-08 16:31:46132 GetDispatcher()->OnMessageReceived(msg);
133
134 const IPC::Message* reply_msg =
135 sink().GetUniqueMessageMatching(IPC_REPLY_ID);
136 EXPECT_TRUE(reply_msg);
137 if (!reply_msg)
138 return false;
139
mdempsky390ab1e2016-03-07 22:18:35140 PpapiMsg_SupportsInterface::ReplyParam reply_data;
kareng1c62eeb2014-11-08 16:35:03141 EXPECT_TRUE(PpapiMsg_SupportsInterface::ReadReplyParam(
[email protected]465faa22011-02-08 16:31:46142 reply_msg, &reply_data));
143
144 sink().ClearMessages();
tzika0f614d2016-03-08 00:35:15145 return std::get<0>(reply_data);
[email protected]465faa22011-02-08 16:31:46146}
147
[email protected]912f3d6c2011-06-29 18:26:36148// PluginProxyTestHarness ------------------------------------------------------
[email protected]465faa22011-02-08 16:31:46149
[email protected]7ef6b79b2013-01-17 02:38:24150PluginProxyTestHarness::PluginProxyTestHarness(
151 GlobalsConfiguration globals_config)
152 : globals_config_(globals_config) {
[email protected]f24448db2011-01-27 20:40:39153}
154
[email protected]912f3d6c2011-06-29 18:26:36155PluginProxyTestHarness::~PluginProxyTestHarness() {
[email protected]f24448db2011-01-27 20:40:39156}
157
[email protected]d57fd382012-09-19 00:55:42158PpapiGlobals* PluginProxyTestHarness::GetGlobals() {
159 return plugin_globals_.get();
160}
161
[email protected]912f3d6c2011-06-29 18:26:36162Dispatcher* PluginProxyTestHarness::GetDispatcher() {
[email protected]465faa22011-02-08 16:31:46163 return plugin_dispatcher_.get();
164}
165
[email protected]912f3d6c2011-06-29 18:26:36166void PluginProxyTestHarness::SetUpHarness() {
[email protected]f24448db2011-01-27 20:40:39167 // These must be first since the dispatcher set-up uses them.
dmichaelb11ca7b2015-04-02 16:59:40168 CreatePluginGlobals(nullptr /* ipc_task_runner */);
[email protected]b73c6592013-03-30 17:08:13169 // Some of the methods called during set-up check that the lock is held.
170 ProxyAutoLock lock;
[email protected]7ef6b79b2013-01-17 02:38:24171
[email protected]794d83cd2011-10-20 19:09:20172 resource_tracker().DidCreateInstance(pp_instance());
[email protected]f24448db2011-01-27 20:40:39173
[email protected]f24448db2011-01-27 20:40:39174 plugin_dispatcher_.reset(new PluginDispatcher(
[email protected]bc2eeb42012-05-02 22:35:53175 &MockGetInterface,
[email protected]195d4cde2012-10-02 18:12:41176 PpapiPermissions(),
[email protected]bc2eeb42012-05-02 22:35:53177 false));
[email protected]465faa22011-02-08 16:31:46178 plugin_dispatcher_->InitWithTestSink(&sink());
[email protected]d57fd382012-09-19 00:55:42179 // The plugin proxy delegate is needed for
180 // |PluginProxyDelegate::GetBrowserSender| which is used
181 // in |ResourceCreationProxy::GetConnection| to get the channel to the
182 // browser. In this case we just use the |plugin_dispatcher_| as the channel
183 // for test purposes.
184 plugin_delegate_mock_.set_browser_sender(plugin_dispatcher_.get());
dmichaelfee3a512014-09-18 21:32:13185 PluginGlobals::Get()->SetPluginProxyDelegate(&plugin_delegate_mock_);
[email protected]22fdaa62012-11-30 01:55:44186 plugin_dispatcher_->DidCreateInstance(pp_instance());
[email protected]f24448db2011-01-27 20:40:39187}
188
[email protected]912f3d6c2011-06-29 18:26:36189void PluginProxyTestHarness::SetUpHarnessWithChannel(
190 const IPC::ChannelHandle& channel_handle,
skyostil23490d42015-06-12 12:54:26191 base::SingleThreadTaskRunner* ipc_task_runner,
[email protected]912f3d6c2011-06-29 18:26:36192 base::WaitableEvent* shutdown_event,
193 bool is_client) {
194 // These must be first since the dispatcher set-up uses them.
skyostil23490d42015-06-12 12:54:26195 CreatePluginGlobals(ipc_task_runner);
[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());
skyostil23490d42015-06-12 12:54:26200 plugin_delegate_mock_.Init(ipc_task_runner, shutdown_event);
[email protected]912f3d6c2011-06-29 18:26:36201
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(
Gabriel Charettee926fc12019-12-16 19:00:02229 const scoped_refptr<base::SingleThreadTaskRunner>& 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() {
skyostil23490d42015-06-12 12:54:26241 return ipc_task_runner_;
[email protected]912f3d6c2011-06-29 18:26:36242}
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) {
erikchen09b40032016-04-06 18:51:55254 return IPC::GetPlatformFileForTransit(handle,
255 should_close_source);
[email protected]f0ecb552012-05-11 22:09:11256}
257
Alexandr Ilinc7d975f2018-06-01 09:25:41258base::UnsafeSharedMemoryRegion PluginProxyTestHarness::PluginDelegateMock::
259 ShareUnsafeSharedMemoryRegionWithRemote(
260 const base::UnsafeSharedMemoryRegion& region,
261 base::ProcessId /* remote_pid */) {
262 return region.Duplicate();
263}
264
265base::ReadOnlySharedMemoryRegion PluginProxyTestHarness::PluginDelegateMock::
266 ShareReadOnlySharedMemoryRegionWithRemote(
267 const base::ReadOnlySharedMemoryRegion& region,
268 base::ProcessId /* remote_pid */) {
269 return region.Duplicate();
270}
271
[email protected]912f3d6c2011-06-29 18:26:36272std::set<PP_Instance>*
273PluginProxyTestHarness::PluginDelegateMock::GetGloballySeenInstanceIDSet() {
274 return &instance_id_set_;
275}
276
avie029c4132015-12-23 06:45:22277uint32_t PluginProxyTestHarness::PluginDelegateMock::Register(
[email protected]6fc87e02011-12-20 19:18:45278 PluginDispatcher* plugin_dispatcher) {
279 return 0;
280}
281
282void PluginProxyTestHarness::PluginDelegateMock::Unregister(
avie029c4132015-12-23 06:45:22283 uint32_t plugin_dispatcher_id) {}
[email protected]6fc87e02011-12-20 19:18:45284
[email protected]93df81e2012-08-10 22:22:46285IPC::Sender* PluginProxyTestHarness::PluginDelegateMock::GetBrowserSender() {
[email protected]d57fd382012-09-19 00:55:42286 return browser_sender_;
[email protected]93df81e2012-08-10 22:22:46287}
288
[email protected]2306303a2012-06-11 18:10:37289std::string PluginProxyTestHarness::PluginDelegateMock::GetUILanguage() {
290 return std::string("en-US");
291}
292
mgiuca8ca59182015-07-08 02:10:21293void PluginProxyTestHarness::PluginDelegateMock::PreCacheFontForFlash(
[email protected]6fc87e02011-12-20 19:18:45294 const void* logfontw) {
[email protected]373a95a2011-07-01 16:58:14295}
[email protected]7f801d82011-07-08 23:30:11296
[email protected]72a10722012-06-27 19:30:58297void PluginProxyTestHarness::PluginDelegateMock::SetActiveURL(
298 const std::string& url) {
299}
300
[email protected]1d148062013-07-25 20:25:45301PP_Resource PluginProxyTestHarness::PluginDelegateMock::CreateBrowserFont(
302 Connection connection,
303 PP_Instance instance,
304 const PP_BrowserFont_Trusted_Description& desc,
305 const Preferences& prefs) {
306 return 0;
307}
308
[email protected]912f3d6c2011-06-29 18:26:36309// PluginProxyTest -------------------------------------------------------------
310
[email protected]7ef6b79b2013-01-17 02:38:24311PluginProxyTest::PluginProxyTest() : PluginProxyTestHarness(SINGLETON_GLOBALS) {
[email protected]912f3d6c2011-06-29 18:26:36312}
313
314PluginProxyTest::~PluginProxyTest() {
315}
316
317void PluginProxyTest::SetUp() {
318 SetUpHarness();
319}
320
321void PluginProxyTest::TearDown() {
322 TearDownHarness();
323}
324
[email protected]7ef6b79b2013-01-17 02:38:24325// PluginProxyMultiThreadTest --------------------------------------------------
326
327PluginProxyMultiThreadTest::PluginProxyMultiThreadTest() {
328}
329
330PluginProxyMultiThreadTest::~PluginProxyMultiThreadTest() {
331}
332
333void PluginProxyMultiThreadTest::RunTest() {
skyostil23490d42015-06-12 12:54:26334 main_thread_task_runner_ = PpapiGlobals::Get()->GetMainThreadMessageLoop();
335 ASSERT_EQ(main_thread_task_runner_.get(),
336 base::ThreadTaskRunnerHandle::Get().get());
[email protected]7ef6b79b2013-01-17 02:38:24337 nested_main_thread_message_loop_.reset(new base::RunLoop());
338
339 secondary_thread_.reset(new base::DelegateSimpleThread(
340 this, "PluginProxyMultiThreadTest"));
341
342 {
343 ProxyAutoLock auto_lock;
344
345 // MessageLoopResource assumes that the proxy lock has been acquired.
346 secondary_thread_message_loop_ = new MessageLoopResource(pp_instance());
347
[email protected]7ef6b79b2013-01-17 02:38:24348 ASSERT_EQ(PP_OK,
349 secondary_thread_message_loop_->PostWork(
350 PP_MakeCompletionCallback(
351 &PluginProxyMultiThreadTest::InternalSetUpTestOnSecondaryThread,
352 this),
353 0));
354 }
355
356 SetUpTestOnMainThread();
357
358 secondary_thread_->Start();
359 nested_main_thread_message_loop_->Run();
360 secondary_thread_->Join();
361
362 {
363 ProxyAutoLock auto_lock;
364
365 // The destruction requires a valid PpapiGlobals instance, so we should
366 // explicitly release it.
kylechar37594cb2019-11-15 16:41:17367 secondary_thread_message_loop_.reset();
[email protected]7ef6b79b2013-01-17 02:38:24368 }
369
370 secondary_thread_.reset(NULL);
371 nested_main_thread_message_loop_.reset(NULL);
kylechar37594cb2019-11-15 16:41:17372 main_thread_task_runner_.reset();
[email protected]7ef6b79b2013-01-17 02:38:24373}
374
375void PluginProxyMultiThreadTest::CheckOnThread(ThreadType thread_type) {
376 ProxyAutoLock auto_lock;
377 if (thread_type == MAIN_THREAD) {
378 ASSERT_TRUE(MessageLoopResource::GetCurrent()->is_main_thread_loop());
379 } else {
380 ASSERT_EQ(secondary_thread_message_loop_.get(),
381 MessageLoopResource::GetCurrent());
382 }
383}
384
385void PluginProxyMultiThreadTest::PostQuitForMainThread() {
skyostil23490d42015-06-12 12:54:26386 main_thread_task_runner_->PostTask(
kylechar444859b2019-02-20 04:32:19387 FROM_HERE, base::BindOnce(&PluginProxyMultiThreadTest::QuitNestedLoop,
388 base::Unretained(this)));
[email protected]7ef6b79b2013-01-17 02:38:24389}
390
391void PluginProxyMultiThreadTest::PostQuitForSecondaryThread() {
392 ProxyAutoLock auto_lock;
393 secondary_thread_message_loop_->PostQuit(PP_TRUE);
394}
395
396void PluginProxyMultiThreadTest::Run() {
397 ProxyAutoLock auto_lock;
398 ASSERT_EQ(PP_OK, secondary_thread_message_loop_->AttachToCurrentThread());
399 ASSERT_EQ(PP_OK, secondary_thread_message_loop_->Run());
[email protected]1b777012013-07-15 20:42:38400 secondary_thread_message_loop_->DetachFromThread();
[email protected]7ef6b79b2013-01-17 02:38:24401}
402
403void PluginProxyMultiThreadTest::QuitNestedLoop() {
404 nested_main_thread_message_loop_->Quit();
405}
406
407// static
408void PluginProxyMultiThreadTest::InternalSetUpTestOnSecondaryThread(
409 void* user_data,
410 int32_t result) {
411 EXPECT_EQ(PP_OK, result);
412 PluginProxyMultiThreadTest* thiz =
413 static_cast<PluginProxyMultiThreadTest*>(user_data);
414 thiz->CheckOnThread(SECONDARY_THREAD);
415 thiz->SetUpTestOnSecondaryThread();
416}
417
[email protected]912f3d6c2011-06-29 18:26:36418// HostProxyTestHarness --------------------------------------------------------
419
[email protected]7ef6b79b2013-01-17 02:38:24420HostProxyTestHarness::HostProxyTestHarness(GlobalsConfiguration globals_config)
dmichael6b328f3d2014-09-29 23:49:02421 : globals_config_(globals_config) {
[email protected]912f3d6c2011-06-29 18:26:36422}
423
424HostProxyTestHarness::~HostProxyTestHarness() {
425}
426
[email protected]d57fd382012-09-19 00:55:42427PpapiGlobals* HostProxyTestHarness::GetGlobals() {
428 return host_globals_.get();
429}
430
[email protected]912f3d6c2011-06-29 18:26:36431Dispatcher* HostProxyTestHarness::GetDispatcher() {
432 return host_dispatcher_.get();
433}
434
435void HostProxyTestHarness::SetUpHarness() {
[email protected]73097562012-01-12 19:38:55436 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24437 CreateHostGlobals();
438
[email protected]912f3d6c2011-06-29 18:26:36439 host_dispatcher_.reset(new HostDispatcher(
[email protected]912f3d6c2011-06-29 18:26:36440 pp_module(),
[email protected]8be45842012-04-13 19:49:29441 &MockGetInterface,
[email protected]73e20db2012-12-12 22:27:06442 PpapiPermissions::AllPermissions()));
[email protected]912f3d6c2011-06-29 18:26:36443 host_dispatcher_->InitWithTestSink(&sink());
444 HostDispatcher::SetForInstance(pp_instance(), host_dispatcher_.get());
445}
446
447void HostProxyTestHarness::SetUpHarnessWithChannel(
448 const IPC::ChannelHandle& channel_handle,
skyostil23490d42015-06-12 12:54:26449 base::SingleThreadTaskRunner* ipc_task_runner,
[email protected]912f3d6c2011-06-29 18:26:36450 base::WaitableEvent* shutdown_event,
451 bool is_client) {
[email protected]73097562012-01-12 19:38:55452 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24453 CreateHostGlobals();
454
skyostil23490d42015-06-12 12:54:26455 delegate_mock_.Init(ipc_task_runner, shutdown_event);
[email protected]73097562012-01-12 19:38:55456
[email protected]912f3d6c2011-06-29 18:26:36457 host_dispatcher_.reset(new HostDispatcher(
[email protected]912f3d6c2011-06-29 18:26:36458 pp_module(),
[email protected]8be45842012-04-13 19:49:29459 &MockGetInterface,
[email protected]73e20db2012-12-12 22:27:06460 PpapiPermissions::AllPermissions()));
[email protected]912f3d6c2011-06-29 18:26:36461 ppapi::Preferences preferences;
Hajime Hoshi5959c54f2019-01-09 01:42:12462 host_dispatcher_->InitHostWithChannel(&delegate_mock_, base::kNullProcessId,
463 channel_handle, is_client, preferences,
464 base::ThreadTaskRunnerHandle::Get());
[email protected]912f3d6c2011-06-29 18:26:36465 HostDispatcher::SetForInstance(pp_instance(), host_dispatcher_.get());
466}
467
468void HostProxyTestHarness::TearDownHarness() {
469 HostDispatcher::RemoveForInstance(pp_instance());
470 host_dispatcher_.reset();
[email protected]d57fd382012-09-19 00:55:42471 host_globals_.reset();
[email protected]912f3d6c2011-06-29 18:26:36472}
473
[email protected]7ef6b79b2013-01-17 02:38:24474void HostProxyTestHarness::CreateHostGlobals() {
dmichaelbd96c1e2015-02-12 00:58:08475 disable_locking_.reset(new ProxyLock::LockingDisablerForTest);
[email protected]7ef6b79b2013-01-17 02:38:24476 if (globals_config_ == PER_THREAD_GLOBALS) {
477 host_globals_.reset(new TestGlobals(PpapiGlobals::PerThreadForTest()));
478 PpapiGlobals::SetPpapiGlobalsOnThreadForTest(GetGlobals());
479 } else {
480 host_globals_.reset(new TestGlobals());
481 }
482}
483
skyostil23490d42015-06-12 12:54:26484base::SingleThreadTaskRunner*
485HostProxyTestHarness::DelegateMock::GetIPCTaskRunner() {
486 return ipc_task_runner_;
[email protected]912f3d6c2011-06-29 18:26:36487}
488
489base::WaitableEvent* HostProxyTestHarness::DelegateMock::GetShutdownEvent() {
490 return shutdown_event_;
491}
492
[email protected]f0ecb552012-05-11 22:09:11493IPC::PlatformFileForTransit
494HostProxyTestHarness::DelegateMock::ShareHandleWithRemote(
495 base::PlatformFile handle,
[email protected]108fd342013-01-04 20:46:54496 base::ProcessId /* remote_pid */,
[email protected]f0ecb552012-05-11 22:09:11497 bool should_close_source) {
erikchen09b40032016-04-06 18:51:55498 return IPC::GetPlatformFileForTransit(handle,
499 should_close_source);
[email protected]f0ecb552012-05-11 22:09:11500}
501
Alexandr Ilinc7d975f2018-06-01 09:25:41502base::UnsafeSharedMemoryRegion
503HostProxyTestHarness::DelegateMock::ShareUnsafeSharedMemoryRegionWithRemote(
504 const base::UnsafeSharedMemoryRegion& region,
505 base::ProcessId /*remote_pid*/) {
506 return region.Duplicate();
507}
508
509base::ReadOnlySharedMemoryRegion
510HostProxyTestHarness::DelegateMock::ShareReadOnlySharedMemoryRegionWithRemote(
511 const base::ReadOnlySharedMemoryRegion& region,
512 base::ProcessId /*remote_pid*/) {
513 return region.Duplicate();
514}
515
[email protected]465faa22011-02-08 16:31:46516// HostProxyTest ---------------------------------------------------------------
517
[email protected]7ef6b79b2013-01-17 02:38:24518HostProxyTest::HostProxyTest() : HostProxyTestHarness(SINGLETON_GLOBALS) {
[email protected]465faa22011-02-08 16:31:46519}
520
521HostProxyTest::~HostProxyTest() {
522}
523
[email protected]465faa22011-02-08 16:31:46524void HostProxyTest::SetUp() {
[email protected]912f3d6c2011-06-29 18:26:36525 SetUpHarness();
[email protected]465faa22011-02-08 16:31:46526}
527
528void HostProxyTest::TearDown() {
[email protected]912f3d6c2011-06-29 18:26:36529 TearDownHarness();
[email protected]465faa22011-02-08 16:31:46530}
531
[email protected]912f3d6c2011-06-29 18:26:36532// TwoWayTest ---------------------------------------------------------------
533
534TwoWayTest::TwoWayTest(TwoWayTest::TwoWayTestMode test_mode)
535 : test_mode_(test_mode),
[email protected]7ef6b79b2013-01-17 02:38:24536 host_(ProxyTestHarnessBase::PER_THREAD_GLOBALS),
537 plugin_(ProxyTestHarnessBase::PER_THREAD_GLOBALS),
[email protected]912f3d6c2011-06-29 18:26:36538 io_thread_("TwoWayTest_IOThread"),
539 plugin_thread_("TwoWayTest_PluginThread"),
540 remote_harness_(NULL),
541 local_harness_(NULL),
gabf40c0a5e2016-06-01 20:10:46542 channel_created_(base::WaitableEvent::ResetPolicy::MANUAL,
543 base::WaitableEvent::InitialState::NOT_SIGNALED),
544 shutdown_event_(base::WaitableEvent::ResetPolicy::MANUAL,
545 base::WaitableEvent::InitialState::NOT_SIGNALED) {
[email protected]912f3d6c2011-06-29 18:26:36546 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;
Carlos Caballerodd8bf7b042019-07-30 14:14:15561 options.message_pump_type = base::MessagePumpType::IO;
[email protected]912f3d6c2011-06-29 18:26:36562 io_thread_.StartWithOptions(options);
563 plugin_thread_.Start();
564
sammc9bf370c2016-11-14 03:29:08565 mojo::MessagePipe pipe;
gabf40c0a5e2016-06-01 20:10:46566 base::WaitableEvent remote_harness_set_up(
567 base::WaitableEvent::ResetPolicy::MANUAL,
568 base::WaitableEvent::InitialState::NOT_SIGNALED);
skyostil23490d42015-06-12 12:54:26569 plugin_thread_.task_runner()->PostTask(
kylechar444859b2019-02-20 04:32:19570 FROM_HERE, base::BindOnce(&SetUpRemoteHarness, remote_harness_,
571 pipe.handle0.release(),
572 base::RetainedRef(io_thread_.task_runner()),
573 &shutdown_event_, &remote_harness_set_up));
[email protected]912f3d6c2011-06-29 18:26:36574 remote_harness_set_up.Wait();
skyostil23490d42015-06-12 12:54:26575 local_harness_->SetUpHarnessWithChannel(
sammc9bf370c2016-11-14 03:29:08576 pipe.handle1.release(), io_thread_.task_runner().get(), &shutdown_event_,
skyostil23490d42015-06-12 12:54:26577 true); // is_client
[email protected]912f3d6c2011-06-29 18:26:36578}
579
580void TwoWayTest::TearDown() {
gabf40c0a5e2016-06-01 20:10:46581 base::WaitableEvent remote_harness_torn_down(
582 base::WaitableEvent::ResetPolicy::MANUAL,
583 base::WaitableEvent::InitialState::NOT_SIGNALED);
skyostil23490d42015-06-12 12:54:26584 plugin_thread_.task_runner()->PostTask(
kylechar444859b2019-02-20 04:32:19585 FROM_HERE, base::BindOnce(&TearDownRemoteHarness, remote_harness_,
586 &remote_harness_torn_down));
[email protected]912f3d6c2011-06-29 18:26:36587 remote_harness_torn_down.Wait();
588
589 local_harness_->TearDownHarness();
590
591 io_thread_.Stop();
592}
593
[email protected]d57fd382012-09-19 00:55:42594void TwoWayTest::PostTaskOnRemoteHarness(const base::Closure& task) {
gabf40c0a5e2016-06-01 20:10:46595 base::WaitableEvent task_complete(
596 base::WaitableEvent::ResetPolicy::MANUAL,
597 base::WaitableEvent::InitialState::NOT_SIGNALED);
skyostil23490d42015-06-12 12:54:26598 plugin_thread_.task_runner()->PostTask(
kylechar444859b2019-02-20 04:32:19599 FROM_HERE, base::BindOnce(&RunTaskOnRemoteHarness, task, &task_complete));
[email protected]d57fd382012-09-19 00:55:42600 task_complete.Wait();
601}
602
603
[email protected]f24448db2011-01-27 20:40:39604} // namespace proxy
[email protected]4d2efd22011-08-18 21:58:02605} // namespace ppapi