212 lines
5.8 KiB
C++
212 lines
5.8 KiB
C++
//
|
|
// Copyright (C) 2015 Google, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at:
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "service/common/bluetooth/advertise_data.h"
|
|
#include "service/common/bluetooth/advertise_settings.h"
|
|
#include "service/common/bluetooth/binder/parcel_helpers.h"
|
|
|
|
using android::Parcel;
|
|
|
|
using bluetooth::AdvertiseData;
|
|
using bluetooth::AdvertiseSettings;
|
|
using bluetooth::GattIdentifier;
|
|
using bluetooth::ScanFilter;
|
|
using bluetooth::ScanResult;
|
|
using bluetooth::ScanSettings;
|
|
using bluetooth::UUID;
|
|
|
|
namespace ipc {
|
|
namespace binder {
|
|
namespace {
|
|
|
|
bool TestAdvertiseData(const AdvertiseData &adv_in) {
|
|
Parcel parcel;
|
|
|
|
WriteAdvertiseDataToParcel(adv_in, &parcel);
|
|
parcel.setDataPosition(0);
|
|
auto adv_out = CreateAdvertiseDataFromParcel(parcel);
|
|
|
|
return adv_in == *adv_out;
|
|
}
|
|
|
|
bool TestAdvertiseSettings(const AdvertiseSettings &settings_in) {
|
|
Parcel parcel;
|
|
|
|
WriteAdvertiseSettingsToParcel(settings_in, &parcel);
|
|
parcel.setDataPosition(0);
|
|
auto settings_out = CreateAdvertiseSettingsFromParcel(parcel);
|
|
|
|
return settings_in == *settings_out;
|
|
}
|
|
|
|
bool TestUUID(const UUID& uuid_in) {
|
|
Parcel parcel;
|
|
|
|
WriteUUIDToParcel(uuid_in, &parcel);
|
|
parcel.setDataPosition(0);
|
|
auto uuid_out = CreateUUIDFromParcel(parcel);
|
|
|
|
return uuid_in == *uuid_out;
|
|
}
|
|
|
|
bool TestGattIdentifier(const GattIdentifier& id_in) {
|
|
Parcel parcel;
|
|
|
|
WriteGattIdentifierToParcel(id_in, &parcel);
|
|
parcel.setDataPosition(0);
|
|
auto id_out = CreateGattIdentifierFromParcel(parcel);
|
|
|
|
return id_in == *id_out;
|
|
}
|
|
|
|
bool TestScanSettings(const ScanSettings& settings_in) {
|
|
Parcel parcel;
|
|
WriteScanSettingsToParcel(settings_in, &parcel);
|
|
parcel.setDataPosition(0);
|
|
auto settings_out = CreateScanSettingsFromParcel(parcel);
|
|
|
|
return settings_in == *settings_out;
|
|
}
|
|
|
|
bool TestScanFilter(const ScanFilter& filter_in) {
|
|
Parcel parcel;
|
|
WriteScanFilterToParcel(filter_in, &parcel);
|
|
parcel.setDataPosition(0);
|
|
auto filter_out = CreateScanFilterFromParcel(parcel);
|
|
|
|
return filter_in == *filter_out;
|
|
}
|
|
|
|
bool TestScanResult(const ScanResult& result_in) {
|
|
Parcel parcel;
|
|
WriteScanResultToParcel(result_in, &parcel);
|
|
parcel.setDataPosition(0);
|
|
auto result_out = CreateScanResultFromParcel(parcel);
|
|
assert(result_out.get() != nullptr);
|
|
|
|
return result_in == *result_out;
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, EmptyAdvertiseData) {
|
|
std::vector<uint8_t> data;
|
|
AdvertiseData adv(data);
|
|
|
|
EXPECT_TRUE(TestAdvertiseData(adv));
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, NonEmptyAdvertiseData) {
|
|
std::vector<uint8_t> data{ 0x02, 0x02, 0x00 };
|
|
AdvertiseData adv0(data);
|
|
adv0.set_include_tx_power_level(true);
|
|
EXPECT_TRUE(TestAdvertiseData(adv0));
|
|
|
|
AdvertiseData adv1(data);
|
|
adv1.set_include_device_name(true);
|
|
EXPECT_TRUE(TestAdvertiseData(adv1));
|
|
|
|
AdvertiseData adv2(data);
|
|
adv2.set_include_tx_power_level(true);
|
|
adv2.set_include_device_name(true);
|
|
EXPECT_TRUE(TestAdvertiseData(adv2));
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, DefaultAdvertiseSettings) {
|
|
AdvertiseSettings settings;
|
|
EXPECT_TRUE(TestAdvertiseSettings(settings));
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, NonEmptyAdvertiseSettings) {
|
|
AdvertiseSettings settings(
|
|
AdvertiseSettings::MODE_BALANCED,
|
|
base::TimeDelta::FromMilliseconds(150),
|
|
AdvertiseSettings::TX_POWER_LEVEL_HIGH,
|
|
false /* connectable */);
|
|
EXPECT_TRUE(TestAdvertiseSettings(settings));
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, UUID) {
|
|
// Try a whole bunch of UUIDs.
|
|
for (int i = 0; i < 10; i++) {
|
|
UUID uuid = UUID::GetRandom();
|
|
TestUUID(uuid);
|
|
}
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, GattIdentifier) {
|
|
UUID uuid0 = UUID::GetRandom();
|
|
UUID uuid1 = UUID::GetRandom();
|
|
UUID uuid2 = UUID::GetRandom();
|
|
|
|
auto service_id = GattIdentifier::CreateServiceId(
|
|
"01:23:45:67:89:ab", 5, uuid0, false);
|
|
auto char_id = GattIdentifier::CreateCharacteristicId(3, uuid1, *service_id);
|
|
auto desc_id = GattIdentifier::CreateDescriptorId(10, uuid2, *char_id);
|
|
|
|
TestGattIdentifier(*service_id);
|
|
TestGattIdentifier(*char_id);
|
|
TestGattIdentifier(*desc_id);
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, ScanSettings) {
|
|
ScanSettings settings0;
|
|
ScanSettings settings1(
|
|
ScanSettings::MODE_BALANCED,
|
|
ScanSettings::CALLBACK_TYPE_FIRST_MATCH,
|
|
ScanSettings::RESULT_TYPE_ABBREVIATED,
|
|
base::TimeDelta::FromMilliseconds(150),
|
|
ScanSettings::MATCH_MODE_STICKY,
|
|
ScanSettings::MATCH_COUNT_FEW_ADVERTISEMENTS);
|
|
|
|
EXPECT_TRUE(TestScanSettings(settings0));
|
|
EXPECT_TRUE(TestScanSettings(settings1));
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, ScanFilter) {
|
|
ScanFilter filter;
|
|
|
|
filter.set_device_name("Test Device Name");
|
|
ASSERT_TRUE(filter.SetDeviceAddress("01:02:04:AB:CD:EF"));
|
|
EXPECT_TRUE(TestScanFilter(filter));
|
|
|
|
UUID uuid = UUID::GetRandom();
|
|
filter.SetServiceUuid(uuid);
|
|
EXPECT_TRUE(TestScanFilter(filter));
|
|
|
|
UUID mask = UUID::GetRandom();
|
|
filter.SetServiceUuidWithMask(uuid, mask);
|
|
EXPECT_TRUE(TestScanFilter(filter));
|
|
}
|
|
|
|
TEST(ParcelHelpersTest, ScanResult) {
|
|
const char kTestAddress[] = "01:02:03:AB:CD:EF";
|
|
|
|
const std::vector<uint8_t> kEmptyBytes;
|
|
const std::vector<uint8_t> kTestBytes{ 0x01, 0x02, 0x03 };
|
|
|
|
const int kTestRssi = 127;
|
|
|
|
ScanResult result0(kTestAddress, kEmptyBytes, kTestRssi);
|
|
ScanResult result1(kTestAddress, kTestBytes, kTestRssi);
|
|
|
|
EXPECT_TRUE(TestScanResult(result0));
|
|
EXPECT_TRUE(TestScanResult(result1));
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace binder
|
|
} // namespace ipc
|