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: mojo/edk/system/multiprocess_message_pipe_unittest.cc

Issue 2741033003: Mojo EDK: Introduce MojoQueryHandleSignalsState API (Closed)
Patch Set: fix stupid bad DCHECK Created 3 years, 9 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 | « mojo/edk/system/message_pipe_unittest.cc ('k') | mojo/edk/system/signals_unittest.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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 #include <stdio.h> 7 #include <stdio.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include <string> 10 #include <string>
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 // For each message received, sends a reply message with the same contents 84 // For each message received, sends a reply message with the same contents
85 // repeated twice, until the other end is closed or it receives "quitquitquit" 85 // repeated twice, until the other end is closed or it receives "quitquitquit"
86 // (which it doesn't reply to). It'll return the number of messages received, 86 // (which it doesn't reply to). It'll return the number of messages received,
87 // not including any "quitquitquit" message, modulo 100. 87 // not including any "quitquitquit" message, modulo 100.
88 DEFINE_TEST_CLIENT_WITH_PIPE(EchoEcho, MultiprocessMessagePipeTest, h) { 88 DEFINE_TEST_CLIENT_WITH_PIPE(EchoEcho, MultiprocessMessagePipeTest, h) {
89 const std::string quitquitquit("quitquitquit"); 89 const std::string quitquitquit("quitquitquit");
90 int rv = 0; 90 int rv = 0;
91 for (;; rv = (rv + 1) % 100) { 91 for (;; rv = (rv + 1) % 100) {
92 // Wait for our end of the message pipe to be readable. 92 // Wait for our end of the message pipe to be readable.
93 HandleSignalsState hss; 93 HandleSignalsState hss;
94 MojoResult result = 94 MojoResult result = WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss);
95 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE,
96 MOJO_DEADLINE_INDEFINITE, &hss);
97 if (result != MOJO_RESULT_OK) { 95 if (result != MOJO_RESULT_OK) {
98 // It was closed, probably. 96 // It was closed, probably.
99 CHECK_EQ(result, MOJO_RESULT_FAILED_PRECONDITION); 97 CHECK_EQ(result, MOJO_RESULT_FAILED_PRECONDITION);
100 CHECK_EQ(hss.satisfied_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED); 98 CHECK_EQ(hss.satisfied_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED);
101 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED); 99 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED);
102 break; 100 break;
103 } else { 101 } else {
104 CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 102 CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
105 CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 103 CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
106 } 104 }
(...skipping 25 matching lines...) Expand all
132 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, Basic) { 130 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, Basic) {
133 RUN_CHILD_ON_PIPE(EchoEcho, h) 131 RUN_CHILD_ON_PIPE(EchoEcho, h)
134 std::string hello("hello"); 132 std::string hello("hello");
135 ASSERT_EQ(MOJO_RESULT_OK, 133 ASSERT_EQ(MOJO_RESULT_OK,
136 MojoWriteMessage(h, hello.data(), 134 MojoWriteMessage(h, hello.data(),
137 static_cast<uint32_t>(hello.size()), nullptr, 0u, 135 static_cast<uint32_t>(hello.size()), nullptr, 0u,
138 MOJO_WRITE_MESSAGE_FLAG_NONE)); 136 MOJO_WRITE_MESSAGE_FLAG_NONE));
139 137
140 HandleSignalsState hss; 138 HandleSignalsState hss;
141 ASSERT_EQ(MOJO_RESULT_OK, 139 ASSERT_EQ(MOJO_RESULT_OK,
142 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 140 WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
143 MOJO_DEADLINE_INDEFINITE, &hss));
144 // The child may or may not have closed its end of the message pipe and died 141 // The child may or may not have closed its end of the message pipe and died
145 // (and we may or may not know it yet), so our end may or may not appear as 142 // (and we may or may not know it yet), so our end may or may not appear as
146 // writable. 143 // writable.
147 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 144 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
148 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 145 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
149 146
150 std::string read_buffer(1000, '\0'); 147 std::string read_buffer(1000, '\0');
151 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); 148 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
152 CHECK_EQ(MojoReadMessage(h, &read_buffer[0], 149 CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
153 &read_buffer_size, nullptr, 0, 150 &read_buffer_size, nullptr, 0,
(...skipping 18 matching lines...) Expand all
172 std::string write_buffer(i, 'A' + (i % 26)); 169 std::string write_buffer(i, 'A' + (i % 26));
173 ASSERT_EQ(MOJO_RESULT_OK, 170 ASSERT_EQ(MOJO_RESULT_OK,
174 MojoWriteMessage(h, write_buffer.data(), 171 MojoWriteMessage(h, write_buffer.data(),
175 static_cast<uint32_t>(write_buffer.size()), 172 static_cast<uint32_t>(write_buffer.size()),
176 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE)); 173 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE));
177 } 174 }
178 175
179 for (size_t i = 0; i < kNumMessages; i++) { 176 for (size_t i = 0; i < kNumMessages; i++) {
180 HandleSignalsState hss; 177 HandleSignalsState hss;
181 ASSERT_EQ(MOJO_RESULT_OK, 178 ASSERT_EQ(MOJO_RESULT_OK,
182 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 179 WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
183 MOJO_DEADLINE_INDEFINITE, &hss));
184 // The child may or may not have closed its end of the message pipe and 180 // The child may or may not have closed its end of the message pipe and
185 // died (and we may or may not know it yet), so our end may or may not 181 // died (and we may or may not know it yet), so our end may or may not
186 // appear as writable. 182 // appear as writable.
187 ASSERT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 183 ASSERT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
188 ASSERT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 184 ASSERT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
189 185
190 std::string read_buffer(kNumMessages * 2, '\0'); 186 std::string read_buffer(kNumMessages * 2, '\0');
191 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); 187 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
192 ASSERT_EQ(MojoReadMessage(h, &read_buffer[0], 188 ASSERT_EQ(MojoReadMessage(h, &read_buffer[0],
193 &read_buffer_size, nullptr, 0, 189 &read_buffer_size, nullptr, 0,
194 MOJO_READ_MESSAGE_FLAG_NONE), 190 MOJO_READ_MESSAGE_FLAG_NONE),
195 MOJO_RESULT_OK); 191 MOJO_RESULT_OK);
196 read_buffer.resize(read_buffer_size); 192 read_buffer.resize(read_buffer_size);
197 193
198 ASSERT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); 194 ASSERT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer);
199 } 195 }
200 196
201 const std::string quitquitquit("quitquitquit"); 197 const std::string quitquitquit("quitquitquit");
202 ASSERT_EQ(MOJO_RESULT_OK, 198 ASSERT_EQ(MOJO_RESULT_OK,
203 MojoWriteMessage(h, quitquitquit.data(), 199 MojoWriteMessage(h, quitquitquit.data(),
204 static_cast<uint32_t>(quitquitquit.size()), 200 static_cast<uint32_t>(quitquitquit.size()),
205 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE)); 201 nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE));
206 202
207 // Wait for it to become readable, which should fail (since we sent 203 // Wait for it to become readable, which should fail (since we sent
208 // "quitquitquit"). 204 // "quitquitquit").
209 HandleSignalsState hss; 205 HandleSignalsState hss;
210 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 206 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
211 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 207 WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
212 MOJO_DEADLINE_INDEFINITE, &hss));
213 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 208 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
214 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 209 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
215 END_CHILD_AND_EXPECT_EXIT_CODE(static_cast<int>(kNumMessages % 100)); 210 END_CHILD_AND_EXPECT_EXIT_CODE(static_cast<int>(kNumMessages % 100));
216 } 211 }
217 212
218 DEFINE_TEST_CLIENT_WITH_PIPE(CheckSharedBuffer, MultiprocessMessagePipeTest, 213 DEFINE_TEST_CLIENT_WITH_PIPE(CheckSharedBuffer, MultiprocessMessagePipeTest,
219 h) { 214 h) {
220 // Wait for the first message from our parent. 215 // Wait for the first message from our parent.
221 HandleSignalsState hss; 216 HandleSignalsState hss;
222 CHECK_EQ(MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 217 CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
223 MOJO_DEADLINE_INDEFINITE, &hss),
224 MOJO_RESULT_OK); 218 MOJO_RESULT_OK);
225 // In this test, the parent definitely doesn't close its end of the message 219 // In this test, the parent definitely doesn't close its end of the message
226 // pipe before we do. 220 // pipe before we do.
227 CHECK_EQ(hss.satisfied_signals, 221 CHECK_EQ(hss.satisfied_signals,
228 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 222 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
229 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | 223 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
230 MOJO_HANDLE_SIGNAL_WRITABLE | 224 MOJO_HANDLE_SIGNAL_WRITABLE |
231 MOJO_HANDLE_SIGNAL_PEER_CLOSED); 225 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
232 226
233 // It should have a shared buffer. 227 // It should have a shared buffer.
(...skipping 24 matching lines...) Expand all
258 252
259 // And send a message to signal that we've written stuff. 253 // And send a message to signal that we've written stuff.
260 const std::string go2("go 2"); 254 const std::string go2("go 2");
261 CHECK_EQ(MojoWriteMessage(h, go2.data(), 255 CHECK_EQ(MojoWriteMessage(h, go2.data(),
262 static_cast<uint32_t>(go2.size()), nullptr, 0u, 256 static_cast<uint32_t>(go2.size()), nullptr, 0u,
263 MOJO_WRITE_MESSAGE_FLAG_NONE), 257 MOJO_WRITE_MESSAGE_FLAG_NONE),
264 MOJO_RESULT_OK); 258 MOJO_RESULT_OK);
265 259
266 // Now wait for our parent to send us a message. 260 // Now wait for our parent to send us a message.
267 hss = HandleSignalsState(); 261 hss = HandleSignalsState();
268 CHECK_EQ(MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 262 CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
269 MOJO_DEADLINE_INDEFINITE, &hss),
270 MOJO_RESULT_OK); 263 MOJO_RESULT_OK);
271 CHECK_EQ(hss.satisfied_signals, 264 CHECK_EQ(hss.satisfied_signals,
272 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 265 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
273 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | 266 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
274 MOJO_HANDLE_SIGNAL_WRITABLE | 267 MOJO_HANDLE_SIGNAL_WRITABLE |
275 MOJO_HANDLE_SIGNAL_PEER_CLOSED); 268 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
276 269
277 read_buffer = std::string(100, '\0'); 270 read_buffer = std::string(100, '\0');
278 num_bytes = static_cast<uint32_t>(read_buffer.size()); 271 num_bytes = static_cast<uint32_t>(read_buffer.size());
279 CHECK_EQ(MojoReadMessage(h, &read_buffer[0], &num_bytes, 272 CHECK_EQ(MojoReadMessage(h, &read_buffer[0], &num_bytes,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 handles[0] = duplicated_shared_buffer; 308 handles[0] = duplicated_shared_buffer;
316 ASSERT_EQ(MOJO_RESULT_OK, 309 ASSERT_EQ(MOJO_RESULT_OK,
317 MojoWriteMessage(h, &go1[0], 310 MojoWriteMessage(h, &go1[0],
318 static_cast<uint32_t>(go1.size()), &handles[0], 311 static_cast<uint32_t>(go1.size()), &handles[0],
319 arraysize(handles), 312 arraysize(handles),
320 MOJO_WRITE_MESSAGE_FLAG_NONE)); 313 MOJO_WRITE_MESSAGE_FLAG_NONE));
321 314
322 // Wait for a message from the child. 315 // Wait for a message from the child.
323 HandleSignalsState hss; 316 HandleSignalsState hss;
324 ASSERT_EQ(MOJO_RESULT_OK, 317 ASSERT_EQ(MOJO_RESULT_OK,
325 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 318 WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
326 MOJO_DEADLINE_INDEFINITE, &hss));
327 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 319 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
328 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 320 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
329 321
330 std::string read_buffer(100, '\0'); 322 std::string read_buffer(100, '\0');
331 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); 323 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
332 ASSERT_EQ(MOJO_RESULT_OK, 324 ASSERT_EQ(MOJO_RESULT_OK,
333 MojoReadMessage(h, &read_buffer[0], 325 MojoReadMessage(h, &read_buffer[0],
334 &num_bytes, nullptr, 0, 326 &num_bytes, nullptr, 0,
335 MOJO_READ_MESSAGE_FLAG_NONE)); 327 MOJO_READ_MESSAGE_FLAG_NONE));
336 read_buffer.resize(num_bytes); 328 read_buffer.resize(num_bytes);
(...skipping 15 matching lines...) Expand all
352 // And send a message to signal that we've written stuff. 344 // And send a message to signal that we've written stuff.
353 const std::string go3("go 3"); 345 const std::string go3("go 3");
354 ASSERT_EQ(MOJO_RESULT_OK, 346 ASSERT_EQ(MOJO_RESULT_OK,
355 MojoWriteMessage(h, &go3[0], 347 MojoWriteMessage(h, &go3[0],
356 static_cast<uint32_t>(go3.size()), nullptr, 0u, 348 static_cast<uint32_t>(go3.size()), nullptr, 0u,
357 MOJO_WRITE_MESSAGE_FLAG_NONE)); 349 MOJO_WRITE_MESSAGE_FLAG_NONE));
358 350
359 // Wait for |h| to become readable, which should fail. 351 // Wait for |h| to become readable, which should fail.
360 hss = HandleSignalsState(); 352 hss = HandleSignalsState();
361 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 353 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
362 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 354 WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
363 MOJO_DEADLINE_INDEFINITE, &hss));
364 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 355 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
365 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 356 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
366 END_CHILD() 357 END_CHILD()
367 } 358 }
368 359
369 DEFINE_TEST_CLIENT_WITH_PIPE(CheckPlatformHandleFile, 360 DEFINE_TEST_CLIENT_WITH_PIPE(CheckPlatformHandleFile,
370 MultiprocessMessagePipeTest, h) { 361 MultiprocessMessagePipeTest, h) {
371 HandleSignalsState hss; 362 HandleSignalsState hss;
372 CHECK_EQ(MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 363 CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
373 MOJO_DEADLINE_INDEFINITE, &hss),
374 MOJO_RESULT_OK); 364 MOJO_RESULT_OK);
375 CHECK_EQ(hss.satisfied_signals, 365 CHECK_EQ(hss.satisfied_signals,
376 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 366 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
377 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | 367 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
378 MOJO_HANDLE_SIGNAL_WRITABLE | 368 MOJO_HANDLE_SIGNAL_WRITABLE |
379 MOJO_HANDLE_SIGNAL_PEER_CLOSED); 369 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
380 370
381 std::string read_buffer(100, '\0'); 371 std::string read_buffer(100, '\0');
382 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); 372 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
383 MojoHandle handles[255]; // Maximum number to receive. 373 MojoHandle handles[255]; // Maximum number to receive.
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 ASSERT_EQ(MOJO_RESULT_OK, 438 ASSERT_EQ(MOJO_RESULT_OK,
449 MojoWriteMessage(h, message, 439 MojoWriteMessage(h, message,
450 static_cast<uint32_t>(strlen(message)), 440 static_cast<uint32_t>(strlen(message)),
451 &handles[0], 441 &handles[0],
452 static_cast<uint32_t>(handles.size()), 442 static_cast<uint32_t>(handles.size()),
453 MOJO_WRITE_MESSAGE_FLAG_NONE)); 443 MOJO_WRITE_MESSAGE_FLAG_NONE));
454 444
455 // Wait for it to become readable, which should fail. 445 // Wait for it to become readable, which should fail.
456 HandleSignalsState hss; 446 HandleSignalsState hss;
457 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 447 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
458 MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 448 WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
459 MOJO_DEADLINE_INDEFINITE, &hss));
460 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 449 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
461 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 450 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
462 END_CHILD() 451 END_CHILD()
463 } 452 }
464 453
465 // Android multi-process tests are not executing the new process. This is flaky. 454 // Android multi-process tests are not executing the new process. This is flaky.
466 #if !defined(OS_ANDROID) 455 #if !defined(OS_ANDROID)
467 INSTANTIATE_TEST_CASE_P(PipeCount, 456 INSTANTIATE_TEST_CASE_P(PipeCount,
468 MultiprocessMessagePipeTestWithPipeCount, 457 MultiprocessMessagePipeTestWithPipeCount,
469 // TODO(rockot): Re-enable the 140-pipe case when 458 // TODO(rockot): Re-enable the 140-pipe case when
470 // ChannelPosix has support for sending lots of handles. 459 // ChannelPosix has support for sending lots of handles.
471 testing::Values(1u, 128u /*, 140u*/)); 460 testing::Values(1u, 128u /*, 140u*/));
472 #endif 461 #endif
473 462
474 DEFINE_TEST_CLIENT_WITH_PIPE(CheckMessagePipe, MultiprocessMessagePipeTest, h) { 463 DEFINE_TEST_CLIENT_WITH_PIPE(CheckMessagePipe, MultiprocessMessagePipeTest, h) {
475 // Wait for the first message from our parent. 464 // Wait for the first message from our parent.
476 HandleSignalsState hss; 465 HandleSignalsState hss;
477 CHECK_EQ(MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 466 CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
478 MOJO_DEADLINE_INDEFINITE, &hss),
479 MOJO_RESULT_OK); 467 MOJO_RESULT_OK);
480 // In this test, the parent definitely doesn't close its end of the message 468 // In this test, the parent definitely doesn't close its end of the message
481 // pipe before we do. 469 // pipe before we do.
482 CHECK_EQ(hss.satisfied_signals, 470 CHECK_EQ(hss.satisfied_signals,
483 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 471 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
484 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | 472 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
485 MOJO_HANDLE_SIGNAL_WRITABLE | 473 MOJO_HANDLE_SIGNAL_WRITABLE |
486 MOJO_HANDLE_SIGNAL_PEER_CLOSED); 474 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
487 475
488 // It should have a message pipe. 476 // It should have a message pipe.
489 MojoHandle handles[10]; 477 MojoHandle handles[10];
490 uint32_t num_handlers = arraysize(handles); 478 uint32_t num_handlers = arraysize(handles);
491 CHECK_EQ(MojoReadMessage(h, nullptr, 479 CHECK_EQ(MojoReadMessage(h, nullptr,
492 nullptr, &handles[0], 480 nullptr, &handles[0],
493 &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE), 481 &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
494 MOJO_RESULT_OK); 482 MOJO_RESULT_OK);
495 CHECK_EQ(num_handlers, 1u); 483 CHECK_EQ(num_handlers, 1u);
496 484
497 // Read data from the received message pipe. 485 // Read data from the received message pipe.
498 CHECK_EQ(MojoWait(handles[0], MOJO_HANDLE_SIGNAL_READABLE, 486 CHECK_EQ(WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_READABLE, &hss),
499 MOJO_DEADLINE_INDEFINITE, &hss),
500 MOJO_RESULT_OK); 487 MOJO_RESULT_OK);
501 CHECK_EQ(hss.satisfied_signals, 488 CHECK_EQ(hss.satisfied_signals,
502 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 489 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
503 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | 490 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
504 MOJO_HANDLE_SIGNAL_WRITABLE | 491 MOJO_HANDLE_SIGNAL_WRITABLE |
505 MOJO_HANDLE_SIGNAL_PEER_CLOSED); 492 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
506 493
507 std::string read_buffer(100, '\0'); 494 std::string read_buffer(100, '\0');
508 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); 495 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
509 CHECK_EQ(MojoReadMessage(handles[0], &read_buffer[0], 496 CHECK_EQ(MojoReadMessage(handles[0], &read_buffer[0],
(...skipping 30 matching lines...) Expand all
540 MojoWriteMessage(mp1, &hello[0], 527 MojoWriteMessage(mp1, &hello[0],
541 static_cast<uint32_t>(hello.size()), nullptr, 0, 528 static_cast<uint32_t>(hello.size()), nullptr, 0,
542 MOJO_WRITE_MESSAGE_FLAG_NONE)); 529 MOJO_WRITE_MESSAGE_FLAG_NONE));
543 ASSERT_EQ(MOJO_RESULT_OK, 530 ASSERT_EQ(MOJO_RESULT_OK,
544 MojoWriteMessage(h, nullptr, 0, &mp2, 1, 531 MojoWriteMessage(h, nullptr, 0, &mp2, 1,
545 MOJO_WRITE_MESSAGE_FLAG_NONE)); 532 MOJO_WRITE_MESSAGE_FLAG_NONE));
546 533
547 // Wait for a message from the child. 534 // Wait for a message from the child.
548 HandleSignalsState hss; 535 HandleSignalsState hss;
549 ASSERT_EQ(MOJO_RESULT_OK, 536 ASSERT_EQ(MOJO_RESULT_OK,
550 MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE, 537 WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
551 MOJO_DEADLINE_INDEFINITE, &hss));
552 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 538 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
553 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 539 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
554 540
555 std::string read_buffer(100, '\0'); 541 std::string read_buffer(100, '\0');
556 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); 542 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
557 CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0], 543 CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
558 &read_buffer_size, nullptr, 544 &read_buffer_size, nullptr,
559 0, MOJO_READ_MESSAGE_FLAG_NONE), 545 0, MOJO_READ_MESSAGE_FLAG_NONE),
560 MOJO_RESULT_OK); 546 MOJO_RESULT_OK);
561 read_buffer.resize(read_buffer_size); 547 read_buffer.resize(read_buffer_size);
(...skipping 16 matching lines...) Expand all
578 MojoWriteMessage(mp1, &hello[0], 564 MojoWriteMessage(mp1, &hello[0],
579 static_cast<uint32_t>(hello.size()), nullptr, 0u, 565 static_cast<uint32_t>(hello.size()), nullptr, 0u,
580 MOJO_WRITE_MESSAGE_FLAG_NONE)); 566 MOJO_WRITE_MESSAGE_FLAG_NONE));
581 ASSERT_EQ(MOJO_RESULT_OK, 567 ASSERT_EQ(MOJO_RESULT_OK,
582 MojoWriteMessage(h, nullptr, 0u, &mp2, 1u, 568 MojoWriteMessage(h, nullptr, 0u, &mp2, 1u,
583 MOJO_WRITE_MESSAGE_FLAG_NONE)); 569 MOJO_WRITE_MESSAGE_FLAG_NONE));
584 570
585 // Wait for a message from the child. 571 // Wait for a message from the child.
586 HandleSignalsState hss; 572 HandleSignalsState hss;
587 ASSERT_EQ(MOJO_RESULT_OK, 573 ASSERT_EQ(MOJO_RESULT_OK,
588 MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE, 574 WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
589 MOJO_DEADLINE_INDEFINITE, &hss));
590 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 575 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
591 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 576 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
592 577
593 std::string read_buffer(100, '\0'); 578 std::string read_buffer(100, '\0');
594 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); 579 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
595 CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0], 580 CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
596 &read_buffer_size, nullptr, 581 &read_buffer_size, nullptr,
597 0, MOJO_READ_MESSAGE_FLAG_NONE), 582 0, MOJO_READ_MESSAGE_FLAG_NONE),
598 MOJO_RESULT_OK); 583 MOJO_RESULT_OK);
599 read_buffer.resize(read_buffer_size); 584 read_buffer.resize(read_buffer_size);
600 CHECK_EQ(read_buffer, std::string("world")); 585 CHECK_EQ(read_buffer, std::string("world"));
601 END_CHILD(); 586 END_CHILD();
602 } 587 }
603 588
604 DEFINE_TEST_CLIENT_WITH_PIPE(DataPipeConsumer, MultiprocessMessagePipeTest, h) { 589 DEFINE_TEST_CLIENT_WITH_PIPE(DataPipeConsumer, MultiprocessMessagePipeTest, h) {
605 // Wait for the first message from our parent. 590 // Wait for the first message from our parent.
606 HandleSignalsState hss; 591 HandleSignalsState hss;
607 CHECK_EQ(MojoWait(h, MOJO_HANDLE_SIGNAL_READABLE, 592 CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
608 MOJO_DEADLINE_INDEFINITE, &hss),
609 MOJO_RESULT_OK); 593 MOJO_RESULT_OK);
610 // In this test, the parent definitely doesn't close its end of the message 594 // In this test, the parent definitely doesn't close its end of the message
611 // pipe before we do. 595 // pipe before we do.
612 CHECK_EQ(hss.satisfied_signals, 596 CHECK_EQ(hss.satisfied_signals,
613 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 597 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
614 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | 598 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
615 MOJO_HANDLE_SIGNAL_WRITABLE | 599 MOJO_HANDLE_SIGNAL_WRITABLE |
616 MOJO_HANDLE_SIGNAL_PEER_CLOSED); 600 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
617 601
618 // It should have a message pipe. 602 // It should have a message pipe.
619 MojoHandle handles[10]; 603 MojoHandle handles[10];
620 uint32_t num_handlers = arraysize(handles); 604 uint32_t num_handlers = arraysize(handles);
621 CHECK_EQ(MojoReadMessage(h, nullptr, 605 CHECK_EQ(MojoReadMessage(h, nullptr,
622 nullptr, &handles[0], 606 nullptr, &handles[0],
623 &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE), 607 &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
624 MOJO_RESULT_OK); 608 MOJO_RESULT_OK);
625 CHECK_EQ(num_handlers, 1u); 609 CHECK_EQ(num_handlers, 1u);
626 610
627 // Read data from the received message pipe. 611 // Read data from the received message pipe.
628 CHECK_EQ(MojoWait(handles[0], MOJO_HANDLE_SIGNAL_READABLE, 612 CHECK_EQ(WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_READABLE, &hss),
629 MOJO_DEADLINE_INDEFINITE, &hss),
630 MOJO_RESULT_OK); 613 MOJO_RESULT_OK);
631 CHECK_EQ(hss.satisfied_signals, 614 CHECK_EQ(hss.satisfied_signals,
632 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 615 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
633 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | 616 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
634 MOJO_HANDLE_SIGNAL_WRITABLE | 617 MOJO_HANDLE_SIGNAL_WRITABLE |
635 MOJO_HANDLE_SIGNAL_PEER_CLOSED); 618 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
636 619
637 std::string read_buffer(100, '\0'); 620 std::string read_buffer(100, '\0');
638 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); 621 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
639 CHECK_EQ(MojoReadMessage(handles[0], &read_buffer[0], 622 CHECK_EQ(MojoReadMessage(handles[0], &read_buffer[0],
(...skipping 30 matching lines...) Expand all
670 MojoWriteMessage(mp1, &hello[0], 653 MojoWriteMessage(mp1, &hello[0],
671 static_cast<uint32_t>(hello.size()), nullptr, 0u, 654 static_cast<uint32_t>(hello.size()), nullptr, 0u,
672 MOJO_WRITE_MESSAGE_FLAG_NONE)); 655 MOJO_WRITE_MESSAGE_FLAG_NONE));
673 ASSERT_EQ(MOJO_RESULT_OK, 656 ASSERT_EQ(MOJO_RESULT_OK,
674 MojoWriteMessage(h, nullptr, 0, &mp2, 1u, 657 MojoWriteMessage(h, nullptr, 0, &mp2, 1u,
675 MOJO_WRITE_MESSAGE_FLAG_NONE)); 658 MOJO_WRITE_MESSAGE_FLAG_NONE));
676 659
677 // Wait for a message from the child. 660 // Wait for a message from the child.
678 HandleSignalsState hss; 661 HandleSignalsState hss;
679 ASSERT_EQ(MOJO_RESULT_OK, 662 ASSERT_EQ(MOJO_RESULT_OK,
680 MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE, 663 WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
681 MOJO_DEADLINE_INDEFINITE, &hss));
682 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 664 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
683 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 665 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
684 666
685 std::string read_buffer(100, '\0'); 667 std::string read_buffer(100, '\0');
686 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); 668 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
687 CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0], 669 CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
688 &read_buffer_size, nullptr, 670 &read_buffer_size, nullptr,
689 0, MOJO_READ_MESSAGE_FLAG_NONE), 671 0, MOJO_READ_MESSAGE_FLAG_NONE),
690 MOJO_RESULT_OK); 672 MOJO_RESULT_OK);
691 read_buffer.resize(read_buffer_size); 673 read_buffer.resize(read_buffer_size);
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 ReadMessageWithHandles(h, &p1, 1); 899 ReadMessageWithHandles(h, &p1, 1);
918 WriteMessageWithHandles(h, "", &p1, 1); 900 WriteMessageWithHandles(h, "", &p1, 1);
919 } 901 }
920 ReadMessageWithHandles(h, &p0, 1); 902 ReadMessageWithHandles(h, &p0, 1);
921 WriteMessage(h, "quit"); 903 WriteMessage(h, "quit");
922 END_CHILD() 904 END_CHILD()
923 905
924 EXPECT_EQ("bye", ReadMessage(p0)); 906 EXPECT_EQ("bye", ReadMessage(p0));
925 907
926 // We should still be able to observe peer closure from the other end. 908 // We should still be able to observe peer closure from the other end.
927 EXPECT_EQ(MOJO_RESULT_OK, 909 EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(p0, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
928 MojoWait(p0, MOJO_HANDLE_SIGNAL_PEER_CLOSED,
929 MOJO_DEADLINE_INDEFINITE, nullptr));
930 } 910 }
931 911
932 // Parses commands from the parent pipe and does whatever it's asked to do. 912 // Parses commands from the parent pipe and does whatever it's asked to do.
933 DEFINE_TEST_CLIENT_WITH_PIPE(CommandDrivenClient, MultiprocessMessagePipeTest, 913 DEFINE_TEST_CLIENT_WITH_PIPE(CommandDrivenClient, MultiprocessMessagePipeTest,
934 h) { 914 h) {
935 base::hash_map<std::string, MojoHandle> named_pipes; 915 base::hash_map<std::string, MojoHandle> named_pipes;
936 for (;;) { 916 for (;;) {
937 MojoHandle p; 917 MojoHandle p;
938 auto parts = base::SplitString(ReadMessageWithOptionalHandle(h, &p), ":", 918 auto parts = base::SplitString(ReadMessageWithOptionalHandle(h, &p), ":",
939 base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); 919 base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1103 END_CHILD() 1083 END_CHILD()
1104 END_CHILD() 1084 END_CHILD()
1105 END_CHILD() 1085 END_CHILD()
1106 END_CHILD() 1086 END_CHILD()
1107 } 1087 }
1108 1088
1109 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceivePipeWithClosedPeer, 1089 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceivePipeWithClosedPeer,
1110 MultiprocessMessagePipeTest, h) { 1090 MultiprocessMessagePipeTest, h) {
1111 MojoHandle p; 1091 MojoHandle p;
1112 EXPECT_EQ("foo", ReadMessageWithHandles(h, &p, 1)); 1092 EXPECT_EQ("foo", ReadMessageWithHandles(h, &p, 1));
1113 1093 EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
1114 auto result = MojoWait(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1115 MOJO_DEADLINE_INDEFINITE, nullptr);
1116 EXPECT_EQ(MOJO_RESULT_OK, result);
1117 } 1094 }
1118 1095
1119 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, SendPipeThenClosePeer) { 1096 TEST_P(MultiprocessMessagePipeTestWithPeerSupport, SendPipeThenClosePeer) {
1120 RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeer, h) 1097 RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeer, h)
1121 MojoHandle a, b; 1098 MojoHandle a, b;
1122 CreateMessagePipe(&a, &b); 1099 CreateMessagePipe(&a, &b);
1123 1100
1124 // Send |a| and immediately close |b|. The child should observe closure. 1101 // Send |a| and immediately close |b|. The child should observe closure.
1125 WriteMessageWithHandles(h, "foo", &a, 1); 1102 WriteMessageWithHandles(h, "foo", &a, 1);
1126 MojoClose(b); 1103 MojoClose(b);
(...skipping 25 matching lines...) Expand all
1152 // Receive a pipe from the parent. This is akin to an "application request". 1129 // Receive a pipe from the parent. This is akin to an "application request".
1153 MojoHandle application_client; 1130 MojoHandle application_client;
1154 EXPECT_EQ("c2a", ReadMessageWithHandles(h, &application_client, 1)); 1131 EXPECT_EQ("c2a", ReadMessageWithHandles(h, &application_client, 1));
1155 1132
1156 // Receive a pipe from the "application" "client". 1133 // Receive a pipe from the "application" "client".
1157 MojoHandle service_client; 1134 MojoHandle service_client;
1158 EXPECT_EQ("c2s lol", 1135 EXPECT_EQ("c2s lol",
1159 ReadMessageWithHandles(application_client, &service_client, 1)); 1136 ReadMessageWithHandles(application_client, &service_client, 1));
1160 1137
1161 // Wait for the service client to signal closure. 1138 // Wait for the service client to signal closure.
1162 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(service_client, 1139 EXPECT_EQ(MOJO_RESULT_OK,
1163 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1140 WaitForSignals(service_client, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
1164 MOJO_DEADLINE_INDEFINITE, nullptr));
1165 1141
1166 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(service_client)); 1142 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(service_client));
1167 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(application_client)); 1143 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(application_client));
1168 } 1144 }
1169 1145
1170 #if defined(OS_ANDROID) 1146 #if defined(OS_ANDROID)
1171 // Android multi-process tests are not executing the new process. This is flaky. 1147 // Android multi-process tests are not executing the new process. This is flaky.
1172 #define MAYBE_SendPipeWithClosedPeerBetweenChildren \ 1148 #define MAYBE_SendPipeWithClosedPeerBetweenChildren \
1173 DISABLED_SendPipeWithClosedPeerBetweenChildren 1149 DISABLED_SendPipeWithClosedPeerBetweenChildren
1174 #else 1150 #else
(...skipping 25 matching lines...) Expand all
1200 CreateMessagePipe(&c, &d); 1176 CreateMessagePipe(&c, &d);
1201 1177
1202 // Send |a| over |c|, immediately close |b|, then send |a| back over |d|. 1178 // Send |a| over |c|, immediately close |b|, then send |a| back over |d|.
1203 WriteMessageWithHandles(c, "foo", &a, 1); 1179 WriteMessageWithHandles(c, "foo", &a, 1);
1204 EXPECT_EQ("foo", ReadMessageWithHandles(d, &a, 1)); 1180 EXPECT_EQ("foo", ReadMessageWithHandles(d, &a, 1));
1205 WriteMessageWithHandles(d, "bar", &a, 1); 1181 WriteMessageWithHandles(d, "bar", &a, 1);
1206 EXPECT_EQ("bar", ReadMessageWithHandles(c, &a, 1)); 1182 EXPECT_EQ("bar", ReadMessageWithHandles(c, &a, 1));
1207 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b)); 1183 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
1208 1184
1209 // We should be able to detect peer closure on |a|. 1185 // We should be able to detect peer closure on |a|.
1210 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(a, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1186 EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(a, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
1211 MOJO_DEADLINE_INDEFINITE, nullptr));
1212 } 1187 }
1213 1188
1214 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(WriteCloseSendPeerClient, 1189 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(WriteCloseSendPeerClient,
1215 MultiprocessMessagePipeTest, h) { 1190 MultiprocessMessagePipeTest, h) {
1216 MojoHandle pipe[2]; 1191 MojoHandle pipe[2];
1217 EXPECT_EQ("foo", ReadMessageWithHandles(h, pipe, 2)); 1192 EXPECT_EQ("foo", ReadMessageWithHandles(h, pipe, 2));
1218 1193
1219 // Write some messages to the first endpoint and then close it. 1194 // Write some messages to the first endpoint and then close it.
1220 WriteMessage(pipe[0], "baz"); 1195 WriteMessage(pipe[0], "baz");
1221 WriteMessage(pipe[0], "qux"); 1196 WriteMessage(pipe[0], "qux");
(...skipping 22 matching lines...) Expand all
1244 WriteMessageWithHandles(h, "foo", pipe, 2); 1219 WriteMessageWithHandles(h, "foo", pipe, 2);
1245 1220
1246 // Read back an endpoint which should have messages on it. 1221 // Read back an endpoint which should have messages on it.
1247 MojoHandle p; 1222 MojoHandle p;
1248 EXPECT_EQ("bar", ReadMessageWithHandles(h, &p, 1)); 1223 EXPECT_EQ("bar", ReadMessageWithHandles(h, &p, 1));
1249 1224
1250 EXPECT_EQ("baz", ReadMessage(p)); 1225 EXPECT_EQ("baz", ReadMessage(p));
1251 EXPECT_EQ("qux", ReadMessage(p)); 1226 EXPECT_EQ("qux", ReadMessage(p));
1252 1227
1253 // Expect to have peer closure signaled. 1228 // Expect to have peer closure signaled.
1254 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1229 EXPECT_EQ(MOJO_RESULT_OK,
1255 MOJO_DEADLINE_INDEFINITE, nullptr)); 1230 WaitForSignals(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
1256 1231
1257 WriteMessage(h, "quit"); 1232 WriteMessage(h, "quit");
1258 END_CHILD() 1233 END_CHILD()
1259 } 1234 }
1260 1235
1261 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MessagePipeStatusChangeInTransitClient, 1236 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MessagePipeStatusChangeInTransitClient,
1262 MultiprocessMessagePipeTest, parent) { 1237 MultiprocessMessagePipeTest, parent) {
1263 // This test verifies that peer closure is detectable through various 1238 // This test verifies that peer closure is detectable through various
1264 // mechanisms when it races with handle transfer. 1239 // mechanisms when it races with handle transfer.
1265 MojoHandle handles[4]; 1240 MojoHandle handles[4];
1266 EXPECT_EQ("o_O", ReadMessageWithHandles(parent, handles, 4)); 1241 EXPECT_EQ("o_O", ReadMessageWithHandles(parent, handles, 4));
1267 1242
1268 // Wait on handle 0 using MojoWait. 1243 EXPECT_EQ(MOJO_RESULT_OK,
1269 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(handles[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1244 WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED));
1270 MOJO_DEADLINE_INDEFINITE, nullptr));
1271 1245
1272 base::MessageLoop message_loop; 1246 base::MessageLoop message_loop;
1273 1247
1274 // Wait on handle 1 using a SimpleWatcher. 1248 // Wait on handle 1 using a SimpleWatcher.
1275 { 1249 {
1276 base::RunLoop run_loop; 1250 base::RunLoop run_loop;
1277 SimpleWatcher watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC); 1251 SimpleWatcher watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
1278 watcher.Watch(Handle(handles[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1252 watcher.Watch(Handle(handles[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1279 base::Bind( 1253 base::Bind(
1280 [](base::RunLoop* loop, MojoResult result) { 1254 [](base::RunLoop* loop, MojoResult result) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1342 set_process_error_callback(base::Bind(&OnProcessError, 1316 set_process_error_callback(base::Bind(&OnProcessError,
1343 &second_process_error)); 1317 &second_process_error));
1344 RUN_CHILD_ON_PIPE(BadMessageClient, child2) 1318 RUN_CHILD_ON_PIPE(BadMessageClient, child2)
1345 MojoHandle a, b, c, d; 1319 MojoHandle a, b, c, d;
1346 CreateMessagePipe(&a, &b); 1320 CreateMessagePipe(&a, &b);
1347 CreateMessagePipe(&c, &d); 1321 CreateMessagePipe(&c, &d);
1348 WriteMessageWithHandles(child1, "hi", &b, 1); 1322 WriteMessageWithHandles(child1, "hi", &b, 1);
1349 WriteMessageWithHandles(child2, "hi", &d, 1); 1323 WriteMessageWithHandles(child2, "hi", &d, 1);
1350 1324
1351 // Read a message from the pipe we sent to child1 and flag it as bad. 1325 // Read a message from the pipe we sent to child1 and flag it as bad.
1352 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(a, MOJO_HANDLE_SIGNAL_READABLE, 1326 ASSERT_EQ(MOJO_RESULT_OK, WaitForSignals(a, MOJO_HANDLE_SIGNAL_READABLE));
1353 MOJO_DEADLINE_INDEFINITE, nullptr));
1354 uint32_t num_bytes = 0; 1327 uint32_t num_bytes = 0;
1355 MojoMessageHandle message; 1328 MojoMessageHandle message;
1356 ASSERT_EQ(MOJO_RESULT_OK, 1329 ASSERT_EQ(MOJO_RESULT_OK,
1357 MojoReadMessageNew(a, &message, &num_bytes, nullptr, 0, 1330 MojoReadMessageNew(a, &message, &num_bytes, nullptr, 0,
1358 MOJO_READ_MESSAGE_FLAG_NONE)); 1331 MOJO_READ_MESSAGE_FLAG_NONE));
1359 EXPECT_EQ(MOJO_RESULT_OK, 1332 EXPECT_EQ(MOJO_RESULT_OK,
1360 MojoNotifyBadMessage(message, kFirstErrorMessage.data(), 1333 MojoNotifyBadMessage(message, kFirstErrorMessage.data(),
1361 kFirstErrorMessage.size())); 1334 kFirstErrorMessage.size()));
1362 EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message)); 1335 EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
1363 1336
1364 // Read a message from the pipe we sent to child2 and flag it as bad. 1337 // Read a message from the pipe we sent to child2 and flag it as bad.
1365 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(c, MOJO_HANDLE_SIGNAL_READABLE, 1338 ASSERT_EQ(MOJO_RESULT_OK, WaitForSignals(c, MOJO_HANDLE_SIGNAL_READABLE));
1366 MOJO_DEADLINE_INDEFINITE, nullptr));
1367 ASSERT_EQ(MOJO_RESULT_OK, 1339 ASSERT_EQ(MOJO_RESULT_OK,
1368 MojoReadMessageNew(c, &message, &num_bytes, nullptr, 0, 1340 MojoReadMessageNew(c, &message, &num_bytes, nullptr, 0,
1369 MOJO_READ_MESSAGE_FLAG_NONE)); 1341 MOJO_READ_MESSAGE_FLAG_NONE));
1370 EXPECT_EQ(MOJO_RESULT_OK, 1342 EXPECT_EQ(MOJO_RESULT_OK,
1371 MojoNotifyBadMessage(message, kSecondErrorMessage.data(), 1343 MojoNotifyBadMessage(message, kSecondErrorMessage.data(),
1372 kSecondErrorMessage.size())); 1344 kSecondErrorMessage.size()));
1373 EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message)); 1345 EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
1374 1346
1375 WriteMessage(child2, "bye"); 1347 WriteMessage(child2, "bye");
1376 END_CHILD(); 1348 END_CHILD();
1377 1349
1378 WriteMessage(child1, "bye"); 1350 WriteMessage(child1, "bye");
1379 END_CHILD() 1351 END_CHILD()
1380 1352
1381 // The error messages should match the processes which triggered them. 1353 // The error messages should match the processes which triggered them.
1382 EXPECT_NE(std::string::npos, first_process_error.find(kFirstErrorMessage)); 1354 EXPECT_NE(std::string::npos, first_process_error.find(kFirstErrorMessage));
1383 EXPECT_NE(std::string::npos, second_process_error.find(kSecondErrorMessage)); 1355 EXPECT_NE(std::string::npos, second_process_error.find(kSecondErrorMessage));
1384 } 1356 }
1385 INSTANTIATE_TEST_CASE_P( 1357 INSTANTIATE_TEST_CASE_P(
1386 , 1358 ,
1387 MultiprocessMessagePipeTestWithPeerSupport, 1359 MultiprocessMessagePipeTestWithPeerSupport,
1388 testing::Values(test::MojoTestBase::LaunchType::CHILD, 1360 testing::Values(test::MojoTestBase::LaunchType::CHILD,
1389 test::MojoTestBase::LaunchType::PEER, 1361 test::MojoTestBase::LaunchType::PEER,
1390 test::MojoTestBase::LaunchType::NAMED_CHILD, 1362 test::MojoTestBase::LaunchType::NAMED_CHILD,
1391 test::MojoTestBase::LaunchType::NAMED_PEER)); 1363 test::MojoTestBase::LaunchType::NAMED_PEER));
1392 } // namespace 1364 } // namespace
1393 } // namespace edk 1365 } // namespace edk
1394 } // namespace mojo 1366 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/message_pipe_unittest.cc ('k') | mojo/edk/system/signals_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698