Index: components/arc/bluetooth/bluetooth_type_converters_unittest.cc |
diff --git a/components/arc/bluetooth/bluetooth_type_converters_unittest.cc b/components/arc/bluetooth/bluetooth_type_converters_unittest.cc |
index 57e296d2516ab7544bd68f75f861ed5c1b859fea..0a5f2c256251e823a502c8bae31c8e115c162165 100644 |
--- a/components/arc/bluetooth/bluetooth_type_converters_unittest.cc |
+++ b/components/arc/bluetooth/bluetooth_type_converters_unittest.cc |
@@ -4,15 +4,20 @@ |
#include "components/arc/bluetooth/bluetooth_type_converters.h" |
+#include <algorithm> |
+#include <memory> |
#include <string> |
#include <vector> |
+#include "base/values.h" |
#include "device/bluetooth/bluetooth_gatt_service.h" |
#include "device/bluetooth/bluetooth_uuid.h" |
+#include "device/bluetooth/bluez/bluetooth_service_attribute_value_bluez.h" |
#include "mojo/public/cpp/bindings/array.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace { |
+ |
constexpr char kAddressStr[] = "1A:2B:3C:4D:5E:6F"; |
constexpr char kInvalidAddressStr[] = "00:00:00:00:00:00"; |
constexpr uint8_t kAddressArray[] = {0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f}; |
@@ -23,6 +28,62 @@ constexpr uint8_t kUuidArray[] = {0x12, 0x34, 0x56, 0x78, 0x12, 0x34, |
0x23, 0x45, 0x67, 0x89}; |
constexpr size_t kUuidSize = 16; |
constexpr uint8_t kFillerByte = 0x79; |
+ |
+arc::mojom::BluetoothSdpAttributePtr CreateDeepMojoSequenceAttribute( |
+ size_t depth) { |
+ auto value = arc::mojom::BluetoothSdpAttribute::New(); |
+ |
+ if (depth > 0u) { |
+ value->type = bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE; |
+ value->value.Clear(); |
+ value->sequence.push_back(CreateDeepMojoSequenceAttribute(depth - 1)); |
+ value->type_size = static_cast<uint32_t>(value->sequence.size()); |
+ } else { |
+ uint16_t data = 3; |
+ value->type = bluez::BluetoothServiceAttributeValueBlueZ::UINT; |
+ value->type_size = static_cast<uint32_t>(sizeof(data)); |
+ value->value.AppendInteger(static_cast<int>(data)); |
+ value->sequence = mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ } |
+ return value; |
+} |
+ |
+size_t GetDepthOfMojoAttribute( |
+ const arc::mojom::BluetoothSdpAttributePtr& attribute) { |
+ size_t depth = 1; |
+ if (attribute->type == bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE) { |
+ for (const auto& value : attribute->sequence) |
+ depth = std::max(depth, GetDepthOfMojoAttribute(value) + 1); |
+ } |
+ return depth; |
+} |
+ |
+bluez::BluetoothServiceAttributeValueBlueZ CreateDeepBlueZSequenceAttribute( |
+ size_t depth) { |
+ if (depth > 0u) { |
+ std::unique_ptr<bluez::BluetoothServiceAttributeValueBlueZ::Sequence> |
+ sequence(new bluez::BluetoothServiceAttributeValueBlueZ::Sequence()); |
+ sequence->push_back(CreateDeepBlueZSequenceAttribute(depth - 1)); |
+ |
+ return bluez::BluetoothServiceAttributeValueBlueZ(std::move(sequence)); |
+ } else { |
+ return bluez::BluetoothServiceAttributeValueBlueZ( |
+ bluez::BluetoothServiceAttributeValueBlueZ::UINT, sizeof(uint16_t), |
+ base::WrapUnique(new base::FundamentalValue(3))); |
+ } |
+} |
+ |
+size_t GetDepthOfBlueZAttribute( |
+ const bluez::BluetoothServiceAttributeValueBlueZ& attribute) { |
+ size_t depth = 1; |
+ if (attribute.type() == |
+ bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE) { |
+ for (const auto& value : attribute.sequence()) |
+ depth = std::max(depth, GetDepthOfBlueZAttribute(value) + 1); |
+ } |
+ return depth; |
+} |
+ |
} // namespace |
namespace mojo { |
@@ -80,4 +141,370 @@ TEST(BluetoothTypeConvertorTest, |
EXPECT_FALSE(uuidMojo.To<device::BluetoothUUID>().IsValid()); |
} |
+TEST(BluetoothTypeConvertorTest, ConvertMojoValueAttributeToBlueZAttribute) { |
+ // Construct Mojo attribute with NULLTYPE value. |
+ auto nulltypeAttributeMojo = arc::mojom::BluetoothSdpAttribute::New(); |
+ nulltypeAttributeMojo->type = |
+ bluez::BluetoothServiceAttributeValueBlueZ::NULLTYPE; |
+ nulltypeAttributeMojo->type_size = 0; |
+ nulltypeAttributeMojo->value.Append(base::Value::CreateNullValue()); |
+ nulltypeAttributeMojo->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ auto nulltypeAttributeBlueZ = |
+ nulltypeAttributeMojo.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::NULLTYPE, |
+ nulltypeAttributeBlueZ.type()); |
+ EXPECT_EQ(0u, nulltypeAttributeBlueZ.size()); |
+ EXPECT_EQ(base::Value::TYPE_NULL, nulltypeAttributeBlueZ.value().GetType()); |
+ |
+ // Construct Mojo attribute with TYPE_BOOLEAN value. |
+ bool valueBool = true; |
+ auto boolAttributeMojo = arc::mojom::BluetoothSdpAttribute::New(); |
+ boolAttributeMojo->type = bluez::BluetoothServiceAttributeValueBlueZ::BOOL; |
+ boolAttributeMojo->type_size = static_cast<uint32_t>(sizeof(valueBool)); |
+ boolAttributeMojo->value.AppendBoolean(valueBool); |
+ boolAttributeMojo->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ auto boolAttributeBlueZ = |
+ boolAttributeMojo.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::BOOL, |
+ boolAttributeBlueZ.type()); |
+ EXPECT_EQ(sizeof(valueBool), boolAttributeBlueZ.size()); |
+ EXPECT_EQ(base::Value::TYPE_BOOLEAN, boolAttributeBlueZ.value().GetType()); |
+ EXPECT_TRUE(boolAttributeBlueZ.value().GetAsBoolean(&valueBool)); |
+ EXPECT_TRUE(valueBool); |
+ |
+ // Construct Mojo attribute with TYPE_UINT value. |
+ uint16_t valueUint16 = 10; |
+ int valueUint16AsInt = 0; |
+ auto uintAttributeMojo = arc::mojom::BluetoothSdpAttribute::New(); |
+ uintAttributeMojo->type = bluez::BluetoothServiceAttributeValueBlueZ::UINT; |
+ uintAttributeMojo->type_size = static_cast<uint32_t>(sizeof(valueUint16)); |
+ uintAttributeMojo->value.AppendInteger(static_cast<int>(valueUint16)); |
+ uintAttributeMojo->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ auto uintAttributeBlueZ = |
+ uintAttributeMojo.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::UINT, |
+ uintAttributeBlueZ.type()); |
+ EXPECT_EQ(sizeof(valueUint16), uintAttributeBlueZ.size()); |
+ EXPECT_EQ(base::Value::TYPE_INTEGER, uintAttributeBlueZ.value().GetType()); |
+ EXPECT_TRUE(uintAttributeBlueZ.value().GetAsInteger(&valueUint16AsInt)); |
+ EXPECT_EQ(valueUint16, static_cast<uint16_t>(valueUint16AsInt)); |
+ |
+ // Construct Mojo attribute with TYPE_INT value. |
+ int16_t valueInt16 = 20; |
+ int valueInt16AsInt = 0; |
+ auto intAttributeMojo = arc::mojom::BluetoothSdpAttribute::New(); |
+ intAttributeMojo->type = bluez::BluetoothServiceAttributeValueBlueZ::INT; |
+ intAttributeMojo->type_size = static_cast<uint32_t>(sizeof(valueInt16)); |
+ intAttributeMojo->value.AppendInteger(static_cast<int>(valueInt16)); |
+ intAttributeMojo->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ auto intAttributeBlueZ = |
+ intAttributeMojo.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::INT, |
+ intAttributeBlueZ.type()); |
+ EXPECT_EQ(sizeof(valueInt16), intAttributeBlueZ.size()); |
+ EXPECT_EQ(base::Value::TYPE_INTEGER, intAttributeBlueZ.value().GetType()); |
+ EXPECT_TRUE(intAttributeBlueZ.value().GetAsInteger(&valueInt16AsInt)); |
+ EXPECT_EQ(valueInt16, static_cast<int16_t>(valueInt16AsInt)); |
+ |
+ // Construct Mojo attribute with TYPE_UUID. |
+ std::string expectedUUID("00000000-0000-1000-8000-00805f9b34fb"); |
+ std::string actualUUID; |
+ auto uuidAttributeMojo = arc::mojom::BluetoothSdpAttribute::New(); |
+ uuidAttributeMojo->type = bluez::BluetoothServiceAttributeValueBlueZ::UUID; |
+ // UUIDs are all stored in string form, but it can be converted to one of |
+ // UUID16, UUID32 and UUID128. |
+ uuidAttributeMojo->type_size = static_cast<uint32_t>(sizeof(uint16_t)); |
+ uuidAttributeMojo->value.AppendString(expectedUUID); |
+ uuidAttributeMojo->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ auto uuidAttributeBlueZ = |
+ uuidAttributeMojo.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::UUID, |
+ uuidAttributeBlueZ.type()); |
+ EXPECT_EQ(sizeof(uint16_t), uuidAttributeBlueZ.size()); |
+ EXPECT_EQ(base::Value::TYPE_STRING, uuidAttributeBlueZ.value().GetType()); |
+ EXPECT_TRUE(uuidAttributeBlueZ.value().GetAsString(&actualUUID)); |
+ EXPECT_EQ(expectedUUID, actualUUID); |
+ |
+ // Construct Mojo attribute with TYPE_STRING. TYPE_URL is the same case as |
+ // TYPE_STRING. |
+ std::string expectedString("Some SDP service"); |
+ std::string actualString; |
+ auto stringAttributeMojo = arc::mojom::BluetoothSdpAttribute::New(); |
+ stringAttributeMojo->type = |
+ bluez::BluetoothServiceAttributeValueBlueZ::STRING; |
+ stringAttributeMojo->type_size = |
+ static_cast<uint32_t>(expectedString.length()); |
+ stringAttributeMojo->value.AppendString(expectedString); |
+ stringAttributeMojo->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ auto stringAttributeBlueZ = |
+ stringAttributeMojo.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::STRING, |
+ stringAttributeBlueZ.type()); |
+ EXPECT_EQ(expectedString.length(), stringAttributeBlueZ.size()); |
+ EXPECT_EQ(base::Value::TYPE_STRING, stringAttributeBlueZ.value().GetType()); |
+ EXPECT_TRUE(stringAttributeBlueZ.value().GetAsString(&actualString)); |
+ EXPECT_EQ(expectedString, actualString); |
+} |
+ |
+TEST(BluetoothTypeConvertorTest, ConvertMojoSequenceAttributeToBlueZAttribute) { |
+ // Create an UUID value. |
+ std::string l2capUUID("00000100-0000-1000-8000-00805f9b34fb"); |
+ auto valueUUID = arc::mojom::BluetoothSdpAttribute::New(); |
+ valueUUID->type = bluez::BluetoothServiceAttributeValueBlueZ::UUID; |
+ valueUUID->type_size = static_cast<uint32_t>(sizeof(uint16_t)); |
+ valueUUID->value.AppendString(l2capUUID); |
+ valueUUID->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ // Create an UINT value. |
+ uint16_t l2capChannel = 3; |
+ auto valueUint16 = arc::mojom::BluetoothSdpAttribute::New(); |
+ valueUint16->type = bluez::BluetoothServiceAttributeValueBlueZ::UINT; |
+ valueUint16->type_size = static_cast<uint32_t>(sizeof(l2capChannel)); |
+ valueUint16->value.AppendInteger(static_cast<int>(l2capChannel)); |
+ valueUint16->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ // Create a sequence with the above two values. |
+ auto sequenceMojo = arc::mojom::BluetoothSdpAttribute::New(); |
+ sequenceMojo->type = bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE; |
+ sequenceMojo->sequence.push_back(std::move(valueUUID)); |
+ sequenceMojo->sequence.push_back(std::move(valueUint16)); |
+ sequenceMojo->type_size = sequenceMojo->sequence.size(); |
+ sequenceMojo->value.Clear(); |
+ |
+ auto sequenceBlueZ = |
+ sequenceMojo.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE, |
+ sequenceBlueZ.type()); |
+ EXPECT_EQ(sequenceMojo->sequence.size(), sequenceBlueZ.sequence().size()); |
+ |
+ const auto& sequence = sequenceBlueZ.sequence(); |
+ std::string uuid; |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::UUID, |
+ sequence.at(0).type()); |
+ EXPECT_EQ(sizeof(uint16_t), sequence.at(0).size()); |
+ EXPECT_TRUE(sequence.at(0).value().GetAsString(&uuid)); |
+ EXPECT_EQ(l2capUUID, uuid); |
+ |
+ int channel; |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::UINT, |
+ sequence.at(1).type()); |
+ EXPECT_EQ(sizeof(l2capChannel), sequence.at(1).size()); |
+ EXPECT_TRUE(sequence.at(1).value().GetAsInteger(&channel)); |
+ EXPECT_EQ(l2capChannel, static_cast<uint16_t>(channel)); |
+} |
+ |
+TEST(BluetoothTypeConvertorTest, |
+ ConvertInvalidMojoValueAttributeToBlueZAttribute) { |
+ // Create a Mojo attribute without value defined. |
+ auto valueNoData = arc::mojom::BluetoothSdpAttribute::New(); |
+ valueNoData->type = bluez::BluetoothServiceAttributeValueBlueZ::UINT; |
+ valueNoData->type_size = static_cast<uint32_t>(sizeof(uint32_t)); |
+ valueNoData->value.Clear(); |
+ valueNoData->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ auto valueNoDataBlueZ = |
+ valueNoData.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::NULLTYPE, |
+ valueNoDataBlueZ.type()); |
+ EXPECT_EQ(0u, valueNoDataBlueZ.size()); |
+ EXPECT_EQ(base::Value::TYPE_NULL, valueNoDataBlueZ.value().GetType()); |
+} |
+ |
+TEST(BluetoothTypeConvertorTest, |
+ ConvertInvalidMojoSequenceAttributeToBlueZAttribute) { |
+ // Create a Mojo attribute with an empty sequence. |
+ auto sequenceNoData = arc::mojom::BluetoothSdpAttribute::New(); |
+ sequenceNoData->type = bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE; |
+ sequenceNoData->type_size = 0; |
+ sequenceNoData->value.Append(base::Value::CreateNullValue()); |
+ sequenceNoData->sequence = |
+ mojo::Array<arc::mojom::BluetoothSdpAttributePtr>::New(0); |
+ |
+ auto sequenceNoDataBlueZ = |
+ sequenceNoData.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::NULLTYPE, |
+ sequenceNoDataBlueZ.type()); |
+ EXPECT_EQ(0u, sequenceNoDataBlueZ.size()); |
+ EXPECT_EQ(base::Value::TYPE_NULL, sequenceNoDataBlueZ.value().GetType()); |
+ |
+ // Create a Mojo attribute with the depth = arc::kBluetoothSDPMaxDepth + 3. |
+ auto sequenceTooDeepMojo = |
+ CreateDeepMojoSequenceAttribute(arc::kBluetoothSDPMaxDepth + 3); |
+ auto sequenceTooDeepBlueZ = |
+ sequenceTooDeepMojo.To<bluez::BluetoothServiceAttributeValueBlueZ>(); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE, |
+ sequenceTooDeepBlueZ.type()); |
+ EXPECT_EQ(1u, sequenceTooDeepBlueZ.size()); |
+ EXPECT_EQ(arc::kBluetoothSDPMaxDepth, |
+ GetDepthOfBlueZAttribute(sequenceTooDeepBlueZ)); |
+} |
+ |
+TEST(BluetoothTypeConvertorTest, ConvertBlueZValueAttributeToMojoAttribute) { |
+ // Check NULL type. |
+ auto nulltypeAttributeBlueZ = bluez::BluetoothServiceAttributeValueBlueZ(); |
+ base::Value* actualValue; |
+ |
+ auto nulltypeAttributeMojo = |
+ ConvertTo<arc::mojom::BluetoothSdpAttributePtr>(nulltypeAttributeBlueZ); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::NULLTYPE, |
+ nulltypeAttributeMojo->type); |
+ EXPECT_EQ(0u, nulltypeAttributeMojo->type_size); |
+ EXPECT_TRUE(nulltypeAttributeMojo->value.Get(0, &actualValue)); |
+ EXPECT_EQ(base::Value::TYPE_NULL, actualValue->GetType()); |
+ |
+ // Check integer types (INT, UINT). |
+ uint16_t valueUint16 = 10; |
+ int valueUint16AsInt; |
+ auto uintAttributeBlueZ = bluez::BluetoothServiceAttributeValueBlueZ( |
+ bluez::BluetoothServiceAttributeValueBlueZ::UINT, sizeof(valueUint16), |
+ base::MakeUnique<base::FundamentalValue>( |
+ base::FundamentalValue(static_cast<int>(valueUint16)))); |
+ |
+ auto uintAttributeMojo = |
+ ConvertTo<arc::mojom::BluetoothSdpAttributePtr>(uintAttributeBlueZ); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::UINT, |
+ uintAttributeMojo->type); |
+ EXPECT_EQ(sizeof(valueUint16), uintAttributeMojo->type_size); |
+ EXPECT_TRUE(uintAttributeMojo->value.GetInteger(0, &valueUint16AsInt)); |
+ EXPECT_EQ(valueUint16, static_cast<uint16_t>(valueUint16AsInt)); |
+ |
+ // Check bool type. |
+ bool valueBool = false; |
+ bool actualBool = true; |
+ auto boolAttributeBlueZ = bluez::BluetoothServiceAttributeValueBlueZ( |
+ bluez::BluetoothServiceAttributeValueBlueZ::BOOL, sizeof(bool), |
+ base::MakeUnique<base::FundamentalValue>( |
+ base::FundamentalValue(valueBool))); |
+ |
+ auto boolAttributeMojo = |
+ ConvertTo<arc::mojom::BluetoothSdpAttributePtr>(boolAttributeBlueZ); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::BOOL, |
+ boolAttributeMojo->type); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(valueBool)), |
+ boolAttributeMojo->type_size); |
+ EXPECT_TRUE(boolAttributeMojo->value.GetBoolean(0, &actualBool)); |
+ EXPECT_FALSE(valueBool); |
+ |
+ // Check UUID type. |
+ std::string valueUUID("00000100-0000-1000-8000-00805f9b34fb"); |
+ std::string actualUUID; |
+ auto uuidAttributeBlueZ = bluez::BluetoothServiceAttributeValueBlueZ( |
+ bluez::BluetoothServiceAttributeValueBlueZ::UUID, sizeof(uint16_t), |
+ base::MakeUnique<base::StringValue>(base::StringValue(valueUUID))); |
+ |
+ auto uuidAttributeMojo = |
+ ConvertTo<arc::mojom::BluetoothSdpAttributePtr>(uuidAttributeBlueZ); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::UUID, |
+ uuidAttributeMojo->type); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(uint16_t)), |
+ uuidAttributeMojo->type_size); |
+ EXPECT_TRUE(uuidAttributeMojo->value.GetString(0, &actualUUID)); |
+ EXPECT_EQ(valueUUID, actualUUID); |
+ |
+ // Check string types (STRING, URL). |
+ std::string valueString("Some Service Name"); |
+ std::string actualString; |
+ auto stringAttributeBlueZ = bluez::BluetoothServiceAttributeValueBlueZ( |
+ bluez::BluetoothServiceAttributeValueBlueZ::STRING, valueString.length(), |
+ base::MakeUnique<base::StringValue>(valueString)); |
+ |
+ auto stringAttributeMojo = |
+ ConvertTo<arc::mojom::BluetoothSdpAttributePtr>(stringAttributeBlueZ); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::STRING, |
+ stringAttributeMojo->type); |
+ EXPECT_EQ(static_cast<uint32_t>(valueString.length()), |
+ stringAttributeMojo->type_size); |
+ EXPECT_TRUE(stringAttributeMojo->value.GetString(0, &actualString)); |
+ EXPECT_EQ(valueString, actualString); |
+} |
+ |
+TEST(BluetoothTypeConvertorTest, ConvertBlueZSequenceAttributeToMojoAttribute) { |
+ std::string l2capUUID("00000100-0000-1000-8000-00805f9b34fb"); |
+ uint16_t l2capChannel = 3; |
+ |
+ std::unique_ptr<bluez::BluetoothServiceAttributeValueBlueZ::Sequence> |
+ sequence(new bluez::BluetoothServiceAttributeValueBlueZ::Sequence()); |
+ sequence->push_back(bluez::BluetoothServiceAttributeValueBlueZ( |
+ bluez::BluetoothServiceAttributeValueBlueZ::UUID, sizeof(uint16_t), |
+ base::MakeUnique<base::StringValue>(base::StringValue(l2capUUID)))); |
+ sequence->push_back(bluez::BluetoothServiceAttributeValueBlueZ( |
+ bluez::BluetoothServiceAttributeValueBlueZ::UINT, sizeof(uint16_t), |
+ base::MakeUnique<base::FundamentalValue>( |
+ base::FundamentalValue(l2capChannel)))); |
+ |
+ auto sequenceBlueZ = |
+ bluez::BluetoothServiceAttributeValueBlueZ(std::move(sequence)); |
+ |
+ ASSERT_EQ(2u, sequenceBlueZ.sequence().size()); |
+ |
+ auto sequenceMojo = |
+ ConvertTo<arc::mojom::BluetoothSdpAttributePtr>(sequenceBlueZ); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE, |
+ sequenceMojo->type); |
+ EXPECT_EQ(static_cast<uint32_t>(sequenceBlueZ.size()), |
+ sequenceMojo->type_size); |
+ EXPECT_EQ(sequenceMojo->type_size, sequenceMojo->sequence.size()); |
+ |
+ std::string uuid; |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::UUID, |
+ sequenceMojo->sequence[0]->type); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(uint16_t)), |
+ sequenceMojo->sequence[0]->type_size); |
+ EXPECT_TRUE(sequenceMojo->sequence[0]->value.GetString(0, &uuid)); |
+ EXPECT_EQ(l2capUUID, uuid); |
+ |
+ int channel; |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::UINT, |
+ sequenceMojo->sequence[1]->type); |
+ EXPECT_EQ(static_cast<uint32_t>(sizeof(uint16_t)), |
+ sequenceMojo->sequence[1]->type_size); |
+ EXPECT_TRUE(sequenceMojo->sequence[1]->value.GetInteger(0, &channel)); |
+ EXPECT_EQ(l2capChannel, static_cast<uint16_t>(channel)); |
+} |
+ |
+TEST(BluetoothTypeConvertorTest, |
+ ConvertDeepBlueZSequenceAttributeToBlueZAttribute) { |
+ bluez::BluetoothServiceAttributeValueBlueZ sequenceBlueZ = |
+ CreateDeepBlueZSequenceAttribute(arc::kBluetoothSDPMaxDepth + 3); |
+ |
+ auto sequenceMojo = |
+ ConvertTo<arc::mojom::BluetoothSdpAttributePtr>(sequenceBlueZ); |
+ |
+ EXPECT_EQ(bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE, |
+ sequenceMojo->type); |
+ EXPECT_EQ((uint32_t)1, sequenceMojo->type_size); |
+ EXPECT_EQ(arc::kBluetoothSDPMaxDepth, GetDepthOfMojoAttribute(sequenceMojo)); |
+} |
+ |
} // namespace mojo |