| 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 "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |