Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(639)

Side by Side Diff: ppapi/tests/test_message_handler.cc

Issue 608843002: PPAPI: Add more error testing for postMessageAndAwaitResponse (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix review comment Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ppapi/tests/test_message_handler.h ('k') | ppapi/tests/testing_instance.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ppapi/tests/test_message_handler.h" 5 #include "ppapi/tests/test_message_handler.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <map> 9 #include <map>
10 #include <sstream> 10 #include <sstream>
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 void* user_data, 177 void* user_data,
178 const PP_Var* message_data, 178 const PP_Var* message_data,
179 PP_Var* result) {} 179 PP_Var* result) {}
180 void FakeDestroy(PP_Instance instance, void* user_data) {} 180 void FakeDestroy(PP_Instance instance, void* user_data) {}
181 181
182 } // namespace 182 } // namespace
183 183
184 TestMessageHandler::TestMessageHandler(TestingInstance* instance) 184 TestMessageHandler::TestMessageHandler(TestingInstance* instance)
185 : TestCase(instance), 185 : TestCase(instance),
186 ppb_messaging_if_(NULL), 186 ppb_messaging_if_(NULL),
187 handler_thread_(instance) { 187 handler_thread_(instance),
188 message_received_(instance->pp_instance()) {
188 } 189 }
189 190
190 TestMessageHandler::~TestMessageHandler() { 191 TestMessageHandler::~TestMessageHandler() {
191 handler_thread_.Join(); 192 handler_thread_.Join();
192 } 193 }
193 194
194 bool TestMessageHandler::Init() { 195 bool TestMessageHandler::Init() {
195 ppb_messaging_if_ = static_cast<const PPB_Messaging_1_2*>( 196 ppb_messaging_if_ = static_cast<const PPB_Messaging_1_2*>(
196 pp::Module::Get()->GetBrowserInterface(PPB_MESSAGING_INTERFACE_1_2)); 197 pp::Module::Get()->GetBrowserInterface(PPB_MESSAGING_INTERFACE_1_2));
197 return ppb_messaging_if_ && 198 return ppb_messaging_if_ &&
198 CheckTestingInterface() && 199 CheckTestingInterface() &&
199 handler_thread_.Start(); 200 handler_thread_.Start();
200 } 201 }
201 202
202 void TestMessageHandler::RunTests(const std::string& filter) { 203 void TestMessageHandler::RunTests(const std::string& filter) {
203 RUN_TEST(RegisterErrorConditions, filter); 204 RUN_TEST(RegisterErrorConditions, filter);
204 RUN_TEST(PostMessageAndAwaitResponse, filter); 205 RUN_TEST(PostMessageAndAwaitResponse, filter);
206 RUN_TEST(Exceptions, filter);
205 } 207 }
206 208
207 void TestMessageHandler::HandleMessage(const pp::Var& message_data) { 209 void TestMessageHandler::HandleMessage(const pp::Var& message_data) {
208 // All messages should go to the background thread message handler. 210 if (instance()->current_test_name() == "Exceptions") {
209 assert(false); 211 // For TestPostMessageAndAwaitResponse(), all messages should go to the
212 // background thread message handler.
213 assert(false);
214 } else {
215 if (message_data.is_string()) {
216 last_message_ = message_data.AsString();
217 } else {
218 last_message_ = "message_data was not a string!";
219 }
220 message_received_.Signal();
221 }
210 } 222 }
211 223
212 std::string TestMessageHandler::TestRegisterErrorConditions() { 224 std::string TestMessageHandler::TestRegisterErrorConditions() {
213 { 225 {
214 // Test registering with the main thread as the message loop. 226 // Test registering with the main thread as the message loop.
215 PPP_MessageHandler_0_2 fake_ppp_message_handler = { 227 PPP_MessageHandler_0_2 fake_ppp_message_handler = {
216 &FakeHandleMessage, &FakeHandleBlockingMessage, &FakeDestroy 228 &FakeHandleMessage, &FakeHandleBlockingMessage, &FakeDestroy
217 }; 229 };
218 pp::MessageLoop main_loop = pp::MessageLoop::GetForMainThread(); 230 pp::MessageLoop main_loop = pp::MessageLoop::GetForMainThread();
219 int32_t result = ppb_messaging_if_->RegisterMessageHandler( 231 int32_t result = ppb_messaging_if_->RegisterMessageHandler(
(...skipping 17 matching lines...) Expand all
237 handler_thread_.message_loop().pp_resource()); 249 handler_thread_.message_loop().pp_resource());
238 ASSERT_EQ(PP_ERROR_BADARGUMENT, result); 250 ASSERT_EQ(PP_ERROR_BADARGUMENT, result);
239 } 251 }
240 } 252 }
241 PASS(); 253 PASS();
242 } 254 }
243 255
244 std::string TestMessageHandler::TestPostMessageAndAwaitResponse() { 256 std::string TestMessageHandler::TestPostMessageAndAwaitResponse() {
245 EchoingMessageHandler handler(instance(), 257 EchoingMessageHandler handler(instance(),
246 handler_thread_.message_loop()); 258 handler_thread_.message_loop());
259 // Test doing a sync call before the handler is registered.
247 handler.Register(); 260 handler.Register();
248 std::string js_code("var plugin = document.getElementById('plugin');\n"); 261 std::string js_code("var plugin = document.getElementById('plugin');\n");
249 js_code += "var result = undefined;\n"; 262 js_code += "var result = undefined;\n";
250 const char* const values_to_test[] = { 263 const char* const values_to_test[] = {
251 "5", 264 "5",
252 "undefined", 265 "undefined",
253 "1.5", 266 "1.5",
254 "'hello'", 267 "'hello'",
255 "{'key': 'value', 'array_key': [1, 2, 3, 4, 5]}", 268 "{'key': 'value', 'array_key': [1, 2, 3, 4, 5]}",
256 NULL 269 NULL
(...skipping 11 matching lines...) Expand all
268 } 281 }
269 instance_->EvalScript(js_code); 282 instance_->EvalScript(js_code);
270 instance_->EvalScript("plugin.postMessage('FINISHED_TEST');\n"); 283 instance_->EvalScript("plugin.postMessage('FINISHED_TEST');\n");
271 handler.WaitForTestFinishedMessage(); 284 handler.WaitForTestFinishedMessage();
272 handler.Unregister(); 285 handler.Unregister();
273 ASSERT_SUBTEST_SUCCESS(handler.WaitForDestroy()); 286 ASSERT_SUBTEST_SUCCESS(handler.WaitForDestroy());
274 287
275 PASS(); 288 PASS();
276 } 289 }
277 290
291 std::string TestMessageHandler::TestExceptions() {
292 EchoingMessageHandler handler(instance(),
293 handler_thread_.message_loop());
294 {
295 // First, try sending a blocking message when there is no handler
296 // registered. It should throw an exception.
297 std::string js_code(
298 "var plugin = document.getElementById('plugin');\n"
299 "var caught_exception = false;\n"
300 "try {\n"
301 " plugin.postMessageAndAwaitResponse('Hello!');\n"
302 "} catch (err) {\n"
303 " caught_exception = true;\n"
304 "}\n"
305 "plugin.postMessage(caught_exception ? 'SUCCESS' : 'FAIL');\n");
306 instance_->EvalScript(js_code);
307 message_received_.Wait();
308 ASSERT_EQ("SUCCESS", last_message_);
309 }
310 handler.Register();
311 {
312 // Now that a handler is registered, try requesting and sending a
313 // FileSystem. It should throw an exception. The file system is opened
314 // asynchronously. What *should* happen is that it opens successfully, then
315 // we try to send it via postMessageAndAwaitResponse, which fails with an
316 // exception. The test could fail either because the filesystem doesn't
317 // open or because postMessageAndAwaitResponse doesn't throw an exception.
318 std::string js_code(
319 "var plugin = document.getElementById('plugin');\n"
320 "function gotFileSystem(fs) {\n"
321 " var caught_exception = false;\n"
322 " try {\n"
323 " plugin.postMessageAndAwaitResponse(fs);\n"
324 " } catch (err) {\n"
325 " caught_exception = true;\n"
326 " }\n"
327 " plugin.postMessage(caught_exception ? 'SUCCESS' : 'FAIL');\n"
328 "}\n"
329 "function fileSystemError() {\n"
330 " plugin.postMessage('Failed to open filesystem');\n"
331 "}\n"
332 "window.webkitRequestFileSystem(\n"
333 " window.Temporary, 1024, gotFileSystem, fileSystemError)\n");
334 instance_->EvalScript(js_code);
335 message_received_.Wait();
336 ASSERT_EQ("SUCCESS", last_message_);
337 }
338 handler.Unregister();
339 ASSERT_SUBTEST_SUCCESS(handler.WaitForDestroy());
340
341 PASS();
342 }
343
OLDNEW
« no previous file with comments | « ppapi/tests/test_message_handler.h ('k') | ppapi/tests/testing_instance.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698