// Copyright 2020 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 "device/bluetooth/server_socket.h" #include #include #include #include "base/callback_helpers.h" #include "base/location.h" #include "base/optional.h" #include "base/run_loop.h" #include "base/test/task_environment.h" #include "device/bluetooth/bluetooth_socket.h" #include "device/bluetooth/socket.h" #include "device/bluetooth/test/fake_bluetooth_socket.h" #include "device/bluetooth/test/mock_bluetooth_adapter.h" #include "device/bluetooth/test/mock_bluetooth_device.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/base/io_buffer.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace bluetooth { class ServerSocketTest : public testing::Test { public: ServerSocketTest() = default; ~ServerSocketTest() override = default; ServerSocketTest(const ServerSocketTest&) = delete; ServerSocketTest& operator=(const ServerSocketTest&) = delete; void SetUp() override { mock_bluetooth_adapter_ = base::MakeRefCounted>(); mock_bluetooth_device_ = std::make_unique>( mock_bluetooth_adapter_.get(), /*class=*/0, "DeviceName", "DeviceAddress", /*paired=*/false, /*connected=*/false); fake_bluetooth_server_socket_ = base::MakeRefCounted(); server_socket_ = std::make_unique(fake_bluetooth_server_socket_); } protected: void Accept() { server_socket_->Accept( base::BindOnce(&ServerSocketTest::OnAccept, base::Unretained(this))); EXPECT_TRUE(fake_bluetooth_server_socket_->HasAcceptArgs()); } std::unique_ptr server_socket_; scoped_refptr fake_bluetooth_server_socket_; scoped_refptr> mock_bluetooth_adapter_; std::unique_ptr> mock_bluetooth_device_; mojom::AcceptConnectionResultPtr accept_connection_result_; private: void OnAccept(mojom::AcceptConnectionResultPtr result) { accept_connection_result_ = std::move(result); } base::test::SingleThreadTaskEnvironment task_environment; }; TEST_F(ServerSocketTest, TestOnDestroyCallsClose) { // When destroyed, |server_socket_| is expected to tear down its // BluetoothSocket. server_socket_.reset(); EXPECT_TRUE(fake_bluetooth_server_socket_->called_close()); } TEST_F(ServerSocketTest, TestAccept_Success) { Accept(); auto accept_args = fake_bluetooth_server_socket_->TakeAcceptArgs(); auto success_callback = std::move(std::get<0>(*accept_args)); auto fake_bluetooth_client_socket = base::MakeRefCounted(); std::move(success_callback) .Run(/*device=*/mock_bluetooth_device_.get(), /*bluetooth_socket=*/fake_bluetooth_client_socket); EXPECT_TRUE(accept_connection_result_); EXPECT_EQ(mock_bluetooth_device_->GetName(), accept_connection_result_->device->name); auto pending_socket = std::move(accept_connection_result_->socket); EXPECT_TRUE(pending_socket.is_valid()); EXPECT_TRUE(accept_connection_result_->receive_stream.is_valid()); EXPECT_TRUE(accept_connection_result_->send_stream.is_valid()); // Ensure that the underlying BluetoothSocket is // |fake_bluetooth_client_socket|. mojo::Remote socket(std::move(pending_socket)); base::RunLoop run_loop; socket->Disconnect(run_loop.QuitClosure()); run_loop.Run(); EXPECT_TRUE(fake_bluetooth_client_socket->called_disconnect()); EXPECT_FALSE(fake_bluetooth_server_socket_->HasAcceptArgs()); } TEST_F(ServerSocketTest, TestAccept_Error) { Accept(); auto accept_args = fake_bluetooth_server_socket_->TakeAcceptArgs(); auto error_callback = std::move(std::get<1>(*accept_args)); std::move(error_callback).Run("ErrorMessage"); EXPECT_FALSE(accept_connection_result_); EXPECT_FALSE(fake_bluetooth_server_socket_->HasAcceptArgs()); } } // namespace bluetooth