blob: 7f4ce17edb1a04afd0476f1b9e775354dd663df7 [file] [log] [blame]
// Copyright 2019 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 "cast/common/channel/namespace_router.h"
#include <utility>
#include "cast/common/channel/cast_message_handler.h"
#include "cast/common/channel/proto/cast_channel.pb.h"
#include "cast/common/channel/testing/fake_cast_socket.h"
#include "cast/common/channel/testing/mock_cast_message_handler.h"
#include "cast/common/channel/virtual_connection_router.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
namespace openscreen {
namespace cast {
namespace {
using ::cast::channel::CastMessage;
using ::testing::_;
using ::testing::Invoke;
class NamespaceRouterTest : public ::testing::Test {
public:
protected:
CastSocket* socket() { return &fake_socket_.socket; }
FakeCastSocket fake_socket_;
VirtualConnectionRouter vc_router_;
NamespaceRouter router_;
};
} // namespace
TEST_F(NamespaceRouterTest, NoHandlersNoop) {
CastMessage message;
message.set_namespace_("anzrfcnpr");
router_.OnMessage(&vc_router_, socket(), std::move(message));
}
TEST_F(NamespaceRouterTest, MultipleHandlers) {
MockCastMessageHandler media_handler;
MockCastMessageHandler auth_handler;
MockCastMessageHandler connection_handler;
router_.AddNamespaceHandler("media", &media_handler);
router_.AddNamespaceHandler("auth", &auth_handler);
router_.AddNamespaceHandler("connection", &connection_handler);
EXPECT_CALL(media_handler, OnMessage(_, _, _)).Times(0);
EXPECT_CALL(auth_handler, OnMessage(_, _, _))
.WillOnce(Invoke([](VirtualConnectionRouter* router, CastSocket*,
CastMessage message) {
EXPECT_EQ(message.namespace_(), "auth");
}));
EXPECT_CALL(connection_handler, OnMessage(_, _, _))
.WillOnce(Invoke([](VirtualConnectionRouter* router, CastSocket*,
CastMessage message) {
EXPECT_EQ(message.namespace_(), "connection");
}));
CastMessage auth_message;
auth_message.set_namespace_("auth");
router_.OnMessage(&vc_router_, socket(), std::move(auth_message));
CastMessage connection_message;
connection_message.set_namespace_("connection");
router_.OnMessage(&vc_router_, socket(), std::move(connection_message));
}
TEST_F(NamespaceRouterTest, RemoveHandler) {
MockCastMessageHandler handler1;
MockCastMessageHandler handler2;
router_.AddNamespaceHandler("one", &handler1);
router_.AddNamespaceHandler("two", &handler2);
router_.RemoveNamespaceHandler("one");
EXPECT_CALL(handler1, OnMessage(_, _, _)).Times(0);
EXPECT_CALL(handler2, OnMessage(_, _, _))
.WillOnce(Invoke(
[](VirtualConnectionRouter* router, CastSocket* socket,
CastMessage message) { EXPECT_EQ("two", message.namespace_()); }));
CastMessage message1;
message1.set_namespace_("one");
router_.OnMessage(&vc_router_, socket(), std::move(message1));
CastMessage message2;
message2.set_namespace_("two");
router_.OnMessage(&vc_router_, socket(), std::move(message2));
}
} // namespace cast
} // namespace openscreen