| 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 |