1 /*
2  * Copyright 2018 The Android Open Source Project
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 <android-base/silent_death_test.h>
18 #include <gtest/gtest.h>
19 
20 #include <memory>
21 
22 #include "packet.h"
23 #include "packet_test_common.h"
24 #include "test_packets.h"
25 
26 namespace bluetooth {
27 
28 using pair = std::pair<size_t, size_t>;
29 
30 class IteratorTest : public ::testing::TestWithParam<std::pair<size_t, size_t>> {
31 public:
GetTestPacket()32   std::shared_ptr<TestPacket> GetTestPacket() {
33     auto bounds = GetParam();
34     auto lower_bound = bounds.first;
35     auto upper_bound = bounds.second;
36 
37     return TestPacket::Make(test_l2cap_data, lower_bound, upper_bound);
38   }
39 
GetTestPacketLength()40   size_t GetTestPacketLength() { return GetParam().second - GetParam().first; }
41 
GetLowerBound()42   size_t GetLowerBound() { return GetParam().first; }
43 
GetUpperBound()44   size_t GetUpperBound() { return GetParam().second; }
45 };
46 
47 INSTANTIATE_TEST_CASE_P(IteratorParameterTest, IteratorTest,
48                         ::testing::Values(pair(0, test_l2cap_data.size()),
49                                           pair(3, test_l2cap_data.size() - 2)));
50 
51 using IteratorDeathTest = IteratorTest;
52 
53 INSTANTIATE_TEST_CASE_P(IteratorParameterTest, IteratorDeathTest,
54                         ::testing::Values(pair(0, test_l2cap_data.size()),
55                                           pair(3, test_l2cap_data.size() - 2)));
56 
TEST_F(IteratorDeathTest,iteratorCreateDeathTest)57 TEST_F(IteratorDeathTest, iteratorCreateDeathTest) {
58   auto packet = TestPacket::Make(test_l2cap_data, 3, test_l2cap_data.size() - 2);
59 
60   // this will silent SIGABRT sent in ASSERT_DEATH below
61   ScopedSilentDeath _silentDeath;
62 
63   ASSERT_DEATH(Iterator(packet, 0), "index_ >= packet->packet_start_index_");
64   ASSERT_DEATH(Iterator(packet, test_l2cap_data.size()), "index_ <= packet->packet_end_index_");
65 }
66 
TEST_F(IteratorTest,extractTest)67 TEST_F(IteratorTest, extractTest) {
68   auto packet = TestPacket::Make(test_l2cap_data);
69   Iterator general_case = packet->begin();
70 
71   ASSERT_EQ(0x02u, general_case.extract<uint8_t>());
72   ASSERT_EQ(0x2edcu, general_case.extract<uint16_t>());
73   ASSERT_EQ(0x00620066u, general_case.extract<uint32_t>());
74   ASSERT_EQ(0x00010000000a0013u, general_case.extract<uint64_t>());
75 }
76 
TEST_F(IteratorTest,extractBETest)77 TEST_F(IteratorTest, extractBETest) {
78   auto packet = TestPacket::Make(test_l2cap_data);
79   Iterator general_case = packet->begin();
80 
81   ASSERT_EQ(0x02u, general_case.extractBE<uint8_t>());
82   ASSERT_EQ(0xdc2eu, general_case.extractBE<uint16_t>());
83   ASSERT_EQ(0x66006200u, general_case.extractBE<uint32_t>());
84   ASSERT_EQ(0x13000a0000000100u, general_case.extractBE<uint64_t>());
85 }
86 
TEST_P(IteratorTest,payloadBoundsTest)87 TEST_P(IteratorTest, payloadBoundsTest) {
88   auto packet = GetTestPacket();
89   ASSERT_EQ(static_cast<size_t>(packet->end() - packet->begin()), GetTestPacketLength());
90 
91   auto it = packet->begin();
92   for (size_t i = 0; i < GetTestPacketLength(); i++) {
93     ASSERT_EQ(test_l2cap_data[i + GetLowerBound()], *it++);
94   }
95 }
96 
TEST_P(IteratorDeathTest,extractBoundsDeathTest)97 TEST_P(IteratorDeathTest, extractBoundsDeathTest) {
98   auto packet = GetTestPacket();
99   Iterator bounds_test = packet->end();
100 
101   // this will silent SIGABRT sent in ASSERT_DEATH below
102   ScopedSilentDeath _silentDeath;
103 
104   ASSERT_DEATH(bounds_test.extract<uint8_t>(), "index_ != packet_->packet_end_index_");
105   ASSERT_DEATH(bounds_test.extract<uint16_t>(), "index_ != packet_->packet_end_index_");
106   ASSERT_DEATH(bounds_test.extract<uint32_t>(), "index_ != packet_->packet_end_index_");
107   ASSERT_DEATH(bounds_test.extract<uint64_t>(), "index_ != packet_->packet_end_index_");
108 }
109 
TEST_P(IteratorDeathTest,extractBEBoundsDeathTest)110 TEST_P(IteratorDeathTest, extractBEBoundsDeathTest) {
111   auto packet = GetTestPacket();
112   Iterator bounds_test = packet->end();
113 
114   // this will silent SIGABRT sent in ASSERT_DEATH below
115   ScopedSilentDeath _silentDeath;
116 
117   ASSERT_DEATH(bounds_test.extractBE<uint8_t>(), "index_ != packet_->packet_end_index_");
118   ASSERT_DEATH(bounds_test.extractBE<uint16_t>(), "index_ != packet_->packet_end_index_");
119   ASSERT_DEATH(bounds_test.extractBE<uint32_t>(), "index_ != packet_->packet_end_index_");
120   ASSERT_DEATH(bounds_test.extractBE<uint64_t>(), "index_ != packet_->packet_end_index_");
121 }
122 
TEST_P(IteratorDeathTest,dereferenceDeathTest)123 TEST_P(IteratorDeathTest, dereferenceDeathTest) {
124   auto packet = GetTestPacket();
125   Iterator dereference_test = packet->end();
126 
127   ASSERT_EQ((*packet)[GetTestPacketLength() - 1], *(dereference_test - static_cast<size_t>(1)));
128 
129   // this will silent SIGABRT sent in ASSERT_DEATH below
130   ScopedSilentDeath _silentDeath;
131 
132   ASSERT_DEATH(*dereference_test, "index_ != packet_->packet_end_index_");
133 }
134 
TEST_P(IteratorTest,plusEqTest)135 TEST_P(IteratorTest, plusEqTest) {
136   auto packet = GetTestPacket();
137   Iterator plus_eq = packet->begin();
138   for (size_t i = 0; i < GetTestPacketLength(); i += 2) {
139     ASSERT_EQ(test_l2cap_data[i + GetLowerBound()], *plus_eq)
140             << "+= test: Dereferenced iterator does not equal expected at index " << i;
141     plus_eq += 2;
142   }
143 
144   ASSERT_EQ(plus_eq, packet->end());
145 }
146 
TEST_P(IteratorTest,preIncrementTest)147 TEST_P(IteratorTest, preIncrementTest) {
148   auto packet = GetTestPacket();
149   Iterator plus_plus = packet->begin();
150   for (size_t i = 0; i < GetTestPacketLength() - 1; i++) {
151     ASSERT_EQ(test_l2cap_data[i + GetLowerBound() + 1], *(++plus_plus))
152             << "Pre-increment test: Dereferenced iterator does not equal expected " << "at index "
153             << i;
154   }
155 }
156 
TEST_P(IteratorTest,postIncrementTest)157 TEST_P(IteratorTest, postIncrementTest) {
158   auto packet = GetTestPacket();
159   Iterator plus_plus = packet->begin();
160   for (size_t i = 0; i < GetTestPacketLength(); i++) {
161     ASSERT_EQ(test_l2cap_data[i + GetLowerBound()], *(plus_plus++))
162             << "Post-increment test: Dereferenced iterator does not equal expected " << "at index "
163             << i;
164   }
165 }
166 
TEST_P(IteratorTest,additionTest)167 TEST_P(IteratorTest, additionTest) {
168   auto packet = GetTestPacket();
169   Iterator plus = packet->begin();
170   for (size_t i = 0; i < GetTestPacketLength(); i++) {
171     ASSERT_EQ(test_l2cap_data[i + GetLowerBound()], *plus)
172             << "+ test: Dereferenced iterator does not equal expected at index " << i;
173     plus = plus + static_cast<size_t>(1);
174   }
175 }
176 
TEST_P(IteratorTest,minusEqTest)177 TEST_P(IteratorTest, minusEqTest) {
178   auto packet = GetTestPacket();
179   Iterator minus_eq = packet->end();
180   minus_eq -= 1;
181   for (int i = GetTestPacketLength() - 1; i > 0; i -= 2) {
182     ASSERT_EQ(test_l2cap_data[static_cast<size_t>(i) + GetLowerBound()], *minus_eq)
183             << "-= test: Dereferenced iterator does not equal expected at index " << i;
184     minus_eq -= 2;
185   }
186 }
187 
TEST_P(IteratorTest,preDecrementTest)188 TEST_P(IteratorTest, preDecrementTest) {
189   auto packet = GetTestPacket();
190   Iterator minus_minus = packet->end();
191   for (int i = GetTestPacketLength(); i > 0; i--) {
192     ASSERT_EQ(test_l2cap_data[static_cast<size_t>(i) + GetLowerBound() - 1], *(--minus_minus))
193             << "Pre-decrement test: Dereferenced iterator does not equal expected " << "at index "
194             << i;
195   }
196 }
197 
TEST_P(IteratorTest,postDecrementTest)198 TEST_P(IteratorTest, postDecrementTest) {
199   auto packet = GetTestPacket();
200   Iterator minus_minus = packet->end();
201   minus_minus--;
202   for (int i = GetTestPacketLength() - 1; i > 0; i--) {
203     ASSERT_EQ(test_l2cap_data[static_cast<size_t>(i) + GetLowerBound()], *(minus_minus--))
204             << "Post-decrement test: Dereferenced iterator does not equal expected " << "at index "
205             << i;
206   }
207 }
208 
TEST_P(IteratorTest,subtractionTest)209 TEST_P(IteratorTest, subtractionTest) {
210   auto packet = GetTestPacket();
211   Iterator minus = packet->end();
212   minus = minus - static_cast<size_t>(1);
213   for (int i = GetTestPacketLength() - 1; i > 0; i--) {
214     ASSERT_EQ(test_l2cap_data[static_cast<size_t>(i) + GetLowerBound()], *minus)
215             << "- test: Dereferenced iterator does not equal expected at index " << i;
216     minus = minus - static_cast<size_t>(1);
217   }
218 }
219 
TEST_P(IteratorTest,plusEqBoundsTest)220 TEST_P(IteratorTest, plusEqBoundsTest) {
221   auto packet = GetTestPacket();
222   Iterator plus_eq = packet->end();
223   for (size_t i = 0; i < 100; i++) {
224     plus_eq += i;
225     ASSERT_EQ(packet->end(), plus_eq)
226             << "+= test: Iterator exceeded the upper bound set by get_length()";
227   }
228 }
229 
TEST_P(IteratorTest,preIncrementBoundsTest)230 TEST_P(IteratorTest, preIncrementBoundsTest) {
231   auto packet = GetTestPacket();
232   Iterator plus_plus = packet->end();
233   plus_plus--;
234   for (size_t i = 0; i < 100; i++) {
235     ASSERT_EQ(packet->end(), ++plus_plus)
236             << "Pre-increment test: Iterator exceeded the upper bound set by get_length()";
237   }
238 }
239 
TEST_P(IteratorTest,postIncrementBoundsTest)240 TEST_P(IteratorTest, postIncrementBoundsTest) {
241   auto packet = GetTestPacket();
242   Iterator plus_plus = packet->end();
243   for (size_t i = 0; i < 100; i++) {
244     ASSERT_EQ(packet->end(), plus_plus++)
245             << "Post-increment test: Iterator exceeded the upper bound set by get_length()";
246   }
247 }
248 
TEST_P(IteratorTest,additionBoundsTest)249 TEST_P(IteratorTest, additionBoundsTest) {
250   auto packet = GetTestPacket();
251   Iterator plus = packet->end();
252   for (size_t i = 0; i < 100; i++) {
253     plus = plus + static_cast<size_t>(i);
254     ASSERT_EQ(packet->end(), plus)
255             << "+ test: Iterator exceeded the upper bound set by get_length()";
256   }
257 }
258 
TEST_P(IteratorTest,minusEqBoundsTest)259 TEST_P(IteratorTest, minusEqBoundsTest) {
260   auto packet = GetTestPacket();
261   Iterator minus_eq = packet->begin();
262   for (size_t i = 0; i < 100; i++) {
263     minus_eq -= i;
264     ASSERT_EQ(test_l2cap_data[GetLowerBound()], *minus_eq)
265             << "-= test: Iterator is less than the lower bound set by packet->begin()";
266   }
267 }
268 
TEST_P(IteratorTest,preDecrementBoundsTest)269 TEST_P(IteratorTest, preDecrementBoundsTest) {
270   auto packet = GetTestPacket();
271   Iterator minus_minus = packet->begin();
272   for (size_t i = 0; i < 100; i++) {
273     ASSERT_EQ(test_l2cap_data[GetLowerBound()], *(--minus_minus))
274             << "Pre-decrement test: Iterator is less than the lower bound set by packet->begin()";
275   }
276 }
277 
TEST_P(IteratorTest,postDecrementBoundsTest)278 TEST_P(IteratorTest, postDecrementBoundsTest) {
279   auto packet = GetTestPacket();
280   Iterator minus_minus = packet->begin();
281   for (size_t i = 0; i < 100; i++) {
282     ASSERT_EQ(test_l2cap_data[GetLowerBound()], *(minus_minus--))
283             << "Post-decrement test: Iterator is less than the lower bound set by packet->begin()";
284   }
285 }
286 
TEST_P(IteratorTest,subtractionBoundsTest)287 TEST_P(IteratorTest, subtractionBoundsTest) {
288   auto packet = GetTestPacket();
289   Iterator minus = packet->begin();
290   for (size_t i = 0; i < 100; i++) {
291     minus = minus - static_cast<size_t>(i);
292     ASSERT_EQ(test_l2cap_data[GetLowerBound()], *minus)
293             << "- test: Iterator is less than the lower bound set by packet->begin()";
294   }
295 }
296 
297 }  // namespace bluetooth
298