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 "stack/include/bt_types.h"
21 #include "stack/include/hcidefs.h"
22 
23 namespace bluetooth {
24 
TEST(AdvertiseDataTest,EmptyData)25 TEST(AdvertiseDataTest, EmptyData) {
26   const std::vector<uint8_t> data0;
27   AdvertiseData adv0(data0);
28   EXPECT_TRUE(adv0.IsValid());
29 
30   // Single empty field not allowed.
31   const std::vector<uint8_t> data1{ 0x00 };
32   AdvertiseData adv1(data1);
33   EXPECT_FALSE(adv1.IsValid());
34 }
35 
TEST(AdvertiseDataTest,BadTLV)36 TEST(AdvertiseDataTest, BadTLV) {
37   // Single field, field empty.
38   const std::vector<uint8_t> data0{ 0x01 };
39   AdvertiseData adv0(data0);
40   EXPECT_FALSE(adv0.IsValid());
41 
42   // Single field, first field length too long.
43   const std::vector<uint8_t> data1{ 0x05, 0x02, 0x00, 0x00, 0x00 };
44   AdvertiseData adv1(data1);
45   EXPECT_FALSE(adv1.IsValid());
46 
47   // Two fields, second field length too long.
48   const std::vector<uint8_t> data2{ 0x02, 0x02, 0x00, 0x02, 0x00 };
49   AdvertiseData adv2(data2);
50   EXPECT_FALSE(adv2.IsValid());
51 
52   // Two fields, second field empty.
53   const std::vector<uint8_t> data3{ 0x02, 0x02, 0x00, 0x01 };
54   AdvertiseData adv3(data3);
55   EXPECT_FALSE(adv3.IsValid());
56 }
57 
TEST(AdvertiseDataTest,GoodTLV)58 TEST(AdvertiseDataTest, GoodTLV) {
59   // Singe field.
60   const std::vector<uint8_t> data0{ 0x03, 0x02, 0x01, 0x02 };
61   AdvertiseData adv0(data0);
62   EXPECT_TRUE(adv0.IsValid());
63 
64   // Twi fields.
65   const std::vector<uint8_t> data1{ 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x01 };
66   AdvertiseData adv1(data1);
67   EXPECT_TRUE(adv0.IsValid());
68 }
69 
TEST(AdvertiseDataTest,DisallowedFields)70 TEST(AdvertiseDataTest, DisallowedFields) {
71   // Singe field.
72   const std::vector<uint8_t> data0{ 0x02, HCI_EIR_FLAGS_TYPE, 0x00 };
73   AdvertiseData adv0(data0);
74   EXPECT_FALSE(adv0.IsValid());
75 
76   // Two fields, first invalid.
77   const std::vector<uint8_t> data1{
78       0x02, HCI_EIR_FLAGS_TYPE, 0x00,
79       0x03, 0x02, 0x01, 0x02
80   };
81   AdvertiseData adv1(data1);
82   EXPECT_FALSE(adv1.IsValid());
83 
84   // Two fields, second invalid.
85   const std::vector<uint8_t> data2{
86       0x03, 0x02, 0x01, 0x02,
87       0x02, HCI_EIR_FLAGS_TYPE, 0x00
88   };
89   AdvertiseData adv2(data2);
90   EXPECT_FALSE(adv2.IsValid());
91 
92   // Check all blacklisted fields
93   uint8_t blacklist[] = {
94       HCI_EIR_FLAGS_TYPE,
95       HCI_EIR_TX_POWER_LEVEL_TYPE,
96       HCI_EIR_SHORTENED_LOCAL_NAME_TYPE,
97       HCI_EIR_COMPLETE_LOCAL_NAME_TYPE,
98       HCI_EIR_OOB_BD_ADDR_TYPE,
99       HCI_EIR_OOB_COD_TYPE,
100       HCI_EIR_OOB_SSP_HASH_C_TYPE,
101       HCI_EIR_OOB_SSP_RAND_R_TYPE
102   };
103   for (size_t i = 0; i < sizeof(blacklist); i++) {
104     const std::vector<uint8_t> data{ 0x02, blacklist[i], 0x00 };
105     AdvertiseData adv(data);
106     EXPECT_FALSE(adv.IsValid());
107   }
108 }
109 
TEST(AdvertiseDataTest,EqualsData)110 TEST(AdvertiseDataTest, EqualsData) {
111   const std::vector<uint8_t> data0{ 0x02, 0x02, 0x00 };
112   const std::vector<uint8_t> data1{ 0x02, 0x03, 0x00 };
113 
114   AdvertiseData adv0(data0);
115   AdvertiseData adv1(data1);
116 
117   EXPECT_FALSE(adv0 == adv1);
118 
119   AdvertiseData adv2(data1);
120   EXPECT_TRUE(adv1 == adv2);
121 }
122 
TEST(AdvertiseDataTest,EqualsIncludes)123 TEST(AdvertiseDataTest, EqualsIncludes) {
124   const std::vector<uint8_t> data;
125 
126   AdvertiseData adv0;
127   AdvertiseData adv1;
128   AdvertiseData adv2;
129   AdvertiseData adv3;
130   AdvertiseData adv4;
131 
132   adv0.set_include_device_name(true);
133   adv0.set_include_tx_power_level(false);
134 
135   adv1.set_include_device_name(false);
136   adv1.set_include_tx_power_level(false);
137 
138   adv2.set_include_device_name(false);
139   adv2.set_include_tx_power_level(true);
140 
141   adv3.set_include_device_name(true);
142   adv3.set_include_tx_power_level(true);
143 
144   adv4.set_include_device_name(true);
145   adv4.set_include_tx_power_level(false);
146 
147   EXPECT_FALSE(adv0 == adv1);
148   EXPECT_FALSE(adv0 == adv2);
149   EXPECT_FALSE(adv3 == adv1);
150   EXPECT_TRUE(adv4 == adv0);
151 }
152 
153 }  // namespace bluetooth
154