OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/cast_channel/cast_socket_service.h" | 5 #include "components/cast_channel/cast_socket_service.h" |
| 6 #include "base/test/mock_callback.h" |
6 #include "components/cast_channel/cast_test_util.h" | 7 #include "components/cast_channel/cast_test_util.h" |
7 #include "content/public/test/test_browser_thread_bundle.h" | 8 #include "content/public/test/test_browser_thread_bundle.h" |
8 | 9 |
| 10 #include "testing/gmock/include/gmock/gmock.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
10 | 12 |
11 using testing::_; | 13 using testing::_; |
| 14 using testing::DoAll; |
| 15 using testing::Invoke; |
| 16 using testing::Return; |
12 using testing::SaveArg; | 17 using testing::SaveArg; |
13 | 18 |
14 namespace cast_channel { | 19 namespace cast_channel { |
15 | 20 |
16 class CastSocketServiceTest : public testing::Test { | 21 class CastSocketServiceTest : public testing::Test { |
17 public: | 22 public: |
18 CastSocketServiceTest() | 23 CastSocketServiceTest() |
19 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), | 24 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), |
20 cast_socket_service_(new CastSocketService()) {} | 25 cast_socket_service_(new CastSocketService()) {} |
21 | 26 |
| 27 int AddSocket(std::unique_ptr<CastSocket> socket) { |
| 28 return cast_socket_service_->AddSocketRecord( |
| 29 std::move(socket), mock_on_open_callback_.Get(), |
| 30 &pass_through_message_handler_); |
| 31 } |
| 32 |
| 33 void TearDown() override { cast_socket_service_ = nullptr; } |
| 34 |
22 protected: | 35 protected: |
23 content::TestBrowserThreadBundle thread_bundle_; | 36 content::TestBrowserThreadBundle thread_bundle_; |
24 scoped_refptr<CastSocketService> cast_socket_service_; | 37 scoped_refptr<CastSocketService> cast_socket_service_; |
| 38 base::MockCallback<CastSocketService::OnOpenCallback> mock_on_open_callback_; |
| 39 PassThroughMessageHandler pass_through_message_handler_; |
25 }; | 40 }; |
26 | 41 |
27 TEST_F(CastSocketServiceTest, TestAddSocket) { | 42 TEST_F(CastSocketServiceTest, TestAddSocket) { |
28 int channel_id_1 = 0; | |
29 auto socket1 = base::MakeUnique<MockCastSocket>(); | 43 auto socket1 = base::MakeUnique<MockCastSocket>(); |
30 EXPECT_CALL(*socket1, set_id(_)).WillOnce(SaveArg<0>(&channel_id_1)); | 44 int channel_id_1 = AddSocket(std::move(socket1)); |
31 | |
32 int channel_id = cast_socket_service_->AddSocket(std::move(socket1)); | |
33 EXPECT_EQ(channel_id_1, channel_id); | |
34 EXPECT_NE(0, channel_id_1); | 45 EXPECT_NE(0, channel_id_1); |
35 | 46 |
36 int channel_id_2 = 0; | |
37 auto socket2 = base::MakeUnique<MockCastSocket>(); | 47 auto socket2 = base::MakeUnique<MockCastSocket>(); |
38 EXPECT_CALL(*socket2, set_id(_)).WillOnce(SaveArg<0>(&channel_id_2)); | 48 auto* socket_ptr = socket2.get(); |
| 49 int channel_id_2 = AddSocket(std::move(socket2)); |
| 50 EXPECT_NE(channel_id_1, channel_id_2); |
| 51 EXPECT_CALL(mock_on_open_callback_, |
| 52 Run(channel_id_2, ChannelError::CONNECT_ERROR)); |
39 | 53 |
40 auto* socket_ptr = socket2.get(); | 54 auto removed_socket = cast_socket_service_->RemoveSocket(channel_id_2); |
41 channel_id = cast_socket_service_->AddSocket(std::move(socket2)); | |
42 EXPECT_EQ(channel_id_2, channel_id); | |
43 EXPECT_NE(channel_id_1, channel_id_2); | |
44 | |
45 auto removed_socket = cast_socket_service_->RemoveSocket(channel_id); | |
46 EXPECT_EQ(socket_ptr, removed_socket.get()); | 55 EXPECT_EQ(socket_ptr, removed_socket.get()); |
47 | 56 |
48 int channel_id_3 = 0; | |
49 auto socket3 = base::MakeUnique<MockCastSocket>(); | 57 auto socket3 = base::MakeUnique<MockCastSocket>(); |
50 EXPECT_CALL(*socket3, set_id(_)).WillOnce(SaveArg<0>(&channel_id_3)); | 58 int channel_id_3 = AddSocket(std::move(socket3)); |
51 | |
52 channel_id = cast_socket_service_->AddSocket(std::move(socket3)); | |
53 EXPECT_EQ(channel_id_3, channel_id); | |
54 EXPECT_NE(channel_id_1, channel_id_3); | 59 EXPECT_NE(channel_id_1, channel_id_3); |
55 EXPECT_NE(channel_id_2, channel_id_3); | 60 EXPECT_NE(channel_id_2, channel_id_3); |
56 } | 61 } |
57 | 62 |
58 TEST_F(CastSocketServiceTest, TestRemoveAndGetSocket) { | 63 TEST_F(CastSocketServiceTest, TestRemoveAndGetSocket) { |
59 int channel_id = 1; | 64 int channel_id = 1; |
60 auto* socket_ptr = cast_socket_service_->GetSocket(channel_id); | 65 auto* socket_ptr = cast_socket_service_->GetSocket(channel_id); |
61 EXPECT_FALSE(socket_ptr); | 66 EXPECT_FALSE(socket_ptr); |
62 auto socket = cast_socket_service_->RemoveSocket(channel_id); | 67 auto socket = cast_socket_service_->RemoveSocket(channel_id); |
63 EXPECT_FALSE(socket); | 68 EXPECT_FALSE(socket); |
64 | 69 |
65 auto mock_socket = base::MakeUnique<MockCastSocket>(); | 70 auto mock_socket = base::MakeUnique<MockCastSocket>(); |
66 EXPECT_CALL(*mock_socket, set_id(_)); | |
67 | 71 |
68 auto* mock_socket_ptr = mock_socket.get(); | 72 auto* mock_socket_ptr = mock_socket.get(); |
69 channel_id = cast_socket_service_->AddSocket(std::move(mock_socket)); | 73 channel_id = AddSocket(std::move(mock_socket)); |
70 EXPECT_EQ(mock_socket_ptr, cast_socket_service_->GetSocket(channel_id)); | 74 EXPECT_EQ(mock_socket_ptr, cast_socket_service_->GetSocket(channel_id)); |
| 75 EXPECT_CALL(mock_on_open_callback_, |
| 76 Run(channel_id, ChannelError::CONNECT_ERROR)); |
| 77 |
71 socket = cast_socket_service_->RemoveSocket(channel_id); | 78 socket = cast_socket_service_->RemoveSocket(channel_id); |
72 EXPECT_TRUE(socket); | 79 EXPECT_TRUE(socket); |
73 } | 80 } |
74 | 81 |
| 82 TEST_F(CastSocketServiceTest, TestOpenChannel) { |
| 83 base::Callback<void(ChannelError)> callback; |
| 84 auto socket = base::MakeUnique<MockCastSocket>(); |
| 85 EXPECT_CALL(*socket, ConnectRawPtr(_, _)).WillOnce(SaveArg<1>(&callback)); |
| 86 |
| 87 auto ip_endpoint = CreateIPEndPointForTest(); |
| 88 socket->SetIPEndpoint(ip_endpoint); |
| 89 cast_socket_service_->SetSocketForTest(std::move(socket)); |
| 90 |
| 91 base::MockCallback<CastSocketService::OnOpenCallback> mock_on_open_callback_; |
| 92 int channel_id = cast_socket_service_->OpenSocket( |
| 93 ip_endpoint, nullptr /* net_log */, mock_on_open_callback_.Get()); |
| 94 |
| 95 EXPECT_CALL(mock_on_open_callback_, Run(channel_id, ChannelError::NONE)); |
| 96 callback.Run(ChannelError::NONE); |
| 97 } |
| 98 |
| 99 TEST_F(CastSocketServiceTest, TestOpenChannelConnectingSocketExists) { |
| 100 base::Callback<void(ChannelError)> callback; |
| 101 auto socket = base::MakeUnique<MockCastSocket>(); |
| 102 |
| 103 EXPECT_CALL(*socket, ConnectRawPtr(_, _)).WillOnce(SaveArg<1>(&callback)); |
| 104 EXPECT_CALL(*socket, ready_state()).WillOnce(Return(ReadyState::CONNECTING)); |
| 105 |
| 106 auto ip_endpoint = CreateIPEndPointForTest(); |
| 107 socket->SetIPEndpoint(ip_endpoint); |
| 108 cast_socket_service_->SetSocketForTest(std::move(socket)); |
| 109 |
| 110 base::MockCallback<CastSocketService::OnOpenCallback> mock_on_open_callback_; |
| 111 int channel_id = cast_socket_service_->OpenSocket( |
| 112 ip_endpoint, nullptr /* net_log */, mock_on_open_callback_.Get()); |
| 113 // Stores pending OnOpen callback. |
| 114 int second_channel_id = cast_socket_service_->OpenSocket( |
| 115 ip_endpoint, nullptr /* net_log */, mock_on_open_callback_.Get()); |
| 116 |
| 117 EXPECT_EQ(channel_id, second_channel_id); |
| 118 |
| 119 // Invokes all pending callbacks. |
| 120 EXPECT_CALL(mock_on_open_callback_, Run(channel_id, ChannelError::NONE)) |
| 121 .Times(2); |
| 122 callback.Run(ChannelError::NONE); |
| 123 } |
| 124 |
| 125 TEST_F(CastSocketServiceTest, TestOpenChannelConnectedSocketExists) { |
| 126 auto socket = base::MakeUnique<MockCastSocket>(); |
| 127 |
| 128 EXPECT_CALL(*socket, ConnectRawPtr(_, _)); |
| 129 EXPECT_CALL(*socket, ready_state()).WillOnce(Return(ReadyState::OPEN)); |
| 130 |
| 131 auto ip_endpoint = CreateIPEndPointForTest(); |
| 132 socket->SetIPEndpoint(ip_endpoint); |
| 133 cast_socket_service_->SetSocketForTest(std::move(socket)); |
| 134 |
| 135 base::MockCallback<CastSocketService::OnOpenCallback> mock_on_open_callback_; |
| 136 int channel_id = cast_socket_service_->OpenSocket( |
| 137 ip_endpoint, nullptr /* net_log */, mock_on_open_callback_.Get()); |
| 138 |
| 139 // Invokes callback directly. |
| 140 EXPECT_CALL(mock_on_open_callback_, Run(channel_id, ChannelError::NONE)); |
| 141 int second_channel_id = cast_socket_service_->OpenSocket( |
| 142 ip_endpoint, nullptr /* net_log */, mock_on_open_callback_.Get()); |
| 143 |
| 144 EXPECT_EQ(channel_id, second_channel_id); |
| 145 } |
| 146 |
| 147 TEST_F(CastSocketServiceTest, TestOpenChannelClosedSocketExists) { |
| 148 auto socket1 = base::MakeUnique<MockCastSocket>(); |
| 149 |
| 150 EXPECT_CALL(*socket1, ConnectRawPtr(_, _)); |
| 151 EXPECT_CALL(*socket1, ready_state()).WillOnce(Return(ReadyState::CLOSED)); |
| 152 |
| 153 auto ip_endpoint = CreateIPEndPointForTest(); |
| 154 socket1->SetIPEndpoint(ip_endpoint); |
| 155 cast_socket_service_->SetSocketForTest(std::move(socket1)); |
| 156 |
| 157 base::MockCallback<CastSocketService::OnOpenCallback> mock_on_open_callback_; |
| 158 int channel_id = cast_socket_service_->OpenSocket( |
| 159 ip_endpoint, nullptr /* net_log */, mock_on_open_callback_.Get()); |
| 160 |
| 161 base::Callback<void(ChannelError)> callback2; |
| 162 auto socket2 = base::MakeUnique<MockCastSocket>(); |
| 163 |
| 164 EXPECT_CALL(*socket2, ConnectRawPtr(_, _)); |
| 165 cast_socket_service_->SetSocketForTest(std::move(socket2)); |
| 166 |
| 167 EXPECT_CALL(mock_on_open_callback_, |
| 168 Run(channel_id, ChannelError::CONNECT_ERROR)); |
| 169 // This call will release |socket1|. |
| 170 int second_channel_id = cast_socket_service_->OpenSocket( |
| 171 ip_endpoint, nullptr /* net_log */, mock_on_open_callback_.Get()); |
| 172 |
| 173 EXPECT_NE(channel_id, second_channel_id); |
| 174 } |
| 175 |
| 176 TEST_F(CastSocketServiceTest, TestRegisterDelegate) { |
| 177 EXPECT_FALSE(cast_socket_service_->RegisterDelegate( |
| 178 1, base::MakeUnique<MockCastTransportDelegate>())); |
| 179 |
| 180 auto socket = base::MakeUnique<MockCastSocket>(); |
| 181 int channel_id = AddSocket(std::move(socket)); |
| 182 |
| 183 auto* mock_delegate = new MockCastTransportDelegate(); |
| 184 EXPECT_TRUE(cast_socket_service_->RegisterDelegate( |
| 185 channel_id, base::WrapUnique(mock_delegate))); |
| 186 EXPECT_EQ(mock_delegate, pass_through_message_handler_.inner_delegate_.get()); |
| 187 } |
| 188 |
75 } // namespace cast_channel | 189 } // namespace cast_channel |
OLD | NEW |