Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: mojo/edk/system/multiprocess_message_pipe_unittest.cc

Issue 1946763002: EDK: Add MojoHandleRights to DispatcherTransport. (Closed) Base URL: https://github.com/domokit/mojo.git@work788_edk_handle_10
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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>
11 #include <utility> 11 #include <utility>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "build/build_config.h" // TODO(vtl): Remove this. 15 #include "build/build_config.h" // TODO(vtl): Remove this.
16 #include "mojo/edk/embedder/simple_platform_support.h" 16 #include "mojo/edk/embedder/simple_platform_support.h"
17 #include "mojo/edk/platform/platform_handle_utils_posix.h" 17 #include "mojo/edk/platform/platform_handle_utils_posix.h"
18 #include "mojo/edk/platform/platform_shared_buffer.h" 18 #include "mojo/edk/platform/platform_shared_buffer.h"
19 #include "mojo/edk/platform/scoped_platform_handle.h" 19 #include "mojo/edk/platform/scoped_platform_handle.h"
20 #include "mojo/edk/system/channel.h" 20 #include "mojo/edk/system/channel.h"
21 #include "mojo/edk/system/dispatcher.h" 21 #include "mojo/edk/system/dispatcher.h"
22 #include "mojo/edk/system/handle.h"
22 #include "mojo/edk/system/handle_transport.h" 23 #include "mojo/edk/system/handle_transport.h"
23 #include "mojo/edk/system/message_pipe.h" 24 #include "mojo/edk/system/message_pipe.h"
24 #include "mojo/edk/system/message_pipe_test_utils.h" 25 #include "mojo/edk/system/message_pipe_test_utils.h"
25 #include "mojo/edk/system/platform_handle_dispatcher.h" 26 #include "mojo/edk/system/platform_handle_dispatcher.h"
26 #include "mojo/edk/system/raw_channel.h" 27 #include "mojo/edk/system/raw_channel.h"
27 #include "mojo/edk/system/shared_buffer_dispatcher.h" 28 #include "mojo/edk/system/shared_buffer_dispatcher.h"
28 #include "mojo/edk/system/test/scoped_test_dir.h" 29 #include "mojo/edk/system/test/scoped_test_dir.h"
29 #include "mojo/edk/util/ref_ptr.h" 30 #include "mojo/edk/util/ref_ptr.h"
30 #include "mojo/edk/util/scoped_file.h" 31 #include "mojo/edk/util/scoped_file.h"
31 #include "testing/gtest/include/gtest/gtest.h" 32 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 auto mp = MessagePipe::CreateLocalProxy(&ep); 317 auto mp = MessagePipe::CreateLocalProxy(&ep);
317 Init(std::move(ep)); 318 Init(std::move(ep));
318 319
319 // Make a shared buffer. 320 // Make a shared buffer.
320 MojoResult result = MOJO_RESULT_INTERNAL; 321 MojoResult result = MOJO_RESULT_INTERNAL;
321 auto dispatcher = SharedBufferDispatcher::Create( 322 auto dispatcher = SharedBufferDispatcher::Create(
322 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, 323 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100,
323 &result); 324 &result);
324 EXPECT_EQ(MOJO_RESULT_OK, result); 325 EXPECT_EQ(MOJO_RESULT_OK, result);
325 ASSERT_TRUE(dispatcher); 326 ASSERT_TRUE(dispatcher);
327 Handle handle(std::move(dispatcher),
328 MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_TRANSFER |
329 MOJO_HANDLE_RIGHT_READ | MOJO_HANDLE_RIGHT_WRITE);
326 330
327 // Make a mapping. 331 // Make a mapping.
328 std::unique_ptr<PlatformSharedBufferMapping> mapping; 332 std::unique_ptr<PlatformSharedBufferMapping> mapping;
329 EXPECT_EQ(MOJO_RESULT_OK, 333 EXPECT_EQ(MOJO_RESULT_OK, handle.dispatcher->MapBuffer(
330 dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); 334 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
331 ASSERT_TRUE(mapping); 335 ASSERT_TRUE(mapping);
332 ASSERT_TRUE(mapping->GetBase()); 336 ASSERT_TRUE(mapping->GetBase());
333 ASSERT_EQ(100u, mapping->GetLength()); 337 ASSERT_EQ(100u, mapping->GetLength());
334 338
335 // Send the shared buffer. 339 // Send the shared buffer.
336 const std::string go1("go 1"); 340 const std::string go1("go 1");
337 DispatcherTransport transport( 341 DispatcherTransport transport(test::HandleTryStartTransport(handle));
338 test::DispatcherTryStartTransport(dispatcher.get()));
339 ASSERT_TRUE(transport.is_valid()); 342 ASSERT_TRUE(transport.is_valid());
340 343
341 std::vector<DispatcherTransport> transports; 344 std::vector<DispatcherTransport> transports;
342 transports.push_back(transport); 345 transports.push_back(transport);
343 EXPECT_EQ(MOJO_RESULT_OK, 346 EXPECT_EQ(MOJO_RESULT_OK,
344 mp->WriteMessage(0, UserPointer<const void>(&go1[0]), 347 mp->WriteMessage(0, UserPointer<const void>(&go1[0]),
345 static_cast<uint32_t>(go1.size()), &transports, 348 static_cast<uint32_t>(go1.size()), &transports,
346 MOJO_WRITE_MESSAGE_FLAG_NONE)); 349 MOJO_WRITE_MESSAGE_FLAG_NONE));
347 transport.End(); 350 transport.End();
348 351
349 EXPECT_TRUE(dispatcher->HasOneRef()); 352 EXPECT_TRUE(handle.dispatcher->HasOneRef());
350 dispatcher = nullptr; 353 handle.reset();
351 354
352 // Wait for a message from the child. 355 // Wait for a message from the child.
353 HandleSignalsState hss; 356 HandleSignalsState hss;
354 EXPECT_EQ(MOJO_RESULT_OK, 357 EXPECT_EQ(MOJO_RESULT_OK,
355 test::WaitIfNecessary(mp.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss)); 358 test::WaitIfNecessary(mp.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
356 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 359 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
357 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 360 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
358 361
359 std::string read_buffer(100, '\0'); 362 std::string read_buffer(100, '\0');
360 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); 363 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 460
458 TEST_P(MultiprocessMessagePipeTestWithPipeCount, PlatformHandlePassing) { 461 TEST_P(MultiprocessMessagePipeTestWithPipeCount, PlatformHandlePassing) {
459 test::ScopedTestDir test_dir; 462 test::ScopedTestDir test_dir;
460 463
461 helper()->StartChild("CheckPlatformHandleFile"); 464 helper()->StartChild("CheckPlatformHandleFile");
462 465
463 RefPtr<ChannelEndpoint> ep; 466 RefPtr<ChannelEndpoint> ep;
464 auto mp = MessagePipe::CreateLocalProxy(&ep); 467 auto mp = MessagePipe::CreateLocalProxy(&ep);
465 Init(std::move(ep)); 468 Init(std::move(ep));
466 469
467 std::vector<RefPtr<PlatformHandleDispatcher>> dispatchers; 470 std::vector<Handle> handles;
468 std::vector<DispatcherTransport> transports; 471 std::vector<DispatcherTransport> transports;
469 472
470 size_t pipe_count = GetParam(); 473 size_t pipe_count = GetParam();
471 for (size_t i = 0; i < pipe_count; ++i) { 474 for (size_t i = 0; i < pipe_count; ++i) {
472 util::ScopedFILE fp(test_dir.CreateFile()); 475 util::ScopedFILE fp(test_dir.CreateFile());
473 const std::string world("world"); 476 const std::string world("world");
474 CHECK_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size()); 477 CHECK_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size());
475 fflush(fp.get()); 478 fflush(fp.get());
476 rewind(fp.get()); 479 rewind(fp.get());
477 480
478 auto dispatcher = PlatformHandleDispatcher::Create( 481 Handle handle(PlatformHandleDispatcher::Create(ScopedPlatformHandle(
479 ScopedPlatformHandle(PlatformHandleFromFILE(std::move(fp)))); 482 PlatformHandleFromFILE(std::move(fp)))),
480 dispatchers.push_back(dispatcher); 483 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
484 MOJO_HANDLE_RIGHT_WRITE);
485 handles.push_back(std::move(handle));
481 DispatcherTransport transport( 486 DispatcherTransport transport(
482 test::DispatcherTryStartTransport(dispatcher.get())); 487 test::HandleTryStartTransport(handles.back()));
483 ASSERT_TRUE(transport.is_valid()); 488 ASSERT_TRUE(transport.is_valid());
484 transports.push_back(transport); 489 transports.push_back(transport);
485 } 490 }
486 491
487 char message[128]; 492 char message[128];
488 sprintf(message, "hello %d", static_cast<int>(pipe_count)); 493 sprintf(message, "hello %d", static_cast<int>(pipe_count));
489 EXPECT_EQ(MOJO_RESULT_OK, 494 EXPECT_EQ(MOJO_RESULT_OK,
490 mp->WriteMessage(0, UserPointer<const void>(message), 495 mp->WriteMessage(0, UserPointer<const void>(message),
491 static_cast<uint32_t>(strlen(message)), 496 static_cast<uint32_t>(strlen(message)),
492 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE)); 497 &transports, MOJO_WRITE_MESSAGE_FLAG_NONE));
493 498
494 for (size_t i = 0; i < pipe_count; ++i) { 499 for (size_t i = 0; i < pipe_count; ++i) {
495 transports[i].End(); 500 transports[i].End();
496 EXPECT_TRUE(dispatchers[i]->HasOneRef()); 501 EXPECT_TRUE(handles[i].dispatcher->HasOneRef());
497 } 502 }
498 503
499 dispatchers.clear(); 504 handles.clear();
500 505
501 // Wait for it to become readable, which should fail. 506 // Wait for it to become readable, which should fail.
502 HandleSignalsState hss; 507 HandleSignalsState hss;
503 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 508 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
504 test::WaitIfNecessary(mp.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss)); 509 test::WaitIfNecessary(mp.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
505 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 510 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
506 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 511 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
507 512
508 mp->Close(0); 513 mp->Close(0);
509 514
510 EXPECT_EQ(0, helper()->WaitForChildShutdown()); 515 EXPECT_EQ(0, helper()->WaitForChildShutdown());
511 } 516 }
512 517
513 // Android multi-process tests are not executing the new process. This is flaky. 518 // Android multi-process tests are not executing the new process. This is flaky.
514 #if !defined(OS_ANDROID) 519 #if !defined(OS_ANDROID)
515 INSTANTIATE_TEST_CASE_P(PipeCount, 520 INSTANTIATE_TEST_CASE_P(PipeCount,
516 MultiprocessMessagePipeTestWithPipeCount, 521 MultiprocessMessagePipeTestWithPipeCount,
517 testing::Values(1u, 128u, 140u)); 522 testing::Values(1u, 128u, 140u));
518 #endif 523 #endif
519 524
520 } // namespace 525 } // namespace
521 } // namespace system 526 } // namespace system
522 } // namespace mojo 527 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/ipc_support_unittest.cc ('k') | mojo/edk/system/platform_handle_dispatcher_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698