blob: c2931336bc0a9bee41e1edd1c6aa0530a66d3035 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/packet_number_indexed_queue.h"
6
7#include <limits>
8#include <map>
vasilvv872e7a32019-03-12 16:42:44 -07009#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050010
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
12
13namespace quic {
14namespace {
15
16class PacketNumberIndexedQueueTest : public QuicTest {
17 public:
18 PacketNumberIndexedQueueTest() {}
19
20 protected:
vasilvvc48c8712019-03-11 13:38:16 -070021 PacketNumberIndexedQueue<std::string> queue_;
QUICHE teama6ef0a62019-03-07 20:34:33 -050022};
23
24TEST_F(PacketNumberIndexedQueueTest, InitialState) {
25 EXPECT_TRUE(queue_.IsEmpty());
26 EXPECT_FALSE(queue_.first_packet().IsInitialized());
27 EXPECT_FALSE(queue_.last_packet().IsInitialized());
28 EXPECT_EQ(0u, queue_.number_of_present_entries());
29 EXPECT_EQ(0u, queue_.entry_slots_used());
30}
31
32TEST_F(PacketNumberIndexedQueueTest, InsertingContinuousElements) {
33 ASSERT_TRUE(queue_.Emplace(QuicPacketNumber(1001), "one"));
34 EXPECT_EQ("one", *queue_.GetEntry(QuicPacketNumber(1001)));
35
36 ASSERT_TRUE(queue_.Emplace(QuicPacketNumber(1002), "two"));
37 EXPECT_EQ("two", *queue_.GetEntry(QuicPacketNumber(1002)));
38
39 EXPECT_FALSE(queue_.IsEmpty());
40 EXPECT_EQ(QuicPacketNumber(1001u), queue_.first_packet());
41 EXPECT_EQ(QuicPacketNumber(1002u), queue_.last_packet());
42 EXPECT_EQ(2u, queue_.number_of_present_entries());
43 EXPECT_EQ(2u, queue_.entry_slots_used());
44}
45
46TEST_F(PacketNumberIndexedQueueTest, InsertingOutOfOrder) {
47 queue_.Emplace(QuicPacketNumber(1001), "one");
48
49 ASSERT_TRUE(queue_.Emplace(QuicPacketNumber(1003), "three"));
50 EXPECT_EQ(nullptr, queue_.GetEntry(QuicPacketNumber(1002)));
51 EXPECT_EQ("three", *queue_.GetEntry(QuicPacketNumber(1003)));
52
53 EXPECT_EQ(QuicPacketNumber(1001u), queue_.first_packet());
54 EXPECT_EQ(QuicPacketNumber(1003u), queue_.last_packet());
55 EXPECT_EQ(2u, queue_.number_of_present_entries());
56 EXPECT_EQ(3u, queue_.entry_slots_used());
57
58 ASSERT_FALSE(queue_.Emplace(QuicPacketNumber(1002), "two"));
59}
60
61TEST_F(PacketNumberIndexedQueueTest, InsertingIntoPast) {
62 queue_.Emplace(QuicPacketNumber(1001), "one");
63 EXPECT_FALSE(queue_.Emplace(QuicPacketNumber(1000), "zero"));
64}
65
66TEST_F(PacketNumberIndexedQueueTest, InsertingDuplicate) {
67 queue_.Emplace(QuicPacketNumber(1001), "one");
68 EXPECT_FALSE(queue_.Emplace(QuicPacketNumber(1001), "one"));
69}
70
71TEST_F(PacketNumberIndexedQueueTest, RemoveInTheMiddle) {
72 queue_.Emplace(QuicPacketNumber(1001), "one");
73 queue_.Emplace(QuicPacketNumber(1002), "two");
74 queue_.Emplace(QuicPacketNumber(1003), "three");
75
76 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(1002)));
77 EXPECT_EQ(nullptr, queue_.GetEntry(QuicPacketNumber(1002)));
78
79 EXPECT_EQ(QuicPacketNumber(1001u), queue_.first_packet());
80 EXPECT_EQ(QuicPacketNumber(1003u), queue_.last_packet());
81 EXPECT_EQ(2u, queue_.number_of_present_entries());
82 EXPECT_EQ(3u, queue_.entry_slots_used());
83
84 EXPECT_FALSE(queue_.Emplace(QuicPacketNumber(1002), "two"));
85 EXPECT_TRUE(queue_.Emplace(QuicPacketNumber(1004), "four"));
86}
87
88TEST_F(PacketNumberIndexedQueueTest, RemoveAtImmediateEdges) {
89 queue_.Emplace(QuicPacketNumber(1001), "one");
90 queue_.Emplace(QuicPacketNumber(1002), "two");
91 queue_.Emplace(QuicPacketNumber(1003), "three");
92 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(1001)));
93 EXPECT_EQ(nullptr, queue_.GetEntry(QuicPacketNumber(1001)));
94 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(1003)));
95 EXPECT_EQ(nullptr, queue_.GetEntry(QuicPacketNumber(1003)));
96
97 EXPECT_EQ(QuicPacketNumber(1002u), queue_.first_packet());
98 EXPECT_EQ(QuicPacketNumber(1003u), queue_.last_packet());
99 EXPECT_EQ(1u, queue_.number_of_present_entries());
100 EXPECT_EQ(2u, queue_.entry_slots_used());
101
102 EXPECT_TRUE(queue_.Emplace(QuicPacketNumber(1004), "four"));
103}
104
105TEST_F(PacketNumberIndexedQueueTest, RemoveAtDistantFront) {
106 queue_.Emplace(QuicPacketNumber(1001), "one");
107 queue_.Emplace(QuicPacketNumber(1002), "one (kinda)");
108 queue_.Emplace(QuicPacketNumber(2001), "two");
109
110 EXPECT_EQ(QuicPacketNumber(1001u), queue_.first_packet());
111 EXPECT_EQ(QuicPacketNumber(2001u), queue_.last_packet());
112 EXPECT_EQ(3u, queue_.number_of_present_entries());
113 EXPECT_EQ(1001u, queue_.entry_slots_used());
114
115 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(1002)));
116 EXPECT_EQ(QuicPacketNumber(1001u), queue_.first_packet());
117 EXPECT_EQ(QuicPacketNumber(2001u), queue_.last_packet());
118 EXPECT_EQ(2u, queue_.number_of_present_entries());
119 EXPECT_EQ(1001u, queue_.entry_slots_used());
120
121 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(1001)));
122 EXPECT_EQ(QuicPacketNumber(2001u), queue_.first_packet());
123 EXPECT_EQ(QuicPacketNumber(2001u), queue_.last_packet());
124 EXPECT_EQ(1u, queue_.number_of_present_entries());
125 EXPECT_EQ(1u, queue_.entry_slots_used());
126}
127
128TEST_F(PacketNumberIndexedQueueTest, RemoveAtDistantBack) {
129 queue_.Emplace(QuicPacketNumber(1001), "one");
130 queue_.Emplace(QuicPacketNumber(2001), "two");
131
132 EXPECT_EQ(QuicPacketNumber(1001u), queue_.first_packet());
133 EXPECT_EQ(QuicPacketNumber(2001u), queue_.last_packet());
134
135 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(2001)));
136 EXPECT_EQ(QuicPacketNumber(1001u), queue_.first_packet());
137 EXPECT_EQ(QuicPacketNumber(2001u), queue_.last_packet());
138}
139
140TEST_F(PacketNumberIndexedQueueTest, ClearAndRepopulate) {
141 queue_.Emplace(QuicPacketNumber(1001), "one");
142 queue_.Emplace(QuicPacketNumber(2001), "two");
143
144 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(1001)));
145 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(2001)));
146 EXPECT_TRUE(queue_.IsEmpty());
147 EXPECT_FALSE(queue_.first_packet().IsInitialized());
148 EXPECT_FALSE(queue_.last_packet().IsInitialized());
149
150 EXPECT_TRUE(queue_.Emplace(QuicPacketNumber(101), "one"));
151 EXPECT_TRUE(queue_.Emplace(QuicPacketNumber(201), "two"));
152 EXPECT_EQ(QuicPacketNumber(101u), queue_.first_packet());
153 EXPECT_EQ(QuicPacketNumber(201u), queue_.last_packet());
154}
155
156TEST_F(PacketNumberIndexedQueueTest, FailToRemoveElementsThatNeverExisted) {
157 ASSERT_FALSE(queue_.Remove(QuicPacketNumber(1000)));
158 queue_.Emplace(QuicPacketNumber(1001), "one");
159 ASSERT_FALSE(queue_.Remove(QuicPacketNumber(1000)));
160 ASSERT_FALSE(queue_.Remove(QuicPacketNumber(1002)));
161}
162
163TEST_F(PacketNumberIndexedQueueTest, FailToRemoveElementsTwice) {
164 queue_.Emplace(QuicPacketNumber(1001), "one");
165 ASSERT_TRUE(queue_.Remove(QuicPacketNumber(1001)));
166 ASSERT_FALSE(queue_.Remove(QuicPacketNumber(1001)));
167 ASSERT_FALSE(queue_.Remove(QuicPacketNumber(1001)));
168}
169
170TEST_F(PacketNumberIndexedQueueTest, ConstGetter) {
171 queue_.Emplace(QuicPacketNumber(1001), "one");
172 const auto& const_queue = queue_;
173
174 EXPECT_EQ("one", *const_queue.GetEntry(QuicPacketNumber(1001)));
175 EXPECT_EQ(nullptr, const_queue.GetEntry(QuicPacketNumber(1002)));
176}
177
178} // namespace
179} // namespace quic