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

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

Issue 14636009: Hook up V8<->Var conversion in the pepper message channel (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « ppapi/tests/test_post_message.h ('k') | webkit/plugins/ppapi/message_channel.cc » ('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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_post_message.h" 5 #include "ppapi/tests/test_post_message.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map>
8 #include <sstream> 9 #include <sstream>
9 10
10 #include "ppapi/c/dev/ppb_testing_dev.h" 11 #include "ppapi/c/dev/ppb_testing_dev.h"
11 #include "ppapi/c/pp_var.h" 12 #include "ppapi/c/pp_var.h"
12 #include "ppapi/cpp/instance.h" 13 #include "ppapi/cpp/instance.h"
13 #include "ppapi/cpp/var.h" 14 #include "ppapi/cpp/var.h"
14 #include "ppapi/cpp/var_array_buffer.h" 15 #include "ppapi/cpp/var_array_buffer.h"
15 #include "ppapi/tests/pp_thread.h" 16 #include "ppapi/tests/pp_thread.h"
16 #include "ppapi/tests/test_utils.h" 17 #include "ppapi/tests/test_utils.h"
17 #include "ppapi/tests/testing_instance.h" 18 #include "ppapi/tests/testing_instance.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 }; 52 };
52 53
53 void InvokePostMessageThreadFunc(void* user_data) { 54 void InvokePostMessageThreadFunc(void* user_data) {
54 InvokePostMessageThreadArg* arg = 55 InvokePostMessageThreadArg* arg =
55 static_cast<InvokePostMessageThreadArg*>(user_data); 56 static_cast<InvokePostMessageThreadArg*>(user_data);
56 for (int32_t i = 0; i < kMessagesToSendPerThread; ++i) 57 for (int32_t i = 0; i < kMessagesToSendPerThread; ++i)
57 arg->instance->PostMessage(arg->value_to_send); 58 arg->instance->PostMessage(arg->value_to_send);
58 delete arg; 59 delete arg;
59 } 60 }
60 61
62 // TODO(raymes): Consider putting something like this into pp::Var.
63 bool VarsEqual(const pp::Var& expected,
64 const pp::Var& actual,
65 std::map<int64_t, int64_t>* visited_ids) {
66 if (expected.pp_var().type != actual.pp_var().type) {
67 if (!expected.is_number() && !actual.is_number())
68 return false;
69 }
70 // TODO(raymes): Implement a pp::Var::IsRefCounted() function.
71 if (expected.pp_var().type > PP_VARTYPE_DOUBLE) {
72 std::map<int64_t, int64_t>::const_iterator it =
73 visited_ids->find(expected.pp_var().value.as_id);
74 if (it != visited_ids->end()) {
75 if (it->second == actual.pp_var().value.as_id)
76 return true;
77 return false;
78 }
79 (*visited_ids)[expected.pp_var().value.as_id] = actual.pp_var().value.as_id;
80 }
81
82 if (expected.is_number()) {
83 return fabs(expected.AsDouble() - actual.AsDouble()) < 1.0e-4;
84 } else if (expected.is_array()) {
85 pp::VarArray_Dev expected_array(expected);
86 pp::VarArray_Dev actual_array(actual);
87 if (expected_array.GetLength() != actual_array.GetLength())
88 return false;
89 for (uint32_t i = 0; i < expected_array.GetLength(); ++i) {
90 if (!VarsEqual(expected_array.Get(i), actual_array.Get(i), visited_ids))
91 return false;
92 }
93 return true;
94 } else if (expected.is_dictionary()) {
95 pp::VarDictionary_Dev expected_dict(expected);
96 pp::VarDictionary_Dev actual_dict(actual);
97 if (expected_dict.GetKeys().GetLength() !=
98 actual_dict.GetKeys().GetLength()) {
99 return false;
100 }
101 for (uint32_t i = 0; i < expected_dict.GetKeys().GetLength(); ++i) {
102 pp::Var key = expected_dict.GetKeys().Get(i);
103 if (actual_dict.HasKey(key) == PP_FALSE)
104 return false;
105 if (!VarsEqual(expected_dict.Get(key), actual_dict.Get(key), visited_ids))
106 return false;
107 }
108 return true;
109 } else {
110 return expected == actual;
111 }
112 }
113
114 bool VarsEqual(const pp::Var& expected,
115 const pp::Var& actual) {
116 std::map<int64_t, int64_t> visited_ids;
117 return VarsEqual(expected, actual, &visited_ids);
118 }
119
61 class ScopedArrayBufferSizeSetter { 120 class ScopedArrayBufferSizeSetter {
62 public: 121 public:
63 ScopedArrayBufferSizeSetter(const PPB_Testing_Dev* interface, 122 ScopedArrayBufferSizeSetter(const PPB_Testing_Dev* interface,
64 PP_Instance instance, 123 PP_Instance instance,
65 uint32_t threshold) 124 uint32_t threshold)
66 : interface_(interface), 125 : interface_(interface),
67 instance_(instance) { 126 instance_(instance) {
68 interface_->SetMinimumArrayBufferSizeForShmem(instance_, threshold); 127 interface_->SetMinimumArrayBufferSizeForShmem(instance_, threshold);
69 } 128 }
70 ~ScopedArrayBufferSizeSetter() { 129 ~ScopedArrayBufferSizeSetter() {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 187
129 return success; 188 return success;
130 } 189 }
131 190
132 void TestPostMessage::RunTests(const std::string& filter) { 191 void TestPostMessage::RunTests(const std::string& filter) {
133 // Note: SendInInit must be first, because it expects to receive a message 192 // Note: SendInInit must be first, because it expects to receive a message
134 // that was sent in Init above. 193 // that was sent in Init above.
135 RUN_TEST(SendInInit, filter); 194 RUN_TEST(SendInInit, filter);
136 RUN_TEST(SendingData, filter); 195 RUN_TEST(SendingData, filter);
137 RUN_TEST(SendingArrayBuffer, filter); 196 RUN_TEST(SendingArrayBuffer, filter);
197 RUN_TEST(SendingArray, filter);
198 RUN_TEST(SendingDictionary, filter);
199 RUN_TEST(SendingComplexVar, filter);
138 RUN_TEST(MessageEvent, filter); 200 RUN_TEST(MessageEvent, filter);
139 RUN_TEST(NoHandler, filter); 201 RUN_TEST(NoHandler, filter);
140 RUN_TEST(ExtraParam, filter); 202 RUN_TEST(ExtraParam, filter);
141 if (testing_interface_->IsOutOfProcess()) 203 if (testing_interface_->IsOutOfProcess())
142 RUN_TEST(NonMainThread, filter); 204 RUN_TEST(NonMainThread, filter);
143 } 205 }
144 206
145 void TestPostMessage::HandleMessage(const pp::Var& message_data) { 207 void TestPostMessage::HandleMessage(const pp::Var& message_data) {
146 if (message_data.is_string() && 208 if (message_data.is_string() &&
147 (message_data.AsString() == FINISHED_WAITING_MESSAGE)) 209 (message_data.AsString() == FINISHED_WAITING_MESSAGE))
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 // We first post a FINISHED_WAITING_MESSAGE. This should be guaranteed to 254 // We first post a FINISHED_WAITING_MESSAGE. This should be guaranteed to
193 // come back _after_ any other incoming messages that were already pending. 255 // come back _after_ any other incoming messages that were already pending.
194 instance_->PostMessage(pp::Var(FINISHED_WAITING_MESSAGE)); 256 instance_->PostMessage(pp::Var(FINISHED_WAITING_MESSAGE));
195 testing_interface_->RunMessageLoop(instance_->pp_instance()); 257 testing_interface_->RunMessageLoop(instance_->pp_instance());
196 // Now that the FINISHED_WAITING_MESSAGE has been echoed back to us, we know 258 // Now that the FINISHED_WAITING_MESSAGE has been echoed back to us, we know
197 // that all pending messages have been slurped up. Return the number we 259 // that all pending messages have been slurped up. Return the number we
198 // received (which may be zero). 260 // received (which may be zero).
199 return message_data_.size() - message_size_before; 261 return message_data_.size() - message_size_before;
200 } 262 }
201 263
264 std::string TestPostMessage::CheckMessageProperties(
265 const pp::Var& test_data,
266 const std::vector<std::string>& properties_to_check) {
267 typedef std::vector<std::string>::const_iterator Iterator;
268 for (Iterator iter = properties_to_check.begin();
269 iter != properties_to_check.end();
270 ++iter) {
271 ASSERT_TRUE(AddEchoingListener(*iter));
272 message_data_.clear();
273 instance_->PostMessage(test_data);
274 ASSERT_EQ(message_data_.size(), 0);
275 ASSERT_EQ(WaitForMessages(), 1);
276 ASSERT_TRUE(message_data_.back().is_bool());
277 if (!message_data_.back().AsBool())
278 return std::string("Failed: ") + *iter;
279 ASSERT_TRUE(message_data_.back().AsBool());
280 ASSERT_TRUE(ClearListeners());
281 }
282 PASS();
283 }
284
202 std::string TestPostMessage::TestSendInInit() { 285 std::string TestPostMessage::TestSendInInit() {
203 ASSERT_EQ(WaitForMessages(), 1); 286 ASSERT_EQ(WaitForMessages(), 1);
204 // This test assumes Init already sent a message. 287 // This test assumes Init already sent a message.
205 ASSERT_EQ(message_data_.size(), 1); 288 ASSERT_EQ(message_data_.size(), 1);
206 ASSERT_TRUE(message_data_.back().is_string()); 289 ASSERT_TRUE(message_data_.back().is_string());
207 ASSERT_EQ(message_data_.back().AsString(), kTestString); 290 ASSERT_EQ(message_data_.back().AsString(), kTestString);
208 message_data_.clear(); 291 message_data_.clear();
209 PASS(); 292 PASS();
210 } 293 }
211 294
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 std::string("message_event.data.byteLength === ") + kSizeAsString); 393 std::string("message_event.data.byteLength === ") + kSizeAsString);
311 if (sizes[i] > 0) { 394 if (sizes[i] > 0) {
312 properties_to_check.push_back( 395 properties_to_check.push_back(
313 "(new DataView(message_event.data)).getUint8(0) == 0"); 396 "(new DataView(message_event.data)).getUint8(0) == 0");
314 // Checks that the last element has the right value: (byteLength-1)%256. 397 // Checks that the last element has the right value: (byteLength-1)%256.
315 std::string received_byte("(new DataView(message_event.data)).getUint8(" 398 std::string received_byte("(new DataView(message_event.data)).getUint8("
316 " message_event.data.byteLength-1)"); 399 " message_event.data.byteLength-1)");
317 std::string expected_byte("(message_event.data.byteLength-1)%256"); 400 std::string expected_byte("(message_event.data.byteLength-1)%256");
318 properties_to_check.push_back(received_byte + " == " + expected_byte); 401 properties_to_check.push_back(received_byte + " == " + expected_byte);
319 } 402 }
320 for (std::vector<std::string>::iterator iter = properties_to_check.begin(); 403 ASSERT_SUBTEST_SUCCESS(CheckMessageProperties(test_data,
321 iter != properties_to_check.end(); 404 properties_to_check));
322 ++iter) {
323 ASSERT_TRUE(AddEchoingListener(*iter));
324 message_data_.clear();
325 instance_->PostMessage(test_data);
326 ASSERT_EQ(message_data_.size(), 0);
327 ASSERT_EQ(WaitForMessages(), 1);
328 ASSERT_TRUE(message_data_.back().is_bool());
329 if (!message_data_.back().AsBool())
330 return std::string("Failed: ") + *iter + ", size: " + kSizeAsString;
331 ASSERT_TRUE(message_data_.back().AsBool());
332 ASSERT_TRUE(ClearListeners());
333 }
334 405
335 // Set up the JavaScript message event listener to echo the data part of the 406 // Set up the JavaScript message event listener to echo the data part of the
336 // message event back to us. 407 // message event back to us.
337 ASSERT_TRUE(AddEchoingListener("message_event.data")); 408 ASSERT_TRUE(AddEchoingListener("message_event.data"));
338 message_data_.clear(); 409 message_data_.clear();
339 instance_->PostMessage(test_data); 410 instance_->PostMessage(test_data);
340 // PostMessage is asynchronous, so we should not receive a response yet. 411 // PostMessage is asynchronous, so we should not receive a response yet.
341 ASSERT_EQ(message_data_.size(), 0); 412 ASSERT_EQ(message_data_.size(), 0);
342 ASSERT_EQ(WaitForMessages(), 1); 413 ASSERT_EQ(WaitForMessages(), 1);
343 ASSERT_TRUE(message_data_.back().is_array_buffer()); 414 ASSERT_TRUE(message_data_.back().is_array_buffer());
344 pp::VarArrayBuffer received(message_data_.back()); 415 pp::VarArrayBuffer received(message_data_.back());
345 message_data_.clear(); 416 message_data_.clear();
346 ASSERT_EQ(test_data.ByteLength(), received.ByteLength()); 417 ASSERT_EQ(test_data.ByteLength(), received.ByteLength());
347 unsigned char* received_buff = static_cast<unsigned char*>(received.Map()); 418 unsigned char* received_buff = static_cast<unsigned char*>(received.Map());
348 // The buffer should be copied, so this should be a distinct buffer. When 419 // The buffer should be copied, so this should be a distinct buffer. When
349 // 'transferrables' are implemented for PPAPI, we'll also want to test that 420 // 'transferrables' are implemented for PPAPI, we'll also want to test that
350 // we get the _same_ buffer back when it's transferred. 421 // we get the _same_ buffer back when it's transferred.
351 if (sizes[i] > 0) 422 if (sizes[i] > 0)
352 ASSERT_NE(buff, received_buff); 423 ASSERT_NE(buff, received_buff);
353 for (size_t i = 0; i < test_data.ByteLength(); ++i) 424 for (size_t i = 0; i < test_data.ByteLength(); ++i)
354 ASSERT_EQ(buff[i], received_buff[i]); 425 ASSERT_EQ(buff[i], received_buff[i]);
355 426
356 message_data_.clear(); 427 message_data_.clear();
357 ASSERT_TRUE(ClearListeners()); 428 ASSERT_TRUE(ClearListeners());
358 } 429 }
359 430
360 PASS(); 431 PASS();
361 } 432 }
362 433
434 std::string TestPostMessage::TestSendingArray() {
435 // Clean up after previous tests. This also swallows the message sent by Init
436 // if we didn't run the 'SendInInit' test. All tests other than 'SendInInit'
437 // should start with these.
438 WaitForMessages();
439 ASSERT_TRUE(ClearListeners());
440
441 pp::VarArray_Dev array;
442 array.Set(0, pp::Var(kTestBool));
443 array.Set(1, pp::Var(kTestString));
444 // Purposely leave index 2 empty.
445 array.Set(3, pp::Var(kTestInt));
446 array.Set(4, pp::Var(kTestDouble));
447
448 std::stringstream ss;
449 ss << array.GetLength();
450 std::string length_as_string(ss.str());
451
452 // Have the listener test some properties of the Array.
453 std::vector<std::string> properties_to_check;
454 properties_to_check.push_back(
455 "message_event.data.constructor.name === 'Array'");
456 properties_to_check.push_back(
457 std::string("message_event.data.length === ") + length_as_string);
458 ASSERT_SUBTEST_SUCCESS(CheckMessageProperties(array, properties_to_check));
459
460 // Set up the JavaScript message event listener to echo the data part of the
461 // message event back to us.
462 ASSERT_TRUE(AddEchoingListener("message_event.data"));
463 message_data_.clear();
464 instance_->PostMessage(array);
465 // PostMessage is asynchronous, so we should not receive a response yet.
466 ASSERT_EQ(message_data_.size(), 0);
467 ASSERT_EQ(WaitForMessages(), 1);
468 ASSERT_TRUE(message_data_.back().is_array());
469 ASSERT_TRUE(VarsEqual(array, message_data_.back()));
470
471 message_data_.clear();
472 ASSERT_TRUE(ClearListeners());
473
474 PASS();
475 }
476
477 std::string TestPostMessage::TestSendingDictionary() {
478 // Clean up after previous tests. This also swallows the message sent by Init
479 // if we didn't run the 'SendInInit' test. All tests other than 'SendInInit'
480 // should start with these.
481 WaitForMessages();
482 ASSERT_TRUE(ClearListeners());
483
484 pp::VarDictionary_Dev dictionary;
485 dictionary.Set(pp::Var("foo"), pp::Var(kTestBool));
486 dictionary.Set(pp::Var("bar"), pp::Var(kTestString));
487 dictionary.Set(pp::Var("abc"), pp::Var(kTestInt));
488 dictionary.Set(pp::Var("def"), pp::Var());
489
490 std::stringstream ss;
491 ss << dictionary.GetKeys().GetLength();
492 std::string length_as_string(ss.str());
493
494 // Have the listener test some properties of the Dictionary.
495 std::vector<std::string> properties_to_check;
496 properties_to_check.push_back(
497 "message_event.data.constructor.name === 'Object'");
498 properties_to_check.push_back(
499 std::string("Object.keys(message_event.data).length === ") +
500 length_as_string);
dmichael (off chromium) 2013/05/13 18:02:26 nit: indentation is off
raymes 2013/05/17 17:39:12 Done.
501 ASSERT_SUBTEST_SUCCESS(CheckMessageProperties(dictionary,
502 properties_to_check));
503
504 // Set up the JavaScript message event listener to echo the data part of the
505 // message event back to us.
506 ASSERT_TRUE(AddEchoingListener("message_event.data"));
507 message_data_.clear();
508 instance_->PostMessage(dictionary);
509 // PostMessage is asynchronous, so we should not receive a response yet.
510 ASSERT_EQ(message_data_.size(), 0);
511 ASSERT_EQ(WaitForMessages(), 1);
512 ASSERT_TRUE(message_data_.back().is_dictionary());
513 ASSERT_TRUE(VarsEqual(dictionary, message_data_.back()));
514
515 message_data_.clear();
516 ASSERT_TRUE(ClearListeners());
517
518 PASS();
519 }
520
521 std::string TestPostMessage::TestSendingComplexVar() {
522 // Clean up after previous tests. This also swallows the message sent by Init
523 // if we didn't run the 'SendInInit' test. All tests other than 'SendInInit'
524 // should start with these.
525 WaitForMessages();
526 ASSERT_TRUE(ClearListeners());
527
528 pp::Var string(kTestString);
529 pp::VarDictionary_Dev dictionary;
530 dictionary.Set(pp::Var("foo"), pp::Var(kTestBool));
531 dictionary.Set(pp::Var("bar"), string);
532 dictionary.Set(pp::Var("abc"), pp::Var(kTestInt));
533 dictionary.Set(pp::Var("def"), pp::Var());
534 dictionary.Set(pp::Var("dictionary"), dictionary); // Self-reference.
535
536 // Reference to array.
537 pp::VarArray_Dev array;
538 array.Set(0, pp::Var(kTestBool));
539 array.Set(1, string);
540 // Purposely leave index 2 empty (which will place an undefined var there).
541 array.Set(3, pp::Var(kTestInt));
542 array.Set(4, pp::Var(kTestDouble));
543
544 dictionary.Set(pp::Var("array-ref1"), array);
545 dictionary.Set(pp::Var("array-ref2"), array);
546
547 // Set up a (dictionary -> array -> dictionary) cycle.
548 pp::VarArray_Dev array2;
549 array2.Set(0, dictionary);
550 dictionary.Set(pp::Var("array2"), array2);
551
552 // Set up the JavaScript message event listener to echo the data part of the
553 // message event back to us.
554 ASSERT_TRUE(AddEchoingListener("message_event.data"));
555 message_data_.clear();
556 instance_->PostMessage(dictionary);
557 // PostMessage is asynchronous, so we should not receive a response yet.
558 ASSERT_EQ(message_data_.size(), 0);
559 ASSERT_EQ(WaitForMessages(), 1);
560 ASSERT_TRUE(message_data_.back().is_dictionary());
561 pp::VarDictionary_Dev result(message_data_.back());
562 ASSERT_TRUE(VarsEqual(dictionary, message_data_.back()));
563
564 // Break the cycles.
565 dictionary.Delete(pp::Var("dictionary"));
566 dictionary.Delete(pp::Var("array2"));
567 result.Delete(pp::Var("dictionary"));
568 result.Delete(pp::Var("array2"));
569
570 message_data_.clear();
571 ASSERT_TRUE(ClearListeners());
572
573 PASS();
574 }
575
363 std::string TestPostMessage::TestMessageEvent() { 576 std::string TestPostMessage::TestMessageEvent() {
364 // Set up the JavaScript message event listener to pass us some values from 577 // Set up the JavaScript message event listener to pass us some values from
365 // the MessageEvent and make sure they match our expectations. 578 // the MessageEvent and make sure they match our expectations.
366 579
367 WaitForMessages(); 580 WaitForMessages();
368 ASSERT_TRUE(ClearListeners()); 581 ASSERT_TRUE(ClearListeners());
369 // Have the listener pass back the class name of message_event and make sure 582 // Have the listener pass back the class name of message_event and make sure
370 // it's "MessageEvent". 583 // it's "MessageEvent".
371 ASSERT_TRUE(AddEchoingListener("message_event.constructor.name")); 584 ASSERT_TRUE(AddEchoingListener("message_event.constructor.name"));
372 message_data_.clear(); 585 message_data_.clear();
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 ASSERT_TRUE(received_value <= kThreadsToRun); 723 ASSERT_TRUE(received_value <= kThreadsToRun);
511 ++received_counts[received_value]; 724 ++received_counts[received_value];
512 } 725 }
513 ASSERT_EQ(received_counts, expected_counts); 726 ASSERT_EQ(received_counts, expected_counts);
514 727
515 message_data_.clear(); 728 message_data_.clear();
516 ASSERT_TRUE(ClearListeners()); 729 ASSERT_TRUE(ClearListeners());
517 730
518 PASS(); 731 PASS();
519 } 732 }
OLDNEW
« no previous file with comments | « ppapi/tests/test_post_message.h ('k') | webkit/plugins/ppapi/message_channel.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698