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

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

Issue 741503003: Adding MOJO_HANDLE_SIGNAL_PEER_CLOSED to be notified when a peer is closed. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Fix go formatting Created 6 years 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 "mojo/edk/system/message_pipe.h" 5 #include "mojo/edk/system/message_pipe.h"
6 6
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/threading/platform_thread.h" // For |Sleep()|. 8 #include "base/threading/platform_thread.h" // For |Sleep()|.
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "mojo/edk/system/waiter.h" 10 #include "mojo/edk/system/waiter.h"
11 #include "mojo/edk/system/waiter_test_utils.h" 11 #include "mojo/edk/system/waiter_test_utils.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
13 13
14 namespace mojo { 14 namespace mojo {
15 namespace system { 15 namespace system {
16 namespace { 16 namespace {
17 17
18 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
19 MOJO_HANDLE_SIGNAL_WRITABLE |
20 MOJO_HANDLE_SIGNAL_PEER_CLOSED;
21
18 // Tests: 22 // Tests:
19 // - only default flags 23 // - only default flags
20 // - reading messages from a port 24 // - reading messages from a port
21 // - when there are no/one/two messages available for that port 25 // - when there are no/one/two messages available for that port
22 // - with buffer size 0 (and null buffer) -- should get size 26 // - with buffer size 0 (and null buffer) -- should get size
23 // - with too-small buffer -- should get size 27 // - with too-small buffer -- should get size
24 // - also verify that buffers aren't modified when/where they shouldn't be 28 // - also verify that buffers aren't modified when/where they shouldn't be
25 // - writing messages to a port 29 // - writing messages to a port
26 // - in the obvious scenarios (as above) 30 // - in the obvious scenarios (as above)
27 // - to a port that's been closed 31 // - to a port that's been closed
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 int32_t buffer[1]; 332 int32_t buffer[1];
329 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 333 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
330 uint32_t buffer_size; 334 uint32_t buffer_size;
331 335
332 // Always writable (until the other port is closed). 336 // Always writable (until the other port is closed).
333 waiter.Init(); 337 waiter.Init();
334 hss = HandleSignalsState(); 338 hss = HandleSignalsState();
335 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 339 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
336 mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); 340 mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
337 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 341 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
338 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 342 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
339 hss.satisfiable_signals);
340 waiter.Init(); 343 waiter.Init();
341 hss = HandleSignalsState(); 344 hss = HandleSignalsState();
342 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 345 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
343 mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE | 346 mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE |
344 MOJO_HANDLE_SIGNAL_WRITABLE, 347 MOJO_HANDLE_SIGNAL_WRITABLE,
345 0, &hss)); 348 0, &hss));
346 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 349 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
347 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 350 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
348 hss.satisfiable_signals);
349 351
350 // Not yet readable. 352 // Not yet readable.
351 waiter.Init(); 353 waiter.Init();
352 ASSERT_EQ(MOJO_RESULT_OK, 354 ASSERT_EQ(MOJO_RESULT_OK,
353 mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); 355 mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr));
354 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 356 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
355 hss = HandleSignalsState(); 357 hss = HandleSignalsState();
356 mp->RemoveWaiter(0, &waiter, &hss); 358 mp->RemoveWaiter(0, &waiter, &hss);
357 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 359 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
358 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 360 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
359 hss.satisfiable_signals); 361
362 // The peer is not closed.
363 waiter.Init();
364 ASSERT_EQ(
365 MOJO_RESULT_OK,
366 mp->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 2, nullptr));
367 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
368 hss = HandleSignalsState();
369 mp->RemoveWaiter(0, &waiter, &hss);
370 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
371 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
360 372
361 // Write from port 0 (to port 1), to make port 1 readable. 373 // Write from port 0 (to port 1), to make port 1 readable.
362 buffer[0] = 123456789; 374 buffer[0] = 123456789;
363 EXPECT_EQ(MOJO_RESULT_OK, 375 EXPECT_EQ(MOJO_RESULT_OK,
364 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize, 376 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize,
365 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 377 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
366 378
367 // Port 1 should already be readable now. 379 // Port 1 should already be readable now.
368 waiter.Init(); 380 waiter.Init();
369 hss = HandleSignalsState(); 381 hss = HandleSignalsState();
370 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 382 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
371 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); 383 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss));
372 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 384 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
373 hss.satisfied_signals); 385 hss.satisfied_signals);
374 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 386 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
375 hss.satisfiable_signals);
376 waiter.Init(); 387 waiter.Init();
377 hss = HandleSignalsState(); 388 hss = HandleSignalsState();
378 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 389 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
379 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE | 390 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE |
380 MOJO_HANDLE_SIGNAL_WRITABLE, 391 MOJO_HANDLE_SIGNAL_WRITABLE,
381 0, &hss)); 392 0, &hss));
382 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 393 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
383 hss.satisfied_signals); 394 hss.satisfied_signals);
384 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 395 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
385 hss.satisfiable_signals);
386 // ... and still writable. 396 // ... and still writable.
387 waiter.Init(); 397 waiter.Init();
388 hss = HandleSignalsState(); 398 hss = HandleSignalsState();
389 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 399 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
390 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss)); 400 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
391 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 401 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
392 hss.satisfied_signals); 402 hss.satisfied_signals);
393 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 403 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
394 hss.satisfiable_signals);
395 404
396 // Close port 0. 405 // Close port 0.
397 mp->Close(0); 406 mp->Close(0);
398 407
399 // Now port 1 should not be writable. 408 // Port 1 should be signaled with peer closed.
409 waiter.Init();
410 hss = HandleSignalsState();
411 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
412 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 5, &hss));
413 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
414 hss.satisfied_signals);
415 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
416 hss.satisfiable_signals);
417
418 // Port 1 should not be writable.
400 waiter.Init(); 419 waiter.Init();
401 hss = HandleSignalsState(); 420 hss = HandleSignalsState();
402 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 421 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
403 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); 422 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss));
404 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 423 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
405 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 424 hss.satisfied_signals);
425 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
426 hss.satisfiable_signals);
406 427
407 // But it should still be readable. 428 // But it should still be readable.
408 waiter.Init(); 429 waiter.Init();
409 hss = HandleSignalsState(); 430 hss = HandleSignalsState();
410 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 431 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
411 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); 432 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, &hss));
412 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 433 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
413 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 434 hss.satisfied_signals);
435 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
436 hss.satisfiable_signals);
414 437
415 // Read from port 1. 438 // Read from port 1.
416 buffer[0] = 0; 439 buffer[0] = 0;
417 buffer_size = kBufferSize; 440 buffer_size = kBufferSize;
418 EXPECT_EQ(MOJO_RESULT_OK, 441 EXPECT_EQ(MOJO_RESULT_OK,
419 mp->ReadMessage(1, UserPointer<void>(buffer), 442 mp->ReadMessage(1, UserPointer<void>(buffer),
420 MakeUserPointer(&buffer_size), 0, nullptr, 443 MakeUserPointer(&buffer_size), 0, nullptr,
421 MOJO_READ_MESSAGE_FLAG_NONE)); 444 MOJO_READ_MESSAGE_FLAG_NONE));
422 EXPECT_EQ(123456789, buffer[0]); 445 EXPECT_EQ(123456789, buffer[0]);
423 446
424 // Now port 1 should no longer be readable. 447 // Now port 1 should no longer be readable.
425 waiter.Init(); 448 waiter.Init();
426 hss = HandleSignalsState(); 449 hss = HandleSignalsState();
427 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 450 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
428 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 6, nullptr)); 451 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, nullptr));
429 EXPECT_EQ(0u, hss.satisfied_signals); 452 EXPECT_EQ(0u, hss.satisfied_signals);
430 EXPECT_EQ(0u, hss.satisfiable_signals); 453 EXPECT_EQ(0u, hss.satisfiable_signals);
431 454
432 mp->Close(1); 455 mp->Close(1);
433 } 456 }
434 457
435 TEST(MessagePipeTest, ThreadedWaiting) { 458 TEST(MessagePipeTest, ThreadedWaiting) {
436 int32_t buffer[1]; 459 int32_t buffer[1];
437 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 460 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
438 461
(...skipping 14 matching lines...) Expand all
453 buffer[0] = 123456789; 476 buffer[0] = 123456789;
454 // Write from port 0 (to port 1), which should wake up the waiter. 477 // Write from port 0 (to port 1), which should wake up the waiter.
455 EXPECT_EQ(MOJO_RESULT_OK, 478 EXPECT_EQ(MOJO_RESULT_OK,
456 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize, 479 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize,
457 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 480 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
458 481
459 HandleSignalsState hss; 482 HandleSignalsState hss;
460 mp->RemoveWaiter(1, thread.waiter(), &hss); 483 mp->RemoveWaiter(1, thread.waiter(), &hss);
461 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 484 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
462 hss.satisfied_signals); 485 hss.satisfied_signals);
463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 486 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
464 hss.satisfiable_signals);
465 487
466 mp->Close(0); 488 mp->Close(0);
467 mp->Close(1); 489 mp->Close(1);
468 } // Joins |thread|. 490 } // Joins |thread|.
469 // The waiter should have woken up successfully. 491 // The waiter should have woken up successfully.
470 EXPECT_EQ(MOJO_RESULT_OK, result); 492 EXPECT_EQ(MOJO_RESULT_OK, result);
471 EXPECT_EQ(1u, context); 493 EXPECT_EQ(1u, context);
472 494
473 // Close to cancel waiter. 495 // Close to cancel waiter.
474 { 496 {
(...skipping 11 matching lines...) Expand all
486 mp->Close(1); 508 mp->Close(1);
487 509
488 // Port 1 is closed, so |Dispatcher::RemoveWaiter()| wouldn't call into the 510 // Port 1 is closed, so |Dispatcher::RemoveWaiter()| wouldn't call into the
489 // |MessagePipe| to remove any waiter. 511 // |MessagePipe| to remove any waiter.
490 512
491 mp->Close(0); 513 mp->Close(0);
492 } // Joins |thread|. 514 } // Joins |thread|.
493 EXPECT_EQ(MOJO_RESULT_CANCELLED, result); 515 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
494 EXPECT_EQ(2u, context); 516 EXPECT_EQ(2u, context);
495 517
518 // Close to cancel waiter using peer closed signal.
519 {
520 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal());
521 test::SimpleWaiterThread thread(&result, &context);
522
523 thread.waiter()->Init();
524 ASSERT_EQ(MOJO_RESULT_OK,
525 mp->AddWaiter(1, thread.waiter(), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
526 3, nullptr));
527 thread.Start();
528
529 // Close port 1 first -- this should result in the waiter being cancelled.
530 mp->CancelAllWaiters(1);
531 mp->Close(1);
532
533 // Port 1 is closed, so |Dispatcher::RemoveWaiter()| wouldn't call into the
534 // |MessagePipe| to remove any waiter.
535
536 mp->Close(0);
537 } // Joins |thread|.
538 EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
539 EXPECT_EQ(3u, context);
540
496 // Close to make waiter un-wake-up-able. 541 // Close to make waiter un-wake-up-able.
497 { 542 {
498 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal()); 543 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalLocal());
499 test::SimpleWaiterThread thread(&result, &context); 544 test::SimpleWaiterThread thread(&result, &context);
500 545
501 thread.waiter()->Init(); 546 thread.waiter()->Init();
502 ASSERT_EQ(MOJO_RESULT_OK, 547 ASSERT_EQ(MOJO_RESULT_OK,
503 mp->AddWaiter(1, thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3, 548 mp->AddWaiter(1, thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 4,
504 nullptr)); 549 nullptr));
505 thread.Start(); 550 thread.Start();
506 551
507 // Close port 0 first -- this should wake the waiter up, since port 1 will 552 // Close port 0 first -- this should wake the waiter up, since port 1 will
508 // never be readable. 553 // never be readable.
509 mp->CancelAllWaiters(0); 554 mp->CancelAllWaiters(0);
510 mp->Close(0); 555 mp->Close(0);
511 556
512 HandleSignalsState hss; 557 HandleSignalsState hss;
513 mp->RemoveWaiter(1, thread.waiter(), &hss); 558 mp->RemoveWaiter(1, thread.waiter(), &hss);
514 EXPECT_EQ(0u, hss.satisfied_signals); 559 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
515 EXPECT_EQ(0u, hss.satisfiable_signals); 560 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
516 561
517 mp->CancelAllWaiters(1); 562 mp->CancelAllWaiters(1);
518 mp->Close(1); 563 mp->Close(1);
519 } // Joins |thread|. 564 } // Joins |thread|.
520 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 565 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
521 EXPECT_EQ(3u, context); 566 EXPECT_EQ(4u, context);
522 } 567 }
523 568
524 } // namespace 569 } // namespace
525 } // namespace system 570 } // namespace system
526 } // namespace mojo 571 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/message_pipe_dispatcher_unittest.cc ('k') | mojo/edk/system/multiprocess_message_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698