blob: f744cbf9de152c283acc8b90733c2979264b06f1 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/media_router/browser/presentation/local_presentation_manager.h"
#include <utility>
#include "base/containers/contains.h"
#include "base/functional/bind.h"
#include "components/media_router/browser/test/test_helper.h"
#include "content/public/test/test_renderer_host.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
using blink::mojom::PresentationConnectionResultPtr;
using blink::mojom::PresentationInfo;
using testing::_;
namespace media_router {
namespace {
const char kPresentationId[] = "presentationId";
const char kPresentationId2[] = "presentationId2";
const char kPresentationUrl[] = "http://www.example.com/presentation.html";
} // namespace
class MockReceiverConnectionAvailableCallback {
public:
MOCK_METHOD1(OnReceiverConnectionAvailable,
void(PresentationConnectionResultPtr));
};
class LocalPresentationManagerTest : public content::RenderViewHostTestHarness {
public:
LocalPresentationManagerTest()
: render_frame_host_id_(1, 1),
presentation_info_(GURL(kPresentationUrl), kPresentationId),
route_("route_1", MediaSource("source_1"), "sink_1", "", false) {}
LocalPresentationManager* manager() { return &manager_; }
void VerifyPresentationsSize(size_t expected) {
EXPECT_EQ(expected, manager_.local_presentations_.size());
}
void VerifyControllerSize(size_t expected,
const std::string& presentationId) {
EXPECT_TRUE(base::Contains(manager_.local_presentations_, presentationId));
EXPECT_EQ(expected, manager_.local_presentations_[presentationId]
->pending_controllers_.size());
}
void RegisterController(
const std::string& presentation_id,
mojo::PendingRemote<blink::mojom::PresentationConnection> controller) {
RegisterController(
PresentationInfo(GURL(kPresentationUrl), presentation_id),
render_frame_host_id_, std::move(controller));
}
void RegisterController(
const content::GlobalRenderFrameHostId& render_frame_id,
mojo::PendingRemote<blink::mojom::PresentationConnection> controller) {
RegisterController(presentation_info_, render_frame_id,
std::move(controller));
}
void RegisterController(
mojo::PendingRemote<blink::mojom::PresentationConnection> controller) {
RegisterController(presentation_info_, render_frame_host_id_,
std::move(controller));
}
void RegisterController(
const PresentationInfo& presentation_info,
const content::GlobalRenderFrameHostId& render_frame_id,
mojo::PendingRemote<blink::mojom::PresentationConnection> controller) {
mojo::PendingReceiver<blink::mojom::PresentationConnection>
receiver_conn_receiver;
manager()->RegisterLocalPresentationController(
presentation_info, render_frame_id, std::move(controller),
std::move(receiver_conn_receiver), route_);
}
void RegisterReceiver(
MockReceiverConnectionAvailableCallback& receiver_callback) {
RegisterReceiver(kPresentationId, receiver_callback);
}
void RegisterReceiver(
const std::string& presentation_id,
MockReceiverConnectionAvailableCallback& receiver_callback) {
manager()->OnLocalPresentationReceiverCreated(
PresentationInfo(GURL(kPresentationUrl), presentation_id),
base::BindRepeating(&MockReceiverConnectionAvailableCallback::
OnReceiverConnectionAvailable,
base::Unretained(&receiver_callback)),
web_contents());
}
void UnregisterController(
const content::GlobalRenderFrameHostId& render_frame_id) {
manager()->UnregisterLocalPresentationController(kPresentationId,
render_frame_id);
}
void UnregisterController() {
manager()->UnregisterLocalPresentationController(kPresentationId,
render_frame_host_id_);
}
void UnregisterReceiver() {
manager()->OnLocalPresentationReceiverTerminated(kPresentationId);
}
private:
const content::GlobalRenderFrameHostId render_frame_host_id_;
const PresentationInfo presentation_info_;
LocalPresentationManager manager_;
MediaRoute route_;
};
TEST_F(LocalPresentationManagerTest, RegisterUnregisterController) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller;
RegisterController(std::move(controller));
VerifyPresentationsSize(1);
UnregisterController();
VerifyPresentationsSize(0);
}
TEST_F(LocalPresentationManagerTest, RegisterUnregisterReceiver) {
MockReceiverConnectionAvailableCallback receiver_callback;
RegisterReceiver(receiver_callback);
VerifyPresentationsSize(1);
UnregisterReceiver();
VerifyPresentationsSize(0);
}
TEST_F(LocalPresentationManagerTest, UnregisterNonexistentController) {
UnregisterController();
VerifyPresentationsSize(0);
}
TEST_F(LocalPresentationManagerTest, UnregisterNonexistentReceiver) {
UnregisterReceiver();
VerifyPresentationsSize(0);
}
TEST_F(LocalPresentationManagerTest,
RegisterMultipleControllersSamePresentation) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller1;
RegisterController(content::GlobalRenderFrameHostId(1, 1),
std::move(controller1));
mojo::PendingRemote<blink::mojom::PresentationConnection> controller2;
RegisterController(content::GlobalRenderFrameHostId(1, 2),
std::move(controller2));
VerifyPresentationsSize(1);
}
TEST_F(LocalPresentationManagerTest,
RegisterMultipleControllersDifferentPresentations) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller1;
RegisterController(kPresentationId, std::move(controller1));
mojo::PendingRemote<blink::mojom::PresentationConnection> controller2;
RegisterController(kPresentationId2, std::move(controller2));
VerifyPresentationsSize(2);
}
TEST_F(LocalPresentationManagerTest,
RegisterControllerThenReceiverInvokesCallback) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller;
MockReceiverConnectionAvailableCallback receiver_callback;
VerifyPresentationsSize(0);
RegisterController(std::move(controller));
EXPECT_CALL(receiver_callback, OnReceiverConnectionAvailable(_));
RegisterReceiver(receiver_callback);
}
TEST_F(LocalPresentationManagerTest,
UnregisterReceiverFromConnectedPresentation) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller;
MockReceiverConnectionAvailableCallback receiver_callback;
VerifyPresentationsSize(0);
RegisterController(std::move(controller));
EXPECT_CALL(receiver_callback, OnReceiverConnectionAvailable(_));
RegisterReceiver(receiver_callback);
UnregisterReceiver();
VerifyPresentationsSize(0);
}
TEST_F(LocalPresentationManagerTest,
UnregisterControllerFromConnectedPresentation) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller;
MockReceiverConnectionAvailableCallback receiver_callback;
VerifyPresentationsSize(0);
RegisterController(std::move(controller));
EXPECT_CALL(receiver_callback, OnReceiverConnectionAvailable(_));
RegisterReceiver(receiver_callback);
UnregisterController();
VerifyPresentationsSize(1);
}
TEST_F(LocalPresentationManagerTest,
UnregisterReceiverThenControllerFromConnectedPresentation) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller;
MockReceiverConnectionAvailableCallback receiver_callback;
VerifyPresentationsSize(0);
RegisterController(std::move(controller));
EXPECT_CALL(receiver_callback, OnReceiverConnectionAvailable(_));
RegisterReceiver(receiver_callback);
UnregisterReceiver();
UnregisterController();
VerifyPresentationsSize(0);
}
TEST_F(LocalPresentationManagerTest,
UnregisterControllerThenReceiverFromConnectedPresentation) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller;
MockReceiverConnectionAvailableCallback receiver_callback;
VerifyPresentationsSize(0);
RegisterController(std::move(controller));
EXPECT_CALL(receiver_callback, OnReceiverConnectionAvailable(_));
RegisterReceiver(receiver_callback);
UnregisterController();
UnregisterReceiver();
VerifyPresentationsSize(0);
}
TEST_F(LocalPresentationManagerTest,
RegisterTwoControllersThenReceiverInvokesCallbackTwice) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller1;
RegisterController(content::GlobalRenderFrameHostId(1, 1),
std::move(controller1));
mojo::PendingRemote<blink::mojom::PresentationConnection> controller2;
RegisterController(content::GlobalRenderFrameHostId(1, 2),
std::move(controller2));
MockReceiverConnectionAvailableCallback receiver_callback;
EXPECT_CALL(receiver_callback, OnReceiverConnectionAvailable(_)).Times(2);
RegisterReceiver(receiver_callback);
}
TEST_F(LocalPresentationManagerTest,
RegisterControllerReceiverConontrollerInvokesCallbackTwice) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller1;
RegisterController(content::GlobalRenderFrameHostId(1, 1),
std::move(controller1));
MockReceiverConnectionAvailableCallback receiver_callback;
EXPECT_CALL(receiver_callback, OnReceiverConnectionAvailable(_)).Times(2);
RegisterReceiver(receiver_callback);
mojo::PendingRemote<blink::mojom::PresentationConnection> controller2;
RegisterController(content::GlobalRenderFrameHostId(1, 2),
std::move(controller2));
}
TEST_F(LocalPresentationManagerTest,
UnregisterFirstControllerFromeConnectedPresentation) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller1;
RegisterController(content::GlobalRenderFrameHostId(1, 1),
std::move(controller1));
mojo::PendingRemote<blink::mojom::PresentationConnection> controller2;
RegisterController(content::GlobalRenderFrameHostId(1, 2),
std::move(controller2));
MockReceiverConnectionAvailableCallback receiver_callback;
EXPECT_CALL(receiver_callback, OnReceiverConnectionAvailable(_)).Times(2);
RegisterReceiver(receiver_callback);
UnregisterController(content::GlobalRenderFrameHostId(1, 1));
UnregisterController(content::GlobalRenderFrameHostId(1, 1));
VerifyPresentationsSize(1);
}
TEST_F(LocalPresentationManagerTest, TwoPresentations) {
mojo::PendingRemote<blink::mojom::PresentationConnection> controller1;
RegisterController(kPresentationId, std::move(controller1));
MockReceiverConnectionAvailableCallback receiver_callback1;
EXPECT_CALL(receiver_callback1, OnReceiverConnectionAvailable(_)).Times(1);
RegisterReceiver(kPresentationId, receiver_callback1);
mojo::PendingRemote<blink::mojom::PresentationConnection> controller2;
RegisterController(kPresentationId2, std::move(controller2));
MockReceiverConnectionAvailableCallback receiver_callback2;
EXPECT_CALL(receiver_callback2, OnReceiverConnectionAvailable(_)).Times(1);
RegisterReceiver(kPresentationId2, receiver_callback2);
VerifyPresentationsSize(2);
UnregisterReceiver();
VerifyPresentationsSize(1);
}
TEST_F(LocalPresentationManagerTest,
TestIsLocalPresentationWithPresentationId) {
EXPECT_FALSE(manager()->IsLocalPresentation(kPresentationId));
mojo::PendingRemote<blink::mojom::PresentationConnection> controller1;
RegisterController(kPresentationId, std::move(controller1));
EXPECT_TRUE(manager()->IsLocalPresentation(kPresentationId));
}
TEST_F(LocalPresentationManagerTest, TestIsLocalPresentationWithWebContents) {
EXPECT_FALSE(manager()->IsLocalPresentation(web_contents()));
MockReceiverConnectionAvailableCallback receiver_callback;
RegisterReceiver(receiver_callback);
EXPECT_TRUE(manager()->IsLocalPresentation(web_contents()));
}
TEST_F(LocalPresentationManagerTest, TestRegisterAndGetRoute) {
MediaSource source("source_1");
MediaRoute route("route_1", source, "sink_1", "", false);
EXPECT_FALSE(manager()->GetRoute(kPresentationId));
mojo::PendingRemote<blink::mojom::PresentationConnection> controller;
RegisterController(std::move(controller));
auto* actual_route = manager()->GetRoute(kPresentationId);
EXPECT_TRUE(actual_route);
EXPECT_EQ(route, *actual_route);
}
} // namespace media_router