OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |