| 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 <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), | 235 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 236 MakeUserPointer(&num_bytes), &dispatchers, | 236 MakeUserPointer(&num_bytes), &dispatchers, |
| 237 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), | 237 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), |
| 238 MOJO_RESULT_OK); | 238 MOJO_RESULT_OK); |
| 239 read_buffer.resize(num_bytes); | 239 read_buffer.resize(num_bytes); |
| 240 CHECK_EQ(read_buffer, std::string("go 1")); | 240 CHECK_EQ(read_buffer, std::string("go 1")); |
| 241 CHECK_EQ(num_dispatchers, 1u); | 241 CHECK_EQ(num_dispatchers, 1u); |
| 242 | 242 |
| 243 CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::Type::SHARED_BUFFER); | 243 CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::Type::SHARED_BUFFER); |
| 244 | 244 |
| 245 scoped_refptr<SharedBufferDispatcher> dispatcher( | 245 RefPtr<SharedBufferDispatcher> dispatcher( |
| 246 static_cast<SharedBufferDispatcher*>(dispatchers[0].get())); | 246 static_cast<SharedBufferDispatcher*>(dispatchers[0].get())); |
| 247 | 247 |
| 248 // Make a mapping. | 248 // Make a mapping. |
| 249 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping; | 249 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping; |
| 250 CHECK_EQ(dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping), | 250 CHECK_EQ(dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping), |
| 251 MOJO_RESULT_OK); | 251 MOJO_RESULT_OK); |
| 252 CHECK(mapping); | 252 CHECK(mapping); |
| 253 CHECK(mapping->GetBase()); | 253 CHECK(mapping->GetBase()); |
| 254 CHECK_EQ(mapping->GetLength(), 100u); | 254 CHECK_EQ(mapping->GetLength(), 100u); |
| 255 | 255 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 #define MAYBE_SharedBufferPassing SharedBufferPassing | 303 #define MAYBE_SharedBufferPassing SharedBufferPassing |
| 304 #endif | 304 #endif |
| 305 TEST_F(MultiprocessMessagePipeTest, MAYBE_SharedBufferPassing) { | 305 TEST_F(MultiprocessMessagePipeTest, MAYBE_SharedBufferPassing) { |
| 306 helper()->StartChild("CheckSharedBuffer"); | 306 helper()->StartChild("CheckSharedBuffer"); |
| 307 | 307 |
| 308 RefPtr<ChannelEndpoint> ep; | 308 RefPtr<ChannelEndpoint> ep; |
| 309 auto mp = MessagePipe::CreateLocalProxy(&ep); | 309 auto mp = MessagePipe::CreateLocalProxy(&ep); |
| 310 Init(std::move(ep)); | 310 Init(std::move(ep)); |
| 311 | 311 |
| 312 // Make a shared buffer. | 312 // Make a shared buffer. |
| 313 scoped_refptr<SharedBufferDispatcher> dispatcher; | 313 MojoResult result = MOJO_RESULT_INTERNAL; |
| 314 EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create( | 314 auto dispatcher = SharedBufferDispatcher::Create( |
| 315 platform_support(), | 315 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, |
| 316 SharedBufferDispatcher::kDefaultCreateOptions, | 316 &result); |
| 317 100, &dispatcher)); | 317 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 318 ASSERT_TRUE(dispatcher); | 318 ASSERT_TRUE(dispatcher); |
| 319 | 319 |
| 320 // Make a mapping. | 320 // Make a mapping. |
| 321 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping; | 321 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping; |
| 322 EXPECT_EQ(MOJO_RESULT_OK, | 322 EXPECT_EQ(MOJO_RESULT_OK, |
| 323 dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 323 dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
| 324 ASSERT_TRUE(mapping); | 324 ASSERT_TRUE(mapping); |
| 325 ASSERT_TRUE(mapping->GetBase()); | 325 ASSERT_TRUE(mapping->GetBase()); |
| 326 ASSERT_EQ(100u, mapping->GetLength()); | 326 ASSERT_EQ(100u, mapping->GetLength()); |
| 327 | 327 |
| 328 // Send the shared buffer. | 328 // Send the shared buffer. |
| 329 const std::string go1("go 1"); | 329 const std::string go1("go 1"); |
| 330 DispatcherTransport transport( | 330 DispatcherTransport transport( |
| 331 test::DispatcherTryStartTransport(dispatcher.get())); | 331 test::DispatcherTryStartTransport(dispatcher.get())); |
| 332 ASSERT_TRUE(transport.is_valid()); | 332 ASSERT_TRUE(transport.is_valid()); |
| 333 | 333 |
| 334 std::vector<DispatcherTransport> transports; | 334 std::vector<DispatcherTransport> transports; |
| 335 transports.push_back(transport); | 335 transports.push_back(transport); |
| 336 EXPECT_EQ(MOJO_RESULT_OK, | 336 EXPECT_EQ(MOJO_RESULT_OK, |
| 337 mp->WriteMessage(0, UserPointer<const void>(&go1[0]), | 337 mp->WriteMessage(0, UserPointer<const void>(&go1[0]), |
| 338 static_cast<uint32_t>(go1.size()), &transports, | 338 static_cast<uint32_t>(go1.size()), &transports, |
| 339 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 339 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 340 transport.End(); | 340 transport.End(); |
| 341 | 341 |
| 342 EXPECT_TRUE(dispatcher->HasOneRef()); | 342 dispatcher->AssertHasOneRef(); |
| 343 dispatcher = nullptr; | 343 dispatcher = nullptr; |
| 344 | 344 |
| 345 // Wait for a message from the child. | 345 // Wait for a message from the child. |
| 346 HandleSignalsState hss; | 346 HandleSignalsState hss; |
| 347 EXPECT_EQ(MOJO_RESULT_OK, | 347 EXPECT_EQ(MOJO_RESULT_OK, |
| 348 test::WaitIfNecessary(mp.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 348 test::WaitIfNecessary(mp.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 349 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 349 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 350 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 350 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 351 | 351 |
| 352 std::string read_buffer(100, '\0'); | 352 std::string read_buffer(100, '\0'); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 read_buffer.resize(num_bytes); | 418 read_buffer.resize(num_bytes); |
| 419 char hello[32]; | 419 char hello[32]; |
| 420 int num_handles = 0; | 420 int num_handles = 0; |
| 421 sscanf(read_buffer.c_str(), "%s %d", hello, &num_handles); | 421 sscanf(read_buffer.c_str(), "%s %d", hello, &num_handles); |
| 422 CHECK_EQ(std::string("hello"), std::string(hello)); | 422 CHECK_EQ(std::string("hello"), std::string(hello)); |
| 423 CHECK_GT(num_handles, 0); | 423 CHECK_GT(num_handles, 0); |
| 424 | 424 |
| 425 for (int i = 0; i < num_handles; ++i) { | 425 for (int i = 0; i < num_handles; ++i) { |
| 426 CHECK_EQ(dispatchers[i]->GetType(), Dispatcher::Type::PLATFORM_HANDLE); | 426 CHECK_EQ(dispatchers[i]->GetType(), Dispatcher::Type::PLATFORM_HANDLE); |
| 427 | 427 |
| 428 scoped_refptr<PlatformHandleDispatcher> dispatcher( | 428 RefPtr<PlatformHandleDispatcher> dispatcher( |
| 429 static_cast<PlatformHandleDispatcher*>(dispatchers[i].get())); | 429 static_cast<PlatformHandleDispatcher*>(dispatchers[i].get())); |
| 430 embedder::ScopedPlatformHandle h = dispatcher->PassPlatformHandle().Pass(); | 430 embedder::ScopedPlatformHandle h = dispatcher->PassPlatformHandle().Pass(); |
| 431 CHECK(h.is_valid()); | 431 CHECK(h.is_valid()); |
| 432 dispatcher->Close(); | 432 dispatcher->Close(); |
| 433 | 433 |
| 434 util::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h.Pass(), "r")); | 434 util::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h.Pass(), "r")); |
| 435 CHECK(fp); | 435 CHECK(fp); |
| 436 std::string fread_buffer(100, '\0'); | 436 std::string fread_buffer(100, '\0'); |
| 437 size_t bytes_read = | 437 size_t bytes_read = |
| 438 fread(&fread_buffer[0], 1, fread_buffer.size(), fp.get()); | 438 fread(&fread_buffer[0], 1, fread_buffer.size(), fp.get()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 449 | 449 |
| 450 TEST_P(MultiprocessMessagePipeTestWithPipeCount, PlatformHandlePassing) { | 450 TEST_P(MultiprocessMessagePipeTestWithPipeCount, PlatformHandlePassing) { |
| 451 mojo::test::ScopedTestDir test_dir; | 451 mojo::test::ScopedTestDir test_dir; |
| 452 | 452 |
| 453 helper()->StartChild("CheckPlatformHandleFile"); | 453 helper()->StartChild("CheckPlatformHandleFile"); |
| 454 | 454 |
| 455 RefPtr<ChannelEndpoint> ep; | 455 RefPtr<ChannelEndpoint> ep; |
| 456 auto mp = MessagePipe::CreateLocalProxy(&ep); | 456 auto mp = MessagePipe::CreateLocalProxy(&ep); |
| 457 Init(std::move(ep)); | 457 Init(std::move(ep)); |
| 458 | 458 |
| 459 std::vector<scoped_refptr<PlatformHandleDispatcher>> dispatchers; | 459 std::vector<RefPtr<PlatformHandleDispatcher>> dispatchers; |
| 460 std::vector<DispatcherTransport> transports; | 460 std::vector<DispatcherTransport> transports; |
| 461 | 461 |
| 462 size_t pipe_count = GetParam(); | 462 size_t pipe_count = GetParam(); |
| 463 for (size_t i = 0; i < pipe_count; ++i) { | 463 for (size_t i = 0; i < pipe_count; ++i) { |
| 464 util::ScopedFILE fp(test_dir.CreateFile()); | 464 util::ScopedFILE fp(test_dir.CreateFile()); |
| 465 const std::string world("world"); | 465 const std::string world("world"); |
| 466 CHECK_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size()); | 466 CHECK_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size()); |
| 467 fflush(fp.get()); | 467 fflush(fp.get()); |
| 468 rewind(fp.get()); | 468 rewind(fp.get()); |
| 469 | 469 |
| 470 scoped_refptr<PlatformHandleDispatcher> dispatcher = | 470 auto dispatcher = |
| 471 PlatformHandleDispatcher::Create(embedder::ScopedPlatformHandle( | 471 PlatformHandleDispatcher::Create(embedder::ScopedPlatformHandle( |
| 472 mojo::test::PlatformHandleFromFILE(fp.Pass()))); | 472 mojo::test::PlatformHandleFromFILE(fp.Pass()))); |
| 473 dispatchers.push_back(dispatcher); | 473 dispatchers.push_back(dispatcher); |
| 474 DispatcherTransport transport( | 474 DispatcherTransport transport( |
| 475 test::DispatcherTryStartTransport(dispatcher.get())); | 475 test::DispatcherTryStartTransport(dispatcher.get())); |
| 476 ASSERT_TRUE(transport.is_valid()); | 476 ASSERT_TRUE(transport.is_valid()); |
| 477 transports.push_back(transport); | 477 transports.push_back(transport); |
| 478 } | 478 } |
| 479 | 479 |
| 480 char message[128]; | 480 char message[128]; |
| 481 sprintf(message, "hello %d", static_cast<int>(pipe_count)); | 481 sprintf(message, "hello %d", static_cast<int>(pipe_count)); |
| 482 EXPECT_EQ(MOJO_RESULT_OK, | 482 EXPECT_EQ(MOJO_RESULT_OK, |
| 483 mp->WriteMessage(0, UserPointer<const void>(message), | 483 mp->WriteMessage(0, UserPointer<const void>(message), |
| 484 static_cast<uint32_t>(strlen(message)), | 484 static_cast<uint32_t>(strlen(message)), |
| 485 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 485 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 486 | 486 |
| 487 for (size_t i = 0; i < pipe_count; ++i) { | 487 for (size_t i = 0; i < pipe_count; ++i) { |
| 488 transports[i].End(); | 488 transports[i].End(); |
| 489 EXPECT_TRUE(dispatchers[i]->HasOneRef()); | 489 dispatchers[i]->AssertHasOneRef(); |
| 490 } | 490 } |
| 491 | 491 |
| 492 dispatchers.clear(); | 492 dispatchers.clear(); |
| 493 | 493 |
| 494 // Wait for it to become readable, which should fail. | 494 // Wait for it to become readable, which should fail. |
| 495 HandleSignalsState hss; | 495 HandleSignalsState hss; |
| 496 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 496 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 497 test::WaitIfNecessary(mp.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 497 test::WaitIfNecessary(mp.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 498 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 498 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 499 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 499 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 500 | 500 |
| 501 mp->Close(0); | 501 mp->Close(0); |
| 502 | 502 |
| 503 EXPECT_EQ(0, helper()->WaitForChildShutdown()); | 503 EXPECT_EQ(0, helper()->WaitForChildShutdown()); |
| 504 } | 504 } |
| 505 | 505 |
| 506 // Android multi-process tests are not executing the new process. This is flaky. | 506 // Android multi-process tests are not executing the new process. This is flaky. |
| 507 #if !defined(OS_ANDROID) | 507 #if !defined(OS_ANDROID) |
| 508 INSTANTIATE_TEST_CASE_P(PipeCount, | 508 INSTANTIATE_TEST_CASE_P(PipeCount, |
| 509 MultiprocessMessagePipeTestWithPipeCount, | 509 MultiprocessMessagePipeTestWithPipeCount, |
| 510 testing::Values(1u, 128u, 140u)); | 510 testing::Values(1u, 128u, 140u)); |
| 511 #endif | 511 #endif |
| 512 | 512 |
| 513 } // namespace | 513 } // namespace |
| 514 } // namespace system | 514 } // namespace system |
| 515 } // namespace mojo | 515 } // namespace mojo |
| OLD | NEW |