OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // 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/locking_resource_releaser.h" |
| 6 #include "ppapi/proxy/ppapi_messages.h" |
| 7 #include "ppapi/proxy/ppapi_proxy_test.h" |
| 8 #include "ppapi/proxy/talk_resource.h" |
| 9 #include "ppapi/thunk/thunk.h" |
| 10 |
| 11 namespace ppapi { |
| 12 namespace proxy { |
| 13 |
| 14 namespace { |
| 15 |
| 16 template <class ResultType> |
| 17 class MockCallbackBase { |
| 18 public: |
| 19 MockCallbackBase() : called_(false) { |
| 20 } |
| 21 |
| 22 bool called() { |
| 23 return called_; |
| 24 } |
| 25 |
| 26 ResultType result() { |
| 27 return result_; |
| 28 } |
| 29 |
| 30 void Reset() { |
| 31 called_ = false; |
| 32 } |
| 33 |
| 34 static void Callback(void* user_data, ResultType result) { |
| 35 MockCallbackBase* that = reinterpret_cast<MockCallbackBase*>(user_data); |
| 36 that->called_ = true; |
| 37 that->result_ = result; |
| 38 } |
| 39 |
| 40 private: |
| 41 bool called_; |
| 42 ResultType result_; |
| 43 }; |
| 44 |
| 45 typedef MockCallbackBase<int32_t> MockCompletionCallback; |
| 46 typedef MockCallbackBase<PP_TalkEvent> TalkEventCallback; |
| 47 |
| 48 class TalkResourceTest : public PluginProxyTest { |
| 49 public: |
| 50 void SendReply( |
| 51 uint32_t id, |
| 52 const IPC::Message& reply, |
| 53 int32_t result) { |
| 54 IPC::Message msg; |
| 55 ResourceMessageCallParams params; |
| 56 ASSERT_TRUE(sink().GetFirstResourceCallMatching(id, ¶ms, &msg)); |
| 57 |
| 58 ResourceMessageReplyParams reply_params(params.pp_resource(), |
| 59 params.sequence()); |
| 60 reply_params.set_result(result); |
| 61 IPC::Message reply_msg = PpapiPluginMsg_ResourceReply(reply_params, reply); |
| 62 ASSERT_TRUE(plugin_dispatcher()->OnMessageReceived(reply_msg)); |
| 63 } |
| 64 }; |
| 65 |
| 66 |
| 67 } // namespace |
| 68 |
| 69 TEST_F(TalkResourceTest, GetPermission) { |
| 70 const PPB_Talk_Private_1_0* talk = thunk::GetPPB_Talk_Private_1_0_Thunk(); |
| 71 LockingResourceReleaser res(talk->Create(pp_instance())); |
| 72 MockCompletionCallback callback; |
| 73 |
| 74 int32_t result = talk->GetPermission( |
| 75 res.get(), |
| 76 PP_MakeCompletionCallback(&MockCompletionCallback::Callback, &callback)); |
| 77 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); |
| 78 |
| 79 ResourceMessageCallParams params; |
| 80 IPC::Message msg; |
| 81 ASSERT_TRUE(sink().GetFirstResourceCallMatching( |
| 82 PpapiHostMsg_Talk_RequestPermission::ID, ¶ms, &msg)); |
| 83 PpapiHostMsg_Talk_RequestPermission::Schema::Param args; |
| 84 ASSERT_TRUE(PpapiHostMsg_Talk_RequestPermission::Schema::Read(&msg, &args)); |
| 85 ASSERT_EQ(PP_TALKPERMISSION_SCREENCAST, args.a); |
| 86 |
| 87 ResourceMessageReplyParams reply_params(params.pp_resource(), |
| 88 params.sequence()); |
| 89 reply_params.set_result(1); |
| 90 IPC::Message reply = PpapiPluginMsg_ResourceReply( |
| 91 reply_params, PpapiPluginMsg_Talk_RequestPermissionReply()); |
| 92 ASSERT_TRUE(plugin_dispatcher()->OnMessageReceived(reply)); |
| 93 |
| 94 ASSERT_TRUE(callback.called()); |
| 95 ASSERT_EQ(1, callback.result()); |
| 96 } |
| 97 |
| 98 TEST_F(TalkResourceTest, RequestPermission) { |
| 99 const PPB_Talk_Private_2_0* talk = thunk::GetPPB_Talk_Private_2_0_Thunk(); |
| 100 LockingResourceReleaser res(talk->Create(pp_instance())); |
| 101 MockCompletionCallback callback; |
| 102 |
| 103 int32_t result = talk->RequestPermission( |
| 104 res.get(), |
| 105 PP_TALKPERMISSION_REMOTING_CONTINUE, |
| 106 PP_MakeCompletionCallback(&MockCompletionCallback::Callback, &callback)); |
| 107 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); |
| 108 |
| 109 ResourceMessageCallParams params; |
| 110 IPC::Message msg; |
| 111 ASSERT_TRUE(sink().GetFirstResourceCallMatching( |
| 112 PpapiHostMsg_Talk_RequestPermission::ID, ¶ms, &msg)); |
| 113 PpapiHostMsg_Talk_RequestPermission::Schema::Param args; |
| 114 ASSERT_TRUE(PpapiHostMsg_Talk_RequestPermission::Schema::Read(&msg, &args)); |
| 115 ASSERT_EQ(PP_TALKPERMISSION_REMOTING_CONTINUE, args.a); |
| 116 |
| 117 ResourceMessageReplyParams reply_params(params.pp_resource(), |
| 118 params.sequence()); |
| 119 reply_params.set_result(1); |
| 120 IPC::Message reply = PpapiPluginMsg_ResourceReply( |
| 121 reply_params, PpapiPluginMsg_Talk_RequestPermissionReply()); |
| 122 ASSERT_TRUE(plugin_dispatcher()->OnMessageReceived(reply)); |
| 123 |
| 124 ASSERT_TRUE(callback.called()); |
| 125 ASSERT_EQ(1, callback.result()); |
| 126 } |
| 127 |
| 128 TEST_F(TalkResourceTest, StartStopRemoting) { |
| 129 const PPB_Talk_Private_2_0* talk = thunk::GetPPB_Talk_Private_2_0_Thunk(); |
| 130 LockingResourceReleaser res(talk->Create(pp_instance())); |
| 131 MockCompletionCallback callback; |
| 132 TalkEventCallback event_callback; |
| 133 |
| 134 // Start |
| 135 int32_t result = talk->StartRemoting( |
| 136 res.get(), |
| 137 &TalkEventCallback::Callback, |
| 138 &event_callback, |
| 139 PP_MakeCompletionCallback(&MockCompletionCallback::Callback, &callback)); |
| 140 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); |
| 141 |
| 142 SendReply(PpapiHostMsg_Talk_StartRemoting::ID, |
| 143 PpapiPluginMsg_Talk_StartRemotingReply(), |
| 144 PP_OK); |
| 145 |
| 146 ASSERT_TRUE(callback.called()); |
| 147 ASSERT_EQ(PP_OK, callback.result()); |
| 148 |
| 149 // Receive an event |
| 150 ASSERT_FALSE(event_callback.called()); |
| 151 ResourceMessageReplyParams notify_params(res.get(), 0); |
| 152 IPC::Message notify = PpapiPluginMsg_ResourceReply( |
| 153 notify_params, PpapiPluginMsg_Talk_NotifyEvent(PP_TALKEVENT_ERROR)); |
| 154 ASSERT_TRUE(plugin_dispatcher()->OnMessageReceived(notify)); |
| 155 ASSERT_TRUE(event_callback.called()); |
| 156 ASSERT_EQ(PP_TALKEVENT_ERROR, event_callback.result()); |
| 157 |
| 158 // Stop |
| 159 callback.Reset(); |
| 160 result = talk->StopRemoting( |
| 161 res.get(), |
| 162 PP_MakeCompletionCallback(&MockCompletionCallback::Callback, &callback)); |
| 163 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); |
| 164 |
| 165 SendReply(PpapiHostMsg_Talk_StopRemoting::ID, |
| 166 PpapiPluginMsg_Talk_StopRemotingReply(), |
| 167 PP_OK); |
| 168 |
| 169 ASSERT_TRUE(callback.called()); |
| 170 ASSERT_EQ(PP_OK, callback.result()); |
| 171 |
| 172 // Events should be discarded at this point |
| 173 event_callback.Reset(); |
| 174 ASSERT_TRUE(plugin_dispatcher()->OnMessageReceived(notify)); |
| 175 ASSERT_FALSE(event_callback.called()); |
| 176 } |
| 177 |
| 178 } // namespace proxy |
| 179 } // namespace ppapi |
OLD | NEW |