| // 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 |