OLD | NEW |
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 Loading... |
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, ×tamp)) { | 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
644 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); | 686 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
645 | 687 |
646 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 688 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
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 Loading... |
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 |
OLD | NEW |