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_frame_list.h" |
13 #include "net/quic/quic_utils.h" | 14 #include "net/quic/quic_utils.h" |
14 #include "net/quic/reliable_quic_stream.h" | 15 #include "net/quic/reliable_quic_stream.h" |
15 #include "net/quic/test_tools/mock_clock.h" | 16 #include "net/quic/test_tools/mock_clock.h" |
16 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" | 17 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" |
17 #include "net/quic/test_tools/quic_test_utils.h" | 18 #include "net/quic/test_tools/quic_test_utils.h" |
18 #include "net/test/gtest_util.h" | 19 #include "net/test/gtest_util.h" |
19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
20 #include "testing/gmock_mutant.h" | 21 #include "testing/gmock_mutant.h" |
21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
22 | 23 |
(...skipping 13 matching lines...) Expand all Loading... |
36 namespace net { | 37 namespace net { |
37 namespace test { | 38 namespace test { |
38 | 39 |
39 class MockStream : public ReliableQuicStream { | 40 class MockStream : public ReliableQuicStream { |
40 public: | 41 public: |
41 MockStream(QuicSession* session, QuicStreamId id) | 42 MockStream(QuicSession* session, QuicStreamId id) |
42 : ReliableQuicStream(id, session) {} | 43 : ReliableQuicStream(id, session) {} |
43 | 44 |
44 MOCK_METHOD0(OnFinRead, void()); | 45 MOCK_METHOD0(OnFinRead, void()); |
45 MOCK_METHOD0(OnDataAvailable, void()); | 46 MOCK_METHOD0(OnDataAvailable, void()); |
46 MOCK_METHOD2(CloseConnectionWithDetails, void(QuicErrorCode error, | 47 MOCK_METHOD2(CloseConnectionWithDetails, |
47 const string& details)); | 48 void(QuicErrorCode error, const string& details)); |
48 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); | 49 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); |
49 MOCK_METHOD0(OnCanWrite, void()); | 50 MOCK_METHOD0(OnCanWrite, void()); |
50 QuicPriority EffectivePriority() const override { | 51 QuicPriority EffectivePriority() const override { |
51 return QuicUtils::HighestPriority(); | 52 return QuicUtils::HighestPriority(); |
52 } | 53 } |
53 virtual bool IsFlowControlEnabled() const { return true; } | 54 virtual bool IsFlowControlEnabled() const { return true; } |
54 }; | 55 }; |
55 | 56 |
56 namespace { | 57 namespace { |
57 | 58 |
(...skipping 13 matching lines...) Expand all Loading... |
71 | 72 |
72 protected: | 73 protected: |
73 QuicStreamSequencerTest() | 74 QuicStreamSequencerTest() |
74 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), | 75 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), |
75 session_(connection_), | 76 session_(connection_), |
76 stream_(&session_, 1), | 77 stream_(&session_, 1), |
77 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {} | 78 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {} |
78 | 79 |
79 bool VerifyReadableRegion(const char** expected) { | 80 bool VerifyReadableRegion(const char** expected) { |
80 iovec iovecs[1]; | 81 iovec iovecs[1]; |
81 if (sequencer_->GetReadableRegion(iovecs, nullptr)) { | 82 QuicTime timestamp = clock_.ApproximateNow(); |
| 83 if (sequencer_->GetReadableRegion(iovecs, ×tamp)) { |
82 return (VerifyIovecs(iovecs, 1, expected, 1)); | 84 return (VerifyIovecs(iovecs, 1, expected, 1)); |
83 } | 85 } |
84 return false; | 86 return false; |
85 } | 87 } |
86 | 88 |
87 bool VerifyReadableRegions(const char** expected, size_t num_expected) { | 89 bool VerifyReadableRegions(const char** expected, size_t num_expected) { |
88 iovec iovecs[5]; | 90 iovec iovecs[5]; |
89 size_t num_iovecs = | 91 size_t num_iovecs = |
90 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); | 92 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); |
91 return VerifyReadableRegion(expected) && | 93 return VerifyReadableRegion(expected) && |
(...skipping 12 matching lines...) Expand all Loading... |
104 for (size_t i = 0; i < num_expected; ++i) { | 106 for (size_t i = 0; i < num_expected; ++i) { |
105 if (!VerifyIovec(iovecs[i], expected[i])) { | 107 if (!VerifyIovec(iovecs[i], expected[i])) { |
106 return false; | 108 return false; |
107 } | 109 } |
108 } | 110 } |
109 return true; | 111 return true; |
110 } | 112 } |
111 | 113 |
112 bool VerifyIovec(const iovec& iovec, StringPiece expected) { | 114 bool VerifyIovec(const iovec& iovec, StringPiece expected) { |
113 if (iovec.iov_len != expected.length()) { | 115 if (iovec.iov_len != expected.length()) { |
114 LOG(ERROR) << "Invalid length: " << iovec.iov_len | 116 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs " |
115 << " vs " << expected.length(); | 117 << expected.length(); |
116 return false; | 118 return false; |
117 } | 119 } |
118 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) { | 120 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) { |
119 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base) | 121 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base) |
120 << " vs " << expected; | 122 << " vs " << expected; |
121 return false; | 123 return false; |
122 } | 124 } |
123 return true; | 125 return true; |
124 } | 126 } |
125 | 127 |
126 void OnFinFrame(QuicStreamOffset byte_offset, const char* data) { | 128 void OnFinFrame(QuicStreamOffset byte_offset, const char* data) { |
127 QuicStreamFrame frame; | 129 QuicStreamFrame frame; |
128 frame.stream_id = 1; | 130 frame.stream_id = 1; |
129 frame.offset = byte_offset; | 131 frame.offset = byte_offset; |
130 frame.data = StringPiece(data); | 132 frame.data = StringPiece(data); |
131 frame.fin = true; | 133 frame.fin = true; |
132 sequencer_->OnStreamFrame(frame); | 134 sequencer_->OnStreamFrame(frame); |
133 } | 135 } |
134 | 136 |
135 void OnFrame(QuicStreamOffset byte_offset, const char* data) { | 137 void OnFrame(QuicStreamOffset byte_offset, const char* data) { |
136 QuicStreamFrame frame; | 138 QuicStreamFrame frame; |
137 frame.stream_id = 1; | 139 frame.stream_id = 1; |
138 frame.offset = byte_offset; | 140 frame.offset = byte_offset; |
139 frame.data = StringPiece(data); | 141 frame.data = StringPiece(data); |
140 frame.fin = false; | 142 frame.fin = false; |
141 sequencer_->OnStreamFrame(frame); | 143 sequencer_->OnStreamFrame(frame); |
142 } | 144 } |
143 | 145 |
144 size_t NumBufferedFrames() { | 146 size_t NumBufferedBytes() { |
145 return QuicStreamSequencerPeer::GetNumBufferedFrames(sequencer_.get()); | 147 return QuicStreamSequencerPeer::GetNumBufferedBytes(sequencer_.get()); |
146 } | |
147 | |
148 bool FrameOverlapsBufferedData(const QuicStreamFrame& frame) { | |
149 return QuicStreamSequencerPeer::FrameOverlapsBufferedData(sequencer_.get(), | |
150 frame); | |
151 } | 148 } |
152 | 149 |
153 MockHelper helper_; | 150 MockHelper helper_; |
154 MockConnection* connection_; | 151 MockConnection* connection_; |
155 MockClock clock_; | 152 MockClock clock_; |
156 MockQuicSpdySession session_; | 153 MockQuicSpdySession session_; |
157 testing::StrictMock<MockStream> stream_; | 154 testing::StrictMock<MockStream> stream_; |
158 scoped_ptr<QuicStreamSequencer> sequencer_; | 155 scoped_ptr<QuicStreamSequencer> sequencer_; |
159 }; | 156 }; |
160 | 157 |
161 // TODO(rch): reorder these tests so they build on each other. | 158 // TODO(rch): reorder these tests so they build on each other. |
162 | 159 |
163 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { | 160 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { |
164 EXPECT_CALL(stream_, OnDataAvailable()) | 161 EXPECT_CALL(stream_, OnDataAvailable()) |
165 .WillOnce(testing::Invoke( | 162 .WillOnce(testing::Invoke( |
166 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 163 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
167 | 164 |
168 OnFrame(0, "abc"); | 165 OnFrame(0, "abc"); |
169 | 166 |
170 EXPECT_EQ(0u, NumBufferedFrames()); | 167 EXPECT_EQ(0u, NumBufferedBytes()); |
171 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 168 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
172 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); | 169 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); |
173 // Ignore this - it matches a past packet number and we should not see it | 170 // Ignore this - it matches a past packet number and we should not see it |
174 // again. | 171 // again. |
175 OnFrame(0, "def"); | 172 OnFrame(0, "def"); |
176 EXPECT_EQ(0u, NumBufferedFrames()); | 173 EXPECT_EQ(0u, NumBufferedBytes()); |
177 } | 174 } |
178 | 175 |
179 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { | 176 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { |
180 EXPECT_CALL(stream_, OnDataAvailable()); | 177 EXPECT_CALL(stream_, OnDataAvailable()); |
181 | 178 |
182 OnFrame(0, "abc"); | 179 OnFrame(0, "abc"); |
183 EXPECT_EQ(1u, NumBufferedFrames()); | 180 EXPECT_EQ(3u, NumBufferedBytes()); |
184 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 181 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
185 | 182 |
186 // Ignore this - it matches a buffered frame. | 183 // Ignore this - it matches a buffered frame. |
187 // Right now there's no checking that the payload is consistent. | 184 // Right now there's no checking that the payload is consistent. |
188 OnFrame(0, "def"); | 185 OnFrame(0, "def"); |
189 EXPECT_EQ(1u, NumBufferedFrames()); | 186 EXPECT_EQ(3u, NumBufferedBytes()); |
190 } | 187 } |
191 | 188 |
192 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { | 189 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { |
193 EXPECT_CALL(stream_, OnDataAvailable()) | 190 EXPECT_CALL(stream_, OnDataAvailable()) |
194 .WillOnce(testing::Invoke( | 191 .WillOnce(testing::Invoke( |
195 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 192 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
196 | 193 |
197 OnFrame(0, "abc"); | 194 OnFrame(0, "abc"); |
198 EXPECT_EQ(0u, NumBufferedFrames()); | 195 EXPECT_EQ(0u, NumBufferedBytes()); |
199 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 196 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
200 } | 197 } |
201 | 198 |
202 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { | 199 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { |
203 sequencer_->SetBlockedUntilFlush(); | 200 sequencer_->SetBlockedUntilFlush(); |
204 | 201 |
205 OnFrame(0, "abc"); | 202 OnFrame(0, "abc"); |
206 EXPECT_EQ(1u, NumBufferedFrames()); | 203 EXPECT_EQ(3u, NumBufferedBytes()); |
207 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 204 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
208 | 205 |
209 EXPECT_CALL(stream_, OnDataAvailable()) | 206 EXPECT_CALL(stream_, OnDataAvailable()) |
210 .WillOnce(testing::Invoke( | 207 .WillOnce(testing::Invoke( |
211 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 208 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
212 sequencer_->SetUnblocked(); | 209 sequencer_->SetUnblocked(); |
213 EXPECT_EQ(0u, NumBufferedFrames()); | 210 EXPECT_EQ(0u, NumBufferedBytes()); |
214 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 211 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
215 | 212 |
216 EXPECT_CALL(stream_, OnDataAvailable()) | 213 EXPECT_CALL(stream_, OnDataAvailable()) |
217 .WillOnce(testing::Invoke( | 214 .WillOnce(testing::Invoke( |
218 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 215 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
219 EXPECT_FALSE(sequencer_->IsClosed()); | 216 EXPECT_FALSE(sequencer_->IsClosed()); |
220 OnFinFrame(3, "def"); | 217 OnFinFrame(3, "def"); |
221 EXPECT_TRUE(sequencer_->IsClosed()); | 218 EXPECT_TRUE(sequencer_->IsClosed()); |
222 } | 219 } |
223 | 220 |
224 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { | 221 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { |
225 sequencer_->SetBlockedUntilFlush(); | 222 sequencer_->SetBlockedUntilFlush(); |
226 | 223 |
227 OnFinFrame(0, "abc"); | 224 OnFinFrame(0, "abc"); |
228 EXPECT_EQ(1u, NumBufferedFrames()); | 225 EXPECT_EQ(3u, NumBufferedBytes()); |
229 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 226 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
230 | 227 |
231 EXPECT_CALL(stream_, OnDataAvailable()) | 228 EXPECT_CALL(stream_, OnDataAvailable()) |
232 .WillOnce(testing::Invoke( | 229 .WillOnce(testing::Invoke( |
233 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 230 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
234 EXPECT_FALSE(sequencer_->IsClosed()); | 231 EXPECT_FALSE(sequencer_->IsClosed()); |
235 sequencer_->SetUnblocked(); | 232 sequencer_->SetUnblocked(); |
236 EXPECT_TRUE(sequencer_->IsClosed()); | 233 EXPECT_TRUE(sequencer_->IsClosed()); |
237 EXPECT_EQ(0u, NumBufferedFrames()); | 234 EXPECT_EQ(0u, NumBufferedBytes()); |
238 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 235 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
239 } | 236 } |
240 | 237 |
241 TEST_F(QuicStreamSequencerTest, EmptyFrame) { | 238 TEST_F(QuicStreamSequencerTest, EmptyFrame) { |
242 EXPECT_CALL(stream_, | 239 EXPECT_CALL(stream_, |
243 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); | 240 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); |
244 OnFrame(0, ""); | 241 OnFrame(0, ""); |
245 EXPECT_EQ(0u, NumBufferedFrames()); | 242 EXPECT_EQ(0u, NumBufferedBytes()); |
246 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 243 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
247 } | 244 } |
248 | 245 |
249 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { | 246 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { |
250 EXPECT_CALL(stream_, OnDataAvailable()); | 247 EXPECT_CALL(stream_, OnDataAvailable()); |
251 OnFinFrame(0, ""); | 248 OnFinFrame(0, ""); |
252 EXPECT_EQ(0u, NumBufferedFrames()); | 249 EXPECT_EQ(0u, NumBufferedBytes()); |
253 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 250 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
254 } | 251 } |
255 | 252 |
256 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { | 253 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { |
257 EXPECT_CALL(stream_, OnDataAvailable()) | 254 EXPECT_CALL(stream_, OnDataAvailable()) |
258 .WillOnce(testing::Invoke( | 255 .WillOnce(testing::Invoke( |
259 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2))); | 256 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2))); |
260 | 257 |
261 OnFrame(0, "abc"); | 258 OnFrame(0, "abc"); |
262 EXPECT_EQ(1u, NumBufferedFrames()); | 259 EXPECT_EQ(1u, NumBufferedBytes()); |
263 EXPECT_EQ(2u, sequencer_->num_bytes_consumed()); | 260 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); |
264 } | 261 } |
265 | 262 |
266 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { | 263 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { |
267 EXPECT_CALL(stream_, OnDataAvailable()); | 264 EXPECT_CALL(stream_, OnDataAvailable()); |
268 | 265 |
269 OnFrame(0, "abc"); | 266 OnFrame(0, "abc"); |
270 EXPECT_EQ(1u, NumBufferedFrames()); | 267 EXPECT_EQ(3u, NumBufferedBytes()); |
271 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 268 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
272 EXPECT_EQ(0, sequencer_->num_early_frames_received()); | 269 EXPECT_EQ(0, sequencer_->num_early_frames_received()); |
273 } | 270 } |
274 | 271 |
275 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { | 272 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { |
276 OnFrame(3, "abc"); | 273 OnFrame(3, "abc"); |
277 EXPECT_EQ(1u, NumBufferedFrames()); | 274 EXPECT_EQ(3u, NumBufferedBytes()); |
278 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 275 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
279 EXPECT_EQ(1, sequencer_->num_early_frames_received()); | 276 EXPECT_EQ(1, sequencer_->num_early_frames_received()); |
280 } | 277 } |
281 | 278 |
282 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { | 279 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { |
283 // Buffer the first | 280 // Buffer the first |
284 OnFrame(6, "ghi"); | 281 OnFrame(6, "ghi"); |
285 EXPECT_EQ(1u, NumBufferedFrames()); | 282 EXPECT_EQ(3u, NumBufferedBytes()); |
286 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 283 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
287 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 284 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
288 // Buffer the second | 285 // Buffer the second |
289 OnFrame(3, "def"); | 286 OnFrame(3, "def"); |
290 EXPECT_EQ(2u, NumBufferedFrames()); | 287 EXPECT_EQ(6u, NumBufferedBytes()); |
291 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 288 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
292 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); | 289 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
293 | 290 |
294 EXPECT_CALL(stream_, OnDataAvailable()) | 291 EXPECT_CALL(stream_, OnDataAvailable()) |
295 .WillOnce(testing::Invoke( | 292 .WillOnce(testing::Invoke( |
296 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9))); | 293 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9))); |
297 | 294 |
298 // Now process all of them at once. | 295 // Now process all of them at once. |
299 OnFrame(0, "abc"); | 296 OnFrame(0, "abc"); |
300 EXPECT_EQ(9u, sequencer_->num_bytes_consumed()); | 297 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); |
301 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); | 298 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
302 | 299 |
303 EXPECT_EQ(0u, NumBufferedFrames()); | 300 EXPECT_EQ(0u, NumBufferedBytes()); |
304 } | 301 } |
305 | 302 |
306 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { | 303 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { |
307 InSequence s; | 304 InSequence s; |
308 | 305 |
309 EXPECT_CALL(stream_, OnDataAvailable()) | 306 EXPECT_CALL(stream_, OnDataAvailable()) |
310 .WillOnce(testing::Invoke( | 307 .WillOnce(testing::Invoke( |
311 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 308 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
312 OnFinFrame(0, "abc"); | 309 OnFinFrame(0, "abc"); |
313 | 310 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 | 441 |
445 while (output_.size() != arraysize(kPayload) - 1) { | 442 while (output_.size() != arraysize(kPayload) - 1) { |
446 if (!list_.empty() && (base::RandUint64() % 2 == 0)) { // Send data | 443 if (!list_.empty() && (base::RandUint64() % 2 == 0)) { // Send data |
447 int index = OneToN(list_.size()) - 1; | 444 int index = OneToN(list_.size()) - 1; |
448 OnFrame(list_[index].first, list_[index].second.data()); | 445 OnFrame(list_[index].first, list_[index].second.data()); |
449 list_.erase(list_.begin() + index); | 446 list_.erase(list_.begin() + index); |
450 } else { // Read data | 447 } else { // Read data |
451 bool has_bytes = sequencer_->HasBytesToRead(); | 448 bool has_bytes = sequencer_->HasBytesToRead(); |
452 iovec peek_iov[20]; | 449 iovec peek_iov[20]; |
453 int iovs_peeked = sequencer_->GetReadableRegions(peek_iov, 20); | 450 int iovs_peeked = sequencer_->GetReadableRegions(peek_iov, 20); |
| 451 QuicTime timestamp = clock_.ApproximateNow(); |
454 if (has_bytes) { | 452 if (has_bytes) { |
455 ASSERT_LT(0, iovs_peeked); | 453 ASSERT_LT(0, iovs_peeked); |
456 ASSERT_TRUE(sequencer_->GetReadableRegion(peek_iov, nullptr)); | 454 ASSERT_TRUE(sequencer_->GetReadableRegion(peek_iov, ×tamp)); |
457 } else { | 455 } else { |
458 ASSERT_EQ(0, iovs_peeked); | 456 ASSERT_EQ(0, iovs_peeked); |
459 ASSERT_FALSE(sequencer_->GetReadableRegion(peek_iov, nullptr)); | 457 ASSERT_FALSE(sequencer_->GetReadableRegion(peek_iov, ×tamp)); |
460 } | 458 } |
461 int total_bytes_to_peek = arraysize(buffer); | 459 int total_bytes_to_peek = arraysize(buffer); |
462 for (int i = 0; i < iovs_peeked; ++i) { | 460 for (int i = 0; i < iovs_peeked; ++i) { |
463 int bytes_to_peek = min<int>(peek_iov[i].iov_len, total_bytes_to_peek); | 461 int bytes_to_peek = min<int>(peek_iov[i].iov_len, total_bytes_to_peek); |
464 peeked_.append(static_cast<char*>(peek_iov[i].iov_base), bytes_to_peek); | 462 peeked_.append(static_cast<char*>(peek_iov[i].iov_base), bytes_to_peek); |
465 total_bytes_to_peek -= bytes_to_peek; | 463 total_bytes_to_peek -= bytes_to_peek; |
466 if (total_bytes_to_peek == 0) { | 464 if (total_bytes_to_peek == 0) { |
467 break; | 465 break; |
468 } | 466 } |
469 } | 467 } |
470 int bytes_read = sequencer_->Readv(iov, 2); | 468 int bytes_read = sequencer_->Readv(iov, 2); |
471 output_.append(buffer, bytes_read); | 469 output_.append(buffer, bytes_read); |
472 ASSERT_EQ(output_.size(), peeked_.size()); | 470 ASSERT_EQ(output_.size(), peeked_.size()); |
473 } | 471 } |
474 } | 472 } |
475 EXPECT_EQ(string(kPayload), output_); | 473 EXPECT_EQ(string(kPayload), output_); |
476 EXPECT_EQ(string(kPayload), peeked_); | 474 EXPECT_EQ(string(kPayload), peeked_); |
477 } | 475 } |
478 | 476 |
479 // Same as above, just using a different method for reading. | 477 // Same as above, just using a different method for reading. |
480 TEST_F(QuicStreamSequencerTest, MarkConsumed) { | 478 TEST_F(QuicStreamSequencerTest, MarkConsumed) { |
481 InSequence s; | 479 InSequence s; |
482 EXPECT_CALL(stream_, OnDataAvailable()); | 480 EXPECT_CALL(stream_, OnDataAvailable()); |
483 | 481 |
484 OnFrame(0, "abc"); | 482 OnFrame(0, "abc"); |
485 OnFrame(3, "def"); | 483 OnFrame(3, "def"); |
486 OnFrame(6, "ghi"); | 484 OnFrame(6, "ghi"); |
487 | 485 |
488 // abcdefghi buffered. | 486 // abcdefghi buffered. |
489 EXPECT_EQ(9u, sequencer_->num_bytes_buffered()); | 487 EXPECT_EQ(9u, sequencer_->NumBytesBuffered()); |
490 | 488 |
491 // Peek into the data. | 489 // Peek into the data. |
492 const char* expected[] = {"abc", "def", "ghi"}; | 490 const char* expected[] = {"abc", "def", "ghi"}; |
493 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 491 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
494 | 492 |
495 // Consume 1 byte. | 493 // Consume 1 byte. |
496 sequencer_->MarkConsumed(1); | 494 sequencer_->MarkConsumed(1); |
497 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); | 495 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); |
498 // Verify data. | 496 // Verify data. |
499 const char* expected2[] = {"bc", "def", "ghi"}; | 497 const char* expected2[] = {"bc", "def", "ghi"}; |
500 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2))); | 498 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2))); |
501 EXPECT_EQ(8u, sequencer_->num_bytes_buffered()); | 499 EXPECT_EQ(8u, sequencer_->NumBytesBuffered()); |
502 | 500 |
503 // Consume 2 bytes. | 501 // Consume 2 bytes. |
504 sequencer_->MarkConsumed(2); | 502 sequencer_->MarkConsumed(2); |
505 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); | 503 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); |
506 // Verify data. | 504 // Verify data. |
507 const char* expected3[] = {"def", "ghi"}; | 505 const char* expected3[] = {"def", "ghi"}; |
508 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); | 506 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); |
509 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); | 507 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
510 | 508 |
511 // Consume 5 bytes. | 509 // Consume 5 bytes. |
512 sequencer_->MarkConsumed(5); | 510 sequencer_->MarkConsumed(5); |
513 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); | 511 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); |
514 // Verify data. | 512 // Verify data. |
515 const char* expected4[] = {"i"}; | 513 const char* expected4[] = {"i"}; |
516 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); | 514 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); |
517 EXPECT_EQ(1u, sequencer_->num_bytes_buffered()); | 515 EXPECT_EQ(1u, sequencer_->NumBytesBuffered()); |
518 } | 516 } |
519 | 517 |
520 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { | 518 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { |
521 EXPECT_CALL(stream_, OnDataAvailable()); | 519 EXPECT_CALL(stream_, OnDataAvailable()); |
522 | 520 |
523 OnFrame(0, "abc"); | 521 OnFrame(0, "abc"); |
524 OnFrame(9, "jklmnopqrstuvwxyz"); | 522 OnFrame(9, "jklmnopqrstuvwxyz"); |
525 | 523 |
526 // Peek into the data. Only the first chunk should be readable because of the | 524 // Peek into the data. Only the first chunk should be readable because of the |
527 // missing data. | 525 // missing data. |
(...skipping 16 matching lines...) Expand all Loading... |
544 OnFrame(3, "def"); | 542 OnFrame(3, "def"); |
545 // Missing packet: 6, ghi. | 543 // Missing packet: 6, ghi. |
546 OnFrame(9, "jkl"); | 544 OnFrame(9, "jkl"); |
547 | 545 |
548 const char* expected[] = {"abc", "def"}; | 546 const char* expected[] = {"abc", "def"}; |
549 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 547 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
550 | 548 |
551 sequencer_->MarkConsumed(6); | 549 sequencer_->MarkConsumed(6); |
552 } | 550 } |
553 | 551 |
554 TEST_F(QuicStreamSequencerTest, FrameOverlapsBufferedData) { | 552 TEST(QuicFrameListTest, FrameOverlapsBufferedData) { |
| 553 QuicFrameList buffer; |
| 554 |
555 // Ensure that FrameOverlapsBufferedData returns appropriate responses when | 555 // Ensure that FrameOverlapsBufferedData returns appropriate responses when |
556 // there is existing data buffered. | 556 // there is existing data buffered. |
557 const int kBufferedOffset = 10; | 557 const int kBufferedOffset = 10; |
558 const int kBufferedDataLength = 3; | 558 const int kBufferedDataLength = 3; |
559 const int kNewDataLength = 3; | 559 const int kNewDataLength = 3; |
560 string data(kNewDataLength, '.'); | 560 string data(kNewDataLength, '.'); |
561 | 561 |
562 // No overlap if no buffered frames. | 562 // No overlap if no buffered frames. |
563 EXPECT_EQ(0u, NumBufferedFrames()); | 563 EXPECT_EQ(0u, buffer.BytesBuffered()); |
| 564 size_t bytes_written; |
564 // Add a buffered frame. | 565 // Add a buffered frame. |
565 sequencer_->OnStreamFrame(QuicStreamFrame(1, false, kBufferedOffset, | 566 buffer.OnStreamData( |
566 string(kBufferedDataLength, '.'))); | 567 kBufferedOffset, |
| 568 StringPiece(string(kBufferedDataLength, '.').data(), kBufferedDataLength), |
| 569 QuicTime::Zero(), &bytes_written); |
567 | 570 |
568 // New byte range partially overlaps with buffered frame, start offset | 571 // New byte range partially overlaps with buffered frame, start offset |
569 // preceding buffered frame. | 572 // preceding buffered frame. |
570 EXPECT_TRUE(FrameOverlapsBufferedData( | 573 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
571 QuicStreamFrame(1, false, kBufferedOffset - 1, data))); | 574 &buffer, QuicStreamFrame(1, false, kBufferedOffset - 1, data))); |
572 EXPECT_TRUE(FrameOverlapsBufferedData( | 575 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 576 &buffer, |
573 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength + 1, data))); | 577 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength + 1, data))); |
574 | 578 |
575 // New byte range partially overlaps with buffered frame, start offset inside | 579 // New byte range partially overlaps with buffered frame, start offset inside |
576 // existing buffered frame. | 580 // existing buffered frame. |
577 EXPECT_TRUE(FrameOverlapsBufferedData( | 581 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
578 QuicStreamFrame(1, false, kBufferedOffset + 1, data))); | 582 &buffer, QuicStreamFrame(1, false, kBufferedOffset + 1, data))); |
579 EXPECT_TRUE(FrameOverlapsBufferedData(QuicStreamFrame( | 583 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
580 1, false, kBufferedOffset + kBufferedDataLength - 1, data))); | 584 &buffer, QuicStreamFrame( |
| 585 1, false, kBufferedOffset + kBufferedDataLength - 1, data))); |
581 | 586 |
582 // New byte range entirely outside of buffered frames, start offset preceeding | 587 // New byte range entirely outside of buffered frames, start offset |
583 // buffered frame. | 588 // preceeding buffered frame. |
584 EXPECT_FALSE(FrameOverlapsBufferedData( | 589 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 590 &buffer, |
585 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); | 591 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); |
586 | 592 |
587 // New byte range entirely outside of buffered frames, start offset later than | 593 // New byte range entirely outside of buffered frames, start offset later than |
588 // buffered frame. | 594 // buffered frame. |
589 EXPECT_FALSE(FrameOverlapsBufferedData( | 595 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 596 &buffer, |
590 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); | 597 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); |
591 } | 598 } |
592 | 599 |
593 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { | 600 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { |
594 // The peer should never send us non-identical stream frames which contain | 601 // The peer should never send us non-identical stream frames which contain |
595 // overlapping byte ranges - if they do, we close the connection. | 602 // overlapping byte ranges - if they do, we close the connection. |
596 | 603 |
597 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); | 604 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); |
598 sequencer_->OnStreamFrame(frame1); | 605 sequencer_->OnStreamFrame(frame1); |
599 | 606 |
600 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); | 607 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); |
601 EXPECT_TRUE(FrameOverlapsBufferedData(frame2)); | |
602 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) | 608 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) |
603 .Times(1); | 609 .Times(1); |
604 sequencer_->OnStreamFrame(frame2); | 610 sequencer_->OnStreamFrame(frame2); |
605 } | 611 } |
606 | 612 |
607 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) { | 613 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) { |
608 // This test verifies that timestamps returned by | 614 // This test verifies that timestamps returned by |
609 // GetReadableRegion() are in the correct sequence when frames | 615 // GetReadableRegion() are in the correct sequence when frames |
610 // arrive at the sequencer in order. | 616 // arrive at the sequencer in order. |
611 EXPECT_CALL(stream_, OnDataAvailable()); | 617 EXPECT_CALL(stream_, OnDataAvailable()); |
612 | 618 |
613 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 619 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
614 | 620 |
615 // Buffer the first frame. | 621 // Buffer the first frame. |
616 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 622 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
617 QuicTime t1 = clock_.ApproximateNow(); | 623 QuicTime t1 = clock_.ApproximateNow(); |
618 OnFrame(0, "abc"); | 624 OnFrame(0, "abc"); |
619 EXPECT_EQ(1u, NumBufferedFrames()); | 625 EXPECT_EQ(3u, NumBufferedBytes()); |
620 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 626 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
621 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 627 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
622 // Buffer the second frame. | 628 // Buffer the second frame. |
623 QuicTime t2 = clock_.ApproximateNow(); | 629 QuicTime t2 = clock_.ApproximateNow(); |
624 OnFrame(3, "def"); | 630 OnFrame(3, "def"); |
625 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 631 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
626 EXPECT_EQ(2u, NumBufferedFrames()); | 632 EXPECT_EQ(6u, NumBufferedBytes()); |
627 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 633 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
628 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); | 634 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
629 | 635 |
630 iovec iovecs[1]; | 636 iovec iovecs[1]; |
631 QuicTime timestamp(QuicTime::Zero()); | 637 QuicTime timestamp(QuicTime::Zero()); |
632 | 638 |
633 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 639 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
634 EXPECT_EQ(timestamp, t1); | 640 EXPECT_EQ(timestamp, t1); |
635 QuicStreamSequencerTest::ConsumeData(3); | 641 QuicStreamSequencerTest::ConsumeData(3); |
636 EXPECT_EQ(1u, NumBufferedFrames()); | 642 EXPECT_EQ(3u, NumBufferedBytes()); |
637 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 643 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
638 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 644 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
639 | 645 |
640 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 646 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
641 EXPECT_EQ(timestamp, t2); | 647 EXPECT_EQ(timestamp, t2); |
642 QuicStreamSequencerTest::ConsumeData(3); | 648 QuicStreamSequencerTest::ConsumeData(3); |
643 EXPECT_EQ(0u, NumBufferedFrames()); | 649 EXPECT_EQ(0u, NumBufferedBytes()); |
644 EXPECT_EQ(6u, sequencer_->num_bytes_consumed()); | 650 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); |
645 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); | 651 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
646 } | 652 } |
647 | 653 |
648 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) { | 654 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) { |
649 // This test verifies that timestamps returned by | 655 // This test verifies that timestamps returned by |
650 // GetReadableRegion() are in the correct sequence when frames | 656 // GetReadableRegion() are in the correct sequence when frames |
651 // arrive at the sequencer out of order. | 657 // arrive at the sequencer out of order. |
652 EXPECT_CALL(stream_, OnDataAvailable()); | 658 EXPECT_CALL(stream_, OnDataAvailable()); |
653 | 659 |
654 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 660 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
655 | 661 |
656 // Buffer the first frame | 662 // Buffer the first frame |
657 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 663 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
658 QuicTime t1 = clock_.ApproximateNow(); | 664 QuicTime t1 = clock_.ApproximateNow(); |
659 OnFrame(3, "def"); | 665 OnFrame(3, "def"); |
660 EXPECT_EQ(1u, NumBufferedFrames()); | 666 EXPECT_EQ(3u, NumBufferedBytes()); |
661 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 667 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
662 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 668 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
663 // Buffer the second frame | 669 // Buffer the second frame |
664 QuicTime t2 = clock_.ApproximateNow(); | 670 QuicTime t2 = clock_.ApproximateNow(); |
665 OnFrame(0, "abc"); | 671 OnFrame(0, "abc"); |
666 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 672 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
667 EXPECT_EQ(2u, NumBufferedFrames()); | 673 EXPECT_EQ(6u, NumBufferedBytes()); |
668 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 674 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
669 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); | 675 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
670 | 676 |
671 iovec iovecs[1]; | 677 iovec iovecs[1]; |
672 QuicTime timestamp(QuicTime::Zero()); | 678 QuicTime timestamp(QuicTime::Zero()); |
673 | 679 |
674 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 680 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
675 EXPECT_EQ(timestamp, t2); | 681 EXPECT_EQ(timestamp, t2); |
676 QuicStreamSequencerTest::ConsumeData(3); | 682 QuicStreamSequencerTest::ConsumeData(3); |
677 EXPECT_EQ(1u, NumBufferedFrames()); | 683 EXPECT_EQ(3u, NumBufferedBytes()); |
678 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 684 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
679 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 685 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
680 | 686 |
681 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 687 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
682 EXPECT_EQ(timestamp, t1); | 688 EXPECT_EQ(timestamp, t1); |
683 QuicStreamSequencerTest::ConsumeData(3); | 689 QuicStreamSequencerTest::ConsumeData(3); |
684 EXPECT_EQ(0u, NumBufferedFrames()); | 690 EXPECT_EQ(0u, NumBufferedBytes()); |
685 EXPECT_EQ(6u, sequencer_->num_bytes_consumed()); | 691 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); |
686 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); | 692 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
687 } | 693 } |
688 | 694 |
689 } // namespace | 695 } // namespace |
690 } // namespace test | 696 } // namespace test |
691 } // namespace net | 697 } // namespace net |
OLD | NEW |