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

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

Issue 1412283002: Convert mojo::system::Dispatcher to use our new refcounting stuff (instead of base's). (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: no change Created 5 years, 2 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>
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW
« no previous file with comments | « mojo/edk/system/message_pipe_dispatcher_unittest.cc ('k') | mojo/edk/system/platform_handle_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698