| 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 <stdint.h> | 5 #include <stdint.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 const std::string quitquitquit("quitquitquit"); | 55 const std::string quitquitquit("quitquitquit"); |
| 56 int rv = 0; | 56 int rv = 0; |
| 57 for (;; rv = (rv + 1) % 100) { | 57 for (;; rv = (rv + 1) % 100) { |
| 58 // Wait for our end of the message pipe to be readable. | 58 // Wait for our end of the message pipe to be readable. |
| 59 HandleSignalsState hss; | 59 HandleSignalsState hss; |
| 60 MojoResult result = | 60 MojoResult result = |
| 61 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss); | 61 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss); |
| 62 if (result != MOJO_RESULT_OK) { | 62 if (result != MOJO_RESULT_OK) { |
| 63 // It was closed, probably. | 63 // It was closed, probably. |
| 64 CHECK_EQ(result, MOJO_RESULT_FAILED_PRECONDITION); | 64 CHECK_EQ(result, MOJO_RESULT_FAILED_PRECONDITION); |
| 65 CHECK_EQ(hss.satisfied_signals, 0u); | 65 CHECK_EQ(hss.satisfied_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED); |
| 66 CHECK_EQ(hss.satisfiable_signals, 0u); | 66 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED); |
| 67 break; | 67 break; |
| 68 } else { | 68 } else { |
| 69 CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 69 CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 70 CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 70 CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 71 } | 71 } |
| 72 | 72 |
| 73 std::string read_buffer(1000, '\0'); | 73 std::string read_buffer(1000, '\0'); |
| 74 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); | 74 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); |
| 75 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), | 75 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 76 MakeUserPointer(&read_buffer_size), nullptr, | 76 MakeUserPointer(&read_buffer_size), nullptr, |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 read_buffer.resize(read_buffer_size); | 189 read_buffer.resize(read_buffer_size); |
| 190 | 190 |
| 191 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); | 191 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); |
| 192 } | 192 } |
| 193 | 193 |
| 194 // Wait for it to become readable, which should fail (since we sent | 194 // Wait for it to become readable, which should fail (since we sent |
| 195 // "quitquitquit"). | 195 // "quitquitquit"). |
| 196 HandleSignalsState hss; | 196 HandleSignalsState hss; |
| 197 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 197 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 198 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 198 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 199 EXPECT_EQ(0u, hss.satisfied_signals); | 199 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 200 EXPECT_EQ(0u, hss.satisfiable_signals); | 200 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 201 | 201 |
| 202 mp->Close(0); | 202 mp->Close(0); |
| 203 | 203 |
| 204 EXPECT_EQ(static_cast<int>(kNumMessages % 100), | 204 EXPECT_EQ(static_cast<int>(kNumMessages % 100), |
| 205 helper()->WaitForChildShutdown()); | 205 helper()->WaitForChildShutdown()); |
| 206 } | 206 } |
| 207 | 207 |
| 208 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckSharedBuffer) { | 208 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckSharedBuffer) { |
| 209 embedder::SimplePlatformSupport platform_support; | 209 embedder::SimplePlatformSupport platform_support; |
| 210 test::ChannelThread channel_thread(&platform_support); | 210 test::ChannelThread channel_thread(&platform_support); |
| 211 embedder::ScopedPlatformHandle client_platform_handle = | 211 embedder::ScopedPlatformHandle client_platform_handle = |
| 212 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); | 212 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); |
| 213 CHECK(client_platform_handle.is_valid()); | 213 CHECK(client_platform_handle.is_valid()); |
| 214 scoped_refptr<ChannelEndpoint> ep; | 214 scoped_refptr<ChannelEndpoint> ep; |
| 215 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); | 215 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); |
| 216 channel_thread.Start(client_platform_handle.Pass(), ep); | 216 channel_thread.Start(client_platform_handle.Pass(), ep); |
| 217 | 217 |
| 218 // Wait for the first message from our parent. | 218 // Wait for the first message from our parent. |
| 219 HandleSignalsState hss; | 219 HandleSignalsState hss; |
| 220 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), | 220 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), |
| 221 MOJO_RESULT_OK); | 221 MOJO_RESULT_OK); |
| 222 // In this test, the parent definitely doesn't close its end of the message | 222 // In this test, the parent definitely doesn't close its end of the message |
| 223 // pipe before we do. | 223 // pipe before we do. |
| 224 CHECK_EQ(hss.satisfied_signals, | 224 CHECK_EQ(hss.satisfied_signals, |
| 225 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 225 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 226 CHECK_EQ(hss.satisfiable_signals, | 226 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | |
| 227 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 227 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 228 MOJO_HANDLE_SIGNAL_PEER_CLOSED); |
| 228 | 229 |
| 229 // It should have a shared buffer. | 230 // It should have a shared buffer. |
| 230 std::string read_buffer(100, '\0'); | 231 std::string read_buffer(100, '\0'); |
| 231 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); | 232 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 232 DispatcherVector dispatchers; | 233 DispatcherVector dispatchers; |
| 233 uint32_t num_dispatchers = 10; // Maximum number to receive. | 234 uint32_t num_dispatchers = 10; // Maximum number to receive. |
| 234 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), | 235 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 235 MakeUserPointer(&num_bytes), &dispatchers, | 236 MakeUserPointer(&num_bytes), &dispatchers, |
| 236 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), | 237 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), |
| 237 MOJO_RESULT_OK); | 238 MOJO_RESULT_OK); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 265 static_cast<uint32_t>(go2.size()), nullptr, | 266 static_cast<uint32_t>(go2.size()), nullptr, |
| 266 MOJO_WRITE_MESSAGE_FLAG_NONE), | 267 MOJO_WRITE_MESSAGE_FLAG_NONE), |
| 267 MOJO_RESULT_OK); | 268 MOJO_RESULT_OK); |
| 268 | 269 |
| 269 // Now wait for our parent to send us a message. | 270 // Now wait for our parent to send us a message. |
| 270 hss = HandleSignalsState(); | 271 hss = HandleSignalsState(); |
| 271 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), | 272 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), |
| 272 MOJO_RESULT_OK); | 273 MOJO_RESULT_OK); |
| 273 CHECK_EQ(hss.satisfied_signals, | 274 CHECK_EQ(hss.satisfied_signals, |
| 274 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 275 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 275 CHECK_EQ(hss.satisfiable_signals, | 276 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | |
| 276 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 277 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 278 MOJO_HANDLE_SIGNAL_PEER_CLOSED); |
| 277 | 279 |
| 278 read_buffer = std::string(100, '\0'); | 280 read_buffer = std::string(100, '\0'); |
| 279 num_bytes = static_cast<uint32_t>(read_buffer.size()); | 281 num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 280 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), | 282 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 281 MakeUserPointer(&num_bytes), nullptr, nullptr, | 283 MakeUserPointer(&num_bytes), nullptr, nullptr, |
| 282 MOJO_READ_MESSAGE_FLAG_NONE), | 284 MOJO_READ_MESSAGE_FLAG_NONE), |
| 283 MOJO_RESULT_OK); | 285 MOJO_RESULT_OK); |
| 284 read_buffer.resize(num_bytes); | 286 read_buffer.resize(num_bytes); |
| 285 CHECK_EQ(read_buffer, std::string("go 3")); | 287 CHECK_EQ(read_buffer, std::string("go 3")); |
| 286 | 288 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 const std::string go3("go 3"); | 372 const std::string go3("go 3"); |
| 371 EXPECT_EQ(MOJO_RESULT_OK, | 373 EXPECT_EQ(MOJO_RESULT_OK, |
| 372 mp->WriteMessage(0, UserPointer<const void>(&go3[0]), | 374 mp->WriteMessage(0, UserPointer<const void>(&go3[0]), |
| 373 static_cast<uint32_t>(go3.size()), nullptr, | 375 static_cast<uint32_t>(go3.size()), nullptr, |
| 374 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 376 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 375 | 377 |
| 376 // Wait for |mp| to become readable, which should fail. | 378 // Wait for |mp| to become readable, which should fail. |
| 377 hss = HandleSignalsState(); | 379 hss = HandleSignalsState(); |
| 378 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 380 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 379 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 381 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 380 EXPECT_EQ(0u, hss.satisfied_signals); | 382 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 381 EXPECT_EQ(0u, hss.satisfiable_signals); | 383 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 382 | 384 |
| 383 mp->Close(0); | 385 mp->Close(0); |
| 384 | 386 |
| 385 EXPECT_EQ(0, helper()->WaitForChildShutdown()); | 387 EXPECT_EQ(0, helper()->WaitForChildShutdown()); |
| 386 } | 388 } |
| 387 | 389 |
| 388 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) { | 390 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) { |
| 389 embedder::SimplePlatformSupport platform_support; | 391 embedder::SimplePlatformSupport platform_support; |
| 390 test::ChannelThread channel_thread(&platform_support); | 392 test::ChannelThread channel_thread(&platform_support); |
| 391 embedder::ScopedPlatformHandle client_platform_handle = | 393 embedder::ScopedPlatformHandle client_platform_handle = |
| 392 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); | 394 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); |
| 393 CHECK(client_platform_handle.is_valid()); | 395 CHECK(client_platform_handle.is_valid()); |
| 394 scoped_refptr<ChannelEndpoint> ep; | 396 scoped_refptr<ChannelEndpoint> ep; |
| 395 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); | 397 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); |
| 396 channel_thread.Start(client_platform_handle.Pass(), ep); | 398 channel_thread.Start(client_platform_handle.Pass(), ep); |
| 397 | 399 |
| 398 HandleSignalsState hss; | 400 HandleSignalsState hss; |
| 399 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), | 401 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), |
| 400 MOJO_RESULT_OK); | 402 MOJO_RESULT_OK); |
| 401 CHECK_EQ(hss.satisfied_signals, | 403 CHECK_EQ(hss.satisfied_signals, |
| 402 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 404 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 403 CHECK_EQ(hss.satisfiable_signals, | 405 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | |
| 404 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 406 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 407 MOJO_HANDLE_SIGNAL_PEER_CLOSED); |
| 405 | 408 |
| 406 std::string read_buffer(100, '\0'); | 409 std::string read_buffer(100, '\0'); |
| 407 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); | 410 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 408 DispatcherVector dispatchers; | 411 DispatcherVector dispatchers; |
| 409 uint32_t num_dispatchers = 10; // Maximum number to receive. | 412 uint32_t num_dispatchers = 10; // Maximum number to receive. |
| 410 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), | 413 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 411 MakeUserPointer(&num_bytes), &dispatchers, | 414 MakeUserPointer(&num_bytes), &dispatchers, |
| 412 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), | 415 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), |
| 413 MOJO_RESULT_OK); | 416 MOJO_RESULT_OK); |
| 414 mp->Close(0); | 417 mp->Close(0); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 481 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 479 transport.End(); | 482 transport.End(); |
| 480 | 483 |
| 481 EXPECT_TRUE(dispatcher->HasOneRef()); | 484 EXPECT_TRUE(dispatcher->HasOneRef()); |
| 482 dispatcher = nullptr; | 485 dispatcher = nullptr; |
| 483 | 486 |
| 484 // Wait for it to become readable, which should fail. | 487 // Wait for it to become readable, which should fail. |
| 485 HandleSignalsState hss; | 488 HandleSignalsState hss; |
| 486 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 489 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 487 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 490 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 488 EXPECT_EQ(0u, hss.satisfied_signals); | 491 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 489 EXPECT_EQ(0u, hss.satisfiable_signals); | 492 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 490 | 493 |
| 491 mp->Close(0); | 494 mp->Close(0); |
| 492 | 495 |
| 493 EXPECT_EQ(0, helper()->WaitForChildShutdown()); | 496 EXPECT_EQ(0, helper()->WaitForChildShutdown()); |
| 494 } | 497 } |
| 495 | 498 |
| 496 } // namespace | 499 } // namespace |
| 497 } // namespace system | 500 } // namespace system |
| 498 } // namespace mojo | 501 } // namespace mojo |
| OLD | NEW |