| Index: chrome/browser/media/router/offscreen_presentation_manager_unittest.cc
|
| diff --git a/chrome/browser/media/router/offscreen_presentation_manager_unittest.cc b/chrome/browser/media/router/offscreen_presentation_manager_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..84d47bd2e54ea7f59c193f6b56f7b5bd1cef4f5a
|
| --- /dev/null
|
| +++ b/chrome/browser/media/router/offscreen_presentation_manager_unittest.cc
|
| @@ -0,0 +1,241 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/bind.h"
|
| +#include "chrome/browser/media/router/offscreen_presentation_manager.h"
|
| +#include "chrome/browser/media/router/test_helper.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using testing::_;
|
| +
|
| +namespace media_router {
|
| +
|
| +using OffscreenPresentationConnection =
|
| + OffscreenPresentationManager::OffscreenPresentationConnection;
|
| +
|
| +namespace {
|
| +const char kPresentationId[] = "presentationId";
|
| +
|
| +} // namespace
|
| +
|
| +class OffscreenPresentationManagerTest : public ::testing::Test {
|
| + public:
|
| + void OnReceiverConnectionAvailable(
|
| + std::unique_ptr<OffscreenPresentationConnection> connection) {
|
| + ASSERT_TRUE(connection);
|
| + receivers_.push_back(std::move(connection));
|
| + }
|
| +
|
| + OffscreenPresentationManager* manager() { return &manager_; }
|
| + std::vector<std::unique_ptr<OffscreenPresentationConnection>>* receivers() {
|
| + return &receivers_;
|
| + }
|
| +
|
| + MockPresentationConnectionStateChangedCallback*
|
| + mock_controller_state_change_callback() {
|
| + return &mock_controller_state_change_callback_;
|
| + }
|
| + MockPresentationConnectionStateChangedCallback*
|
| + mock_receiver_state_change_callback() {
|
| + return &mock_receiver_state_change_callback_;
|
| + }
|
| + MockPresentationMessagesCallback* mock_controller_messages_callback() {
|
| + return &mock_controller_messages_callback_;
|
| + }
|
| + MockPresentationMessagesCallback* mock_receiver_messages_callback() {
|
| + return &mock_receiver_messages_callback_;
|
| + }
|
| +
|
| + private:
|
| + OffscreenPresentationManager manager_;
|
| + std::vector<std::unique_ptr<OffscreenPresentationConnection>> receivers_;
|
| + MockPresentationConnectionStateChangedCallback
|
| + mock_controller_state_change_callback_;
|
| + MockPresentationConnectionStateChangedCallback
|
| + mock_receiver_state_change_callback_;
|
| + MockPresentationMessagesCallback mock_controller_messages_callback_;
|
| + MockPresentationMessagesCallback mock_receiver_messages_callback_;
|
| +};
|
| +
|
| +TEST_F(OffscreenPresentationManagerTest, RegisterReceiver) {
|
| + RenderFrameHostId controller_rfh_id(123, 456);
|
| + // Receiver hasn't registered yet.
|
| + EXPECT_FALSE(manager()->ConnectToOffscreenPresentation(kPresentationId,
|
| + controller_rfh_id));
|
| +
|
| + manager()->RegisterOffscreenPresentationReceiver(
|
| + kPresentationId,
|
| + base::Bind(
|
| + &OffscreenPresentationManagerTest::OnReceiverConnectionAvailable,
|
| + base::Unretained(this)));
|
| +
|
| + // Registered receiver, but controller hasn't connected yet.
|
| + EXPECT_EQ(0u, receivers()->size());
|
| +
|
| + std::unique_ptr<OffscreenPresentationConnection> controller_connection =
|
| + manager()->ConnectToOffscreenPresentation(kPresentationId,
|
| + controller_rfh_id);
|
| + EXPECT_TRUE(controller_connection);
|
| + EXPECT_EQ(1u, receivers()->size());
|
| +
|
| + // A frame can only have one OffscreenPresentationConnection at a time.
|
| + EXPECT_FALSE(manager()->ConnectToOffscreenPresentation(kPresentationId,
|
| + controller_rfh_id));
|
| +
|
| + RenderFrameHostId controller_rfh_id2(234, 567);
|
| + std::unique_ptr<OffscreenPresentationConnection> controller_connection2 =
|
| + manager()->ConnectToOffscreenPresentation(kPresentationId,
|
| + controller_rfh_id2);
|
| + EXPECT_TRUE(controller_connection2);
|
| + EXPECT_EQ(2u, receivers()->size());
|
| +
|
| + // All connections must be destroyed before unregistering receiver.
|
| + receivers()->clear();
|
| + manager()->UnregisterOffscreenPresentationReceiver(kPresentationId);
|
| +
|
| + // Receiver has unregistered, so controller can't connect anymore.
|
| + RenderFrameHostId controller_rfh_id3(345, 678);
|
| + EXPECT_FALSE(manager()->ConnectToOffscreenPresentation(kPresentationId,
|
| + controller_rfh_id3));
|
| +}
|
| +
|
| +TEST_F(OffscreenPresentationManagerTest, ReceiverListenForStateChange) {
|
| + manager()->RegisterOffscreenPresentationReceiver(
|
| + kPresentationId,
|
| + base::Bind(
|
| + &OffscreenPresentationManagerTest::OnReceiverConnectionAvailable,
|
| + base::Unretained(this)));
|
| +
|
| + RenderFrameHostId controller_rfh_id(123, 456);
|
| + std::unique_ptr<OffscreenPresentationConnection> controller_connection =
|
| + manager()->ConnectToOffscreenPresentation(kPresentationId,
|
| + controller_rfh_id);
|
| + ASSERT_TRUE(controller_connection);
|
| + ASSERT_EQ(1u, receivers()->size());
|
| +
|
| + (*receivers())[0]->ListenForStateChange(
|
| + base::Bind(&MockPresentationConnectionStateChangedCallback::Run,
|
| + base::Unretained(mock_receiver_state_change_callback())));
|
| + controller_connection->ListenForStateChange(
|
| + base::Bind(&MockPresentationConnectionStateChangedCallback::Run,
|
| + base::Unretained(mock_controller_state_change_callback())));
|
| +
|
| + content::PresentationConnectionStateChangeInfo info(
|
| + content::PRESENTATION_CONNECTION_STATE_TERMINATED);
|
| + EXPECT_CALL(*mock_receiver_state_change_callback(),
|
| + Run(StateChageInfoEquals(info)));
|
| + EXPECT_CALL(*mock_controller_state_change_callback(), Run(_)).Times(0);
|
| + controller_connection->RemoveFromPresentation(info);
|
| +}
|
| +
|
| +TEST_F(OffscreenPresentationManagerTest, ControllerListenForStateChange) {
|
| + manager()->RegisterOffscreenPresentationReceiver(
|
| + kPresentationId,
|
| + base::Bind(
|
| + &OffscreenPresentationManagerTest::OnReceiverConnectionAvailable,
|
| + base::Unretained(this)));
|
| +
|
| + RenderFrameHostId controller_rfh_id(123, 456);
|
| + std::unique_ptr<OffscreenPresentationConnection> controller_connection =
|
| + manager()->ConnectToOffscreenPresentation(kPresentationId,
|
| + controller_rfh_id);
|
| + ASSERT_TRUE(controller_connection);
|
| + ASSERT_EQ(1u, receivers()->size());
|
| +
|
| + (*receivers())[0]->ListenForStateChange(
|
| + base::Bind(&MockPresentationConnectionStateChangedCallback::Run,
|
| + base::Unretained(mock_receiver_state_change_callback())));
|
| + controller_connection->ListenForStateChange(
|
| + base::Bind(&MockPresentationConnectionStateChangedCallback::Run,
|
| + base::Unretained(mock_controller_state_change_callback())));
|
| +
|
| + // Destroying an OffscreenPresentationConnection will automatically call
|
| + // |RemoveFromPresentation|.
|
| + content::PresentationConnectionStateChangeInfo info(
|
| + content::PRESENTATION_CONNECTION_STATE_CLOSED);
|
| + info.close_reason = content::PRESENTATION_CONNECTION_CLOSE_REASON_WENT_AWAY;
|
| + EXPECT_CALL(*mock_controller_state_change_callback(),
|
| + Run(StateChageInfoEquals(info)));
|
| + EXPECT_CALL(*mock_receiver_state_change_callback(), Run(_)).Times(0);
|
| + receivers()->clear();
|
| +}
|
| +
|
| +TEST_F(OffscreenPresentationManagerTest, ListenForAndSendMessages) {
|
| + manager()->RegisterOffscreenPresentationReceiver(
|
| + kPresentationId,
|
| + base::Bind(
|
| + &OffscreenPresentationManagerTest::OnReceiverConnectionAvailable,
|
| + base::Unretained(this)));
|
| +
|
| + RenderFrameHostId controller_rfh_id(123, 456);
|
| + std::unique_ptr<OffscreenPresentationConnection> controller_connection =
|
| + manager()->ConnectToOffscreenPresentation(kPresentationId,
|
| + controller_rfh_id);
|
| + ASSERT_TRUE(controller_connection);
|
| + ASSERT_EQ(1u, receivers()->size());
|
| +
|
| + (*receivers())[0]->ListenForMessages(
|
| + base::Bind(&MockPresentationMessagesCallback::OnMessagesReceived,
|
| + base::Unretained(mock_receiver_messages_callback())));
|
| + controller_connection->ListenForMessages(
|
| + base::Bind(&MockPresentationMessagesCallback::OnMessagesReceived,
|
| + base::Unretained(mock_controller_messages_callback())));
|
| +
|
| + std::string sender_message_text("from controller to receiver");
|
| + std::unique_ptr<content::PresentationSessionMessage> message(
|
| + new content::PresentationSessionMessage(
|
| + content::PresentationMessageType::TEXT));
|
| + message->message = sender_message_text;
|
| + EXPECT_CALL(*mock_controller_messages_callback(), OnMessageSent(true));
|
| + EXPECT_CALL(*mock_receiver_messages_callback(),
|
| + DoOnMessagesReceived(sender_message_text));
|
| + EXPECT_CALL(*mock_controller_messages_callback(), DoOnMessagesReceived(_))
|
| + .Times(0);
|
| + controller_connection->SendMessage(
|
| + std::move(message),
|
| + base::Bind(&MockPresentationMessagesCallback::OnMessageSent,
|
| + base::Unretained(mock_controller_messages_callback())));
|
| + EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(
|
| + mock_controller_messages_callback()));
|
| + EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(
|
| + mock_receiver_messages_callback()));
|
| +
|
| + std::string receiver_message_text("from receiver to controller");
|
| + message.reset(new content::PresentationSessionMessage(
|
| + content::PresentationMessageType::TEXT));
|
| + message->message = receiver_message_text;
|
| + EXPECT_CALL(*mock_receiver_messages_callback(), OnMessageSent(true));
|
| + EXPECT_CALL(*mock_controller_messages_callback(),
|
| + DoOnMessagesReceived(receiver_message_text));
|
| + EXPECT_CALL(*mock_receiver_messages_callback(), DoOnMessagesReceived(_))
|
| + .Times(0);
|
| + (*receivers())[0]->SendMessage(
|
| + std::move(message),
|
| + base::Bind(&MockPresentationMessagesCallback::OnMessageSent,
|
| + base::Unretained(mock_receiver_messages_callback())));
|
| + EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(
|
| + mock_controller_messages_callback()));
|
| + EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(
|
| + mock_receiver_messages_callback()));
|
| +
|
| + // Can't send/receive messages after either side has left.
|
| + receivers()->clear();
|
| + message.reset(new content::PresentationSessionMessage(
|
| + content::PresentationMessageType::TEXT));
|
| + message->message = sender_message_text;
|
| + EXPECT_CALL(*mock_controller_messages_callback(), OnMessageSent(false));
|
| + EXPECT_CALL(*mock_receiver_messages_callback(), DoOnMessagesReceived(_))
|
| + .Times(0);
|
| + EXPECT_CALL(*mock_controller_messages_callback(), DoOnMessagesReceived(_))
|
| + .Times(0);
|
| + controller_connection->SendMessage(
|
| + std::move(message),
|
| + base::Bind(&MockPresentationMessagesCallback::OnMessageSent,
|
| + base::Unretained(mock_controller_messages_callback())));
|
| +}
|
| +
|
| +} // namespace media_router
|
|
|