1341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker/*
2341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Copyright 2018 The Android Open Source Project
3341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker *
4341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Licensed under the Apache License, Version 2.0 (the "License");
5341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * you may not use this file except in compliance with the License.
6341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * You may obtain a copy of the License at
7341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker *
8341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker *      http://www.apache.org/licenses/LICENSE-2.0
9341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker *
10341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * Unless required by applicable law or agreed to in writing, software
11341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * distributed under the License is distributed on an "AS IS" BASIS,
12341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * See the License for the specific language governing permissions and
14341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker * limitations under the License.
15341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker */
16341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
17341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include <gtest/gtest.h>
18341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include <memory>
19341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
20341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include "packet.h"
21341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include "packet_test_common.h"
22341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker#include "test_packets.h"
23341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
24341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickernamespace bluetooth {
25341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
26341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickerusing pair = std::pair<size_t, size_t>;
27341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
28341ab2befa059e859cdc67655d83bac14980ea9eAjay Panickerclass IteratorTest
29341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    : public ::testing::TestWithParam<std::pair<size_t, size_t>> {
30341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker public:
31341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  std::shared_ptr<TestPacket> GetTestPacket() {
32341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    auto bounds = GetParam();
33341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    auto lower_bound = bounds.first;
34341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    auto upper_bound = bounds.second;
35341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
36341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    return TestPacket::Make(test_l2cap_data, lower_bound, upper_bound);
37341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
38341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
39341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  size_t GetTestPacketLength() { return GetParam().second - GetParam().first; }
40341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
41341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  size_t GetLowerBound() { return GetParam().first; }
42341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
43341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  size_t GetUpperBound() { return GetParam().second; }
44341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker};
45341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
46341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerINSTANTIATE_TEST_CASE_P(IteratorParameterTest, IteratorTest,
47341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker                        ::testing::Values(pair(0, test_l2cap_data.size()),
48341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker                                          pair(3, test_l2cap_data.size() - 2)));
49341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
50341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_F(IteratorTest, iteratorCreateDeathTest) {
51341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet =
52341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker      TestPacket::Make(test_l2cap_data, 3, test_l2cap_data.size() - 2);
53341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_DEATH(Iterator(packet, 0), "index_ >= packet->packet_start_index_");
54341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_DEATH(Iterator(packet, test_l2cap_data.size()),
55341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker               "index_ <= packet->packet_end_index_");
56341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
57341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
58341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_F(IteratorTest, extractTest) {
59341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = TestPacket::Make(test_l2cap_data);
60341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator general_case = packet->begin();
61341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
62341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_EQ(0x02u, general_case.extract<uint8_t>());
63341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_EQ(0x2edcu, general_case.extract<uint16_t>());
64341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_EQ(0x00620066u, general_case.extract<uint32_t>());
65341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_EQ(0x00010000000a0013u, general_case.extract<uint64_t>());
66341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
67341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
68341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, payloadBoundsTest) {
69341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
70341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_EQ(static_cast<size_t>(packet->end() - packet->begin()),
71341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker            GetTestPacketLength());
72341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
73341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto it = packet->begin();
74341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < GetTestPacketLength(); i++) {
75341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[i + GetLowerBound()], *it++);
76341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
77341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
78341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
79341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, extractBoundsDeathTest) {
80341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
81341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator bounds_test = packet->end();
82341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_DEATH(bounds_test.extract<uint8_t>(),
83341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker               "index_ != packet_->packet_end_index_");
84341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_DEATH(bounds_test.extract<uint16_t>(),
85341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker               "index_ != packet_->packet_end_index_");
86341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_DEATH(bounds_test.extract<uint32_t>(),
87341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker               "index_ != packet_->packet_end_index_");
88341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_DEATH(bounds_test.extract<uint64_t>(),
89341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker               "index_ != packet_->packet_end_index_");
90341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
91341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
92341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, dereferenceDeathTest) {
93341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
94341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator dereference_test = packet->end();
95341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
96341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_EQ((*packet)[GetTestPacketLength() - 1],
97341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker            *(dereference_test - static_cast<size_t>(1)));
98341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_DEATH(*dereference_test, "index_ != packet_->packet_end_index_");
99341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
100341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
101341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, plusEqTest) {
102341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
103341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator plus_eq = packet->begin();
104341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < GetTestPacketLength(); i += 2) {
105341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[i + GetLowerBound()], *plus_eq)
106341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "+= test: Dereferenced iterator does not equal expected at index "
107341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << i;
108341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    plus_eq += 2;
109341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
110341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
111341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  ASSERT_EQ(plus_eq, packet->end());
112341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
113341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
114341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, preIncrementTest) {
115341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
116341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator plus_plus = packet->begin();
117341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < GetTestPacketLength() - 1; i++) {
118341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[i + GetLowerBound() + 1], *(++plus_plus))
119341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "Pre-increment test: Dereferenced iterator does not equal expected "
120341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "at index " << i;
121341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
122341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
123341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
124341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, postIncrementTest) {
125341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
126341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator plus_plus = packet->begin();
127341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < GetTestPacketLength(); i++) {
128341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[i + GetLowerBound()], *(plus_plus++))
129341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "Post-increment test: Dereferenced iterator does not equal expected "
130341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "at index " << i;
131341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
132341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
133341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
134341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, additionTest) {
135341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
136341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator plus = packet->begin();
137341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < GetTestPacketLength(); i++) {
138341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[i + GetLowerBound()], *plus)
139341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "+ test: Dereferenced iterator does not equal expected at index "
140341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << i;
141341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    plus = plus + static_cast<size_t>(1);
142341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
143341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
144341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
145341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, minusEqTest) {
146341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
147341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator minus_eq = packet->end();
148341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  minus_eq -= 1;
149341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (int i = GetTestPacketLength() - 1; i > 0; i -= 2) {
150341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[static_cast<size_t>(i) + GetLowerBound()],
151341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker              *minus_eq)
152341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "-= test: Dereferenced iterator does not equal expected at index "
153341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << i;
154341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    minus_eq -= 2;
155341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
156341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
157341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
158341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, preDecrementTest) {
159341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
160341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator minus_minus = packet->end();
161341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (int i = GetTestPacketLength(); i > 0; i--) {
162341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[static_cast<size_t>(i) + GetLowerBound() - 1],
163341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker              *(--minus_minus))
164341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "Pre-decrement test: Dereferenced iterator does not equal expected "
165341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "at index " << i;
166341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
167341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
168341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
169341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, postDecrementTest) {
170341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
171341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator minus_minus = packet->end();
172341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  minus_minus--;
173341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (int i = GetTestPacketLength() - 1; i > 0; i--) {
174341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[static_cast<size_t>(i) + GetLowerBound()],
175341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker              *(minus_minus--))
176341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "Post-decrement test: Dereferenced iterator does not equal expected "
177341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "at index " << i;
178341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
179341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
180341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
181341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, subtractionTest) {
182341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
183341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator minus = packet->end();
184341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  minus = minus - static_cast<size_t>(1);
185341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (int i = GetTestPacketLength() - 1; i > 0; i--) {
186341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[static_cast<size_t>(i) + GetLowerBound()], *minus)
187341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "- test: Dereferenced iterator does not equal expected at index "
188341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << i;
189341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    minus = minus - static_cast<size_t>(1);
190341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
191341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
192341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
193341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, plusEqBoundsTest) {
194341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
195341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator plus_eq = packet->end();
196341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < 100; i++) {
197341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    plus_eq += i;
198341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(packet->end(), plus_eq)
199341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "+= test: Iterator exceeded the upper bound set by get_length()";
200341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
201341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
202341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
203341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, preIncrementBoundsTest) {
204341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
205341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator plus_plus = packet->end();
206341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  plus_plus--;
207341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < 100; i++) {
208341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(packet->end(), ++plus_plus)
209341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "Pre-increment test: Iterator exceeded the upper bound set "
210341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker           "by get_length()";
211341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
212341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
213341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
214341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, postIncrementBoundsTest) {
215341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
216341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator plus_plus = packet->end();
217341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < 100; i++) {
218341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(packet->end(), plus_plus++)
219341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "Post-increment test: Iterator exceeded the upper bound set "
220341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker           "by get_length()";
221341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
222341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
223341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
224341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, additionBoundsTest) {
225341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
226341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator plus = packet->end();
227341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < 100; i++) {
228341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    plus = plus + static_cast<size_t>(i);
229341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(packet->end(), plus)
230341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "+ test: Iterator exceeded the upper bound set by get_length()";
231341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
232341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
233341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
234341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, minusEqBoundsTest) {
235341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
236341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator minus_eq = packet->begin();
237341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < 100; i++) {
238341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    minus_eq -= i;
239341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[GetLowerBound()], *minus_eq)
240341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "-= test: Iterator is less than the lower bound set by "
241341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker           "packet->begin()";
242341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
243341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
244341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
245341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, preDecrementBoundsTest) {
246341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
247341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator minus_minus = packet->begin();
248341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < 100; i++) {
249341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[GetLowerBound()], *(--minus_minus))
250341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "Pre-decrement test: Iterator is less than the lower bound set by "
251341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker           "packet->begin()";
252341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
253341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
254341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
255341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, postDecrementBoundsTest) {
256341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
257341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator minus_minus = packet->begin();
258341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < 100; i++) {
259341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[GetLowerBound()], *(minus_minus--))
260341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "Post-decrement test: Iterator is less than the lower bound set by "
261341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker           "packet->begin()";
262341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
263341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
264341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
265341ab2befa059e859cdc67655d83bac14980ea9eAjay PanickerTEST_P(IteratorTest, subtractionBoundsTest) {
266341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  auto packet = GetTestPacket();
267341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  Iterator minus = packet->begin();
268341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  for (size_t i = 0; i < 100; i++) {
269341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    minus = minus - static_cast<size_t>(i);
270341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker    ASSERT_EQ(test_l2cap_data[GetLowerBound()], *minus)
271341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker        << "- test: Iterator is less than the lower bound set "
272341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker           "by packet->begin()";
273341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker  }
274341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}
275341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker
276341ab2befa059e859cdc67655d83bac14980ea9eAjay Panicker}  // namespace bluetooth