aboutsummaryrefslogtreecommitdiff
path: root/cast/common/channel/virtual_connection_router_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cast/common/channel/virtual_connection_router_unittest.cc')
-rw-r--r--cast/common/channel/virtual_connection_router_unittest.cc248
1 files changed, 200 insertions, 48 deletions
diff --git a/cast/common/channel/virtual_connection_router_unittest.cc b/cast/common/channel/virtual_connection_router_unittest.cc
index 6b1f0055..b05d10e3 100644
--- a/cast/common/channel/virtual_connection_router_unittest.cc
+++ b/cast/common/channel/virtual_connection_router_unittest.cc
@@ -4,6 +4,9 @@
#include "cast/common/channel/virtual_connection_router.h"
+#include <utility>
+
+#include "cast/common/channel/message_util.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"
@@ -19,35 +22,43 @@ namespace {
using ::cast::channel::CastMessage;
using ::testing::_;
using ::testing::Invoke;
+using ::testing::SaveArg;
+using ::testing::WithArg;
class VirtualConnectionRouterTest : public ::testing::Test {
public:
void SetUp() override {
- socket_ = fake_cast_socket_pair_.socket.get();
- router_.TakeSocket(&mock_error_handler_,
- std::move(fake_cast_socket_pair_.socket));
+ local_socket_ = fake_cast_socket_pair_.socket.get();
+ local_router_.TakeSocket(&mock_error_handler_,
+ std::move(fake_cast_socket_pair_.socket));
+
+ remote_socket_ = fake_cast_socket_pair_.peer_socket.get();
+ remote_router_.TakeSocket(&mock_error_handler_,
+ std::move(fake_cast_socket_pair_.peer_socket));
}
protected:
- CastSocket& peer_socket() { return *fake_cast_socket_pair_.peer_socket; }
-
FakeCastSocketPair fake_cast_socket_pair_;
- CastSocket* socket_;
+ CastSocket* local_socket_;
+ CastSocket* remote_socket_;
MockSocketErrorHandler mock_error_handler_;
- MockCastMessageHandler mock_message_handler_;
- VirtualConnectionManager manager_;
- VirtualConnectionRouter router_{&manager_};
+ VirtualConnectionManager local_manager_;
+ VirtualConnectionRouter local_router_{&local_manager_};
+
+ VirtualConnectionManager remote_manager_;
+ VirtualConnectionRouter remote_router_{&remote_manager_};
};
} // namespace
TEST_F(VirtualConnectionRouterTest, LocalIdHandler) {
- router_.AddHandlerForLocalId("receiver-1234", &mock_message_handler_);
- manager_.AddConnection(
- VirtualConnection{"receiver-1234", "sender-9873", socket_->socket_id()},
- {});
+ MockCastMessageHandler mock_message_handler;
+ local_router_.AddHandlerForLocalId("receiver-1234", &mock_message_handler);
+ local_manager_.AddConnection(VirtualConnection{"receiver-1234", "sender-9873",
+ local_socket_->socket_id()},
+ {});
CastMessage message;
message.set_protocol_version(
@@ -57,22 +68,25 @@ TEST_F(VirtualConnectionRouterTest, LocalIdHandler) {
message.set_destination_id("receiver-1234");
message.set_payload_type(CastMessage::STRING);
message.set_payload_utf8("cnlybnq");
- EXPECT_CALL(mock_message_handler_, OnMessage(_, socket_, _));
- EXPECT_TRUE(peer_socket().Send(message).ok());
+ EXPECT_CALL(mock_message_handler, OnMessage(_, local_socket_, _));
+ EXPECT_TRUE(remote_socket_->Send(message).ok());
- EXPECT_CALL(mock_message_handler_, OnMessage(_, socket_, _));
- EXPECT_TRUE(peer_socket().Send(message).ok());
+ EXPECT_CALL(mock_message_handler, OnMessage(_, local_socket_, _));
+ EXPECT_TRUE(remote_socket_->Send(message).ok());
message.set_destination_id("receiver-4321");
- EXPECT_CALL(mock_message_handler_, OnMessage(_, _, _)).Times(0);
- EXPECT_TRUE(peer_socket().Send(message).ok());
+ EXPECT_CALL(mock_message_handler, OnMessage(_, _, _)).Times(0);
+ EXPECT_TRUE(remote_socket_->Send(message).ok());
+
+ local_router_.RemoveHandlerForLocalId("receiver-1234");
}
TEST_F(VirtualConnectionRouterTest, RemoveLocalIdHandler) {
- router_.AddHandlerForLocalId("receiver-1234", &mock_message_handler_);
- manager_.AddConnection(
- VirtualConnection{"receiver-1234", "sender-9873", socket_->socket_id()},
- {});
+ MockCastMessageHandler mock_message_handler;
+ local_router_.AddHandlerForLocalId("receiver-1234", &mock_message_handler);
+ local_manager_.AddConnection(VirtualConnection{"receiver-1234", "sender-9873",
+ local_socket_->socket_id()},
+ {});
CastMessage message;
message.set_protocol_version(
@@ -82,18 +96,27 @@ TEST_F(VirtualConnectionRouterTest, RemoveLocalIdHandler) {
message.set_destination_id("receiver-1234");
message.set_payload_type(CastMessage::STRING);
message.set_payload_utf8("cnlybnq");
- EXPECT_CALL(mock_message_handler_, OnMessage(_, socket_, _));
- EXPECT_TRUE(peer_socket().Send(message).ok());
+ EXPECT_CALL(mock_message_handler, OnMessage(_, local_socket_, _));
+ EXPECT_TRUE(remote_socket_->Send(message).ok());
+
+ local_router_.RemoveHandlerForLocalId("receiver-1234");
- router_.RemoveHandlerForLocalId("receiver-1234");
+ EXPECT_CALL(mock_message_handler, OnMessage(_, local_socket_, _)).Times(0);
+ EXPECT_TRUE(remote_socket_->Send(message).ok());
- EXPECT_CALL(mock_message_handler_, OnMessage(_, socket_, _)).Times(0);
- EXPECT_TRUE(peer_socket().Send(message).ok());
+ local_router_.RemoveHandlerForLocalId("receiver-1234");
}
TEST_F(VirtualConnectionRouterTest, SendMessage) {
- manager_.AddConnection(
- VirtualConnection{"receiver-1234", "sender-4321", socket_->socket_id()},
+ local_manager_.AddConnection(VirtualConnection{"receiver-1234", "sender-4321",
+ local_socket_->socket_id()},
+ {});
+
+ MockCastMessageHandler destination;
+ remote_router_.AddHandlerForLocalId("sender-4321", &destination);
+ remote_manager_.AddConnection(
+ VirtualConnection{"sender-4321", "receiver-1234",
+ remote_socket_->socket_id()},
{});
CastMessage message;
@@ -104,30 +127,159 @@ TEST_F(VirtualConnectionRouterTest, SendMessage) {
message.set_destination_id("sender-4321");
message.set_payload_type(CastMessage::STRING);
message.set_payload_utf8("cnlybnq");
- EXPECT_CALL(fake_cast_socket_pair_.mock_peer_client, OnMessage(_, _))
- .WillOnce(Invoke([](CastSocket* socket, CastMessage message) {
- EXPECT_EQ(message.namespace_(), "zrqvn");
- EXPECT_EQ(message.source_id(), "receiver-1234");
- EXPECT_EQ(message.destination_id(), "sender-4321");
- ASSERT_EQ(message.payload_type(),
- ::cast::channel::CastMessage_PayloadType_STRING);
- EXPECT_EQ(message.payload_utf8(), "cnlybnq");
- }));
- router_.Send(
- VirtualConnection{"receiver-1234", "sender-4321", socket_->socket_id()},
- std::move(message));
+ ASSERT_TRUE(message.IsInitialized());
+
+ EXPECT_CALL(destination, OnMessage(&remote_router_, remote_socket_, _))
+ .WillOnce(
+ WithArg<2>(Invoke([&message](CastMessage message_at_destination) {
+ ASSERT_TRUE(message_at_destination.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(),
+ message_at_destination.SerializeAsString());
+ })));
+ local_router_.Send(VirtualConnection{"receiver-1234", "sender-4321",
+ local_socket_->socket_id()},
+ message);
}
TEST_F(VirtualConnectionRouterTest, CloseSocketRemovesVirtualConnections) {
- manager_.AddConnection(
- VirtualConnection{"receiver-1234", "sender-4321", socket_->socket_id()},
- {});
+ local_manager_.AddConnection(VirtualConnection{"receiver-1234", "sender-4321",
+ local_socket_->socket_id()},
+ {});
+
+ EXPECT_CALL(mock_error_handler_, OnClose(local_socket_)).Times(1);
- int id = socket_->socket_id();
- router_.CloseSocket(id);
- EXPECT_FALSE(manager_.GetConnectionData(
+ int id = local_socket_->socket_id();
+ local_router_.CloseSocket(id);
+ EXPECT_FALSE(local_manager_.GetConnectionData(
VirtualConnection{"receiver-1234", "sender-4321", id}));
}
+// Tests that VirtualConnectionRouter::Send() broadcasts a message from a local
+// source to both: 1) all other local peers; and 2) all remote peers.
+TEST_F(VirtualConnectionRouterTest, BroadcastsFromLocalSource) {
+ // Local peers.
+ MockCastMessageHandler alice, bob;
+ local_router_.AddHandlerForLocalId("alice", &alice);
+ local_router_.AddHandlerForLocalId("bob", &bob);
+
+ // Remote peers.
+ MockCastMessageHandler charlie, dave, eve;
+ remote_router_.AddHandlerForLocalId("charlie", &charlie);
+ remote_router_.AddHandlerForLocalId("dave", &dave);
+ remote_router_.AddHandlerForLocalId("eve", &eve);
+
+ // The local broadcaster, which should never receive her own messages.
+ MockCastMessageHandler wendy;
+ local_router_.AddHandlerForLocalId("wendy", &wendy);
+ EXPECT_CALL(wendy, OnMessage(_, _, _)).Times(0);
+
+ CastMessage message;
+ message.set_protocol_version(
+ ::cast::channel::CastMessage_ProtocolVersion_CASTV2_1_0);
+ message.set_namespace_("zrqvn");
+ message.set_payload_type(CastMessage::STRING);
+ message.set_payload_utf8("cnlybnq");
+
+ CastMessage message_alice_got, message_bob_got, message_charlie_got,
+ message_dave_got, message_eve_got;
+ EXPECT_CALL(alice, OnMessage(&local_router_, nullptr, _))
+ .WillOnce(SaveArg<2>(&message_alice_got))
+ .RetiresOnSaturation();
+ EXPECT_CALL(bob, OnMessage(&local_router_, nullptr, _))
+ .WillOnce(SaveArg<2>(&message_bob_got))
+ .RetiresOnSaturation();
+ EXPECT_CALL(charlie, OnMessage(&remote_router_, remote_socket_, _))
+ .WillOnce(SaveArg<2>(&message_charlie_got))
+ .RetiresOnSaturation();
+ EXPECT_CALL(dave, OnMessage(&remote_router_, remote_socket_, _))
+ .WillOnce(SaveArg<2>(&message_dave_got))
+ .RetiresOnSaturation();
+ EXPECT_CALL(eve, OnMessage(&remote_router_, remote_socket_, _))
+ .WillOnce(SaveArg<2>(&message_eve_got))
+ .RetiresOnSaturation();
+ ASSERT_TRUE(local_router_.BroadcastFromLocalPeer("wendy", message).ok());
+
+ // Confirm message data is correct.
+ message.set_source_id("wendy");
+ message.set_destination_id(kBroadcastId);
+ ASSERT_TRUE(message.IsInitialized());
+ ASSERT_TRUE(message_alice_got.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(), message_alice_got.SerializeAsString());
+ ASSERT_TRUE(message_bob_got.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(), message_bob_got.SerializeAsString());
+ ASSERT_TRUE(message_charlie_got.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(),
+ message_charlie_got.SerializeAsString());
+ ASSERT_TRUE(message_dave_got.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(), message_dave_got.SerializeAsString());
+ ASSERT_TRUE(message_eve_got.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(), message_eve_got.SerializeAsString());
+
+ // Remove one local peer and one remote peer, and confirm only the correct
+ // entities receive a broadcast message.
+ local_router_.RemoveHandlerForLocalId("bob");
+ remote_router_.RemoveHandlerForLocalId("charlie");
+ EXPECT_CALL(alice, OnMessage(&local_router_, nullptr, _)).Times(1);
+ EXPECT_CALL(bob, OnMessage(_, _, _)).Times(0);
+ EXPECT_CALL(charlie, OnMessage(_, _, _)).Times(0);
+ EXPECT_CALL(dave, OnMessage(&remote_router_, remote_socket_, _)).Times(1);
+ EXPECT_CALL(eve, OnMessage(&remote_router_, remote_socket_, _)).Times(1);
+ ASSERT_TRUE(local_router_.BroadcastFromLocalPeer("wendy", message).ok());
+}
+
+// Tests that VirtualConnectionRouter::OnMessage() broadcasts a message from a
+// remote source to all local peers.
+TEST_F(VirtualConnectionRouterTest, BroadcastsFromRemoteSource) {
+ // Local peers.
+ MockCastMessageHandler alice, bob, charlie;
+ local_router_.AddHandlerForLocalId("alice", &alice);
+ local_router_.AddHandlerForLocalId("bob", &bob);
+ local_router_.AddHandlerForLocalId("charlie", &charlie);
+
+ // The remote broadcaster, which should never receive her own messages.
+ MockCastMessageHandler wendy;
+ remote_router_.AddHandlerForLocalId("wendy", &wendy);
+ EXPECT_CALL(wendy, OnMessage(_, _, _)).Times(0);
+
+ CastMessage message;
+ message.set_protocol_version(
+ ::cast::channel::CastMessage_ProtocolVersion_CASTV2_1_0);
+ message.set_namespace_("zrqvn");
+ message.set_payload_type(CastMessage::STRING);
+ message.set_payload_utf8("cnlybnq");
+
+ CastMessage message_alice_got, message_bob_got, message_charlie_got;
+ EXPECT_CALL(alice, OnMessage(&local_router_, local_socket_, _))
+ .WillOnce(SaveArg<2>(&message_alice_got))
+ .RetiresOnSaturation();
+ EXPECT_CALL(bob, OnMessage(&local_router_, local_socket_, _))
+ .WillOnce(SaveArg<2>(&message_bob_got))
+ .RetiresOnSaturation();
+ EXPECT_CALL(charlie, OnMessage(&local_router_, local_socket_, _))
+ .WillOnce(SaveArg<2>(&message_charlie_got))
+ .RetiresOnSaturation();
+ ASSERT_TRUE(remote_router_.BroadcastFromLocalPeer("wendy", message).ok());
+
+ // Confirm message data is correct.
+ message.set_source_id("wendy");
+ message.set_destination_id(kBroadcastId);
+ ASSERT_TRUE(message.IsInitialized());
+ ASSERT_TRUE(message_alice_got.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(), message_alice_got.SerializeAsString());
+ ASSERT_TRUE(message_bob_got.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(), message_bob_got.SerializeAsString());
+ ASSERT_TRUE(message_charlie_got.IsInitialized());
+ EXPECT_EQ(message.SerializeAsString(),
+ message_charlie_got.SerializeAsString());
+
+ // Remove one local peer, and confirm only the two remaining local peers
+ // receive a broadcast message from the remote source.
+ local_router_.RemoveHandlerForLocalId("bob");
+ EXPECT_CALL(alice, OnMessage(&local_router_, local_socket_, _)).Times(1);
+ EXPECT_CALL(bob, OnMessage(_, _, _)).Times(0);
+ EXPECT_CALL(charlie, OnMessage(&local_router_, local_socket_, _)).Times(1);
+ ASSERT_TRUE(remote_router_.BroadcastFromLocalPeer("wendy", message).ok());
+}
+
} // namespace cast
} // namespace openscreen