1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "device/bluetooth/floss/floss_bluetooth_telephony_client.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "dbus/message.h"
#include "dbus/mock_bus.h"
#include "dbus/mock_exported_object.h"
#include "dbus/mock_object_proxy.h"
#include "device/bluetooth/floss/test_helpers.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
using testing::DoAll;
} // namespace
namespace floss {
class FlossBluetoothTelephonyClientTest : public testing::Test {
public:
base::Version GetCurrVersion() {
return floss::version::GetMaximalSupportedVersion();
}
void SetUpMocks() {
bluetooth_telephony_path_ =
FlossDBusClient::GenerateBluetoothTelephonyPath(adapter_index_);
bluetooth_telephony_object_proxy_ =
base::MakeRefCounted<::dbus::MockObjectProxy>(
bus_.get(), kBluetoothTelephonyInterface,
bluetooth_telephony_path_);
EXPECT_CALL(*bus_.get(), GetObjectProxy(kBluetoothTelephonyInterface,
bluetooth_telephony_path_))
.WillRepeatedly(
::testing::Return(bluetooth_telephony_object_proxy_.get()));
// Handle method calls on the object proxy
ON_CALL(*bluetooth_telephony_object_proxy_.get(),
DoCallMethodWithErrorResponse(
HasMemberOf(bluetooth_telephony::kSetPhoneOpsEnabled),
testing::_, testing::_))
.WillByDefault(Invoke(
this,
&FlossBluetoothTelephonyClientTest::HandleSetPhoneOpsEnabled));
}
void SetUp() override {
::dbus::Bus::Options options;
options.bus_type = ::dbus::Bus::BusType::SYSTEM;
bus_ = base::MakeRefCounted<::dbus::MockBus>(options);
client_ = FlossBluetoothTelephonyClient::Create();
SetUpMocks();
}
void TearDown() override { client_.reset(); }
void SetPhoneOpsEnabledCallback(DBusResult<Void> ret) { callback_count_++; }
void HandleSetPhoneOpsEnabled(
::dbus::MethodCall* method_call,
int timeout_ms,
::dbus::ObjectProxy::ResponseOrErrorCallback* cb) {
auto response = ::dbus::Response::CreateEmpty();
::dbus::MessageWriter msg(response.get());
std::move(*cb).Run(response.get(), nullptr);
}
void TestSetPhoneOpsEnabled() {
EXPECT_CALL(*bluetooth_telephony_object_proxy_.get(),
DoCallMethodWithErrorResponse)
.Times(testing::AnyNumber());
EXPECT_CALL(*bluetooth_telephony_object_proxy_.get(),
DoCallMethodWithErrorResponse(
HasMemberOf(bluetooth_telephony::kSetPhoneOpsEnabled),
testing::_, testing::_))
.Times(1);
EXPECT_EQ(callback_count_, 0);
client_->Init(bus_.get(), kBluetoothTelephonyInterface, adapter_index_,
GetCurrVersion(), base::DoNothing());
client_->SetPhoneOpsEnabled(
base::BindOnce(
&FlossBluetoothTelephonyClientTest::SetPhoneOpsEnabledCallback,
weak_ptr_factory_.GetWeakPtr()),
true);
EXPECT_EQ(callback_count_, 1);
}
int callback_count_ = 0;
int adapter_index_ = 5;
dbus::ObjectPath callback_path_;
dbus::ObjectPath bluetooth_telephony_path_;
scoped_refptr<::dbus::MockBus> bus_;
scoped_refptr<::dbus::MockObjectProxy> bluetooth_telephony_object_proxy_;
std::unique_ptr<FlossBluetoothTelephonyClient> client_;
base::WeakPtrFactory<FlossBluetoothTelephonyClientTest> weak_ptr_factory_{
this};
};
TEST_F(FlossBluetoothTelephonyClientTest, SetPhoneOpsEnabled) {
TestSetPhoneOpsEnabled();
}
} // namespace floss
|