Home | History | Annotate | Download | only in test
      1 //
      2 //  Copyright (C) 2015 Google, Inc.
      3 //
      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:
      7 //
      8 //  http://www.apache.org/licenses/LICENSE-2.0
      9 //
     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.
     15 //
     16 
     17 #include <gtest/gtest.h>
     18 
     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"
     22 
     23 using android::Parcel;
     24 
     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;
     32 
     33 namespace ipc {
     34 namespace binder {
     35 namespace {
     36 
     37 bool TestAdvertiseData(const AdvertiseData &adv_in) {
     38   Parcel parcel;
     39 
     40   WriteAdvertiseDataToParcel(adv_in, &parcel);
     41   parcel.setDataPosition(0);
     42   auto adv_out = CreateAdvertiseDataFromParcel(parcel);
     43 
     44   return adv_in == *adv_out;
     45 }
     46 
     47 bool TestAdvertiseSettings(const AdvertiseSettings &settings_in) {
     48   Parcel parcel;
     49 
     50   WriteAdvertiseSettingsToParcel(settings_in, &parcel);
     51   parcel.setDataPosition(0);
     52   auto settings_out = CreateAdvertiseSettingsFromParcel(parcel);
     53 
     54   return settings_in == *settings_out;
     55 }
     56 
     57 bool TestUUID(const UUID& uuid_in) {
     58   Parcel parcel;
     59 
     60   WriteUUIDToParcel(uuid_in, &parcel);
     61   parcel.setDataPosition(0);
     62   auto uuid_out = CreateUUIDFromParcel(parcel);
     63 
     64   return uuid_in == *uuid_out;
     65 }
     66 
     67 bool TestGattIdentifier(const GattIdentifier& id_in) {
     68   Parcel parcel;
     69 
     70   WriteGattIdentifierToParcel(id_in, &parcel);
     71   parcel.setDataPosition(0);
     72   auto id_out = CreateGattIdentifierFromParcel(parcel);
     73 
     74   return id_in == *id_out;
     75 }
     76 
     77 bool TestScanSettings(const ScanSettings& settings_in) {
     78   Parcel parcel;
     79   WriteScanSettingsToParcel(settings_in, &parcel);
     80   parcel.setDataPosition(0);
     81   auto settings_out = CreateScanSettingsFromParcel(parcel);
     82 
     83   return settings_in == *settings_out;
     84 }
     85 
     86 bool TestScanFilter(const ScanFilter& filter_in) {
     87   Parcel parcel;
     88   WriteScanFilterToParcel(filter_in, &parcel);
     89   parcel.setDataPosition(0);
     90   auto filter_out = CreateScanFilterFromParcel(parcel);
     91 
     92   return filter_in == *filter_out;
     93 }
     94 
     95 bool TestScanResult(const ScanResult& result_in) {
     96   Parcel parcel;
     97   WriteScanResultToParcel(result_in, &parcel);
     98   parcel.setDataPosition(0);
     99   auto result_out = CreateScanResultFromParcel(parcel);
    100   assert(result_out.get() != nullptr);
    101 
    102   return result_in == *result_out;
    103 }
    104 
    105 TEST(ParcelHelpersTest, EmptyAdvertiseData) {
    106   std::vector<uint8_t> data;
    107   AdvertiseData adv(data);
    108 
    109   EXPECT_TRUE(TestAdvertiseData(adv));
    110 }
    111 
    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));
    117 
    118   AdvertiseData adv1(data);
    119   adv1.set_include_device_name(true);
    120   EXPECT_TRUE(TestAdvertiseData(adv1));
    121 
    122   AdvertiseData adv2(data);
    123   adv2.set_include_tx_power_level(true);
    124   adv2.set_include_device_name(true);
    125   EXPECT_TRUE(TestAdvertiseData(adv2));
    126 }
    127 
    128 TEST(ParcelHelpersTest, DefaultAdvertiseSettings) {
    129   AdvertiseSettings settings;
    130   EXPECT_TRUE(TestAdvertiseSettings(settings));
    131 }
    132 
    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));
    140 }
    141 
    142 TEST(ParcelHelpersTest, UUID) {
    143   // Try a whole bunch of UUIDs.
    144   for (int i = 0; i < 10; i++) {
    145     UUID uuid = UUID::GetRandom();
    146     TestUUID(uuid);
    147   }
    148 }
    149 
    150 TEST(ParcelHelpersTest, GattIdentifier) {
    151   UUID uuid0 = UUID::GetRandom();
    152   UUID uuid1 = UUID::GetRandom();
    153   UUID uuid2 = UUID::GetRandom();
    154 
    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);
    159 
    160   TestGattIdentifier(*service_id);
    161   TestGattIdentifier(*char_id);
    162   TestGattIdentifier(*desc_id);
    163 }
    164 
    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);
    174 
    175   EXPECT_TRUE(TestScanSettings(settings0));
    176   EXPECT_TRUE(TestScanSettings(settings1));
    177 }
    178 
    179 TEST(ParcelHelpersTest, ScanFilter) {
    180   ScanFilter filter;
    181 
    182   filter.set_device_name("Test Device Name");
    183   ASSERT_TRUE(filter.SetDeviceAddress("01:02:04:AB:CD:EF"));
    184   EXPECT_TRUE(TestScanFilter(filter));
    185 
    186   UUID uuid = UUID::GetRandom();
    187   filter.SetServiceUuid(uuid);
    188   EXPECT_TRUE(TestScanFilter(filter));
    189 
    190   UUID mask = UUID::GetRandom();
    191   filter.SetServiceUuidWithMask(uuid, mask);
    192   EXPECT_TRUE(TestScanFilter(filter));
    193 }
    194 
    195 TEST(ParcelHelpersTest, ScanResult) {
    196   const char kTestAddress[] = "01:02:03:AB:CD:EF";
    197 
    198   const std::vector<uint8_t> kEmptyBytes;
    199   const std::vector<uint8_t> kTestBytes{ 0x01, 0x02, 0x03 };
    200 
    201   const int kTestRssi = 127;
    202 
    203   ScanResult result0(kTestAddress, kEmptyBytes, kTestRssi);
    204   ScanResult result1(kTestAddress, kTestBytes, kTestRssi);
    205 
    206   EXPECT_TRUE(TestScanResult(result0));
    207   EXPECT_TRUE(TestScanResult(result1));
    208 }
    209 
    210 }  // namespace
    211 }  // namespace binder
    212 }  // namespace ipc
    213