server_socket_unittest.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright 2020 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 "device/bluetooth/server_socket.h"
  5. #include <memory>
  6. #include <tuple>
  7. #include <vector>
  8. #include "base/callback_helpers.h"
  9. #include "base/location.h"
  10. #include "base/run_loop.h"
  11. #include "base/test/task_environment.h"
  12. #include "device/bluetooth/bluetooth_socket.h"
  13. #include "device/bluetooth/socket.h"
  14. #include "device/bluetooth/test/fake_bluetooth_socket.h"
  15. #include "device/bluetooth/test/mock_bluetooth_adapter.h"
  16. #include "device/bluetooth/test/mock_bluetooth_device.h"
  17. #include "mojo/public/cpp/bindings/pending_remote.h"
  18. #include "mojo/public/cpp/bindings/remote.h"
  19. #include "net/base/io_buffer.h"
  20. #include "testing/gmock/include/gmock/gmock.h"
  21. #include "testing/gtest/include/gtest/gtest.h"
  22. #include "third_party/abseil-cpp/absl/types/optional.h"
  23. namespace bluetooth {
  24. class ServerSocketTest : public testing::Test {
  25. public:
  26. ServerSocketTest() = default;
  27. ~ServerSocketTest() override = default;
  28. ServerSocketTest(const ServerSocketTest&) = delete;
  29. ServerSocketTest& operator=(const ServerSocketTest&) = delete;
  30. void SetUp() override {
  31. mock_bluetooth_adapter_ =
  32. base::MakeRefCounted<testing::NiceMock<device::MockBluetoothAdapter>>();
  33. mock_bluetooth_device_ =
  34. std::make_unique<testing::NiceMock<device::MockBluetoothDevice>>(
  35. mock_bluetooth_adapter_.get(),
  36. /*class=*/0, "DeviceName", "DeviceAddress",
  37. /*paired=*/false,
  38. /*connected=*/false);
  39. fake_bluetooth_server_socket_ =
  40. base::MakeRefCounted<device::FakeBluetoothSocket>();
  41. server_socket_ =
  42. std::make_unique<ServerSocket>(fake_bluetooth_server_socket_);
  43. }
  44. protected:
  45. void Accept() {
  46. server_socket_->Accept(
  47. base::BindOnce(&ServerSocketTest::OnAccept, base::Unretained(this)));
  48. EXPECT_TRUE(fake_bluetooth_server_socket_->HasAcceptArgs());
  49. }
  50. std::unique_ptr<ServerSocket> server_socket_;
  51. scoped_refptr<device::FakeBluetoothSocket> fake_bluetooth_server_socket_;
  52. scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>>
  53. mock_bluetooth_adapter_;
  54. std::unique_ptr<testing::NiceMock<device::MockBluetoothDevice>>
  55. mock_bluetooth_device_;
  56. mojom::AcceptConnectionResultPtr accept_connection_result_;
  57. private:
  58. void OnAccept(mojom::AcceptConnectionResultPtr result) {
  59. accept_connection_result_ = std::move(result);
  60. }
  61. base::test::SingleThreadTaskEnvironment task_environment;
  62. };
  63. TEST_F(ServerSocketTest, TestOnDestroyCallsClose) {
  64. // When destroyed, |server_socket_| is expected to tear down its
  65. // BluetoothSocket.
  66. server_socket_.reset();
  67. EXPECT_TRUE(fake_bluetooth_server_socket_->called_disconnect());
  68. }
  69. TEST_F(ServerSocketTest, TestAccept_Success) {
  70. Accept();
  71. auto accept_args = fake_bluetooth_server_socket_->TakeAcceptArgs();
  72. auto success_callback = std::move(std::get<0>(*accept_args));
  73. auto fake_bluetooth_client_socket =
  74. base::MakeRefCounted<device::FakeBluetoothSocket>();
  75. std::move(success_callback)
  76. .Run(/*device=*/mock_bluetooth_device_.get(),
  77. /*bluetooth_socket=*/fake_bluetooth_client_socket);
  78. EXPECT_TRUE(accept_connection_result_);
  79. EXPECT_EQ(mock_bluetooth_device_->GetName(),
  80. accept_connection_result_->device->name);
  81. auto pending_socket = std::move(accept_connection_result_->socket);
  82. EXPECT_TRUE(pending_socket.is_valid());
  83. EXPECT_TRUE(accept_connection_result_->receive_stream.is_valid());
  84. EXPECT_TRUE(accept_connection_result_->send_stream.is_valid());
  85. // Ensure that the underlying BluetoothSocket is
  86. // |fake_bluetooth_client_socket|.
  87. mojo::Remote<mojom::Socket> socket(std::move(pending_socket));
  88. base::RunLoop run_loop;
  89. socket->Disconnect(run_loop.QuitClosure());
  90. run_loop.Run();
  91. EXPECT_TRUE(fake_bluetooth_client_socket->called_disconnect());
  92. EXPECT_FALSE(fake_bluetooth_server_socket_->HasAcceptArgs());
  93. }
  94. TEST_F(ServerSocketTest, TestAccept_Error) {
  95. Accept();
  96. auto accept_args = fake_bluetooth_server_socket_->TakeAcceptArgs();
  97. auto error_callback = std::move(std::get<1>(*accept_args));
  98. std::move(error_callback).Run("ErrorMessage");
  99. EXPECT_FALSE(accept_connection_result_);
  100. EXPECT_FALSE(fake_bluetooth_server_socket_->HasAcceptArgs());
  101. }
  102. TEST_F(ServerSocketTest, TestDisconnect) {
  103. server_socket_->Disconnect(base::DoNothing());
  104. EXPECT_TRUE(fake_bluetooth_server_socket_->called_disconnect());
  105. }
  106. } // namespace bluetooth