Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 1 | // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "mojo/edk/system/channel_endpoint.h" |
| 6 | |
Viet-Trung Luu | 266a79f | 2015-09-18 08:27:48 -0700 | [diff] [blame] | 7 | #include <memory> |
| 8 | #include <utility> |
| 9 | |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 10 | #include "base/synchronization/waitable_event.h" |
Viet-Trung Luu | b7cd10b | 2015-10-30 09:47:47 -0700 | [diff] [blame^] | 11 | #include "base/time/time.h" |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 12 | #include "mojo/edk/system/channel_test_base.h" |
| 13 | #include "mojo/edk/system/message_in_transit_queue.h" |
Viet-Trung Luu | 5e139d6 | 2015-05-26 12:29:02 -0700 | [diff] [blame] | 14 | #include "mojo/edk/system/message_in_transit_test_utils.h" |
Viet-Trung Luu | 272228d | 2015-10-14 13:16:21 -0700 | [diff] [blame] | 15 | #include "mojo/edk/system/ref_ptr.h" |
Viet-Trung Luu | b7cd10b | 2015-10-30 09:47:47 -0700 | [diff] [blame^] | 16 | #include "mojo/edk/system/test/timeouts.h" |
Viet-Trung Luu | 5abda57 | 2015-05-27 11:14:42 -0700 | [diff] [blame] | 17 | #include "mojo/edk/system/test_channel_endpoint_client.h" |
Viet-Trung Luu | 7d5ced2 | 2015-06-24 15:21:39 -0700 | [diff] [blame] | 18 | #include "mojo/public/cpp/system/macros.h" |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 19 | |
| 20 | namespace mojo { |
| 21 | namespace system { |
| 22 | namespace { |
| 23 | |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 24 | class ChannelEndpointTest : public test::ChannelTestBase { |
| 25 | public: |
| 26 | ChannelEndpointTest() {} |
| 27 | ~ChannelEndpointTest() override {} |
| 28 | |
| 29 | void SetUp() override { |
| 30 | test::ChannelTestBase::SetUp(); |
| 31 | |
| 32 | PostMethodToIOThreadAndWait( |
Viet-Trung Luu | 4af4c9b | 2015-10-19 22:27:25 -0700 | [diff] [blame] | 33 | &ChannelEndpointTest::CreateAndInitChannelOnIOThread, 0); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 34 | PostMethodToIOThreadAndWait( |
Viet-Trung Luu | 4af4c9b | 2015-10-19 22:27:25 -0700 | [diff] [blame] | 35 | &ChannelEndpointTest::CreateAndInitChannelOnIOThread, 1); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 36 | } |
| 37 | |
| 38 | void TearDown() override { |
Viet-Trung Luu | 4af4c9b | 2015-10-19 22:27:25 -0700 | [diff] [blame] | 39 | PostMethodToIOThreadAndWait(&ChannelEndpointTest::ShutdownChannelOnIOThread, |
| 40 | 0); |
| 41 | PostMethodToIOThreadAndWait(&ChannelEndpointTest::ShutdownChannelOnIOThread, |
| 42 | 1); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 43 | |
| 44 | test::ChannelTestBase::TearDown(); |
| 45 | } |
| 46 | |
| 47 | private: |
Viet-Trung Luu | 7d5ced2 | 2015-06-24 15:21:39 -0700 | [diff] [blame] | 48 | MOJO_DISALLOW_COPY_AND_ASSIGN(ChannelEndpointTest); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 49 | }; |
| 50 | |
| 51 | TEST_F(ChannelEndpointTest, Basic) { |
Viet-Trung Luu | e111613 | 2015-10-15 12:22:40 -0700 | [diff] [blame] | 52 | auto client0 = MakeRefCounted<test::TestChannelEndpointClient>(); |
| 53 | auto endpoint0 = MakeRefCounted<ChannelEndpoint>(client0.Clone(), 0); |
Viet-Trung Luu | 272228d | 2015-10-14 13:16:21 -0700 | [diff] [blame] | 54 | client0->Init(0, endpoint0.Clone()); |
| 55 | channel(0)->SetBootstrapEndpoint(std::move(endpoint0)); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 56 | |
Viet-Trung Luu | e111613 | 2015-10-15 12:22:40 -0700 | [diff] [blame] | 57 | auto client1 = MakeRefCounted<test::TestChannelEndpointClient>(); |
| 58 | auto endpoint1 = MakeRefCounted<ChannelEndpoint>(client1.Clone(), 1); |
Viet-Trung Luu | 272228d | 2015-10-14 13:16:21 -0700 | [diff] [blame] | 59 | client1->Init(1, endpoint1.Clone()); |
| 60 | channel(1)->SetBootstrapEndpoint(endpoint1.Clone()); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 61 | |
| 62 | // We'll receive a message on channel/client 0. |
| 63 | base::WaitableEvent read_event(true, false); |
| 64 | client0->SetReadEvent(&read_event); |
| 65 | |
| 66 | // Make a test message. |
| 67 | unsigned message_id = 0x12345678; |
Viet-Trung Luu | 266a79f | 2015-09-18 08:27:48 -0700 | [diff] [blame] | 68 | std::unique_ptr<MessageInTransit> send_message = |
| 69 | test::MakeTestMessage(message_id); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 70 | // Check that our test utility works (at least in one direction). |
Viet-Trung Luu | 5e139d6 | 2015-05-26 12:29:02 -0700 | [diff] [blame] | 71 | test::VerifyTestMessage(send_message.get(), message_id); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 72 | |
| 73 | // Event shouldn't be signalled yet. |
| 74 | EXPECT_FALSE(read_event.IsSignaled()); |
| 75 | |
| 76 | // Send it through channel/endpoint 1. |
Viet-Trung Luu | 266a79f | 2015-09-18 08:27:48 -0700 | [diff] [blame] | 77 | EXPECT_TRUE(endpoint1->EnqueueMessage(std::move(send_message))); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 78 | |
| 79 | // Wait to receive it. |
Viet-Trung Luu | b7cd10b | 2015-10-30 09:47:47 -0700 | [diff] [blame^] | 80 | EXPECT_TRUE(read_event.TimedWait(base::TimeDelta::FromMicroseconds( |
| 81 | static_cast<int64_t>(test::TinyTimeout())))); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 82 | client0->SetReadEvent(nullptr); |
| 83 | |
| 84 | // Check the received message. |
| 85 | ASSERT_EQ(1u, client0->NumMessages()); |
Viet-Trung Luu | 266a79f | 2015-09-18 08:27:48 -0700 | [diff] [blame] | 86 | std::unique_ptr<MessageInTransit> read_message = client0->PopMessage(); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 87 | ASSERT_TRUE(read_message); |
Viet-Trung Luu | 5e139d6 | 2015-05-26 12:29:02 -0700 | [diff] [blame] | 88 | test::VerifyTestMessage(read_message.get(), message_id); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 89 | } |
| 90 | |
| 91 | // Checks that prequeued messages and messages sent at various stages later on |
| 92 | // are all sent/received (and in the correct order). (Note: Due to the way |
| 93 | // bootstrap endpoints work, the receiving side has to be set up first.) |
| 94 | TEST_F(ChannelEndpointTest, Prequeued) { |
Viet-Trung Luu | e111613 | 2015-10-15 12:22:40 -0700 | [diff] [blame] | 95 | auto client0 = MakeRefCounted<test::TestChannelEndpointClient>(); |
| 96 | auto endpoint0 = MakeRefCounted<ChannelEndpoint>(client0.Clone(), 0); |
Viet-Trung Luu | 272228d | 2015-10-14 13:16:21 -0700 | [diff] [blame] | 97 | client0->Init(0, endpoint0.Clone()); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 98 | |
Viet-Trung Luu | 272228d | 2015-10-14 13:16:21 -0700 | [diff] [blame] | 99 | channel(0)->SetBootstrapEndpoint(std::move(endpoint0)); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 100 | MessageInTransitQueue prequeued_messages; |
Viet-Trung Luu | 5e139d6 | 2015-05-26 12:29:02 -0700 | [diff] [blame] | 101 | prequeued_messages.AddMessage(test::MakeTestMessage(1)); |
| 102 | prequeued_messages.AddMessage(test::MakeTestMessage(2)); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 103 | |
Viet-Trung Luu | e111613 | 2015-10-15 12:22:40 -0700 | [diff] [blame] | 104 | auto client1 = MakeRefCounted<test::TestChannelEndpointClient>(); |
Viet-Trung Luu | 272228d | 2015-10-14 13:16:21 -0700 | [diff] [blame] | 105 | auto endpoint1 = |
Viet-Trung Luu | e111613 | 2015-10-15 12:22:40 -0700 | [diff] [blame] | 106 | MakeRefCounted<ChannelEndpoint>(client1.Clone(), 1, &prequeued_messages); |
Viet-Trung Luu | 272228d | 2015-10-14 13:16:21 -0700 | [diff] [blame] | 107 | client1->Init(1, endpoint1.Clone()); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 108 | |
Viet-Trung Luu | 5e139d6 | 2015-05-26 12:29:02 -0700 | [diff] [blame] | 109 | EXPECT_TRUE(endpoint1->EnqueueMessage(test::MakeTestMessage(3))); |
| 110 | EXPECT_TRUE(endpoint1->EnqueueMessage(test::MakeTestMessage(4))); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 111 | |
Viet-Trung Luu | 272228d | 2015-10-14 13:16:21 -0700 | [diff] [blame] | 112 | channel(1)->SetBootstrapEndpoint(endpoint1.Clone()); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 113 | |
Viet-Trung Luu | 5e139d6 | 2015-05-26 12:29:02 -0700 | [diff] [blame] | 114 | EXPECT_TRUE(endpoint1->EnqueueMessage(test::MakeTestMessage(5))); |
| 115 | EXPECT_TRUE(endpoint1->EnqueueMessage(test::MakeTestMessage(6))); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 116 | |
| 117 | // Wait for the messages. |
| 118 | base::WaitableEvent read_event(true, false); |
| 119 | client0->SetReadEvent(&read_event); |
| 120 | for (size_t i = 0; client0->NumMessages() < 6 && i < 6; i++) { |
Viet-Trung Luu | b7cd10b | 2015-10-30 09:47:47 -0700 | [diff] [blame^] | 121 | EXPECT_TRUE(read_event.TimedWait(base::TimeDelta::FromMicroseconds( |
| 122 | static_cast<int64_t>(test::TinyTimeout())))); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 123 | read_event.Reset(); |
| 124 | } |
| 125 | client0->SetReadEvent(nullptr); |
| 126 | |
| 127 | // Check the received messages. |
| 128 | ASSERT_EQ(6u, client0->NumMessages()); |
| 129 | for (unsigned message_id = 1; message_id <= 6; message_id++) { |
Viet-Trung Luu | 266a79f | 2015-09-18 08:27:48 -0700 | [diff] [blame] | 130 | std::unique_ptr<MessageInTransit> read_message = client0->PopMessage(); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 131 | ASSERT_TRUE(read_message); |
Viet-Trung Luu | 5e139d6 | 2015-05-26 12:29:02 -0700 | [diff] [blame] | 132 | test::VerifyTestMessage(read_message.get(), message_id); |
Viet-Trung Luu | b6d3b3c | 2015-05-26 10:36:20 -0700 | [diff] [blame] | 133 | } |
| 134 | } |
| 135 | |
| 136 | } // namespace |
| 137 | } // namespace system |
| 138 | } // namespace mojo |