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

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