| 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_CLOSED); |
| 66 CHECK_EQ(hss.satisfiable_signals, 0u); | 66 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 read_buffer.resize(read_buffer_size); | 177 read_buffer.resize(read_buffer_size); |
| 178 | 178 |
| 179 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); | 179 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); |
| 180 } | 180 } |
| 181 | 181 |
| 182 // Wait for it to become readable, which should fail (since we sent | 182 // Wait for it to become readable, which should fail (since we sent |
| 183 // "quitquitquit"). | 183 // "quitquitquit"). |
| 184 HandleSignalsState hss; | 184 HandleSignalsState hss; |
| 185 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 185 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 186 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 186 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 187 EXPECT_EQ(0u, hss.satisfied_signals); | 187 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals); |
| 188 EXPECT_EQ(0u, hss.satisfiable_signals); | 188 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals); |
| 189 | 189 |
| 190 mp->Close(0); | 190 mp->Close(0); |
| 191 | 191 |
| 192 EXPECT_EQ(static_cast<int>(kNumMessages % 100), | 192 EXPECT_EQ(static_cast<int>(kNumMessages % 100), |
| 193 helper()->WaitForChildShutdown()); | 193 helper()->WaitForChildShutdown()); |
| 194 } | 194 } |
| 195 | 195 |
| 196 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckSharedBuffer) { | 196 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckSharedBuffer) { |
| 197 embedder::SimplePlatformSupport platform_support; | 197 embedder::SimplePlatformSupport platform_support; |
| 198 test::ChannelThread channel_thread(&platform_support); | 198 test::ChannelThread channel_thread(&platform_support); |
| 199 embedder::ScopedPlatformHandle client_platform_handle = | 199 embedder::ScopedPlatformHandle client_platform_handle = |
| 200 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); | 200 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); |
| 201 CHECK(client_platform_handle.is_valid()); | 201 CHECK(client_platform_handle.is_valid()); |
| 202 scoped_refptr<ChannelEndpoint> ep; | 202 scoped_refptr<ChannelEndpoint> ep; |
| 203 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); | 203 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); |
| 204 channel_thread.Start(client_platform_handle.Pass(), ep); | 204 channel_thread.Start(client_platform_handle.Pass(), ep); |
| 205 | 205 |
| 206 // Wait for the first message from our parent. | 206 // Wait for the first message from our parent. |
| 207 HandleSignalsState hss; | 207 HandleSignalsState hss; |
| 208 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), | 208 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), |
| 209 MOJO_RESULT_OK); | 209 MOJO_RESULT_OK); |
| 210 // In this test, the parent definitely doesn't close its end of the message | 210 // In this test, the parent definitely doesn't close its end of the message |
| 211 // pipe before we do. | 211 // pipe before we do. |
| 212 CHECK_EQ(hss.satisfied_signals, | 212 CHECK_EQ(hss.satisfied_signals, |
| 213 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 213 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 214 CHECK_EQ(hss.satisfiable_signals, | 214 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | |
| 215 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 215 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 216 MOJO_HANDLE_SIGNAL_CLOSED); |
| 216 | 217 |
| 217 // It should have a shared buffer. | 218 // It should have a shared buffer. |
| 218 std::string read_buffer(100, '\0'); | 219 std::string read_buffer(100, '\0'); |
| 219 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); | 220 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 220 DispatcherVector dispatchers; | 221 DispatcherVector dispatchers; |
| 221 uint32_t num_dispatchers = 10; // Maximum number to receive. | 222 uint32_t num_dispatchers = 10; // Maximum number to receive. |
| 222 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), | 223 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 223 MakeUserPointer(&num_bytes), &dispatchers, | 224 MakeUserPointer(&num_bytes), &dispatchers, |
| 224 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), | 225 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), |
| 225 MOJO_RESULT_OK); | 226 MOJO_RESULT_OK); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 253 static_cast<uint32_t>(go2.size()), nullptr, | 254 static_cast<uint32_t>(go2.size()), nullptr, |
| 254 MOJO_WRITE_MESSAGE_FLAG_NONE), | 255 MOJO_WRITE_MESSAGE_FLAG_NONE), |
| 255 MOJO_RESULT_OK); | 256 MOJO_RESULT_OK); |
| 256 | 257 |
| 257 // Now wait for our parent to send us a message. | 258 // Now wait for our parent to send us a message. |
| 258 hss = HandleSignalsState(); | 259 hss = HandleSignalsState(); |
| 259 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), | 260 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), |
| 260 MOJO_RESULT_OK); | 261 MOJO_RESULT_OK); |
| 261 CHECK_EQ(hss.satisfied_signals, | 262 CHECK_EQ(hss.satisfied_signals, |
| 262 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 263 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 263 CHECK_EQ(hss.satisfiable_signals, | 264 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | |
| 264 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 265 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 266 MOJO_HANDLE_SIGNAL_CLOSED); |
| 265 | 267 |
| 266 read_buffer = std::string(100, '\0'); | 268 read_buffer = std::string(100, '\0'); |
| 267 num_bytes = static_cast<uint32_t>(read_buffer.size()); | 269 num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 268 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), | 270 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 269 MakeUserPointer(&num_bytes), nullptr, nullptr, | 271 MakeUserPointer(&num_bytes), nullptr, nullptr, |
| 270 MOJO_READ_MESSAGE_FLAG_NONE), | 272 MOJO_READ_MESSAGE_FLAG_NONE), |
| 271 MOJO_RESULT_OK); | 273 MOJO_RESULT_OK); |
| 272 read_buffer.resize(num_bytes); | 274 read_buffer.resize(num_bytes); |
| 273 CHECK_EQ(read_buffer, std::string("go 3")); | 275 CHECK_EQ(read_buffer, std::string("go 3")); |
| 274 | 276 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 const std::string go3("go 3"); | 359 const std::string go3("go 3"); |
| 358 EXPECT_EQ(MOJO_RESULT_OK, | 360 EXPECT_EQ(MOJO_RESULT_OK, |
| 359 mp->WriteMessage(0, UserPointer<const void>(&go3[0]), | 361 mp->WriteMessage(0, UserPointer<const void>(&go3[0]), |
| 360 static_cast<uint32_t>(go3.size()), nullptr, | 362 static_cast<uint32_t>(go3.size()), nullptr, |
| 361 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 363 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 362 | 364 |
| 363 // Wait for |mp| to become readable, which should fail. | 365 // Wait for |mp| to become readable, which should fail. |
| 364 hss = HandleSignalsState(); | 366 hss = HandleSignalsState(); |
| 365 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 367 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 366 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 368 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 367 EXPECT_EQ(0u, hss.satisfied_signals); | 369 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals); |
| 368 EXPECT_EQ(0u, hss.satisfiable_signals); | 370 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals); |
| 369 | 371 |
| 370 mp->Close(0); | 372 mp->Close(0); |
| 371 | 373 |
| 372 EXPECT_EQ(0, helper()->WaitForChildShutdown()); | 374 EXPECT_EQ(0, helper()->WaitForChildShutdown()); |
| 373 } | 375 } |
| 374 | 376 |
| 375 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) { | 377 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) { |
| 376 embedder::SimplePlatformSupport platform_support; | 378 embedder::SimplePlatformSupport platform_support; |
| 377 test::ChannelThread channel_thread(&platform_support); | 379 test::ChannelThread channel_thread(&platform_support); |
| 378 embedder::ScopedPlatformHandle client_platform_handle = | 380 embedder::ScopedPlatformHandle client_platform_handle = |
| 379 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); | 381 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); |
| 380 CHECK(client_platform_handle.is_valid()); | 382 CHECK(client_platform_handle.is_valid()); |
| 381 scoped_refptr<ChannelEndpoint> ep; | 383 scoped_refptr<ChannelEndpoint> ep; |
| 382 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); | 384 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); |
| 383 channel_thread.Start(client_platform_handle.Pass(), ep); | 385 channel_thread.Start(client_platform_handle.Pass(), ep); |
| 384 | 386 |
| 385 HandleSignalsState hss; | 387 HandleSignalsState hss; |
| 386 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), | 388 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), |
| 387 MOJO_RESULT_OK); | 389 MOJO_RESULT_OK); |
| 388 CHECK_EQ(hss.satisfied_signals, | 390 CHECK_EQ(hss.satisfied_signals, |
| 389 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 391 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 390 CHECK_EQ(hss.satisfiable_signals, | 392 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE | |
| 391 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 393 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 394 MOJO_HANDLE_SIGNAL_CLOSED); |
| 392 | 395 |
| 393 std::string read_buffer(100, '\0'); | 396 std::string read_buffer(100, '\0'); |
| 394 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); | 397 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 395 DispatcherVector dispatchers; | 398 DispatcherVector dispatchers; |
| 396 uint32_t num_dispatchers = 10; // Maximum number to receive. | 399 uint32_t num_dispatchers = 10; // Maximum number to receive. |
| 397 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), | 400 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 398 MakeUserPointer(&num_bytes), &dispatchers, | 401 MakeUserPointer(&num_bytes), &dispatchers, |
| 399 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), | 402 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), |
| 400 MOJO_RESULT_OK); | 403 MOJO_RESULT_OK); |
| 401 mp->Close(0); | 404 mp->Close(0); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 467 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 465 transport.End(); | 468 transport.End(); |
| 466 | 469 |
| 467 EXPECT_TRUE(dispatcher->HasOneRef()); | 470 EXPECT_TRUE(dispatcher->HasOneRef()); |
| 468 dispatcher = nullptr; | 471 dispatcher = nullptr; |
| 469 | 472 |
| 470 // Wait for it to become readable, which should fail. | 473 // Wait for it to become readable, which should fail. |
| 471 HandleSignalsState hss; | 474 HandleSignalsState hss; |
| 472 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 475 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 473 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 476 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 474 EXPECT_EQ(0u, hss.satisfied_signals); | 477 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals); |
| 475 EXPECT_EQ(0u, hss.satisfiable_signals); | 478 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals); |
| 476 | 479 |
| 477 mp->Close(0); | 480 mp->Close(0); |
| 478 | 481 |
| 479 EXPECT_EQ(0, helper()->WaitForChildShutdown()); | 482 EXPECT_EQ(0, helper()->WaitForChildShutdown()); |
| 480 } | 483 } |
| 481 | 484 |
| 482 } // namespace | 485 } // namespace |
| 483 } // namespace system | 486 } // namespace system |
| 484 } // namespace mojo | 487 } // namespace mojo |
| OLD | NEW |