blob: 21170b7273fe2ebcc1866a8e6ad97c97ab7a61c1 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/bind.h"
#include "base/test/bind.h"
#include "dbus/bus.h"
#include "dbus/message.h"
#include "device/bluetooth/bluetooth_gatt_service.h"
#include "device/bluetooth/dbus/bluetooth_gatt_attribute_value_delegate.h"
#include "device/bluetooth/dbus/bluetooth_gatt_characteristic_delegate_wrapper.h"
#include "device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace bluez {
TEST(BluetoothGattCharacteristicServiceProviderTest, ReadValueSuccess) {
auto method_call =
std::make_unique<dbus::MethodCall>("com.example.Interface", "SomeMethod");
method_call->SetSerial(123);
method_call->SetReplySerial(456);
bool callback_called = false;
BluetoothGattCharacteristicServiceProviderImpl provider_impl(
/*bus=*/nullptr,
/*object_path=*/dbus::ObjectPath(),
/*delegate=*/std::unique_ptr<BluetoothGattAttributeValueDelegate>(),
/*uuid=*/std::string(),
/*flags=*/std::vector<std::string>(),
/*service_path=*/dbus::ObjectPath());
const std::vector<uint8_t> read_value = {1, 2, 3};
provider_impl.OnReadValue(
method_call.get(),
base::BindLambdaForTesting([&callback_called, read_value](
std::unique_ptr<dbus::Response> response) {
EXPECT_EQ(response->GetMessageType(), DBUS_MESSAGE_TYPE_METHOD_RETURN);
dbus::MessageReader reader(response.get());
EXPECT_EQ(reader.GetDataType(), dbus::Message::ARRAY);
base::span<const uint8_t> bytes;
EXPECT_TRUE(reader.PopArrayOfBytes(&bytes));
EXPECT_EQ(bytes.size(), read_value.size());
callback_called = true;
}),
/*error_code=*/std::nullopt, read_value);
EXPECT_TRUE(callback_called);
}
TEST(BluetoothGattCharacteristicServiceProviderTest, ReadValueFailure) {
auto method_call =
std::make_unique<dbus::MethodCall>("com.example.Interface", "SomeMethod");
method_call->SetSerial(123);
method_call->SetReplySerial(456);
bool callback_called = false;
BluetoothGattCharacteristicServiceProviderImpl provider_impl(
/*bus=*/nullptr,
/*object_path=*/dbus::ObjectPath(),
/*delegate=*/std::unique_ptr<BluetoothGattAttributeValueDelegate>(),
/*uuid=*/std::string(),
/*flags=*/std::vector<std::string>(),
/*service_path=*/dbus::ObjectPath());
const std::vector<uint8_t> read_value = {1, 2, 3};
provider_impl.OnReadValue(
method_call.get(),
base::BindLambdaForTesting(
[&callback_called](std::unique_ptr<dbus::Response> response) {
EXPECT_EQ(response->GetMessageType(), DBUS_MESSAGE_TYPE_ERROR);
dbus::MessageReader reader(response.get());
EXPECT_NE(reader.GetDataType(), dbus::Message::ARRAY);
base::span<const uint8_t> bytes;
EXPECT_FALSE(reader.PopArrayOfBytes(&bytes));
callback_called = true;
}),
device::BluetoothGattService::GattErrorCode::kFailed, read_value);
EXPECT_TRUE(callback_called);
}
} // namespace bluez