Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: net/quic/quic_stream_sequencer_test.cc

Issue 1433793002: Change bufferring data structure for QuicStreamSequencer. Protected by FLAGS_quic_use_stream_sequen… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@106946658
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_stream_sequencer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_stream_sequencer.h" 5 #include "net/quic/quic_stream_sequencer.h"
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/rand_util.h" 11 #include "base/rand_util.h"
12 #include "net/base/ip_endpoint.h" 12 #include "net/base/ip_endpoint.h"
13 #include "net/quic/quic_flags.h"
13 #include "net/quic/quic_frame_list.h" 14 #include "net/quic/quic_frame_list.h"
14 #include "net/quic/quic_utils.h" 15 #include "net/quic/quic_utils.h"
15 #include "net/quic/reliable_quic_stream.h" 16 #include "net/quic/reliable_quic_stream.h"
16 #include "net/quic/test_tools/mock_clock.h" 17 #include "net/quic/test_tools/mock_clock.h"
17 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" 18 #include "net/quic/test_tools/quic_stream_sequencer_peer.h"
18 #include "net/quic/test_tools/quic_test_utils.h" 19 #include "net/quic/test_tools/quic_test_utils.h"
19 #include "net/test/gtest_util.h" 20 #include "net/test/gtest_util.h"
20 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gmock_mutant.h" 22 #include "testing/gmock_mutant.h"
22 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 29 matching lines...) Expand all
52 return QuicUtils::HighestPriority(); 53 return QuicUtils::HighestPriority();
53 } 54 }
54 virtual bool IsFlowControlEnabled() const { return true; } 55 virtual bool IsFlowControlEnabled() const { return true; }
55 }; 56 };
56 57
57 namespace { 58 namespace {
58 59
59 static const char kPayload[] = 60 static const char kPayload[] =
60 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 61 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
61 62
62 class QuicStreamSequencerTest : public ::testing::Test { 63 class QuicStreamSequencerTest : public ::testing::TestWithParam<bool> {
63 public: 64 public:
65 void SetUp() override {
66 FLAGS_quic_use_stream_sequencer_buffer = GetParam();
67 sequencer_.reset(new QuicStreamSequencer(&stream_, &clock_));
68 }
69
64 void ConsumeData(size_t num_bytes) { 70 void ConsumeData(size_t num_bytes) {
65 char buffer[1024]; 71 char buffer[1024];
66 ASSERT_GT(arraysize(buffer), num_bytes); 72 ASSERT_GT(arraysize(buffer), num_bytes);
67 struct iovec iov; 73 struct iovec iov;
68 iov.iov_base = buffer; 74 iov.iov_base = buffer;
69 iov.iov_len = num_bytes; 75 iov.iov_len = num_bytes;
70 ASSERT_EQ(static_cast<int>(num_bytes), sequencer_->Readv(&iov, 1)); 76 ASSERT_EQ(static_cast<int>(num_bytes), sequencer_->Readv(&iov, 1));
71 } 77 }
72 78
73 protected: 79 protected:
74 QuicStreamSequencerTest() 80 QuicStreamSequencerTest()
75 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), 81 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)),
76 session_(connection_), 82 session_(connection_),
77 stream_(&session_, 1), 83 stream_(&session_, 1) {}
78 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {}
79 84
80 bool VerifyReadableRegion(const char** expected) { 85 // Verify that the data in first region match with the expected[0].
86 bool VerifyReadableRegion(const vector<string>& expected) {
81 iovec iovecs[1]; 87 iovec iovecs[1];
82 QuicTime timestamp = clock_.ApproximateNow(); 88 if (sequencer_->GetReadableRegions(iovecs, 1)) {
83 if (sequencer_->GetReadableRegion(iovecs, &timestamp)) { 89 return (VerifyIovecs(iovecs, 1, vector<string>{expected[0]}));
84 return (VerifyIovecs(iovecs, 1, expected, 1));
85 } 90 }
86 return false; 91 return false;
87 } 92 }
88 93
89 bool VerifyReadableRegions(const char** expected, size_t num_expected) { 94 // Verify that the data in each of currently readable regions match with each
95 // item given in |expected|.
96 bool VerifyReadableRegions(const vector<string>& expected) {
90 iovec iovecs[5]; 97 iovec iovecs[5];
91 size_t num_iovecs = 98 size_t num_iovecs =
92 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); 99 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs));
93 return VerifyReadableRegion(expected) && 100 return VerifyReadableRegion(expected) &&
94 VerifyIovecs(iovecs, num_iovecs, expected, num_expected); 101 VerifyIovecs(iovecs, num_iovecs, expected);
95 } 102 }
96 103
97 bool VerifyIovecs(iovec* iovecs, 104 bool VerifyIovecs(iovec* iovecs,
98 size_t num_iovecs, 105 size_t num_iovecs,
99 const char** expected, 106 const vector<string>& expected) {
100 size_t num_expected) { 107 if (!FLAGS_quic_use_stream_sequencer_buffer) {
101 if (num_expected != num_iovecs) { 108 if (expected.size() != num_iovecs) {
102 LOG(ERROR) << "Incorrect number of iovecs. Expected: " << num_expected 109 LOG(ERROR) << "Incorrect number of iovecs. Expected: "
103 << " Actual: " << num_iovecs; 110 << expected.size() << " Actual: " << num_iovecs;
104 return false;
105 }
106 for (size_t i = 0; i < num_expected; ++i) {
107 if (!VerifyIovec(iovecs[i], expected[i])) {
108 return false; 111 return false;
109 } 112 }
113
114 for (size_t i = 0; i < num_iovecs; ++i) {
115 if (!VerifyIovec(iovecs[i], expected[i])) {
116 return false;
117 }
118 }
119 } else {
120 int start_position = 0;
121 for (size_t i = 0; i < num_iovecs; ++i) {
122 if (!VerifyIovec(iovecs[i], expected[0].substr(start_position,
123 iovecs[i].iov_len))) {
124 return false;
125 }
126 start_position += iovecs[i].iov_len;
127 }
110 } 128 }
111 return true; 129 return true;
112 } 130 }
113 131
114 bool VerifyIovec(const iovec& iovec, StringPiece expected) { 132 bool VerifyIovec(const iovec& iovec, StringPiece expected) {
115 if (iovec.iov_len != expected.length()) { 133 if (iovec.iov_len != expected.length()) {
116 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs " 134 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs "
117 << expected.length(); 135 << expected.length();
118 return false; 136 return false;
119 } 137 }
(...skipping 28 matching lines...) Expand all
148 } 166 }
149 167
150 MockConnectionHelper helper_; 168 MockConnectionHelper helper_;
151 MockConnection* connection_; 169 MockConnection* connection_;
152 MockClock clock_; 170 MockClock clock_;
153 MockQuicSpdySession session_; 171 MockQuicSpdySession session_;
154 testing::StrictMock<MockStream> stream_; 172 testing::StrictMock<MockStream> stream_;
155 scoped_ptr<QuicStreamSequencer> sequencer_; 173 scoped_ptr<QuicStreamSequencer> sequencer_;
156 }; 174 };
157 175
176 INSTANTIATE_TEST_CASE_P(QuicStreamSequencerTests,
177 QuicStreamSequencerTest,
178 ::testing::Values(false, true));
179
158 // TODO(rch): reorder these tests so they build on each other. 180 // TODO(rch): reorder these tests so they build on each other.
159 181
160 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { 182 TEST_P(QuicStreamSequencerTest, RejectOldFrame) {
161 EXPECT_CALL(stream_, OnDataAvailable()) 183 EXPECT_CALL(stream_, OnDataAvailable())
162 .WillOnce(testing::Invoke( 184 .WillOnce(testing::Invoke(
163 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 185 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
164 186
165 OnFrame(0, "abc"); 187 OnFrame(0, "abc");
166 188
167 EXPECT_EQ(0u, NumBufferedBytes()); 189 EXPECT_EQ(0u, NumBufferedBytes());
168 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); 190 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
169 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); 191 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed());
170 // Ignore this - it matches a past packet number and we should not see it 192 // Ignore this - it matches a past packet number and we should not see it
171 // again. 193 // again.
172 OnFrame(0, "def"); 194 OnFrame(0, "def");
173 EXPECT_EQ(0u, NumBufferedBytes()); 195 EXPECT_EQ(0u, NumBufferedBytes());
174 } 196 }
175 197
176 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { 198 TEST_P(QuicStreamSequencerTest, RejectBufferedFrame) {
177 EXPECT_CALL(stream_, OnDataAvailable()); 199 EXPECT_CALL(stream_, OnDataAvailable());
178 200
179 OnFrame(0, "abc"); 201 OnFrame(0, "abc");
180 EXPECT_EQ(3u, NumBufferedBytes()); 202 EXPECT_EQ(3u, NumBufferedBytes());
181 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 203 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
182 204
183 // Ignore this - it matches a buffered frame. 205 // Ignore this - it matches a buffered frame.
184 // Right now there's no checking that the payload is consistent. 206 // Right now there's no checking that the payload is consistent.
185 OnFrame(0, "def"); 207 OnFrame(0, "def");
186 EXPECT_EQ(3u, NumBufferedBytes()); 208 EXPECT_EQ(3u, NumBufferedBytes());
187 } 209 }
188 210
189 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { 211 TEST_P(QuicStreamSequencerTest, FullFrameConsumed) {
190 EXPECT_CALL(stream_, OnDataAvailable()) 212 EXPECT_CALL(stream_, OnDataAvailable())
191 .WillOnce(testing::Invoke( 213 .WillOnce(testing::Invoke(
192 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 214 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
193 215
194 OnFrame(0, "abc"); 216 OnFrame(0, "abc");
195 EXPECT_EQ(0u, NumBufferedBytes()); 217 EXPECT_EQ(0u, NumBufferedBytes());
196 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); 218 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
197 } 219 }
198 220
199 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { 221 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) {
200 sequencer_->SetBlockedUntilFlush(); 222 sequencer_->SetBlockedUntilFlush();
201 223
202 OnFrame(0, "abc"); 224 OnFrame(0, "abc");
203 EXPECT_EQ(3u, NumBufferedBytes()); 225 EXPECT_EQ(3u, NumBufferedBytes());
204 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 226 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
205 227
206 EXPECT_CALL(stream_, OnDataAvailable()) 228 EXPECT_CALL(stream_, OnDataAvailable())
207 .WillOnce(testing::Invoke( 229 .WillOnce(testing::Invoke(
208 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 230 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
209 sequencer_->SetUnblocked(); 231 sequencer_->SetUnblocked();
210 EXPECT_EQ(0u, NumBufferedBytes()); 232 EXPECT_EQ(0u, NumBufferedBytes());
211 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); 233 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
212 234
213 EXPECT_CALL(stream_, OnDataAvailable()) 235 EXPECT_CALL(stream_, OnDataAvailable())
214 .WillOnce(testing::Invoke( 236 .WillOnce(testing::Invoke(
215 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 237 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
216 EXPECT_FALSE(sequencer_->IsClosed()); 238 EXPECT_FALSE(sequencer_->IsClosed());
217 OnFinFrame(3, "def"); 239 OnFinFrame(3, "def");
218 EXPECT_TRUE(sequencer_->IsClosed()); 240 EXPECT_TRUE(sequencer_->IsClosed());
219 } 241 }
220 242
221 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { 243 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) {
222 sequencer_->SetBlockedUntilFlush(); 244 sequencer_->SetBlockedUntilFlush();
223 245
224 OnFinFrame(0, "abc"); 246 OnFinFrame(0, "abc");
225 EXPECT_EQ(3u, NumBufferedBytes()); 247 EXPECT_EQ(3u, NumBufferedBytes());
226 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 248 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
227 249
228 EXPECT_CALL(stream_, OnDataAvailable()) 250 EXPECT_CALL(stream_, OnDataAvailable())
229 .WillOnce(testing::Invoke( 251 .WillOnce(testing::Invoke(
230 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 252 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
231 EXPECT_FALSE(sequencer_->IsClosed()); 253 EXPECT_FALSE(sequencer_->IsClosed());
232 sequencer_->SetUnblocked(); 254 sequencer_->SetUnblocked();
233 EXPECT_TRUE(sequencer_->IsClosed()); 255 EXPECT_TRUE(sequencer_->IsClosed());
234 EXPECT_EQ(0u, NumBufferedBytes()); 256 EXPECT_EQ(0u, NumBufferedBytes());
235 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); 257 EXPECT_EQ(3u, sequencer_->NumBytesConsumed());
236 } 258 }
237 259
238 TEST_F(QuicStreamSequencerTest, EmptyFrame) { 260 TEST_P(QuicStreamSequencerTest, EmptyFrame) {
239 EXPECT_CALL(stream_, 261 EXPECT_CALL(stream_,
240 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); 262 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _));
241 OnFrame(0, ""); 263 OnFrame(0, "");
242 EXPECT_EQ(0u, NumBufferedBytes()); 264 EXPECT_EQ(0u, NumBufferedBytes());
243 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 265 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
244 } 266 }
245 267
246 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { 268 TEST_P(QuicStreamSequencerTest, EmptyFinFrame) {
247 EXPECT_CALL(stream_, OnDataAvailable()); 269 EXPECT_CALL(stream_, OnDataAvailable());
248 OnFinFrame(0, ""); 270 OnFinFrame(0, "");
249 EXPECT_EQ(0u, NumBufferedBytes()); 271 EXPECT_EQ(0u, NumBufferedBytes());
250 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 272 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
251 } 273 }
252 274
253 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { 275 TEST_P(QuicStreamSequencerTest, PartialFrameConsumed) {
254 EXPECT_CALL(stream_, OnDataAvailable()) 276 EXPECT_CALL(stream_, OnDataAvailable())
255 .WillOnce(testing::Invoke( 277 .WillOnce(testing::Invoke(
256 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2))); 278 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2)));
257 279
258 OnFrame(0, "abc"); 280 OnFrame(0, "abc");
259 EXPECT_EQ(1u, NumBufferedBytes()); 281 EXPECT_EQ(1u, NumBufferedBytes());
260 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); 282 EXPECT_EQ(2u, sequencer_->NumBytesConsumed());
261 } 283 }
262 284
263 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { 285 TEST_P(QuicStreamSequencerTest, NextxFrameNotConsumed) {
264 EXPECT_CALL(stream_, OnDataAvailable()); 286 EXPECT_CALL(stream_, OnDataAvailable());
265 287
266 OnFrame(0, "abc"); 288 OnFrame(0, "abc");
267 EXPECT_EQ(3u, NumBufferedBytes()); 289 EXPECT_EQ(3u, NumBufferedBytes());
268 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 290 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
269 EXPECT_EQ(0, sequencer_->num_early_frames_received()); 291 EXPECT_EQ(0, sequencer_->num_early_frames_received());
270 } 292 }
271 293
272 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { 294 TEST_P(QuicStreamSequencerTest, FutureFrameNotProcessed) {
273 OnFrame(3, "abc"); 295 OnFrame(3, "abc");
274 EXPECT_EQ(3u, NumBufferedBytes()); 296 EXPECT_EQ(3u, NumBufferedBytes());
275 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 297 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
276 EXPECT_EQ(1, sequencer_->num_early_frames_received()); 298 EXPECT_EQ(1, sequencer_->num_early_frames_received());
277 } 299 }
278 300
279 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { 301 TEST_P(QuicStreamSequencerTest, OutOfOrderFrameProcessed) {
280 // Buffer the first 302 // Buffer the first
281 OnFrame(6, "ghi"); 303 OnFrame(6, "ghi");
282 EXPECT_EQ(3u, NumBufferedBytes()); 304 EXPECT_EQ(3u, NumBufferedBytes());
283 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 305 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
284 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); 306 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
285 // Buffer the second 307 // Buffer the second
286 OnFrame(3, "def"); 308 OnFrame(3, "def");
287 EXPECT_EQ(6u, NumBufferedBytes()); 309 EXPECT_EQ(6u, NumBufferedBytes());
288 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); 310 EXPECT_EQ(0u, sequencer_->NumBytesConsumed());
289 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); 311 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
290 312
291 EXPECT_CALL(stream_, OnDataAvailable()) 313 EXPECT_CALL(stream_, OnDataAvailable())
292 .WillOnce(testing::Invoke( 314 .WillOnce(testing::Invoke(
293 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9))); 315 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9)));
294 316
295 // Now process all of them at once. 317 // Now process all of them at once.
296 OnFrame(0, "abc"); 318 OnFrame(0, "abc");
297 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); 319 EXPECT_EQ(9u, sequencer_->NumBytesConsumed());
298 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); 320 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
299 321
300 EXPECT_EQ(0u, NumBufferedBytes()); 322 EXPECT_EQ(0u, NumBufferedBytes());
301 } 323 }
302 324
303 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { 325 TEST_P(QuicStreamSequencerTest, BasicHalfCloseOrdered) {
304 InSequence s; 326 InSequence s;
305 327
306 EXPECT_CALL(stream_, OnDataAvailable()) 328 EXPECT_CALL(stream_, OnDataAvailable())
307 .WillOnce(testing::Invoke( 329 .WillOnce(testing::Invoke(
308 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 330 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
309 OnFinFrame(0, "abc"); 331 OnFinFrame(0, "abc");
310 332
311 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 333 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
312 } 334 }
313 335
314 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { 336 TEST_P(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) {
315 OnFinFrame(6, ""); 337 OnFinFrame(6, "");
316 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 338 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
317 339
318 OnFrame(3, "def"); 340 OnFrame(3, "def");
319 EXPECT_CALL(stream_, OnDataAvailable()) 341 EXPECT_CALL(stream_, OnDataAvailable())
320 .WillOnce(testing::Invoke( 342 .WillOnce(testing::Invoke(
321 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 6))); 343 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 6)));
322 EXPECT_FALSE(sequencer_->IsClosed()); 344 EXPECT_FALSE(sequencer_->IsClosed());
323 OnFrame(0, "abc"); 345 OnFrame(0, "abc");
324 EXPECT_TRUE(sequencer_->IsClosed()); 346 EXPECT_TRUE(sequencer_->IsClosed());
325 } 347 }
326 348
327 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { 349 TEST_P(QuicStreamSequencerTest, BasicHalfUnordered) {
328 OnFinFrame(3, ""); 350 OnFinFrame(3, "");
329 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 351 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
330 352
331 EXPECT_CALL(stream_, OnDataAvailable()) 353 EXPECT_CALL(stream_, OnDataAvailable())
332 .WillOnce(testing::Invoke( 354 .WillOnce(testing::Invoke(
333 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); 355 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3)));
334 EXPECT_FALSE(sequencer_->IsClosed()); 356 EXPECT_FALSE(sequencer_->IsClosed());
335 OnFrame(0, "abc"); 357 OnFrame(0, "abc");
336 EXPECT_TRUE(sequencer_->IsClosed()); 358 EXPECT_TRUE(sequencer_->IsClosed());
337 } 359 }
338 360
339 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { 361 TEST_P(QuicStreamSequencerTest, TerminateWithReadv) {
340 char buffer[3]; 362 char buffer[3];
341 363
342 OnFinFrame(3, ""); 364 OnFinFrame(3, "");
343 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 365 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
344 366
345 EXPECT_FALSE(sequencer_->IsClosed()); 367 EXPECT_FALSE(sequencer_->IsClosed());
346 368
347 EXPECT_CALL(stream_, OnDataAvailable()); 369 EXPECT_CALL(stream_, OnDataAvailable());
348 OnFrame(0, "abc"); 370 OnFrame(0, "abc");
349 371
350 iovec iov = {&buffer[0], 3}; 372 iovec iov = {&buffer[0], 3};
351 int bytes_read = sequencer_->Readv(&iov, 1); 373 int bytes_read = sequencer_->Readv(&iov, 1);
352 EXPECT_EQ(3, bytes_read); 374 EXPECT_EQ(3, bytes_read);
353 EXPECT_TRUE(sequencer_->IsClosed()); 375 EXPECT_TRUE(sequencer_->IsClosed());
354 } 376 }
355 377
356 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { 378 TEST_P(QuicStreamSequencerTest, MutipleOffsets) {
357 OnFinFrame(3, ""); 379 OnFinFrame(3, "");
358 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 380 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
359 381
360 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS)); 382 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS));
361 OnFinFrame(5, ""); 383 OnFinFrame(5, "");
362 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 384 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
363 385
364 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS)); 386 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS));
365 OnFinFrame(1, ""); 387 OnFinFrame(1, "");
366 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); 388 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get()));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 } 425 }
404 426
405 string output_; 427 string output_;
406 // Data which peek at using GetReadableRegion if we back up. 428 // Data which peek at using GetReadableRegion if we back up.
407 string peeked_; 429 string peeked_;
408 FrameList list_; 430 FrameList list_;
409 }; 431 };
410 432
411 // All frames are processed as soon as we have sequential data. 433 // All frames are processed as soon as we have sequential data.
412 // Infinite buffering, so all frames are acked right away. 434 // Infinite buffering, so all frames are acked right away.
413 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) { 435 TEST_P(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) {
414 InSequence s; 436 InSequence s;
415 EXPECT_CALL(stream_, OnDataAvailable()) 437 EXPECT_CALL(stream_, OnDataAvailable())
416 .Times(AnyNumber()) 438 .Times(AnyNumber())
417 .WillRepeatedly( 439 .WillRepeatedly(
418 Invoke(this, &QuicSequencerRandomTest::ReadAvailableData)); 440 Invoke(this, &QuicSequencerRandomTest::ReadAvailableData));
419 441
420 while (!list_.empty()) { 442 while (!list_.empty()) {
421 int index = OneToN(list_.size()) - 1; 443 int index = OneToN(list_.size()) - 1;
422 LOG(ERROR) << "Sending index " << index << " " << list_[index].second; 444 LOG(ERROR) << "Sending index " << index << " " << list_[index].second;
423 OnFrame(list_[index].first, list_[index].second.data()); 445 OnFrame(list_[index].first, list_[index].second.data());
424 446
425 list_.erase(list_.begin() + index); 447 list_.erase(list_.begin() + index);
426 } 448 }
427 449
428 ASSERT_EQ(arraysize(kPayload) - 1, output_.size()); 450 ASSERT_EQ(arraysize(kPayload) - 1, output_.size());
429 EXPECT_EQ(kPayload, output_); 451 EXPECT_EQ(kPayload, output_);
430 } 452 }
431 453
432 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingBackup) { 454 TEST_P(QuicSequencerRandomTest, RandomFramesNoDroppingBackup) {
433 char buffer[10]; 455 char buffer[10];
434 iovec iov[2]; 456 iovec iov[2];
435 iov[0].iov_base = &buffer[0]; 457 iov[0].iov_base = &buffer[0];
436 iov[0].iov_len = 5; 458 iov[0].iov_len = 5;
437 iov[1].iov_base = &buffer[5]; 459 iov[1].iov_base = &buffer[5];
438 iov[1].iov_len = 5; 460 iov[1].iov_len = 5;
439 461
440 EXPECT_CALL(stream_, OnDataAvailable()).Times(AnyNumber()); 462 EXPECT_CALL(stream_, OnDataAvailable()).Times(AnyNumber());
441 463
442 while (output_.size() != arraysize(kPayload) - 1) { 464 while (output_.size() != arraysize(kPayload) - 1) {
(...skipping 25 matching lines...) Expand all
468 int bytes_read = sequencer_->Readv(iov, 2); 490 int bytes_read = sequencer_->Readv(iov, 2);
469 output_.append(buffer, bytes_read); 491 output_.append(buffer, bytes_read);
470 ASSERT_EQ(output_.size(), peeked_.size()); 492 ASSERT_EQ(output_.size(), peeked_.size());
471 } 493 }
472 } 494 }
473 EXPECT_EQ(string(kPayload), output_); 495 EXPECT_EQ(string(kPayload), output_);
474 EXPECT_EQ(string(kPayload), peeked_); 496 EXPECT_EQ(string(kPayload), peeked_);
475 } 497 }
476 498
477 // Same as above, just using a different method for reading. 499 // Same as above, just using a different method for reading.
478 TEST_F(QuicStreamSequencerTest, MarkConsumed) { 500 TEST_P(QuicStreamSequencerTest, MarkConsumed) {
479 InSequence s; 501 InSequence s;
480 EXPECT_CALL(stream_, OnDataAvailable()); 502 EXPECT_CALL(stream_, OnDataAvailable());
481 503
482 OnFrame(0, "abc"); 504 OnFrame(0, "abc");
483 OnFrame(3, "def"); 505 OnFrame(3, "def");
484 OnFrame(6, "ghi"); 506 OnFrame(6, "ghi");
485 507
486 // abcdefghi buffered. 508 // abcdefghi buffered.
487 EXPECT_EQ(9u, sequencer_->NumBytesBuffered()); 509 EXPECT_EQ(9u, sequencer_->NumBytesBuffered());
488 510
489 // Peek into the data. 511 // Peek into the data.
490 const char* expected[] = {"abc", "def", "ghi"}; 512 vector<string> expected;
491 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); 513 if (FLAGS_quic_use_stream_sequencer_buffer) {
514 expected = vector<string>{"abcdefghi"};
515 } else {
516 expected = vector<string>{"abc", "def", "ghi"};
517 }
518 ASSERT_TRUE(VerifyReadableRegions(expected));
492 519
493 // Consume 1 byte. 520 // Consume 1 byte.
494 sequencer_->MarkConsumed(1); 521 sequencer_->MarkConsumed(1);
495 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); 522 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed());
496 // Verify data. 523 // Verify data.
497 const char* expected2[] = {"bc", "def", "ghi"}; 524 vector<string> expected2;
498 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2))); 525 if (FLAGS_quic_use_stream_sequencer_buffer) {
526 expected2 = vector<string>{"bcdefghi"};
527 } else {
528 expected2 = vector<string>{"bc", "def", "ghi"};
529 }
530 ASSERT_TRUE(VerifyReadableRegions(expected2));
499 EXPECT_EQ(8u, sequencer_->NumBytesBuffered()); 531 EXPECT_EQ(8u, sequencer_->NumBytesBuffered());
500 532
501 // Consume 2 bytes. 533 // Consume 2 bytes.
502 sequencer_->MarkConsumed(2); 534 sequencer_->MarkConsumed(2);
503 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); 535 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed());
504 // Verify data. 536 // Verify data.
505 const char* expected3[] = {"def", "ghi"}; 537 vector<string> expected3;
506 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); 538 if (FLAGS_quic_use_stream_sequencer_buffer) {
539 expected3 = vector<string>{"defghi"};
540 } else {
541 expected3 = vector<string>{"def", "ghi"};
542 }
543 ASSERT_TRUE(VerifyReadableRegions(expected3));
507 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); 544 EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
508 545
509 // Consume 5 bytes. 546 // Consume 5 bytes.
510 sequencer_->MarkConsumed(5); 547 sequencer_->MarkConsumed(5);
511 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); 548 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed());
512 // Verify data. 549 // Verify data.
513 const char* expected4[] = {"i"}; 550 vector<string> expected4{"i"};
514 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); 551 ASSERT_TRUE(VerifyReadableRegions(expected4));
515 EXPECT_EQ(1u, sequencer_->NumBytesBuffered()); 552 EXPECT_EQ(1u, sequencer_->NumBytesBuffered());
516 } 553 }
517 554
518 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { 555 TEST_P(QuicStreamSequencerTest, MarkConsumedError) {
519 EXPECT_CALL(stream_, OnDataAvailable()); 556 EXPECT_CALL(stream_, OnDataAvailable());
520 557
521 OnFrame(0, "abc"); 558 OnFrame(0, "abc");
522 OnFrame(9, "jklmnopqrstuvwxyz"); 559 OnFrame(9, "jklmnopqrstuvwxyz");
523 560
524 // Peek into the data. Only the first chunk should be readable because of the 561 // Peek into the data. Only the first chunk should be readable because of the
525 // missing data. 562 // missing data.
526 const char* expected[] = {"abc"}; 563 vector<string> expected{"abc"};
527 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); 564 ASSERT_TRUE(VerifyReadableRegions(expected));
528 565
529 // Now, attempt to mark consumed more data than was readable and expect the 566 // Now, attempt to mark consumed more data than was readable and expect the
530 // stream to be closed. 567 // stream to be closed.
531 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM)); 568 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM));
532 EXPECT_DFATAL(sequencer_->MarkConsumed(4), 569 EXPECT_DFATAL(sequencer_->MarkConsumed(4),
533 "Invalid argument to MarkConsumed." 570 "Invalid argument to MarkConsumed."
534 " expect to consume: 4, but not enough bytes available."); 571 " expect to consume: 4, but not enough bytes available.");
535 } 572 }
536 573
537 TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) { 574 TEST_P(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) {
538 InSequence s; 575 InSequence s;
539 EXPECT_CALL(stream_, OnDataAvailable()); 576 EXPECT_CALL(stream_, OnDataAvailable());
540 577
541 OnFrame(0, "abc"); 578 OnFrame(0, "abc");
542 OnFrame(3, "def"); 579 OnFrame(3, "def");
543 // Missing packet: 6, ghi. 580 // Missing packet: 6, ghi.
544 OnFrame(9, "jkl"); 581 OnFrame(9, "jkl");
545 582
546 const char* expected[] = {"abc", "def"}; 583 vector<string> expected;
547 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); 584 if (FLAGS_quic_use_stream_sequencer_buffer) {
585 expected = vector<string>{"abcdef"};
586 } else {
587 expected = vector<string>{"abc", "def"};
588 }
589 ASSERT_TRUE(VerifyReadableRegions(expected));
548 590
549 sequencer_->MarkConsumed(6); 591 sequencer_->MarkConsumed(6);
550 } 592 }
551 593
552 TEST(QuicFrameListTest, FrameOverlapsBufferedData) { 594 TEST(QuicFrameListTest, FrameOverlapsBufferedData) {
553 QuicFrameList buffer; 595 QuicFrameList buffer;
554 596
555 // Ensure that FrameOverlapsBufferedData returns appropriate responses when 597 // Ensure that FrameOverlapsBufferedData returns appropriate responses when
556 // there is existing data buffered. 598 // there is existing data buffered.
557 const int kBufferedOffset = 10; 599 const int kBufferedOffset = 10;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 &buffer, 632 &buffer,
591 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); 633 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data)));
592 634
593 // New byte range entirely outside of buffered frames, start offset later than 635 // New byte range entirely outside of buffered frames, start offset later than
594 // buffered frame. 636 // buffered frame.
595 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( 637 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData(
596 &buffer, 638 &buffer,
597 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); 639 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data)));
598 } 640 }
599 641
600 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { 642 TEST_P(QuicStreamSequencerTest, DontAcceptOverlappingFrames) {
601 // The peer should never send us non-identical stream frames which contain 643 // The peer should never send us non-identical stream frames which contain
602 // overlapping byte ranges - if they do, we close the connection. 644 // overlapping byte ranges - if they do, we close the connection.
603 645
604 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); 646 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello"));
605 sequencer_->OnStreamFrame(frame1); 647 sequencer_->OnStreamFrame(frame1);
606 648
607 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); 649 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello"));
608 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) 650 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _))
609 .Times(1); 651 .Times(1);
610 sequencer_->OnStreamFrame(frame2); 652 sequencer_->OnStreamFrame(frame2);
611 } 653 }
612 654
613 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) { 655 TEST_P(QuicStreamSequencerTest, InOrderTimestamps) {
614 // This test verifies that timestamps returned by 656 // This test verifies that timestamps returned by
615 // GetReadableRegion() are in the correct sequence when frames 657 // GetReadableRegion() are in the correct sequence when frames
616 // arrive at the sequencer in order. 658 // arrive at the sequencer in order.
617 EXPECT_CALL(stream_, OnDataAvailable()); 659 EXPECT_CALL(stream_, OnDataAvailable());
618 660
619 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 661 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
620 662
621 // Buffer the first frame. 663 // Buffer the first frame.
622 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 664 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
623 QuicTime t1 = clock_.ApproximateNow(); 665 QuicTime t1 = clock_.ApproximateNow();
(...skipping 20 matching lines...) Expand all
644 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); 686 EXPECT_EQ(3u, sequencer_->NumBytesBuffered());
645 687
646 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp)); 688 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, &timestamp));
647 EXPECT_EQ(timestamp, t2); 689 EXPECT_EQ(timestamp, t2);
648 QuicStreamSequencerTest::ConsumeData(3); 690 QuicStreamSequencerTest::ConsumeData(3);
649 EXPECT_EQ(0u, NumBufferedBytes()); 691 EXPECT_EQ(0u, NumBufferedBytes());
650 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); 692 EXPECT_EQ(6u, sequencer_->NumBytesConsumed());
651 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); 693 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
652 } 694 }
653 695
654 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) { 696 TEST_P(QuicStreamSequencerTest, OutOfOrderTimestamps) {
655 // This test verifies that timestamps returned by 697 // This test verifies that timestamps returned by
656 // GetReadableRegion() are in the correct sequence when frames 698 // GetReadableRegion() are in the correct sequence when frames
657 // arrive at the sequencer out of order. 699 // arrive at the sequencer out of order.
658 EXPECT_CALL(stream_, OnDataAvailable()); 700 EXPECT_CALL(stream_, OnDataAvailable());
659 701
660 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 702 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
661 703
662 // Buffer the first frame 704 // Buffer the first frame
663 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); 705 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
664 QuicTime t1 = clock_.ApproximateNow(); 706 QuicTime t1 = clock_.ApproximateNow();
(...skipping 23 matching lines...) Expand all
688 EXPECT_EQ(timestamp, t1); 730 EXPECT_EQ(timestamp, t1);
689 QuicStreamSequencerTest::ConsumeData(3); 731 QuicStreamSequencerTest::ConsumeData(3);
690 EXPECT_EQ(0u, NumBufferedBytes()); 732 EXPECT_EQ(0u, NumBufferedBytes());
691 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); 733 EXPECT_EQ(6u, sequencer_->NumBytesConsumed());
692 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); 734 EXPECT_EQ(0u, sequencer_->NumBytesBuffered());
693 } 735 }
694 736
695 } // namespace 737 } // namespace
696 } // namespace test 738 } // namespace test
697 } // namespace net 739 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_stream_sequencer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698