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

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

Issue 7821001: Add test for calling PostMessage during Init. Deflakify TestPostMessage. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Turn down thread & message count to reduce flakiness Created 9 years, 3 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') | no next file » | 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 8
9 #include "ppapi/c/dev/ppb_testing_dev.h" 9 #include "ppapi/c/dev/ppb_testing_dev.h"
10 #include "ppapi/c/pp_var.h" 10 #include "ppapi/c/pp_var.h"
(...skipping 10 matching lines...) Expand all
21 #endif 21 #endif
22 22
23 REGISTER_TEST_CASE(PostMessage); 23 REGISTER_TEST_CASE(PostMessage);
24 24
25 namespace { 25 namespace {
26 26
27 const char kTestString[] = "Hello world!"; 27 const char kTestString[] = "Hello world!";
28 const bool kTestBool = true; 28 const bool kTestBool = true;
29 const int32_t kTestInt = 42; 29 const int32_t kTestInt = 42;
30 const double kTestDouble = 42.0; 30 const double kTestDouble = 42.0;
31 const int32_t kThreadsToRun = 10; 31 const int32_t kThreadsToRun = 4;
32 const int32_t kMessagesToSendPerThread = 50; 32 const int32_t kMessagesToSendPerThread = 10;
33 33
34 // The struct that invoke_post_message_thread_func expects for its argument. 34 // The struct that invoke_post_message_thread_func expects for its argument.
35 // It includes the instance on which to invoke PostMessage, and the value to 35 // It includes the instance on which to invoke PostMessage, and the value to
36 // pass to PostMessage. 36 // pass to PostMessage.
37 struct InvokePostMessageThreadArg { 37 struct InvokePostMessageThreadArg {
38 InvokePostMessageThreadArg(pp::Instance* i, const pp::Var& v) 38 InvokePostMessageThreadArg(pp::Instance* i, const pp::Var& v)
39 : instance(i), value_to_send(v) {} 39 : instance(i), value_to_send(v) {}
40 pp::Instance* instance; 40 pp::Instance* instance;
41 pp::Var value_to_send; 41 pp::Var value_to_send;
42 }; 42 };
43 43
44 void InvokePostMessageThreadFunc(void* user_data) { 44 void InvokePostMessageThreadFunc(void* user_data) {
45 InvokePostMessageThreadArg* arg = 45 InvokePostMessageThreadArg* arg =
46 static_cast<InvokePostMessageThreadArg*>(user_data); 46 static_cast<InvokePostMessageThreadArg*>(user_data);
47 for (int32_t i = 0; i < kMessagesToSendPerThread; ++i) 47 for (int32_t i = 0; i < kMessagesToSendPerThread; ++i)
48 arg->instance->PostMessage(arg->value_to_send); 48 arg->instance->PostMessage(arg->value_to_send);
49 delete arg; 49 delete arg;
50 } 50 }
51 51
52 #define FINISHED_WAITING_MESSAGE "TEST_POST_MESSAGE_FINISHED_WAITING"
53
52 } // namespace 54 } // namespace
53 55
56 TestPostMessage::TestPostMessage(TestingInstance* instance)
57 : TestCase(instance) {
58 }
59
60 TestPostMessage::~TestPostMessage() {
61 // Remove the special listener that only responds to a FINISHED_WAITING
62 // string. See Init for where it gets added.
63 std::string js_code;
64 js_code += "var plugin = document.getElementById('plugin');"
65 "plugin.removeEventListener('message',"
66 " plugin.wait_for_messages_handler);"
67 "delete plugin.wait_for_messages_handler;";
68 pp::Var exception;
69 instance_->ExecuteScript(js_code, &exception);
70 }
71
54 bool TestPostMessage::Init() { 72 bool TestPostMessage::Init() {
55 return InitTestingInterface(); 73 bool success = InitTestingInterface();
74
75 // Set up a special listener that only responds to a FINISHED_WAITING string.
76 // This is for use by WaitForMessages.
77 std::string js_code;
78 // Note the following code is dependent on some features of test_case.html.
79 // E.g., it is assumed that the DOM element where the plugin is embedded has
80 // an id of 'plugin', and there is a function 'IsTestingMessage' that allows
81 // us to ignore the messages that are intended for use by the testing
82 // framework itself.
83 js_code += "var plugin = document.getElementById('plugin');"
84 "var wait_for_messages_handler = function(message_event) {"
85 " if (!IsTestingMessage(message_event.data) &&"
86 " message_event.data === '" FINISHED_WAITING_MESSAGE "') {"
87 " plugin.postMessage('" FINISHED_WAITING_MESSAGE "');"
88 " }"
89 "};"
90 "plugin.addEventListener('message', wait_for_messages_handler);"
91 // Stash it on the plugin so we can remove it in the destructor.
92 "plugin.wait_for_messages_handler = wait_for_messages_handler;";
93 pp::Var exception;
94 instance_->ExecuteScript(js_code, &exception);
95 success = success && exception.is_undefined();
96
97 // Set up the JavaScript message event listener to echo the data part of the
98 // message event back to us.
99 success = success && AddEchoingListener("message_event.data");
100 message_data_.clear();
101 // Send a message that the first test will expect to receive. This is to
102 // verify that we can send messages when the 'Instance::Init' function is on
103 // the stack.
104 instance_->PostMessage(pp::Var(kTestString));
105
106 return success;
56 } 107 }
57 108
58 void TestPostMessage::RunTest() { 109 void TestPostMessage::RunTest() {
110 // Note: SendInInit must be first, because it expects to receive a message
111 // that was sent in Init above.
112 RUN_TEST(SendInInit);
59 RUN_TEST(SendingData); 113 RUN_TEST(SendingData);
60 RUN_TEST(MessageEvent); 114 RUN_TEST(MessageEvent);
61 RUN_TEST(NoHandler); 115 RUN_TEST(NoHandler);
62 RUN_TEST(ExtraParam); 116 RUN_TEST(ExtraParam);
63 if (testing_interface_->IsOutOfProcess()) 117 if (testing_interface_->IsOutOfProcess())
64 RUN_TEST(NonMainThread); 118 RUN_TEST(NonMainThread);
65 } 119 }
66 120
67 void TestPostMessage::HandleMessage(const pp::Var& message_data) { 121 void TestPostMessage::HandleMessage(const pp::Var& message_data) {
68 message_data_.push_back(message_data); 122 if (message_data.is_string() &&
69 testing_interface_->QuitMessageLoop(instance_->pp_instance()); 123 (message_data.AsString() == FINISHED_WAITING_MESSAGE))
124 testing_interface_->QuitMessageLoop(instance_->pp_instance());
125 else
126 message_data_.push_back(message_data);
70 } 127 }
71 128
72 bool TestPostMessage::AddEchoingListener(const std::string& expression) { 129 bool TestPostMessage::AddEchoingListener(const std::string& expression) {
73 std::string js_code; 130 std::string js_code;
74 // Note the following code is dependent on some features of test_case.html. 131 // Note the following code is dependent on some features of test_case.html.
75 // E.g., it is assumed that the DOM element where the plugin is embedded has 132 // E.g., it is assumed that the DOM element where the plugin is embedded has
76 // an id of 'plugin', and there is a function 'IsTestingMessage' that allows 133 // an id of 'plugin', and there is a function 'IsTestingMessage' that allows
77 // us to ignore the messages that are intended for use by the testing 134 // us to ignore the messages that are intended for use by the testing
78 // framework itself. 135 // framework itself.
79 js_code += "var plugin = document.getElementById('plugin');" 136 js_code += "var plugin = document.getElementById('plugin');"
80 "var message_handler = function(message_event) {" 137 "var message_handler = function(message_event) {"
81 " if (!IsTestingMessage(message_event.data)) {" 138 " if (!IsTestingMessage(message_event.data) &&"
139 " !(message_event.data === '" FINISHED_WAITING_MESSAGE "')) {"
82 " plugin.postMessage("; 140 " plugin.postMessage(";
83 js_code += expression; 141 js_code += expression;
84 js_code += " );" 142 js_code += " );"
85 " }" 143 " }"
86 "};" 144 "};"
87 "plugin.addEventListener('message', message_handler);" 145 "plugin.addEventListener('message', message_handler);"
88 // Maintain an array of all event listeners, attached to the 146 // Maintain an array of all event listeners, attached to the
89 // plugin. This is so that we can easily remove them later (see 147 // plugin. This is so that we can easily remove them later (see
90 // ClearListeners()). 148 // ClearListeners()).
91 "if (!plugin.eventListeners) plugin.eventListeners = [];" 149 "if (!plugin.eventListeners) plugin.eventListeners = [];"
92 "plugin.eventListeners.push(message_handler);"; 150 "plugin.eventListeners.push(message_handler);";
93 pp::Var exception; 151 pp::Var exception;
94 instance_->ExecuteScript(js_code, &exception); 152 instance_->ExecuteScript(js_code, &exception);
95 return exception.is_undefined(); 153 return exception.is_undefined();
96 } 154 }
97 155
98 bool TestPostMessage::ClearListeners() { 156 bool TestPostMessage::ClearListeners() {
99 std::string js_code( 157 std::string js_code(
100 "var plugin = document.getElementById('plugin');" 158 "var plugin = document.getElementById('plugin');"
101 "while (plugin.eventListeners.length) {" 159 "while (plugin.eventListeners.length) {"
102 " plugin.removeEventListener('message', plugin.eventListeners.pop());" 160 " plugin.removeEventListener('message', plugin.eventListeners.pop());"
103 "}"); 161 "}");
104 pp::Var exception; 162 pp::Var exception;
105 instance_->ExecuteScript(js_code, &exception); 163 instance_->ExecuteScript(js_code, &exception);
106 return(exception.is_undefined()); 164 return(exception.is_undefined());
107 } 165 }
108 166
167 int TestPostMessage::WaitForMessages() {
168 size_t message_size_before = message_data_.size();
169 // We first post a FINISHED_WAITING_MESSAGE. This should be guaranteed to
170 // come back _after_ any other incoming messages that were already pending.
171 instance_->PostMessage(pp::Var(FINISHED_WAITING_MESSAGE));
172 testing_interface_->RunMessageLoop(instance_->pp_instance());
173 // Now that the FINISHED_WAITING_MESSAGE has been echoed back to us, we know
174 // that all pending messages have been slurped up. Return the number we
175 // received (which may be zero).
176 return message_data_.size() - message_size_before;
177 }
178
179 std::string TestPostMessage::TestSendInInit() {
180 ASSERT_EQ(WaitForMessages(), 1);
181 // This test assumes Init already sent a message.
182 ASSERT_EQ(message_data_.size(), 1);
183 ASSERT_TRUE(message_data_.back().is_string());
184 ASSERT_EQ(message_data_.back().AsString(), kTestString);
185 PASS();
186 }
187
109 std::string TestPostMessage::TestSendingData() { 188 std::string TestPostMessage::TestSendingData() {
110 // Set up the JavaScript message event listener to echo the data part of the 189 // Set up the JavaScript message event listener to echo the data part of the
111 // message event back to us. 190 // message event back to us.
191 ASSERT_TRUE(ClearListeners());
112 ASSERT_TRUE(AddEchoingListener("message_event.data")); 192 ASSERT_TRUE(AddEchoingListener("message_event.data"));
113 193
114 // Test sending a message to JavaScript for each supported type. The JS sends 194 // Test sending a message to JavaScript for each supported type. The JS sends
115 // the data back to us, and we check that they match. 195 // the data back to us, and we check that they match.
116 message_data_.clear(); 196 message_data_.clear();
117 instance_->PostMessage(pp::Var(kTestString)); 197 instance_->PostMessage(pp::Var(kTestString));
118 // PostMessage is asynchronous, so we should not receive a response yet. 198 // PostMessage is asynchronous, so we should not receive a response yet.
119 ASSERT_EQ(message_data_.size(), 0); 199 ASSERT_EQ(message_data_.size(), 0);
120 200 ASSERT_EQ(WaitForMessages(), 1);
121 testing_interface_->RunMessageLoop(instance_->pp_instance());
122 ASSERT_EQ(message_data_.size(), 1);
123 ASSERT_TRUE(message_data_.back().is_string()); 201 ASSERT_TRUE(message_data_.back().is_string());
124 ASSERT_EQ(message_data_.back().AsString(), kTestString); 202 ASSERT_EQ(message_data_.back().AsString(), kTestString);
125 203
126 message_data_.clear(); 204 message_data_.clear();
127 instance_->PostMessage(pp::Var(kTestBool)); 205 instance_->PostMessage(pp::Var(kTestBool));
128 ASSERT_EQ(message_data_.size(), 0); 206 ASSERT_EQ(message_data_.size(), 0);
129 testing_interface_->RunMessageLoop(instance_->pp_instance()); 207 ASSERT_EQ(WaitForMessages(), 1);
130 ASSERT_EQ(message_data_.size(), 1);
131 ASSERT_TRUE(message_data_.back().is_bool()); 208 ASSERT_TRUE(message_data_.back().is_bool());
132 ASSERT_EQ(message_data_.back().AsBool(), kTestBool); 209 ASSERT_EQ(message_data_.back().AsBool(), kTestBool);
133 210
134 message_data_.clear(); 211 message_data_.clear();
135 instance_->PostMessage(pp::Var(kTestInt)); 212 instance_->PostMessage(pp::Var(kTestInt));
136 ASSERT_EQ(message_data_.size(), 0); 213 ASSERT_EQ(message_data_.size(), 0);
137 testing_interface_->RunMessageLoop(instance_->pp_instance()); 214 ASSERT_EQ(WaitForMessages(), 1);
138 ASSERT_EQ(message_data_.size(), 1);
139 ASSERT_TRUE(message_data_.back().is_number()); 215 ASSERT_TRUE(message_data_.back().is_number());
140 ASSERT_DOUBLE_EQ(message_data_.back().AsDouble(), 216 ASSERT_DOUBLE_EQ(message_data_.back().AsDouble(),
141 static_cast<double>(kTestInt)); 217 static_cast<double>(kTestInt));
142 218
143 message_data_.clear(); 219 message_data_.clear();
144 instance_->PostMessage(pp::Var(kTestDouble)); 220 instance_->PostMessage(pp::Var(kTestDouble));
145 ASSERT_EQ(message_data_.size(), 0); 221 ASSERT_EQ(message_data_.size(), 0);
146 testing_interface_->RunMessageLoop(instance_->pp_instance()); 222 ASSERT_EQ(WaitForMessages(), 1);
147 ASSERT_EQ(message_data_.size(), 1);
148 ASSERT_TRUE(message_data_.back().is_number()); 223 ASSERT_TRUE(message_data_.back().is_number());
149 ASSERT_DOUBLE_EQ(message_data_.back().AsDouble(), kTestDouble); 224 ASSERT_DOUBLE_EQ(message_data_.back().AsDouble(), kTestDouble);
150 225
151 message_data_.clear(); 226 message_data_.clear();
152 instance_->PostMessage(pp::Var()); 227 instance_->PostMessage(pp::Var());
153 ASSERT_EQ(message_data_.size(), 0); 228 ASSERT_EQ(message_data_.size(), 0);
154 testing_interface_->RunMessageLoop(instance_->pp_instance()); 229 ASSERT_EQ(WaitForMessages(), 1);
155 ASSERT_EQ(message_data_.size(), 1);
156 ASSERT_TRUE(message_data_.back().is_undefined()); 230 ASSERT_TRUE(message_data_.back().is_undefined());
157 231
158 message_data_.clear(); 232 message_data_.clear();
159 instance_->PostMessage(pp::Var(pp::Var::Null())); 233 instance_->PostMessage(pp::Var(pp::Var::Null()));
160 ASSERT_EQ(message_data_.size(), 0); 234 ASSERT_EQ(message_data_.size(), 0);
161 testing_interface_->RunMessageLoop(instance_->pp_instance()); 235 ASSERT_EQ(WaitForMessages(), 1);
162 ASSERT_EQ(message_data_.size(), 1);
163 ASSERT_TRUE(message_data_.back().is_null()); 236 ASSERT_TRUE(message_data_.back().is_null());
164 237
165 ASSERT_TRUE(ClearListeners()); 238 ASSERT_TRUE(ClearListeners());
166 239
167 PASS(); 240 PASS();
168 } 241 }
169 242
170 std::string TestPostMessage::TestMessageEvent() { 243 std::string TestPostMessage::TestMessageEvent() {
171 // Set up the JavaScript message event listener to pass us some values from 244 // Set up the JavaScript message event listener to pass us some values from
172 // the MessageEvent and make sure they match our expectations. 245 // the MessageEvent and make sure they match our expectations.
173 246
174 // Have the listener pass back the type of message_event and make sure it's 247 // Have the listener pass back the type of message_event and make sure it's
175 // "object". 248 // "object".
249 ASSERT_TRUE(ClearListeners());
176 ASSERT_TRUE(AddEchoingListener("typeof(message_event)")); 250 ASSERT_TRUE(AddEchoingListener("typeof(message_event)"));
177 message_data_.clear(); 251 message_data_.clear();
178 instance_->PostMessage(pp::Var(kTestInt)); 252 instance_->PostMessage(pp::Var(kTestInt));
179 ASSERT_EQ(message_data_.size(), 0); 253 ASSERT_EQ(message_data_.size(), 0);
180 testing_interface_->RunMessageLoop(instance_->pp_instance()); 254 ASSERT_EQ(WaitForMessages(), 1);
181 ASSERT_EQ(message_data_.size(), 1);
182 ASSERT_TRUE(message_data_.back().is_string()); 255 ASSERT_TRUE(message_data_.back().is_string());
183 ASSERT_EQ(message_data_.back().AsString(), "object"); 256 ASSERT_EQ(message_data_.back().AsString(), "object");
184 ASSERT_TRUE(ClearListeners()); 257 ASSERT_TRUE(ClearListeners());
185 258
186 // Make sure all the non-data properties have the expected values. 259 // Make sure all the non-data properties have the expected values.
187 bool success = AddEchoingListener("((message_event.origin == '')" 260 bool success = AddEchoingListener("((message_event.origin == '')"
188 " && (message_event.lastEventId == '')" 261 " && (message_event.lastEventId == '')"
189 " && (message_event.source == null)" 262 " && (message_event.source == null)"
190 " && (message_event.ports.length == 0)" 263 " && (message_event.ports.length == 0)"
191 " && (message_event.bubbles == false)" 264 " && (message_event.bubbles == false)"
192 " && (message_event.cancelable == false)" 265 " && (message_event.cancelable == false)"
193 ")"); 266 ")");
194 ASSERT_TRUE(success); 267 ASSERT_TRUE(success);
195 message_data_.clear(); 268 message_data_.clear();
196 instance_->PostMessage(pp::Var(kTestInt)); 269 instance_->PostMessage(pp::Var(kTestInt));
197 ASSERT_EQ(message_data_.size(), 0); 270 ASSERT_EQ(message_data_.size(), 0);
198 testing_interface_->RunMessageLoop(instance_->pp_instance()); 271 ASSERT_EQ(WaitForMessages(), 1);
199 ASSERT_EQ(message_data_.size(), 1);
200 ASSERT_TRUE(message_data_.back().is_bool()); 272 ASSERT_TRUE(message_data_.back().is_bool());
201 ASSERT_TRUE(message_data_.back().AsBool()); 273 ASSERT_TRUE(message_data_.back().AsBool());
202 ASSERT_TRUE(ClearListeners()); 274 ASSERT_TRUE(ClearListeners());
203 275
204 // Add some event handlers to make sure they receive messages. 276 // Add some event handlers to make sure they receive messages.
205 ASSERT_TRUE(AddEchoingListener("1")); 277 ASSERT_TRUE(AddEchoingListener("1"));
206 ASSERT_TRUE(AddEchoingListener("2")); 278 ASSERT_TRUE(AddEchoingListener("2"));
207 ASSERT_TRUE(AddEchoingListener("3")); 279 ASSERT_TRUE(AddEchoingListener("3"));
208 280
209 message_data_.clear(); 281 message_data_.clear();
210 instance_->PostMessage(pp::Var(kTestInt)); 282 instance_->PostMessage(pp::Var(kTestInt));
211 // Make sure we don't get a response in a re-entrant fashion. 283 // Make sure we don't get a response in a re-entrant fashion.
212 ASSERT_EQ(message_data_.size(), 0); 284 ASSERT_EQ(message_data_.size(), 0);
213 // We should get 3 messages. 285 // We should get 3 messages.
214 testing_interface_->RunMessageLoop(instance_->pp_instance()); 286 ASSERT_EQ(WaitForMessages(), 3);
215 testing_interface_->RunMessageLoop(instance_->pp_instance());
216 testing_interface_->RunMessageLoop(instance_->pp_instance());
217 ASSERT_EQ(message_data_.size(), 3);
218 // Copy to a vector of doubles and sort; w3c does not specify the order for 287 // Copy to a vector of doubles and sort; w3c does not specify the order for
219 // event listeners. (Copying is easier than writing an operator< for pp::Var.) 288 // event listeners. (Copying is easier than writing an operator< for pp::Var.)
220 // 289 //
221 // See http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html. 290 // See http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html.
222 VarVector::iterator iter(message_data_.begin()), the_end(message_data_.end()); 291 VarVector::iterator iter(message_data_.begin()), the_end(message_data_.end());
223 std::vector<double> double_vec; 292 std::vector<double> double_vec;
224 for (; iter != the_end; ++iter) { 293 for (; iter != the_end; ++iter) {
225 ASSERT_TRUE(iter->is_number()); 294 ASSERT_TRUE(iter->is_number());
226 double_vec.push_back(iter->AsDouble()); 295 double_vec.push_back(iter->AsDouble());
227 } 296 }
228 std::sort(double_vec.begin(), double_vec.end()); 297 std::sort(double_vec.begin(), double_vec.end());
229 ASSERT_DOUBLE_EQ(double_vec[0], 1.0); 298 ASSERT_DOUBLE_EQ(double_vec[0], 1.0);
230 ASSERT_DOUBLE_EQ(double_vec[1], 2.0); 299 ASSERT_DOUBLE_EQ(double_vec[1], 2.0);
231 ASSERT_DOUBLE_EQ(double_vec[2], 3.0); 300 ASSERT_DOUBLE_EQ(double_vec[2], 3.0);
232 301
233 ASSERT_TRUE(ClearListeners()); 302 ASSERT_TRUE(ClearListeners());
234 303
235 PASS(); 304 PASS();
236 } 305 }
237 306
238 std::string TestPostMessage::TestNoHandler() { 307 std::string TestPostMessage::TestNoHandler() {
239 // Delete any lingering event listeners. 308 // Delete any lingering event listeners.
240 ASSERT_TRUE(ClearListeners()); 309 ASSERT_TRUE(ClearListeners());
241 310
242 // Now send a message. We shouldn't get a response. 311 // Now send a message. We shouldn't get a response.
243 message_data_.clear(); 312 message_data_.clear();
244 instance_->PostMessage(pp::Var()); 313 instance_->PostMessage(pp::Var());
245 // Note that at this point, if we call RunMessageLoop, we should hang, because 314 ASSERT_EQ(WaitForMessages(), 0);
246 // there should be no call to our HandleMessage function to quit the loop.
247 // Therefore, we will do CallOnMainThread to yield control. That event should
248 // fire, but we should see no messages when we return.
249 TestCompletionCallback callback(instance_->pp_instance());
250 pp::Module::Get()->core()->CallOnMainThread(0, callback);
251 callback.WaitForResult();
252 ASSERT_TRUE(message_data_.empty()); 315 ASSERT_TRUE(message_data_.empty());
253 316
254 PASS(); 317 PASS();
255 } 318 }
256 319
257 std::string TestPostMessage::TestExtraParam() { 320 std::string TestPostMessage::TestExtraParam() {
258 // Delete any lingering event listeners. 321 // Delete any lingering event listeners.
259 ASSERT_TRUE(ClearListeners()); 322 ASSERT_TRUE(ClearListeners());
260 // Add a listener that will respond with 1 and an empty array (where the 323 // Add a listener that will respond with 1 and an empty array (where the
261 // message port array would appear if it was Worker postMessage). 324 // message port array would appear if it was Worker postMessage).
262 ASSERT_TRUE(AddEchoingListener("1, []")); 325 ASSERT_TRUE(AddEchoingListener("1, []"));
263 326
264 // Now send a message. We shouldn't get a response. 327 // Now send a message. We shouldn't get a response.
265 message_data_.clear(); 328 message_data_.clear();
266 instance_->PostMessage(pp::Var()); 329 instance_->PostMessage(pp::Var());
267 // Note that at this point, if we call RunMessageLoop, we should hang, because 330 ASSERT_EQ(WaitForMessages(), 0);
268 // there should be no call to our HandleMessage function to quit the loop.
269 // Therefore, we will do CallOnMainThread to yield control. That event should
270 // fire, but we should see no messages when we return.
271 TestCompletionCallback callback(instance_->pp_instance());
272 pp::Module::Get()->core()->CallOnMainThread(0, callback);
273 callback.WaitForResult();
274 ASSERT_TRUE(message_data_.empty()); 331 ASSERT_TRUE(message_data_.empty());
275 332
276 PASS(); 333 PASS();
277 } 334 }
278 335
279 std::string TestPostMessage::TestNonMainThread() { 336 std::string TestPostMessage::TestNonMainThread() {
280 ASSERT_TRUE(ClearListeners()); 337 ASSERT_TRUE(ClearListeners());
281 ASSERT_TRUE(AddEchoingListener("message_event.data")); 338 ASSERT_TRUE(AddEchoingListener("message_event.data"));
282 message_data_.clear(); 339 message_data_.clear();
283 340
(...skipping 21 matching lines...) Expand all
305 362
306 // Make sure we got all values that we expected. Note that because it's legal 363 // Make sure we got all values that we expected. Note that because it's legal
307 // for the JavaScript engine to treat our integers as floating points, we 364 // for the JavaScript engine to treat our integers as floating points, we
308 // can't just use std::find or equality comparison. So we instead, we convert 365 // can't just use std::find or equality comparison. So we instead, we convert
309 // each incoming value to an integer, and count them in received_counts. 366 // each incoming value to an integer, and count them in received_counts.
310 int32_t expected_num = (kThreadsToRun + 1) * kMessagesToSendPerThread; 367 int32_t expected_num = (kThreadsToRun + 1) * kMessagesToSendPerThread;
311 // Count how many we receive per-index. 368 // Count how many we receive per-index.
312 std::vector<int32_t> expected_counts(kThreadsToRun + 1, 369 std::vector<int32_t> expected_counts(kThreadsToRun + 1,
313 kMessagesToSendPerThread); 370 kMessagesToSendPerThread);
314 std::vector<int32_t> received_counts(kThreadsToRun + 1, 0); 371 std::vector<int32_t> received_counts(kThreadsToRun + 1, 0);
372 ASSERT_EQ(WaitForMessages(), expected_num);
315 for (int32_t i = 0; i < expected_num; ++i) { 373 for (int32_t i = 0; i < expected_num; ++i) {
316 // Run the message loop to get the next expected message. 374 const pp::Var& latest_var(message_data_[i]);
317 testing_interface_->RunMessageLoop(instance_->pp_instance());
318 // Make sure we got another message in.
319 ASSERT_EQ(message_data_.size(), 1);
320 pp::Var latest_var(message_data_.back());
321 message_data_.clear();
322
323 ASSERT_TRUE(latest_var.is_int() || latest_var.is_double()); 375 ASSERT_TRUE(latest_var.is_int() || latest_var.is_double());
324 int32_t received_value = -1; 376 int32_t received_value = -1;
325 if (latest_var.is_int()) { 377 if (latest_var.is_int()) {
326 received_value = latest_var.AsInt(); 378 received_value = latest_var.AsInt();
327 } else if (latest_var.is_double()) { 379 } else if (latest_var.is_double()) {
328 received_value = static_cast<int32_t>(latest_var.AsDouble() + 0.5); 380 received_value = static_cast<int32_t>(latest_var.AsDouble() + 0.5);
329 } 381 }
330 ASSERT_TRUE(received_value >= 0); 382 ASSERT_TRUE(received_value >= 0);
331 ASSERT_TRUE(received_value <= kThreadsToRun); 383 ASSERT_TRUE(received_value <= kThreadsToRun);
332 ++received_counts[received_value]; 384 ++received_counts[received_value];
333 } 385 }
334 ASSERT_EQ(received_counts, expected_counts); 386 ASSERT_EQ(received_counts, expected_counts);
335 387
336 PASS(); 388 PASS();
337 } 389 }
338 390
OLDNEW
« no previous file with comments | « ppapi/tests/test_post_message.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698