1 //
2 //  Copyright 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, 0x03, 0x02, 0x01, 0x02};
79   AdvertiseData adv1(data1);
80   EXPECT_FALSE(adv1.IsValid());
81 
82   // Two fields, second invalid.
83   const std::vector<uint8_t> data2{
84       0x03, 0x02, 0x01, 0x02, 0x02, HCI_EIR_FLAGS_TYPE, 0x00};
85   AdvertiseData adv2(data2);
86   EXPECT_FALSE(adv2.IsValid());
87 
88   // Check all rejectlisted fields
89   uint8_t rejectlist[] = {HCI_EIR_FLAGS_TYPE, HCI_EIR_OOB_BD_ADDR_TYPE,
90                           HCI_EIR_OOB_COD_TYPE, HCI_EIR_OOB_SSP_HASH_C_TYPE,
91                           HCI_EIR_OOB_SSP_RAND_R_TYPE};
92   for (size_t i = 0; i < sizeof(rejectlist); i++) {
93     const std::vector<uint8_t> data{0x02, rejectlist[i], 0x00};
94     AdvertiseData adv(data);
95     EXPECT_FALSE(adv.IsValid());
96   }
97 }
98 
TEST(AdvertiseDataTest,EqualsData)99 TEST(AdvertiseDataTest, EqualsData) {
100   const std::vector<uint8_t> data0{0x02, 0x02, 0x00};
101   const std::vector<uint8_t> data1{0x02, 0x03, 0x00};
102 
103   AdvertiseData adv0(data0);
104   AdvertiseData adv1(data1);
105 
106   EXPECT_FALSE(adv0 == adv1);
107 
108   AdvertiseData adv2(data1);
109   EXPECT_TRUE(adv1 == adv2);
110 }
111 
112 }  // namespace bluetooth
113