• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright (C) 2017 The Android Open Source Project
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 #include <gtest/gtest.h>
20 #include "advertise_data_parser.h"
21 
TEST(AdvertiseDataParserTest,IsValidEmpty)22 TEST(AdvertiseDataParserTest, IsValidEmpty) {
23   const std::vector<uint8_t> data0;
24   EXPECT_TRUE(AdvertiseDataParser::IsValid(data0));
25 
26   // Single empty field allowed (treated as zero padding).
27   const std::vector<uint8_t> data1{0x00};
28   EXPECT_TRUE(AdvertiseDataParser::IsValid(data1));
29 }
30 
TEST(AdvertiseDataParserTest,IsValidBad)31 TEST(AdvertiseDataParserTest, IsValidBad) {
32   // Single field, field empty.
33   const std::vector<uint8_t> data0{0x01};
34   EXPECT_FALSE(AdvertiseDataParser::IsValid(data0));
35 
36   // Single field, first field length too long.
37   const std::vector<uint8_t> data1{0x05, 0x02, 0x00, 0x00, 0x00};
38   EXPECT_FALSE(AdvertiseDataParser::IsValid(data1));
39 
40   // Two fields, second field length too long.
41   const std::vector<uint8_t> data2{0x02, 0x02, 0x00, 0x02, 0x00};
42   EXPECT_FALSE(AdvertiseDataParser::IsValid(data2));
43 
44   // Two fields, second field empty.
45   const std::vector<uint8_t> data3{0x02, 0x02, 0x00, 0x01};
46   EXPECT_FALSE(AdvertiseDataParser::IsValid(data3));
47 
48   // Non-zero padding at end of packet.
49   const std::vector<uint8_t> data4{0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x01,
50                                    0x00, 0x00, 0xBA, 0xBA, 0x00, 0x00};
51   EXPECT_FALSE(AdvertiseDataParser::IsValid(data1));
52 
53   // Non-zero padding at end of packet.
54   const std::vector<uint8_t> data5{0x03, 0x02, 0x01, 0x02, 0x02,
55                                    0x03, 0x01, 0x00, 0xBA};
56   EXPECT_FALSE(AdvertiseDataParser::IsValid(data1));
57 }
58 
TEST(AdvertiseDataParserTest,IsValidGood)59 TEST(AdvertiseDataParserTest, IsValidGood) {
60   // Single field.
61   const std::vector<uint8_t> data0{0x03, 0x02, 0x01, 0x02};
62   EXPECT_TRUE(AdvertiseDataParser::IsValid(data0));
63 
64   // Two fields.
65   const std::vector<uint8_t> data1{0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x01};
66   EXPECT_TRUE(AdvertiseDataParser::IsValid(data1));
67 
68   // Zero padding at end of packet.
69   const std::vector<uint8_t> data2{0x03, 0x02, 0x01, 0x02,
70                                    0x02, 0x03, 0x01, 0x00};
71   EXPECT_TRUE(AdvertiseDataParser::IsValid(data2));
72 
73   // zero padding at end of packet, sample data from real device
74   const std::vector<uint8_t> data3{
75       0x10, 0x096, 0x85, 0x44, 0x32, 0x04, 0x74, 0x32, 0x03, 0x13, 0x93,
76       0xa,  0x32,  0x39, 0x3a, 0x65, 0x32, 0x05, 0x12, 0x50, 0x00, 0x50,
77       0x00, 0x02,  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
78   EXPECT_TRUE(AdvertiseDataParser::IsValid(data3));
79 
80   // Test Quirk for Traxxas (bad name length, should be 0x11 is 0x14)
81   const std::vector<uint8_t> data4{0x14, 0x09, 0x54, 0x52, 0x58, 0x20,
82                                    0x42, 0x4C, 0x45, 0x05, 0x12, 0x60,
83                                    0x00, 0xE8, 0x03, 0x02, 0x0A, 0x00};
84   EXPECT_TRUE(AdvertiseDataParser::IsValid(data4));
85 
86   // Test Quirk for Traxxas (bad name length, should be 0x11 is 0x14)
87   const std::vector<uint8_t> data5{0x14, 0x09, 0x54, 0x51, 0x69, 0x20,
88                                    0x42, 0x4C, 0x45, 0x05, 0x12, 0x64,
89                                    0x00, 0xE8, 0x03, 0x02, 0x0A, 0x00};
90   EXPECT_TRUE(AdvertiseDataParser::IsValid(data5));
91 
92   // Test Quirk for Traxxas (bad name length, should be 0x11 is 0x14)
93   const std::vector<uint8_t> data6{0x14, 0x09, 0x54, 0x51, 0x69, 0x20,
94                                    0x42, 0x4C, 0x45, 0x05, 0x12, 0x60,
95                                    0x00, 0xE8, 0x03, 0x02, 0x0A, 0x00};
96   EXPECT_TRUE(AdvertiseDataParser::IsValid(data6));
97 
98   // Test Quirk for Traxxas (bad length, should be 0x11 is 0x14)
99   // scan response glued after advertise data
100   const std::vector<uint8_t> data7{
101       0x02, 0x01, 0x06, 0x11, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
102       0x00, 0x64, 0xB1, 0x73, 0x41, 0xE7, 0xF3, 0xC4, 0xB4, 0x80,
103       0x08, 0x14, 0x09, 0x54, 0x51, 0x69, 0x20, 0x42, 0x4C, 0x45,
104       0x05, 0x12, 0x60, 0x00, 0xE8, 0x03, 0x02, 0x0A, 0x00};
105   EXPECT_TRUE(AdvertiseDataParser::IsValid(data7));
106 }
107 
TEST(AdvertiseDataParserTest,GetFieldByType)108 TEST(AdvertiseDataParserTest, GetFieldByType) {
109   // Single field.
110   const std::vector<uint8_t> data0{0x03, 0x02, 0x01, 0x02};
111 
112   uint8_t p_length;
113   const uint8_t* data =
114       AdvertiseDataParser::GetFieldByType(data0, 0x02, &p_length);
115   EXPECT_EQ(data0.data() + 2, data);
116   EXPECT_EQ(2, p_length);
117 
118   // Two fields, second field length too long.
119   const std::vector<uint8_t> data1{0x02, 0x02, 0x00, 0x03, 0x00};
120 
121   // First field is ok.
122   data = AdvertiseDataParser::GetFieldByType(data1, 0x02, &p_length);
123   EXPECT_EQ(data1.data() + 2, data);
124   EXPECT_EQ(0x01, p_length);
125 
126   // Second field have bad length.
127   data = AdvertiseDataParser::GetFieldByType(data1, 0x03, &p_length);
128   EXPECT_EQ(nullptr, data);
129   EXPECT_EQ(0, p_length);
130 }
131 
132 // This test makes sure that RemoveTrailingZeros is working correctly. It does
133 // run the RemoveTrailingZeros for ad data, then glue scan response at end of
134 // it, and checks that the resulting data is good.
TEST(AdvertiseDataParserTest,RemoveTrailingZeros)135 TEST(AdvertiseDataParserTest, RemoveTrailingZeros) {
136   std::vector<uint8_t> podo_ad_data{
137       0x02, 0x01, 0x02, 0x11, 0x06, 0x66, 0x9a, 0x0c, 0x20, 0x00, 0x08,
138       0x37, 0xa8, 0xe5, 0x11, 0x81, 0x8b, 0xd0, 0xf0, 0xf0, 0xf0, 0x00,
139       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
140   const std::vector<uint8_t> podo_scan_resp{
141       0x03, 0x19, 0x00, 0x80, 0x09, 0x09, 0x50, 0x6f, 0x64, 0x6f, 0x51,
142       0x35, 0x56, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
144 
145   AdvertiseDataParser::RemoveTrailingZeros(podo_ad_data);
146 
147   std::vector<uint8_t> glued(podo_ad_data);
148   glued.insert(glued.end(), podo_ad_data.begin(), podo_ad_data.end());
149 
150   EXPECT_TRUE(AdvertiseDataParser::IsValid(glued));
151 }