blob: b1553ed19b40fd18255d95a2f2aae475c4111057 [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/media_router_base.h"
#include "base/functional/bind.h"
#include "base/test/mock_callback.h"
#include "components/media_router/browser/test/mock_media_router.h"
#include "components/media_router/browser/test/test_helper.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using blink::mojom::PresentationConnectionState;
using testing::_;
using testing::SaveArg;
namespace media_router {
// MockMediaRouterBase inherits from MediaRouter but overrides some of its
// methods with mock methods, so we must override them again.
class MockMediaRouterBase : public MockMediaRouter {
public:
MockMediaRouterBase() = default;
~MockMediaRouterBase() override = default;
base::CallbackListSubscription AddPresentationConnectionStateChangedCallback(
const MediaRoute::Id& route_id,
const content::PresentationConnectionStateChangedCallback& callback)
override {
return MediaRouterBase::AddPresentationConnectionStateChangedCallback(
route_id, callback);
}
};
class MediaRouterBaseTest : public testing::Test {
public:
void SetUp() override { router_.Initialize(); }
void TearDown() override { router_.Shutdown(); }
protected:
content::BrowserTaskEnvironment task_environment_;
MockMediaRouterBase router_;
};
TEST_F(MediaRouterBaseTest, CreatePresentationIds) {
std::string id1 = MediaRouterBase::CreatePresentationId();
std::string id2 = MediaRouterBase::CreatePresentationId();
EXPECT_NE(id1, "");
EXPECT_NE(id2, "");
EXPECT_NE(id1, id2);
}
TEST_F(MediaRouterBaseTest, NotifyCallbacks) {
MediaRoute::Id route_id1("id1");
MediaRoute::Id route_id2("id2");
base::MockCallback<content::PresentationConnectionStateChangedCallback>
callback1;
base::MockCallback<content::PresentationConnectionStateChangedCallback>
callback2;
base::CallbackListSubscription subscription1 =
router_.AddPresentationConnectionStateChangedCallback(route_id1,
callback1.Get());
base::CallbackListSubscription subscription2 =
router_.AddPresentationConnectionStateChangedCallback(route_id2,
callback2.Get());
content::PresentationConnectionStateChangeInfo change_info_connected(
PresentationConnectionState::CONNECTED);
content::PresentationConnectionStateChangeInfo change_info_terminated(
PresentationConnectionState::TERMINATED);
content::PresentationConnectionStateChangeInfo change_info_closed(
PresentationConnectionState::CLOSED);
change_info_closed.close_reason =
blink::mojom::PresentationConnectionCloseReason::WENT_AWAY;
change_info_closed.message = "Test message";
EXPECT_CALL(callback1, Run(StateChangeInfoEquals(change_info_connected)));
router_.NotifyPresentationConnectionStateChange(
route_id1, PresentationConnectionState::CONNECTED);
EXPECT_CALL(callback2, Run(StateChangeInfoEquals(change_info_connected)));
router_.NotifyPresentationConnectionStateChange(
route_id2, PresentationConnectionState::CONNECTED);
EXPECT_CALL(callback1, Run(StateChangeInfoEquals(change_info_closed)));
router_.NotifyPresentationConnectionClose(
route_id1, change_info_closed.close_reason, change_info_closed.message);
// After removing a subscription, the corresponding callback should no longer
// be called.
subscription1 = {};
router_.NotifyPresentationConnectionStateChange(
route_id1, PresentationConnectionState::TERMINATED);
EXPECT_CALL(callback2, Run(StateChangeInfoEquals(change_info_terminated)));
router_.NotifyPresentationConnectionStateChange(
route_id2, PresentationConnectionState::TERMINATED);
subscription2 = {};
router_.NotifyPresentationConnectionStateChange(
route_id2, PresentationConnectionState::TERMINATED);
}
} // namespace media_router