2 // Copyright (C) 2015 Google, Inc.
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at:
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
17 #include <gtest/gtest.h>
19 #include "service/common/bluetooth/advertise_data.h"
20 #include "service/common/bluetooth/advertise_settings.h"
21 #include "service/common/bluetooth/binder/parcel_helpers.h"
23 using android::Parcel;
25 using bluetooth::AdvertiseData;
26 using bluetooth::AdvertiseSettings;
27 using bluetooth::GattIdentifier;
28 using bluetooth::ScanFilter;
29 using bluetooth::ScanResult;
30 using bluetooth::ScanSettings;
31 using bluetooth::UUID;
37 bool TestAdvertiseData(const AdvertiseData &adv_in) {
40 WriteAdvertiseDataToParcel(adv_in, &parcel);
41 parcel.setDataPosition(0);
42 auto adv_out = CreateAdvertiseDataFromParcel(parcel);
44 return adv_in == *adv_out;
47 bool TestAdvertiseSettings(const AdvertiseSettings &settings_in) {
50 WriteAdvertiseSettingsToParcel(settings_in, &parcel);
51 parcel.setDataPosition(0);
52 auto settings_out = CreateAdvertiseSettingsFromParcel(parcel);
54 return settings_in == *settings_out;
57 bool TestUUID(const UUID& uuid_in) {
60 WriteUUIDToParcel(uuid_in, &parcel);
61 parcel.setDataPosition(0);
62 auto uuid_out = CreateUUIDFromParcel(parcel);
64 return uuid_in == *uuid_out;
67 bool TestGattIdentifier(const GattIdentifier& id_in) {
70 WriteGattIdentifierToParcel(id_in, &parcel);
71 parcel.setDataPosition(0);
72 auto id_out = CreateGattIdentifierFromParcel(parcel);
74 return id_in == *id_out;
77 bool TestScanSettings(const ScanSettings& settings_in) {
79 WriteScanSettingsToParcel(settings_in, &parcel);
80 parcel.setDataPosition(0);
81 auto settings_out = CreateScanSettingsFromParcel(parcel);
83 return settings_in == *settings_out;
86 bool TestScanFilter(const ScanFilter& filter_in) {
88 WriteScanFilterToParcel(filter_in, &parcel);
89 parcel.setDataPosition(0);
90 auto filter_out = CreateScanFilterFromParcel(parcel);
92 return filter_in == *filter_out;
95 bool TestScanResult(const ScanResult& result_in) {
97 WriteScanResultToParcel(result_in, &parcel);
98 parcel.setDataPosition(0);
99 auto result_out = CreateScanResultFromParcel(parcel);
100 assert(result_out.get() != nullptr);
102 return result_in == *result_out;
105 TEST(ParcelHelpersTest, EmptyAdvertiseData) {
106 std::vector<uint8_t> data;
107 AdvertiseData adv(data);
109 EXPECT_TRUE(TestAdvertiseData(adv));
112 TEST(ParcelHelpersTest, NonEmptyAdvertiseData) {
113 std::vector<uint8_t> data{ 0x02, 0x02, 0x00 };
114 AdvertiseData adv0(data);
115 adv0.set_include_tx_power_level(true);
116 EXPECT_TRUE(TestAdvertiseData(adv0));
118 AdvertiseData adv1(data);
119 adv1.set_include_device_name(true);
120 EXPECT_TRUE(TestAdvertiseData(adv1));
122 AdvertiseData adv2(data);
123 adv2.set_include_tx_power_level(true);
124 adv2.set_include_device_name(true);
125 EXPECT_TRUE(TestAdvertiseData(adv2));
128 TEST(ParcelHelpersTest, DefaultAdvertiseSettings) {
129 AdvertiseSettings settings;
130 EXPECT_TRUE(TestAdvertiseSettings(settings));
133 TEST(ParcelHelpersTest, NonEmptyAdvertiseSettings) {
134 AdvertiseSettings settings(
135 AdvertiseSettings::MODE_BALANCED,
136 base::TimeDelta::FromMilliseconds(150),
137 AdvertiseSettings::TX_POWER_LEVEL_HIGH,
138 false /* connectable */);
139 EXPECT_TRUE(TestAdvertiseSettings(settings));
142 TEST(ParcelHelpersTest, UUID) {
143 // Try a whole bunch of UUIDs.
144 for (int i = 0; i < 10; i++) {
145 UUID uuid = UUID::GetRandom();
150 TEST(ParcelHelpersTest, GattIdentifier) {
151 UUID uuid0 = UUID::GetRandom();
152 UUID uuid1 = UUID::GetRandom();
153 UUID uuid2 = UUID::GetRandom();
155 auto service_id = GattIdentifier::CreateServiceId(
156 "01:23:45:67:89:ab", 5, uuid0, false);
157 auto char_id = GattIdentifier::CreateCharacteristicId(3, uuid1, *service_id);
158 auto desc_id = GattIdentifier::CreateDescriptorId(10, uuid2, *char_id);
160 TestGattIdentifier(*service_id);
161 TestGattIdentifier(*char_id);
162 TestGattIdentifier(*desc_id);
165 TEST(ParcelHelpersTest, ScanSettings) {
166 ScanSettings settings0;
167 ScanSettings settings1(
168 ScanSettings::MODE_BALANCED,
169 ScanSettings::CALLBACK_TYPE_FIRST_MATCH,
170 ScanSettings::RESULT_TYPE_ABBREVIATED,
171 base::TimeDelta::FromMilliseconds(150),
172 ScanSettings::MATCH_MODE_STICKY,
173 ScanSettings::MATCH_COUNT_FEW_ADVERTISEMENTS);
175 EXPECT_TRUE(TestScanSettings(settings0));
176 EXPECT_TRUE(TestScanSettings(settings1));
179 TEST(ParcelHelpersTest, ScanFilter) {
182 filter.set_device_name("Test Device Name");
183 ASSERT_TRUE(filter.SetDeviceAddress("01:02:04:AB:CD:EF"));
184 EXPECT_TRUE(TestScanFilter(filter));
186 UUID uuid = UUID::GetRandom();
187 filter.SetServiceUuid(uuid);
188 EXPECT_TRUE(TestScanFilter(filter));
190 UUID mask = UUID::GetRandom();
191 filter.SetServiceUuidWithMask(uuid, mask);
192 EXPECT_TRUE(TestScanFilter(filter));
195 TEST(ParcelHelpersTest, ScanResult) {
196 const char kTestAddress[] = "01:02:03:AB:CD:EF";
198 const std::vector<uint8_t> kEmptyBytes;
199 const std::vector<uint8_t> kTestBytes{ 0x01, 0x02, 0x03 };
201 const int kTestRssi = 127;
203 ScanResult result0(kTestAddress, kEmptyBytes, kTestRssi);
204 ScanResult result1(kTestAddress, kTestBytes, kTestRssi);
206 EXPECT_TRUE(TestScanResult(result0));
207 EXPECT_TRUE(TestScanResult(result1));
211 } // namespace binder