// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ppapi/proxy/locking_resource_releaser.h" #include "ppapi/proxy/plugin_message_filter.h" #include "ppapi/proxy/ppapi_messages.h" #include "ppapi/proxy/ppapi_proxy_test.h" #include "ppapi/proxy/talk_resource.h" #include "ppapi/thunk/thunk.h" namespace ppapi { namespace proxy { namespace { template <class ResultType> class MockCallbackBase { public: MockCallbackBase() : called_(false) { } bool called() { return called_; } ResultType result() { return result_; } void Reset() { called_ = false; } static void Callback(void* user_data, ResultType result) { MockCallbackBase* that = reinterpret_cast<MockCallbackBase*>(user_data); that->called_ = true; that->result_ = result; } private: bool called_; ResultType result_; }; typedef MockCallbackBase<int32_t> MockCompletionCallback; typedef MockCallbackBase<PP_TalkEvent> TalkEventCallback; class TalkResourceTest : public PluginProxyTest { public: void SendReply( uint32_t id, const IPC::Message& reply, int32_t result) { IPC::Message msg; ResourceMessageCallParams params; ASSERT_TRUE(sink().GetFirstResourceCallMatching(id, ¶ms, &msg)); ResourceMessageReplyParams reply_params(params.pp_resource(), params.sequence()); reply_params.set_result(result); PluginMessageFilter::DispatchResourceReplyForTest(reply_params, reply); } }; } // namespace TEST_F(TalkResourceTest, GetPermission) { const PPB_Talk_Private_1_0* talk = thunk::GetPPB_Talk_Private_1_0_Thunk(); LockingResourceReleaser res(talk->Create(pp_instance())); MockCompletionCallback callback; int32_t result = talk->GetPermission( res.get(), PP_MakeCompletionCallback(&MockCompletionCallback::Callback, &callback)); ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); ResourceMessageCallParams params; IPC::Message msg; ASSERT_TRUE(sink().GetFirstResourceCallMatching( PpapiHostMsg_Talk_RequestPermission::ID, ¶ms, &msg)); ResourceMessageReplyParams reply_params(params.pp_resource(), params.sequence()); reply_params.set_result(1); PluginMessageFilter::DispatchResourceReplyForTest( reply_params, PpapiPluginMsg_Talk_RequestPermissionReply()); ASSERT_TRUE(callback.called()); ASSERT_EQ(1, callback.result()); } TEST_F(TalkResourceTest, RequestPermission) { const PPB_Talk_Private_2_0* talk = thunk::GetPPB_Talk_Private_2_0_Thunk(); LockingResourceReleaser res(talk->Create(pp_instance())); MockCompletionCallback callback; int32_t result = talk->RequestPermission( res.get(), PP_TALKPERMISSION_REMOTING_CONTINUE, PP_MakeCompletionCallback(&MockCompletionCallback::Callback, &callback)); ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); ResourceMessageCallParams params; IPC::Message msg; ASSERT_TRUE(sink().GetFirstResourceCallMatching( PpapiHostMsg_Talk_RequestPermission::ID, ¶ms, &msg)); ResourceMessageReplyParams reply_params(params.pp_resource(), params.sequence()); reply_params.set_result(1); PluginMessageFilter::DispatchResourceReplyForTest( reply_params, PpapiPluginMsg_Talk_RequestPermissionReply()); ASSERT_TRUE(callback.called()); ASSERT_EQ(1, callback.result()); } TEST_F(TalkResourceTest, StartStopRemoting) { const PPB_Talk_Private_2_0* talk = thunk::GetPPB_Talk_Private_2_0_Thunk(); LockingResourceReleaser res(talk->Create(pp_instance())); MockCompletionCallback callback; TalkEventCallback event_callback; // Start int32_t result = talk->StartRemoting( res.get(), &TalkEventCallback::Callback, &event_callback, PP_MakeCompletionCallback(&MockCompletionCallback::Callback, &callback)); ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); SendReply(PpapiHostMsg_Talk_StartRemoting::ID, PpapiPluginMsg_Talk_StartRemotingReply(), PP_OK); ASSERT_TRUE(callback.called()); ASSERT_EQ(PP_OK, callback.result()); // Receive an event ASSERT_FALSE(event_callback.called()); ResourceMessageReplyParams notify_params(res.get(), 0); PluginMessageFilter::DispatchResourceReplyForTest( notify_params, PpapiPluginMsg_Talk_NotifyEvent(PP_TALKEVENT_ERROR)); ASSERT_TRUE(event_callback.called()); ASSERT_EQ(PP_TALKEVENT_ERROR, event_callback.result()); // Stop callback.Reset(); result = talk->StopRemoting( res.get(), PP_MakeCompletionCallback(&MockCompletionCallback::Callback, &callback)); ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); SendReply(PpapiHostMsg_Talk_StopRemoting::ID, PpapiPluginMsg_Talk_StopRemotingReply(), PP_OK); ASSERT_TRUE(callback.called()); ASSERT_EQ(PP_OK, callback.result()); // Events should be discarded at this point event_callback.Reset(); PluginMessageFilter::DispatchResourceReplyForTest( notify_params, PpapiPluginMsg_Talk_NotifyEvent(PP_TALKEVENT_ERROR)); ASSERT_FALSE(event_callback.called()); } } // namespace proxy } // namespace ppapi