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