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

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: 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_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);
360 361
361 // Write from port 0 (to port 1), to make port 1 readable. 362 // Write from port 0 (to port 1), to make port 1 readable.
362 buffer[0] = 123456789; 363 buffer[0] = 123456789;
363 EXPECT_EQ(MOJO_RESULT_OK, 364 EXPECT_EQ(MOJO_RESULT_OK,
364 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize, 365 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize,
365 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 366 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
366 367
367 // Port 1 should already be readable now. 368 // Port 1 should already be readable now.
368 waiter.Init(); 369 waiter.Init();
369 hss = HandleSignalsState(); 370 hss = HandleSignalsState();
370 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 371 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
371 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss)); 372 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, &hss));
372 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 373 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
373 hss.satisfied_signals); 374 hss.satisfied_signals);
374 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 375 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
375 hss.satisfiable_signals);
376 waiter.Init(); 376 waiter.Init();
377 hss = HandleSignalsState(); 377 hss = HandleSignalsState();
378 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 378 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
379 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE | 379 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE |
380 MOJO_HANDLE_SIGNAL_WRITABLE, 380 MOJO_HANDLE_SIGNAL_WRITABLE,
381 0, &hss)); 381 0, &hss));
382 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 382 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
383 hss.satisfied_signals); 383 hss.satisfied_signals);
384 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 384 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
385 hss.satisfiable_signals);
386 // ... and still writable. 385 // ... and still writable.
387 waiter.Init(); 386 waiter.Init();
388 hss = HandleSignalsState(); 387 hss = HandleSignalsState();
389 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 388 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
390 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss)); 389 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss));
391 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 390 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
392 hss.satisfied_signals); 391 hss.satisfied_signals);
393 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 392 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
394 hss.satisfiable_signals);
395 393
396 // Close port 0. 394 // Close port 0.
397 mp->Close(0); 395 mp->Close(0);
398 396
399 // Now port 1 should not be writable. 397 // Now port 1 should not be writable.
400 waiter.Init(); 398 waiter.Init();
401 hss = HandleSignalsState(); 399 hss = HandleSignalsState();
402 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 400 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
403 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); 401 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
404 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 402 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
405 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 403 hss.satisfied_signals);
404 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
405 hss.satisfiable_signals);
406 406
407 // But it should still be readable. 407 // But it should still be readable.
408 waiter.Init(); 408 waiter.Init();
409 hss = HandleSignalsState(); 409 hss = HandleSignalsState();
410 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 410 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
411 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); 411 mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss));
412 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 412 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
413 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 413 hss.satisfied_signals);
414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
415 hss.satisfiable_signals);
414 416
415 // Read from port 1. 417 // Read from port 1.
416 buffer[0] = 0; 418 buffer[0] = 0;
417 buffer_size = kBufferSize; 419 buffer_size = kBufferSize;
418 EXPECT_EQ(MOJO_RESULT_OK, 420 EXPECT_EQ(MOJO_RESULT_OK,
419 mp->ReadMessage(1, UserPointer<void>(buffer), 421 mp->ReadMessage(1, UserPointer<void>(buffer),
420 MakeUserPointer(&buffer_size), 0, nullptr, 422 MakeUserPointer(&buffer_size), 0, nullptr,
421 MOJO_READ_MESSAGE_FLAG_NONE)); 423 MOJO_READ_MESSAGE_FLAG_NONE));
422 EXPECT_EQ(123456789, buffer[0]); 424 EXPECT_EQ(123456789, buffer[0]);
423 425
(...skipping 29 matching lines...) Expand all
453 buffer[0] = 123456789; 455 buffer[0] = 123456789;
454 // Write from port 0 (to port 1), which should wake up the waiter. 456 // Write from port 0 (to port 1), which should wake up the waiter.
455 EXPECT_EQ(MOJO_RESULT_OK, 457 EXPECT_EQ(MOJO_RESULT_OK,
456 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize, 458 mp->WriteMessage(0, UserPointer<const void>(buffer), kBufferSize,
457 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 459 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
458 460
459 HandleSignalsState hss; 461 HandleSignalsState hss;
460 mp->RemoveWaiter(1, thread.waiter(), &hss); 462 mp->RemoveWaiter(1, thread.waiter(), &hss);
461 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
462 hss.satisfied_signals); 464 hss.satisfied_signals);
463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 465 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
464 hss.satisfiable_signals);
465 466
466 mp->Close(0); 467 mp->Close(0);
467 mp->Close(1); 468 mp->Close(1);
468 } // Joins |thread|. 469 } // Joins |thread|.
469 // The waiter should have woken up successfully. 470 // The waiter should have woken up successfully.
470 EXPECT_EQ(MOJO_RESULT_OK, result); 471 EXPECT_EQ(MOJO_RESULT_OK, result);
471 EXPECT_EQ(1u, context); 472 EXPECT_EQ(1u, context);
472 473
473 // Close to cancel waiter. 474 // Close to cancel waiter.
474 { 475 {
(...skipping 29 matching lines...) Expand all
504 nullptr)); 505 nullptr));
505 thread.Start(); 506 thread.Start();
506 507
507 // Close port 0 first -- this should wake the waiter up, since port 1 will 508 // Close port 0 first -- this should wake the waiter up, since port 1 will
508 // never be readable. 509 // never be readable.
509 mp->CancelAllWaiters(0); 510 mp->CancelAllWaiters(0);
510 mp->Close(0); 511 mp->Close(0);
511 512
512 HandleSignalsState hss; 513 HandleSignalsState hss;
513 mp->RemoveWaiter(1, thread.waiter(), &hss); 514 mp->RemoveWaiter(1, thread.waiter(), &hss);
514 EXPECT_EQ(0u, hss.satisfied_signals); 515 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
515 EXPECT_EQ(0u, hss.satisfiable_signals); 516 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
516 517
517 mp->CancelAllWaiters(1); 518 mp->CancelAllWaiters(1);
518 mp->Close(1); 519 mp->Close(1);
519 } // Joins |thread|. 520 } // Joins |thread|.
520 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); 521 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
521 EXPECT_EQ(3u, context); 522 EXPECT_EQ(3u, context);
522 } 523 }
523 524
524 } // namespace 525 } // namespace
525 } // namespace system 526 } // namespace system
526 } // namespace mojo 527 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698