libcast_socket_service_unittest.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/cast_channel/libcast_socket_service.h"
  5. #include "base/callback_helpers.h"
  6. #include "base/test/mock_callback.h"
  7. #include "components/cast_channel/cast_test_util.h"
  8. #include "components/openscreen_platform/network_util.h"
  9. #include "content/public/test/browser_task_environment.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. #include "third_party/openscreen/src/cast/common/channel/proto/cast_channel.pb.h"
  12. #include "third_party/openscreen/src/cast/common/channel/testing/fake_cast_socket.h"
  13. namespace cast_channel {
  14. namespace {
  15. using ::testing::_;
  16. void OpenCallback(base::RepeatingClosure cb,
  17. CastSocket** socket_save,
  18. CastSocket* socket) {
  19. *socket_save = socket;
  20. cb.Run();
  21. }
  22. } // namespace
  23. class LibcastSocketServiceTest : public ::testing::Test {
  24. protected:
  25. CastSocket* OpenSocket(std::unique_ptr<LibcastSocket> cast_socket,
  26. const net::IPEndPoint& endpoint) {
  27. socket_service_.SetLibcastSocketForTest(std::move(cast_socket));
  28. CastSocketOpenParams open_params(endpoint, base::Seconds(20));
  29. CastSocket* socket = nullptr;
  30. base::RunLoop run_loop;
  31. socket_service_.OpenSocket(
  32. base::BindRepeating(
  33. []() -> network::mojom::NetworkContext* { return nullptr; }),
  34. open_params,
  35. base::BindOnce(&OpenCallback, run_loop.QuitClosure(),
  36. base::Unretained(&socket)));
  37. run_loop.Run();
  38. return socket;
  39. }
  40. content::BrowserTaskEnvironment task_environment_;
  41. LibcastSocketService socket_service_;
  42. };
  43. TEST_F(LibcastSocketServiceTest, ChannelAddAndRemove) {
  44. openscreen::cast::FakeCastSocketPair pair1({{10, 0, 0, 7}, 2001},
  45. {{10, 0, 0, 20}, 9000});
  46. openscreen::cast::FakeCastSocketPair pair2({{10, 0, 0, 8}, 2002},
  47. {{10, 0, 0, 21}, 9001});
  48. CastSocket* socket_ptr1 =
  49. OpenSocket(std::move(pair1.socket),
  50. openscreen_platform::ToNetEndPoint(pair1.remote_endpoint));
  51. ASSERT_TRUE(socket_ptr1);
  52. CastSocket* socket_ptr2 =
  53. OpenSocket(std::move(pair2.socket),
  54. openscreen_platform::ToNetEndPoint(pair2.remote_endpoint));
  55. ASSERT_TRUE(socket_ptr2);
  56. EXPECT_NE(socket_ptr1, socket_ptr2);
  57. EXPECT_NE(socket_ptr1->id(), socket_ptr2->id());
  58. std::unique_ptr<CastSocket> socket1 =
  59. socket_service_.RemoveSocket(socket_ptr1->id());
  60. EXPECT_EQ(socket1.get(), socket_ptr1);
  61. CastSocket* socket_ptr3 = OpenSocket(
  62. nullptr, openscreen_platform::ToNetEndPoint(pair2.remote_endpoint));
  63. ASSERT_TRUE(socket_ptr3);
  64. EXPECT_EQ(socket_ptr3, socket_ptr2);
  65. }
  66. TEST_F(LibcastSocketServiceTest, OpenChannelIsConnected) {
  67. MockCastSocketObserver mock_observer;
  68. socket_service_.AddObserver(&mock_observer);
  69. openscreen::cast::FakeCastSocketPair fake_cast_socket_pair;
  70. CastSocket* socket = OpenSocket(std::move(fake_cast_socket_pair.socket),
  71. openscreen_platform::ToNetEndPoint(
  72. fake_cast_socket_pair.remote_endpoint));
  73. base::RunLoop run_loop1;
  74. EXPECT_CALL(fake_cast_socket_pair.mock_peer_client, OnMessage(_, _))
  75. .WillOnce([&run_loop1](LibcastSocket* socket,
  76. cast::channel::CastMessage message) {
  77. EXPECT_EQ(message.source_id(), "sender1");
  78. EXPECT_EQ(message.destination_id(), "receiver1");
  79. EXPECT_EQ(message.namespace_(), "ns1");
  80. ASSERT_EQ(message.payload_type(),
  81. cast::channel::CastMessage_PayloadType_STRING);
  82. EXPECT_EQ(message.payload_utf8(), "PING");
  83. run_loop1.Quit();
  84. });
  85. cast::channel::CastMessage ping_message;
  86. ping_message.set_protocol_version(
  87. cast::channel::CastMessage_ProtocolVersion_CASTV2_1_0);
  88. ping_message.set_source_id("sender1");
  89. ping_message.set_destination_id("receiver1");
  90. ping_message.set_namespace_("ns1");
  91. ping_message.set_payload_type(cast::channel::CastMessage_PayloadType_STRING);
  92. ping_message.set_payload_utf8("PING");
  93. socket->transport()->SendMessage(ping_message, base::DoNothing());
  94. run_loop1.Run();
  95. base::RunLoop run_loop2;
  96. EXPECT_CALL(mock_observer, OnMessage(_, _))
  97. .WillOnce(
  98. [&run_loop2](const CastSocket& socket, const CastMessage& message) {
  99. EXPECT_EQ(message.source_id(), "receiver1");
  100. EXPECT_EQ(message.destination_id(), "sender1");
  101. EXPECT_EQ(message.namespace_(), "ns1");
  102. ASSERT_EQ(message.payload_type(),
  103. cast::channel::CastMessage_PayloadType_STRING);
  104. EXPECT_EQ(message.payload_utf8(), "PONG");
  105. run_loop2.Quit();
  106. });
  107. cast::channel::CastMessage pong_message;
  108. pong_message.set_protocol_version(
  109. cast::channel::CastMessage_ProtocolVersion_CASTV2_1_0);
  110. pong_message.set_source_id("receiver1");
  111. pong_message.set_destination_id("sender1");
  112. pong_message.set_namespace_("ns1");
  113. pong_message.set_payload_type(cast::channel::CastMessage_PayloadType_STRING);
  114. pong_message.set_payload_utf8("PONG");
  115. ASSERT_TRUE(fake_cast_socket_pair.peer_socket->Send(pong_message).ok());
  116. run_loop2.Run();
  117. }
  118. } // namespace cast_channel