blob: 71bf780c6993924f4e481c79455d55375e057755 [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(
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() {
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
erikchen4fc32d52015-06-02 02:16:38258base::SharedMemoryHandle
259PluginProxyTestHarness::PluginDelegateMock::ShareSharedMemoryHandleWithRemote(
260 const base::SharedMemoryHandle& handle,
erikchenfc29ad992015-06-04 20:44:18261 base::ProcessId /* remote_pid */) {
262 return base::SharedMemory::DuplicateHandle(handle);
erikchen4fc32d52015-06-02 02:16:38263}
264
Alexandr Ilinc7d975f2018-06-01 09:25:41265base::UnsafeSharedMemoryRegion PluginProxyTestHarness::PluginDelegateMock::
266 ShareUnsafeSharedMemoryRegionWithRemote(
267 const base::UnsafeSharedMemoryRegion& region,
268 base::ProcessId /* remote_pid */) {
269 return region.Duplicate();
270}
271
272base::ReadOnlySharedMemoryRegion PluginProxyTestHarness::PluginDelegateMock::
273 ShareReadOnlySharedMemoryRegionWithRemote(
274 const base::ReadOnlySharedMemoryRegion& region,
275 base::ProcessId /* remote_pid */) {
276 return region.Duplicate();
277}
278
[email protected]912f3d6c2011-06-29 18:26:36279std::set<PP_Instance>*
280PluginProxyTestHarness::PluginDelegateMock::GetGloballySeenInstanceIDSet() {
281 return &instance_id_set_;
282}
283
avie029c4132015-12-23 06:45:22284uint32_t PluginProxyTestHarness::PluginDelegateMock::Register(
[email protected]6fc87e02011-12-20 19:18:45285 PluginDispatcher* plugin_dispatcher) {
286 return 0;
287}
288
289void PluginProxyTestHarness::PluginDelegateMock::Unregister(
avie029c4132015-12-23 06:45:22290 uint32_t plugin_dispatcher_id) {}
[email protected]6fc87e02011-12-20 19:18:45291
[email protected]93df81e2012-08-10 22:22:46292IPC::Sender* PluginProxyTestHarness::PluginDelegateMock::GetBrowserSender() {
[email protected]d57fd382012-09-19 00:55:42293 return browser_sender_;
[email protected]93df81e2012-08-10 22:22:46294}
295
[email protected]2306303a2012-06-11 18:10:37296std::string PluginProxyTestHarness::PluginDelegateMock::GetUILanguage() {
297 return std::string("en-US");
298}
299
mgiuca8ca59182015-07-08 02:10:21300void PluginProxyTestHarness::PluginDelegateMock::PreCacheFontForFlash(
[email protected]6fc87e02011-12-20 19:18:45301 const void* logfontw) {
[email protected]373a95a2011-07-01 16:58:14302}
[email protected]7f801d82011-07-08 23:30:11303
[email protected]72a10722012-06-27 19:30:58304void PluginProxyTestHarness::PluginDelegateMock::SetActiveURL(
305 const std::string& url) {
306}
307
[email protected]1d148062013-07-25 20:25:45308PP_Resource PluginProxyTestHarness::PluginDelegateMock::CreateBrowserFont(
309 Connection connection,
310 PP_Instance instance,
311 const PP_BrowserFont_Trusted_Description& desc,
312 const Preferences& prefs) {
313 return 0;
314}
315
[email protected]912f3d6c2011-06-29 18:26:36316// PluginProxyTest -------------------------------------------------------------
317
[email protected]7ef6b79b2013-01-17 02:38:24318PluginProxyTest::PluginProxyTest() : PluginProxyTestHarness(SINGLETON_GLOBALS) {
[email protected]912f3d6c2011-06-29 18:26:36319}
320
321PluginProxyTest::~PluginProxyTest() {
322}
323
324void PluginProxyTest::SetUp() {
325 SetUpHarness();
326}
327
328void PluginProxyTest::TearDown() {
329 TearDownHarness();
330}
331
[email protected]7ef6b79b2013-01-17 02:38:24332// PluginProxyMultiThreadTest --------------------------------------------------
333
334PluginProxyMultiThreadTest::PluginProxyMultiThreadTest() {
335}
336
337PluginProxyMultiThreadTest::~PluginProxyMultiThreadTest() {
338}
339
340void PluginProxyMultiThreadTest::RunTest() {
skyostil23490d42015-06-12 12:54:26341 main_thread_task_runner_ = PpapiGlobals::Get()->GetMainThreadMessageLoop();
342 ASSERT_EQ(main_thread_task_runner_.get(),
343 base::ThreadTaskRunnerHandle::Get().get());
[email protected]7ef6b79b2013-01-17 02:38:24344 nested_main_thread_message_loop_.reset(new base::RunLoop());
345
346 secondary_thread_.reset(new base::DelegateSimpleThread(
347 this, "PluginProxyMultiThreadTest"));
348
349 {
350 ProxyAutoLock auto_lock;
351
352 // MessageLoopResource assumes that the proxy lock has been acquired.
353 secondary_thread_message_loop_ = new MessageLoopResource(pp_instance());
354
[email protected]7ef6b79b2013-01-17 02:38:24355 ASSERT_EQ(PP_OK,
356 secondary_thread_message_loop_->PostWork(
357 PP_MakeCompletionCallback(
358 &PluginProxyMultiThreadTest::InternalSetUpTestOnSecondaryThread,
359 this),
360 0));
361 }
362
363 SetUpTestOnMainThread();
364
365 secondary_thread_->Start();
366 nested_main_thread_message_loop_->Run();
367 secondary_thread_->Join();
368
369 {
370 ProxyAutoLock auto_lock;
371
372 // The destruction requires a valid PpapiGlobals instance, so we should
373 // explicitly release it.
374 secondary_thread_message_loop_ = NULL;
375 }
376
377 secondary_thread_.reset(NULL);
378 nested_main_thread_message_loop_.reset(NULL);
skyostil23490d42015-06-12 12:54:26379 main_thread_task_runner_ = NULL;
[email protected]7ef6b79b2013-01-17 02:38:24380}
381
382void PluginProxyMultiThreadTest::CheckOnThread(ThreadType thread_type) {
383 ProxyAutoLock auto_lock;
384 if (thread_type == MAIN_THREAD) {
385 ASSERT_TRUE(MessageLoopResource::GetCurrent()->is_main_thread_loop());
386 } else {
387 ASSERT_EQ(secondary_thread_message_loop_.get(),
388 MessageLoopResource::GetCurrent());
389 }
390}
391
392void PluginProxyMultiThreadTest::PostQuitForMainThread() {
skyostil23490d42015-06-12 12:54:26393 main_thread_task_runner_->PostTask(
kylechar444859b2019-02-20 04:32:19394 FROM_HERE, base::BindOnce(&PluginProxyMultiThreadTest::QuitNestedLoop,
395 base::Unretained(this)));
[email protected]7ef6b79b2013-01-17 02:38:24396}
397
398void PluginProxyMultiThreadTest::PostQuitForSecondaryThread() {
399 ProxyAutoLock auto_lock;
400 secondary_thread_message_loop_->PostQuit(PP_TRUE);
401}
402
403void PluginProxyMultiThreadTest::Run() {
404 ProxyAutoLock auto_lock;
405 ASSERT_EQ(PP_OK, secondary_thread_message_loop_->AttachToCurrentThread());
406 ASSERT_EQ(PP_OK, secondary_thread_message_loop_->Run());
[email protected]1b777012013-07-15 20:42:38407 secondary_thread_message_loop_->DetachFromThread();
[email protected]7ef6b79b2013-01-17 02:38:24408}
409
410void PluginProxyMultiThreadTest::QuitNestedLoop() {
411 nested_main_thread_message_loop_->Quit();
412}
413
414// static
415void PluginProxyMultiThreadTest::InternalSetUpTestOnSecondaryThread(
416 void* user_data,
417 int32_t result) {
418 EXPECT_EQ(PP_OK, result);
419 PluginProxyMultiThreadTest* thiz =
420 static_cast<PluginProxyMultiThreadTest*>(user_data);
421 thiz->CheckOnThread(SECONDARY_THREAD);
422 thiz->SetUpTestOnSecondaryThread();
423}
424
[email protected]912f3d6c2011-06-29 18:26:36425// HostProxyTestHarness --------------------------------------------------------
426
[email protected]7ef6b79b2013-01-17 02:38:24427HostProxyTestHarness::HostProxyTestHarness(GlobalsConfiguration globals_config)
dmichael6b328f3d2014-09-29 23:49:02428 : globals_config_(globals_config) {
[email protected]912f3d6c2011-06-29 18:26:36429}
430
431HostProxyTestHarness::~HostProxyTestHarness() {
432}
433
[email protected]d57fd382012-09-19 00:55:42434PpapiGlobals* HostProxyTestHarness::GetGlobals() {
435 return host_globals_.get();
436}
437
[email protected]912f3d6c2011-06-29 18:26:36438Dispatcher* HostProxyTestHarness::GetDispatcher() {
439 return host_dispatcher_.get();
440}
441
442void HostProxyTestHarness::SetUpHarness() {
[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 host_dispatcher_.reset(new HostDispatcher(
[email protected]912f3d6c2011-06-29 18:26:36447 pp_module(),
[email protected]8be45842012-04-13 19:49:29448 &MockGetInterface,
[email protected]73e20db2012-12-12 22:27:06449 PpapiPermissions::AllPermissions()));
[email protected]912f3d6c2011-06-29 18:26:36450 host_dispatcher_->InitWithTestSink(&sink());
451 HostDispatcher::SetForInstance(pp_instance(), host_dispatcher_.get());
452}
453
454void HostProxyTestHarness::SetUpHarnessWithChannel(
455 const IPC::ChannelHandle& channel_handle,
skyostil23490d42015-06-12 12:54:26456 base::SingleThreadTaskRunner* ipc_task_runner,
[email protected]912f3d6c2011-06-29 18:26:36457 base::WaitableEvent* shutdown_event,
458 bool is_client) {
[email protected]73097562012-01-12 19:38:55459 // These must be first since the dispatcher set-up uses them.
[email protected]7ef6b79b2013-01-17 02:38:24460 CreateHostGlobals();
461
skyostil23490d42015-06-12 12:54:26462 delegate_mock_.Init(ipc_task_runner, shutdown_event);
[email protected]73097562012-01-12 19:38:55463
[email protected]912f3d6c2011-06-29 18:26:36464 host_dispatcher_.reset(new HostDispatcher(
[email protected]912f3d6c2011-06-29 18:26:36465 pp_module(),
[email protected]8be45842012-04-13 19:49:29466 &MockGetInterface,
[email protected]73e20db2012-12-12 22:27:06467 PpapiPermissions::AllPermissions()));
[email protected]912f3d6c2011-06-29 18:26:36468 ppapi::Preferences preferences;
Hajime Hoshi5959c54f2019-01-09 01:42:12469 host_dispatcher_->InitHostWithChannel(&delegate_mock_, base::kNullProcessId,
470 channel_handle, is_client, preferences,
471 base::ThreadTaskRunnerHandle::Get());
[email protected]912f3d6c2011-06-29 18:26:36472 HostDispatcher::SetForInstance(pp_instance(), host_dispatcher_.get());
473}
474
475void HostProxyTestHarness::TearDownHarness() {
476 HostDispatcher::RemoveForInstance(pp_instance());
477 host_dispatcher_.reset();
[email protected]d57fd382012-09-19 00:55:42478 host_globals_.reset();
[email protected]912f3d6c2011-06-29 18:26:36479}
480
[email protected]7ef6b79b2013-01-17 02:38:24481void HostProxyTestHarness::CreateHostGlobals() {
dmichaelbd96c1e2015-02-12 00:58:08482 disable_locking_.reset(new ProxyLock::LockingDisablerForTest);
[email protected]7ef6b79b2013-01-17 02:38:24483 if (globals_config_ == PER_THREAD_GLOBALS) {
484 host_globals_.reset(new TestGlobals(PpapiGlobals::PerThreadForTest()));
485 PpapiGlobals::SetPpapiGlobalsOnThreadForTest(GetGlobals());
486 } else {
487 host_globals_.reset(new TestGlobals());
488 }
489}
490
skyostil23490d42015-06-12 12:54:26491base::SingleThreadTaskRunner*
492HostProxyTestHarness::DelegateMock::GetIPCTaskRunner() {
493 return ipc_task_runner_;
[email protected]912f3d6c2011-06-29 18:26:36494}
495
496base::WaitableEvent* HostProxyTestHarness::DelegateMock::GetShutdownEvent() {
497 return shutdown_event_;
498}
499
[email protected]f0ecb552012-05-11 22:09:11500IPC::PlatformFileForTransit
501HostProxyTestHarness::DelegateMock::ShareHandleWithRemote(
502 base::PlatformFile handle,
[email protected]108fd342013-01-04 20:46:54503 base::ProcessId /* remote_pid */,
[email protected]f0ecb552012-05-11 22:09:11504 bool should_close_source) {
erikchen09b40032016-04-06 18:51:55505 return IPC::GetPlatformFileForTransit(handle,
506 should_close_source);
[email protected]f0ecb552012-05-11 22:09:11507}
508
erikchen4fc32d52015-06-02 02:16:38509base::SharedMemoryHandle
510HostProxyTestHarness::DelegateMock::ShareSharedMemoryHandleWithRemote(
511 const base::SharedMemoryHandle& handle,
erikchenfc29ad992015-06-04 20:44:18512 base::ProcessId /*remote_pid*/) {
513 return base::SharedMemory::DuplicateHandle(handle);
erikchen4fc32d52015-06-02 02:16:38514}
[email protected]912f3d6c2011-06-29 18:26:36515
Alexandr Ilinc7d975f2018-06-01 09:25:41516base::UnsafeSharedMemoryRegion
517HostProxyTestHarness::DelegateMock::ShareUnsafeSharedMemoryRegionWithRemote(
518 const base::UnsafeSharedMemoryRegion& region,
519 base::ProcessId /*remote_pid*/) {
520 return region.Duplicate();
521}
522
523base::ReadOnlySharedMemoryRegion
524HostProxyTestHarness::DelegateMock::ShareReadOnlySharedMemoryRegionWithRemote(
525 const base::ReadOnlySharedMemoryRegion& region,
526 base::ProcessId /*remote_pid*/) {
527 return region.Duplicate();
528}
529
[email protected]465faa22011-02-08 16:31:46530// HostProxyTest ---------------------------------------------------------------
531
[email protected]7ef6b79b2013-01-17 02:38:24532HostProxyTest::HostProxyTest() : HostProxyTestHarness(SINGLETON_GLOBALS) {
[email protected]465faa22011-02-08 16:31:46533}
534
535HostProxyTest::~HostProxyTest() {
536}
537
[email protected]465faa22011-02-08 16:31:46538void HostProxyTest::SetUp() {
[email protected]912f3d6c2011-06-29 18:26:36539 SetUpHarness();
[email protected]465faa22011-02-08 16:31:46540}
541
542void HostProxyTest::TearDown() {
[email protected]912f3d6c2011-06-29 18:26:36543 TearDownHarness();
[email protected]465faa22011-02-08 16:31:46544}
545
[email protected]912f3d6c2011-06-29 18:26:36546// TwoWayTest ---------------------------------------------------------------
547
548TwoWayTest::TwoWayTest(TwoWayTest::TwoWayTestMode test_mode)
549 : test_mode_(test_mode),
[email protected]7ef6b79b2013-01-17 02:38:24550 host_(ProxyTestHarnessBase::PER_THREAD_GLOBALS),
551 plugin_(ProxyTestHarnessBase::PER_THREAD_GLOBALS),
[email protected]912f3d6c2011-06-29 18:26:36552 io_thread_("TwoWayTest_IOThread"),
553 plugin_thread_("TwoWayTest_PluginThread"),
554 remote_harness_(NULL),
555 local_harness_(NULL),
gabf40c0a5e2016-06-01 20:10:46556 channel_created_(base::WaitableEvent::ResetPolicy::MANUAL,
557 base::WaitableEvent::InitialState::NOT_SIGNALED),
558 shutdown_event_(base::WaitableEvent::ResetPolicy::MANUAL,
559 base::WaitableEvent::InitialState::NOT_SIGNALED) {
[email protected]912f3d6c2011-06-29 18:26:36560 if (test_mode == TEST_PPP_INTERFACE) {
561 remote_harness_ = &plugin_;
562 local_harness_ = &host_;
563 } else {
564 remote_harness_ = &host_;
565 local_harness_ = &plugin_;
566 }
567}
568
569TwoWayTest::~TwoWayTest() {
570 shutdown_event_.Signal();
571}
572
573void TwoWayTest::SetUp() {
574 base::Thread::Options options;
Carlos Caballerodd8bf7b042019-07-30 14:14:15575 options.message_pump_type = base::MessagePumpType::IO;
[email protected]912f3d6c2011-06-29 18:26:36576 io_thread_.StartWithOptions(options);
577 plugin_thread_.Start();
578
sammc9bf370c2016-11-14 03:29:08579 mojo::MessagePipe pipe;
gabf40c0a5e2016-06-01 20:10:46580 base::WaitableEvent remote_harness_set_up(
581 base::WaitableEvent::ResetPolicy::MANUAL,
582 base::WaitableEvent::InitialState::NOT_SIGNALED);
skyostil23490d42015-06-12 12:54:26583 plugin_thread_.task_runner()->PostTask(
kylechar444859b2019-02-20 04:32:19584 FROM_HERE, base::BindOnce(&SetUpRemoteHarness, remote_harness_,
585 pipe.handle0.release(),
586 base::RetainedRef(io_thread_.task_runner()),
587 &shutdown_event_, &remote_harness_set_up));
[email protected]912f3d6c2011-06-29 18:26:36588 remote_harness_set_up.Wait();
skyostil23490d42015-06-12 12:54:26589 local_harness_->SetUpHarnessWithChannel(
sammc9bf370c2016-11-14 03:29:08590 pipe.handle1.release(), io_thread_.task_runner().get(), &shutdown_event_,
skyostil23490d42015-06-12 12:54:26591 true); // is_client
[email protected]912f3d6c2011-06-29 18:26:36592}
593
594void TwoWayTest::TearDown() {
gabf40c0a5e2016-06-01 20:10:46595 base::WaitableEvent remote_harness_torn_down(
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(&TearDownRemoteHarness, remote_harness_,
600 &remote_harness_torn_down));
[email protected]912f3d6c2011-06-29 18:26:36601 remote_harness_torn_down.Wait();
602
603 local_harness_->TearDownHarness();
604
605 io_thread_.Stop();
606}
607
[email protected]d57fd382012-09-19 00:55:42608void TwoWayTest::PostTaskOnRemoteHarness(const base::Closure& task) {
gabf40c0a5e2016-06-01 20:10:46609 base::WaitableEvent task_complete(
610 base::WaitableEvent::ResetPolicy::MANUAL,
611 base::WaitableEvent::InitialState::NOT_SIGNALED);
skyostil23490d42015-06-12 12:54:26612 plugin_thread_.task_runner()->PostTask(
kylechar444859b2019-02-20 04:32:19613 FROM_HERE, base::BindOnce(&RunTaskOnRemoteHarness, task, &task_complete));
[email protected]d57fd382012-09-19 00:55:42614 task_complete.Wait();
615}
616
617
[email protected]f24448db2011-01-27 20:40:39618} // namespace proxy
[email protected]4d2efd22011-08-18 21:58:02619} // namespace ppapi