OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 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 <vector> |
| 6 |
| 7 #include "base/bind.h" |
| 8 #include "chrome/browser/media/router/offscreen_presentation_manager.h" |
| 9 #include "chrome/browser/media/router/test_helper.h" |
| 10 #include "testing/gmock/include/gmock/gmock.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 |
| 13 using testing::_; |
| 14 |
| 15 namespace media_router { |
| 16 |
| 17 using OffscreenPresentationConnection = |
| 18 OffscreenPresentationManager::OffscreenPresentationConnection; |
| 19 |
| 20 namespace { |
| 21 const char kPresentationId[] = "presentationId"; |
| 22 |
| 23 } // namespace |
| 24 |
| 25 class OffscreenPresentationManagerTest : public ::testing::Test { |
| 26 public: |
| 27 void OnReceiverConnectionAvailable( |
| 28 std::unique_ptr<OffscreenPresentationConnection> connection) { |
| 29 ASSERT_TRUE(connection); |
| 30 receivers_.push_back(std::move(connection)); |
| 31 } |
| 32 |
| 33 OffscreenPresentationManager* manager() { return &manager_; } |
| 34 std::vector<std::unique_ptr<OffscreenPresentationConnection>>* receivers() { |
| 35 return &receivers_; |
| 36 } |
| 37 |
| 38 MockPresentationConnectionStateChangedCallback* |
| 39 mock_controller_state_change_callback() { |
| 40 return &mock_controller_state_change_callback_; |
| 41 } |
| 42 MockPresentationConnectionStateChangedCallback* |
| 43 mock_receiver_state_change_callback() { |
| 44 return &mock_receiver_state_change_callback_; |
| 45 } |
| 46 MockPresentationMessagesCallback* mock_controller_messages_callback() { |
| 47 return &mock_controller_messages_callback_; |
| 48 } |
| 49 MockPresentationMessagesCallback* mock_receiver_messages_callback() { |
| 50 return &mock_receiver_messages_callback_; |
| 51 } |
| 52 |
| 53 private: |
| 54 OffscreenPresentationManager manager_; |
| 55 std::vector<std::unique_ptr<OffscreenPresentationConnection>> receivers_; |
| 56 MockPresentationConnectionStateChangedCallback |
| 57 mock_controller_state_change_callback_; |
| 58 MockPresentationConnectionStateChangedCallback |
| 59 mock_receiver_state_change_callback_; |
| 60 MockPresentationMessagesCallback mock_controller_messages_callback_; |
| 61 MockPresentationMessagesCallback mock_receiver_messages_callback_; |
| 62 }; |
| 63 |
| 64 TEST_F(OffscreenPresentationManagerTest, RegisterReceiver) { |
| 65 RenderFrameHostId controller_rfh_id(123, 456); |
| 66 // Receiver hasn't registered yet. |
| 67 EXPECT_FALSE(manager()->ConnectToOffscreenPresentation(kPresentationId, |
| 68 controller_rfh_id)); |
| 69 |
| 70 manager()->RegisterOffscreenPresentationReceiver( |
| 71 kPresentationId, |
| 72 base::Bind( |
| 73 &OffscreenPresentationManagerTest::OnReceiverConnectionAvailable, |
| 74 base::Unretained(this))); |
| 75 |
| 76 // Registered receiver, but controller hasn't connected yet. |
| 77 EXPECT_EQ(0u, receivers()->size()); |
| 78 |
| 79 std::unique_ptr<OffscreenPresentationConnection> controller_connection = |
| 80 manager()->ConnectToOffscreenPresentation(kPresentationId, |
| 81 controller_rfh_id); |
| 82 EXPECT_TRUE(controller_connection); |
| 83 EXPECT_EQ(1u, receivers()->size()); |
| 84 |
| 85 // A frame can only have one OffscreenPresentationConnection at a time. |
| 86 EXPECT_FALSE(manager()->ConnectToOffscreenPresentation(kPresentationId, |
| 87 controller_rfh_id)); |
| 88 |
| 89 RenderFrameHostId controller_rfh_id2(234, 567); |
| 90 std::unique_ptr<OffscreenPresentationConnection> controller_connection2 = |
| 91 manager()->ConnectToOffscreenPresentation(kPresentationId, |
| 92 controller_rfh_id2); |
| 93 EXPECT_TRUE(controller_connection2); |
| 94 EXPECT_EQ(2u, receivers()->size()); |
| 95 |
| 96 // All connections must be destroyed before unregistering receiver. |
| 97 receivers()->clear(); |
| 98 manager()->UnregisterOffscreenPresentationReceiver(kPresentationId); |
| 99 |
| 100 // Receiver has unregistered, so controller can't connect anymore. |
| 101 RenderFrameHostId controller_rfh_id3(345, 678); |
| 102 EXPECT_FALSE(manager()->ConnectToOffscreenPresentation(kPresentationId, |
| 103 controller_rfh_id3)); |
| 104 } |
| 105 |
| 106 TEST_F(OffscreenPresentationManagerTest, ReceiverListenForStateChange) { |
| 107 manager()->RegisterOffscreenPresentationReceiver( |
| 108 kPresentationId, |
| 109 base::Bind( |
| 110 &OffscreenPresentationManagerTest::OnReceiverConnectionAvailable, |
| 111 base::Unretained(this))); |
| 112 |
| 113 RenderFrameHostId controller_rfh_id(123, 456); |
| 114 std::unique_ptr<OffscreenPresentationConnection> controller_connection = |
| 115 manager()->ConnectToOffscreenPresentation(kPresentationId, |
| 116 controller_rfh_id); |
| 117 ASSERT_TRUE(controller_connection); |
| 118 ASSERT_EQ(1u, receivers()->size()); |
| 119 |
| 120 (*receivers())[0]->ListenForStateChange( |
| 121 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, |
| 122 base::Unretained(mock_receiver_state_change_callback()))); |
| 123 controller_connection->ListenForStateChange( |
| 124 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, |
| 125 base::Unretained(mock_controller_state_change_callback()))); |
| 126 |
| 127 content::PresentationConnectionStateChangeInfo info( |
| 128 content::PRESENTATION_CONNECTION_STATE_TERMINATED); |
| 129 EXPECT_CALL(*mock_receiver_state_change_callback(), |
| 130 Run(StateChageInfoEquals(info))); |
| 131 EXPECT_CALL(*mock_controller_state_change_callback(), Run(_)).Times(0); |
| 132 controller_connection->RemoveFromPresentation(info); |
| 133 } |
| 134 |
| 135 TEST_F(OffscreenPresentationManagerTest, ControllerListenForStateChange) { |
| 136 manager()->RegisterOffscreenPresentationReceiver( |
| 137 kPresentationId, |
| 138 base::Bind( |
| 139 &OffscreenPresentationManagerTest::OnReceiverConnectionAvailable, |
| 140 base::Unretained(this))); |
| 141 |
| 142 RenderFrameHostId controller_rfh_id(123, 456); |
| 143 std::unique_ptr<OffscreenPresentationConnection> controller_connection = |
| 144 manager()->ConnectToOffscreenPresentation(kPresentationId, |
| 145 controller_rfh_id); |
| 146 ASSERT_TRUE(controller_connection); |
| 147 ASSERT_EQ(1u, receivers()->size()); |
| 148 |
| 149 (*receivers())[0]->ListenForStateChange( |
| 150 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, |
| 151 base::Unretained(mock_receiver_state_change_callback()))); |
| 152 controller_connection->ListenForStateChange( |
| 153 base::Bind(&MockPresentationConnectionStateChangedCallback::Run, |
| 154 base::Unretained(mock_controller_state_change_callback()))); |
| 155 |
| 156 // Destroying an OffscreenPresentationConnection will automatically call |
| 157 // |RemoveFromPresentation|. |
| 158 content::PresentationConnectionStateChangeInfo info( |
| 159 content::PRESENTATION_CONNECTION_STATE_CLOSED); |
| 160 info.close_reason = content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY; |
| 161 EXPECT_CALL(*mock_controller_state_change_callback(), |
| 162 Run(StateChageInfoEquals(info))); |
| 163 EXPECT_CALL(*mock_receiver_state_change_callback(), Run(_)).Times(0); |
| 164 receivers()->clear(); |
| 165 } |
| 166 |
| 167 TEST_F(OffscreenPresentationManagerTest, ListenForAndSendMessages) { |
| 168 manager()->RegisterOffscreenPresentationReceiver( |
| 169 kPresentationId, |
| 170 base::Bind( |
| 171 &OffscreenPresentationManagerTest::OnReceiverConnectionAvailable, |
| 172 base::Unretained(this))); |
| 173 |
| 174 RenderFrameHostId controller_rfh_id(123, 456); |
| 175 std::unique_ptr<OffscreenPresentationConnection> controller_connection = |
| 176 manager()->ConnectToOffscreenPresentation(kPresentationId, |
| 177 controller_rfh_id); |
| 178 ASSERT_TRUE(controller_connection); |
| 179 ASSERT_EQ(1u, receivers()->size()); |
| 180 |
| 181 (*receivers())[0]->ListenForMessages( |
| 182 base::Bind(&MockPresentationMessagesCallback::OnMessagesReceived, |
| 183 base::Unretained(mock_receiver_messages_callback()))); |
| 184 controller_connection->ListenForMessages( |
| 185 base::Bind(&MockPresentationMessagesCallback::OnMessagesReceived, |
| 186 base::Unretained(mock_controller_messages_callback()))); |
| 187 |
| 188 std::string sender_message_text("from controller to receiver"); |
| 189 std::unique_ptr<content::PresentationSessionMessage> message( |
| 190 new content::PresentationSessionMessage( |
| 191 content::PresentationMessageType::TEXT)); |
| 192 message->message = sender_message_text; |
| 193 EXPECT_CALL(*mock_controller_messages_callback(), OnMessageSent(true)); |
| 194 EXPECT_CALL(*mock_receiver_messages_callback(), |
| 195 DoOnMessagesReceived(sender_message_text)); |
| 196 EXPECT_CALL(*mock_controller_messages_callback(), DoOnMessagesReceived(_)) |
| 197 .Times(0); |
| 198 controller_connection->SendMessage( |
| 199 std::move(message), |
| 200 base::Bind(&MockPresentationMessagesCallback::OnMessageSent, |
| 201 base::Unretained(mock_controller_messages_callback()))); |
| 202 EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations( |
| 203 mock_controller_messages_callback())); |
| 204 EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations( |
| 205 mock_receiver_messages_callback())); |
| 206 |
| 207 std::string receiver_message_text("from receiver to controller"); |
| 208 message.reset(new content::PresentationSessionMessage( |
| 209 content::PresentationMessageType::TEXT)); |
| 210 message->message = receiver_message_text; |
| 211 EXPECT_CALL(*mock_receiver_messages_callback(), OnMessageSent(true)); |
| 212 EXPECT_CALL(*mock_controller_messages_callback(), |
| 213 DoOnMessagesReceived(receiver_message_text)); |
| 214 EXPECT_CALL(*mock_receiver_messages_callback(), DoOnMessagesReceived(_)) |
| 215 .Times(0); |
| 216 (*receivers())[0]->SendMessage( |
| 217 std::move(message), |
| 218 base::Bind(&MockPresentationMessagesCallback::OnMessageSent, |
| 219 base::Unretained(mock_receiver_messages_callback()))); |
| 220 EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations( |
| 221 mock_controller_messages_callback())); |
| 222 EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations( |
| 223 mock_receiver_messages_callback())); |
| 224 |
| 225 // Can't send/receive messages after either side has left. |
| 226 receivers()->clear(); |
| 227 message.reset(new content::PresentationSessionMessage( |
| 228 content::PresentationMessageType::TEXT)); |
| 229 message->message = sender_message_text; |
| 230 EXPECT_CALL(*mock_controller_messages_callback(), OnMessageSent(false)); |
| 231 EXPECT_CALL(*mock_receiver_messages_callback(), DoOnMessagesReceived(_)) |
| 232 .Times(0); |
| 233 EXPECT_CALL(*mock_controller_messages_callback(), DoOnMessagesReceived(_)) |
| 234 .Times(0); |
| 235 controller_connection->SendMessage( |
| 236 std::move(message), |
| 237 base::Bind(&MockPresentationMessagesCallback::OnMessageSent, |
| 238 base::Unretained(mock_controller_messages_callback()))); |
| 239 } |
| 240 |
| 241 } // namespace media_router |
OLD | NEW |