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/rand_util.h" | 10 #include "base/rand_util.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 QuicStreamOffset close_offset() const { return close_offset_; } | 63 QuicStreamOffset close_offset() const { return close_offset_; } |
64 }; | 64 }; |
65 | 65 |
66 class MockStream : public ReliableQuicStream { | 66 class MockStream : public ReliableQuicStream { |
67 public: | 67 public: |
68 MockStream(QuicSession* session, QuicStreamId id) | 68 MockStream(QuicSession* session, QuicStreamId id) |
69 : ReliableQuicStream(id, session) { | 69 : ReliableQuicStream(id, session) { |
70 } | 70 } |
71 | 71 |
72 MOCK_METHOD0(OnFinRead, void()); | 72 MOCK_METHOD0(OnFinRead, void()); |
73 MOCK_METHOD2(ProcessData, uint32(const char* data, uint32 data_len)); | 73 MOCK_METHOD2(ProcessRawData, uint32(const char* data, uint32 data_len)); |
74 MOCK_METHOD2(CloseConnectionWithDetails, void(QuicErrorCode error, | 74 MOCK_METHOD2(CloseConnectionWithDetails, void(QuicErrorCode error, |
75 const string& details)); | 75 const string& details)); |
76 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); | 76 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); |
77 MOCK_METHOD0(OnCanWrite, void()); | 77 MOCK_METHOD0(OnCanWrite, void()); |
| 78 virtual QuicPriority EffectivePriority() const { return 0; } |
78 }; | 79 }; |
79 | 80 |
80 namespace { | 81 namespace { |
81 | 82 |
82 static const char kPayload[] = | 83 static const char kPayload[] = |
83 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | 84 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
84 | 85 |
85 class QuicStreamSequencerTest : public ::testing::Test { | 86 class QuicStreamSequencerTest : public ::testing::Test { |
86 protected: | 87 protected: |
87 QuicStreamSequencerTest() | 88 QuicStreamSequencerTest() |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 return true; | 130 return true; |
130 } | 131 } |
131 | 132 |
132 MockConnection* connection_; | 133 MockConnection* connection_; |
133 MockSession session_; | 134 MockSession session_; |
134 testing::StrictMock<MockStream> stream_; | 135 testing::StrictMock<MockStream> stream_; |
135 scoped_ptr<QuicStreamSequencerPeer> sequencer_; | 136 scoped_ptr<QuicStreamSequencerPeer> sequencer_; |
136 }; | 137 }; |
137 | 138 |
138 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { | 139 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { |
139 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)) | 140 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)) |
140 .WillOnce(Return(3)); | 141 .WillOnce(Return(3)); |
141 | 142 |
142 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 143 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
143 EXPECT_EQ(0u, sequencer_->frames()->size()); | 144 EXPECT_EQ(0u, sequencer_->frames()->size()); |
144 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 145 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); |
145 // Ignore this - it matches a past sequence number and we should not see it | 146 // Ignore this - it matches a past sequence number and we should not see it |
146 // again. | 147 // again. |
147 EXPECT_TRUE(sequencer_->OnFrame(0, "def")); | 148 EXPECT_TRUE(sequencer_->OnFrame(0, "def")); |
148 EXPECT_EQ(0u, sequencer_->frames()->size()); | 149 EXPECT_EQ(0u, sequencer_->frames()->size()); |
149 } | 150 } |
150 | 151 |
151 TEST_F(QuicStreamSequencerTest, RejectOverlyLargeFrame) { | 152 TEST_F(QuicStreamSequencerTest, RejectOverlyLargeFrame) { |
152 // TODO(rch): enable when chromium supports EXPECT_DFATAL. | 153 // TODO(rch): enable when chromium supports EXPECT_DFATAL. |
153 /* | 154 /* |
154 EXPECT_DFATAL(sequencer_.reset(new QuicStreamSequencerPeer(2, &stream_)), | 155 EXPECT_DFATAL(sequencer_.reset(new QuicStreamSequencerPeer(2, &stream_)), |
155 "Setting max frame memory to 2. " | 156 "Setting max frame memory to 2. " |
156 "Some frames will be impossible to handle."); | 157 "Some frames will be impossible to handle."); |
157 | 158 |
158 EXPECT_DEBUG_DEATH(sequencer_->OnFrame(0, "abc"), ""); | 159 EXPECT_DEBUG_DEATH(sequencer_->OnFrame(0, "abc"), ""); |
159 */ | 160 */ |
160 } | 161 } |
161 | 162 |
162 TEST_F(QuicStreamSequencerTest, DropFramePastBuffering) { | 163 TEST_F(QuicStreamSequencerTest, DropFramePastBuffering) { |
163 sequencer_->SetMemoryLimit(3); | 164 sequencer_->SetMemoryLimit(3); |
164 | 165 |
165 EXPECT_FALSE(sequencer_->OnFrame(3, "abc")); | 166 EXPECT_FALSE(sequencer_->OnFrame(3, "abc")); |
166 } | 167 } |
167 | 168 |
168 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { | 169 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { |
169 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)); | 170 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)); |
170 | 171 |
171 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 172 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
172 EXPECT_EQ(1u, sequencer_->frames()->size()); | 173 EXPECT_EQ(1u, sequencer_->frames()->size()); |
173 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 174 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
174 // Ignore this - it matches a buffered frame. | 175 // Ignore this - it matches a buffered frame. |
175 // Right now there's no checking that the payload is consistent. | 176 // Right now there's no checking that the payload is consistent. |
176 EXPECT_TRUE(sequencer_->OnFrame(0, "def")); | 177 EXPECT_TRUE(sequencer_->OnFrame(0, "def")); |
177 EXPECT_EQ(1u, sequencer_->frames()->size()); | 178 EXPECT_EQ(1u, sequencer_->frames()->size()); |
178 } | 179 } |
179 | 180 |
180 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { | 181 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { |
181 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 182 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
182 | 183 |
183 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 184 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
184 EXPECT_EQ(0u, sequencer_->frames()->size()); | 185 EXPECT_EQ(0u, sequencer_->frames()->size()); |
185 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 186 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); |
186 } | 187 } |
187 | 188 |
188 TEST_F(QuicStreamSequencerTest, EmptyFrame) { | 189 TEST_F(QuicStreamSequencerTest, EmptyFrame) { |
189 EXPECT_CALL(stream_, | 190 EXPECT_CALL(stream_, |
190 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); | 191 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); |
191 EXPECT_FALSE(sequencer_->OnFrame(0, "")); | 192 EXPECT_FALSE(sequencer_->OnFrame(0, "")); |
192 EXPECT_EQ(0u, sequencer_->frames()->size()); | 193 EXPECT_EQ(0u, sequencer_->frames()->size()); |
193 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 194 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
194 } | 195 } |
195 | 196 |
196 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { | 197 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { |
197 EXPECT_CALL(stream_, OnFinRead()); | 198 EXPECT_CALL(stream_, OnFinRead()); |
198 EXPECT_TRUE(sequencer_->OnFinFrame(0, "")); | 199 EXPECT_TRUE(sequencer_->OnFinFrame(0, "")); |
199 EXPECT_EQ(0u, sequencer_->frames()->size()); | 200 EXPECT_EQ(0u, sequencer_->frames()->size()); |
200 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 201 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
201 } | 202 } |
202 | 203 |
203 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { | 204 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { |
204 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(2)); | 205 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(2)); |
205 | 206 |
206 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 207 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
207 EXPECT_EQ(1u, sequencer_->frames()->size()); | 208 EXPECT_EQ(1u, sequencer_->frames()->size()); |
208 EXPECT_EQ(2u, sequencer_->num_bytes_consumed()); | 209 EXPECT_EQ(2u, sequencer_->num_bytes_consumed()); |
209 EXPECT_EQ("c", sequencer_->frames()->find(2)->second); | 210 EXPECT_EQ("c", sequencer_->frames()->find(2)->second); |
210 } | 211 } |
211 | 212 |
212 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { | 213 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { |
213 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 214 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
214 | 215 |
215 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 216 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
216 EXPECT_EQ(1u, sequencer_->frames()->size()); | 217 EXPECT_EQ(1u, sequencer_->frames()->size()); |
217 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 218 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
218 EXPECT_EQ("abc", sequencer_->frames()->find(0)->second); | 219 EXPECT_EQ("abc", sequencer_->frames()->find(0)->second); |
219 } | 220 } |
220 | 221 |
221 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { | 222 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { |
222 EXPECT_TRUE(sequencer_->OnFrame(3, "abc")); | 223 EXPECT_TRUE(sequencer_->OnFrame(3, "abc")); |
223 EXPECT_EQ(1u, sequencer_->frames()->size()); | 224 EXPECT_EQ(1u, sequencer_->frames()->size()); |
224 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 225 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
225 EXPECT_EQ("abc", sequencer_->frames()->find(3)->second); | 226 EXPECT_EQ("abc", sequencer_->frames()->find(3)->second); |
226 } | 227 } |
227 | 228 |
228 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { | 229 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { |
229 // Buffer the first | 230 // Buffer the first |
230 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 231 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
231 EXPECT_EQ(1u, sequencer_->frames()->size()); | 232 EXPECT_EQ(1u, sequencer_->frames()->size()); |
232 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 233 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
233 // Buffer the second | 234 // Buffer the second |
234 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 235 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
235 EXPECT_EQ(2u, sequencer_->frames()->size()); | 236 EXPECT_EQ(2u, sequencer_->frames()->size()); |
236 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 237 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
237 | 238 |
238 InSequence s; | 239 InSequence s; |
239 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 240 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
240 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); | 241 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(3)); |
241 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3)); | 242 EXPECT_CALL(stream_, ProcessRawData(StrEq("ghi"), 3)).WillOnce(Return(3)); |
242 | 243 |
243 // Ack right away | 244 // Ack right away |
244 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 245 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
245 EXPECT_EQ(9u, sequencer_->num_bytes_consumed()); | 246 EXPECT_EQ(9u, sequencer_->num_bytes_consumed()); |
246 | 247 |
247 EXPECT_EQ(0u, sequencer_->frames()->size()); | 248 EXPECT_EQ(0u, sequencer_->frames()->size()); |
248 } | 249 } |
249 | 250 |
250 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesProcessedWithBuffering) { | 251 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesProcessedWithBuffering) { |
251 sequencer_->SetMemoryLimit(9); | 252 sequencer_->SetMemoryLimit(9); |
252 | 253 |
253 // Too far to buffer. | 254 // Too far to buffer. |
254 EXPECT_FALSE(sequencer_->OnFrame(9, "jkl")); | 255 EXPECT_FALSE(sequencer_->OnFrame(9, "jkl")); |
255 | 256 |
256 // We can afford to buffer this. | 257 // We can afford to buffer this. |
257 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 258 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
258 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 259 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); |
259 | 260 |
260 InSequence s; | 261 InSequence s; |
261 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 262 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
262 | 263 |
263 // Ack right away | 264 // Ack right away |
264 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 265 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
265 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 266 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); |
266 | 267 |
267 // We should be willing to buffer this now. | 268 // We should be willing to buffer this now. |
268 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); | 269 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); |
269 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 270 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); |
270 | 271 |
271 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); | 272 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(3)); |
272 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3)); | 273 EXPECT_CALL(stream_, ProcessRawData(StrEq("ghi"), 3)).WillOnce(Return(3)); |
273 EXPECT_CALL(stream_, ProcessData(StrEq("jkl"), 3)).WillOnce(Return(3)); | 274 EXPECT_CALL(stream_, ProcessRawData(StrEq("jkl"), 3)).WillOnce(Return(3)); |
274 | 275 |
275 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 276 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
276 EXPECT_EQ(12u, sequencer_->num_bytes_consumed()); | 277 EXPECT_EQ(12u, sequencer_->num_bytes_consumed()); |
277 EXPECT_EQ(0u, sequencer_->frames()->size()); | 278 EXPECT_EQ(0u, sequencer_->frames()->size()); |
278 } | 279 } |
279 | 280 |
280 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) { | 281 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) { |
281 sequencer_->SetMemoryLimit(9); | 282 sequencer_->SetMemoryLimit(9); |
282 char buffer[20]; | 283 char buffer[20]; |
283 iovec iov[2]; | 284 iovec iov[2]; |
284 iov[0].iov_base = &buffer[0]; | 285 iov[0].iov_base = &buffer[0]; |
285 iov[0].iov_len = 1; | 286 iov[0].iov_len = 1; |
286 iov[1].iov_base = &buffer[1]; | 287 iov[1].iov_base = &buffer[1]; |
287 iov[1].iov_len = 2; | 288 iov[1].iov_len = 2; |
288 | 289 |
289 // Push abc - process. | 290 // Push abc - process. |
290 // Push jkl - buffer (not next data) | 291 // Push jkl - buffer (not next data) |
291 // Push def - don't process. | 292 // Push def - don't process. |
292 // Push mno - drop (too far out) | 293 // Push mno - drop (too far out) |
293 // Push ghi - buffer (def not processed) | 294 // Push ghi - buffer (def not processed) |
294 // Read 2. | 295 // Read 2. |
295 // Push mno - buffer (not all read) | 296 // Push mno - buffer (not all read) |
296 // Read all | 297 // Read all |
297 // Push pqr - process | 298 // Push pqr - process |
298 | 299 |
299 InSequence s; | 300 InSequence s; |
300 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 301 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
301 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0)); | 302 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(0)); |
302 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3)); | 303 EXPECT_CALL(stream_, ProcessRawData(StrEq("pqr"), 3)).WillOnce(Return(3)); |
303 | 304 |
304 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 305 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
305 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 306 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
306 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); | 307 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); |
307 EXPECT_FALSE(sequencer_->OnFrame(12, "mno")); | 308 EXPECT_FALSE(sequencer_->OnFrame(12, "mno")); |
308 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 309 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
309 | 310 |
310 // Read 3 bytes. | 311 // Read 3 bytes. |
311 EXPECT_EQ(3, sequencer_->Readv(iov, 2)); | 312 EXPECT_EQ(3, sequencer_->Readv(iov, 2)); |
312 EXPECT_EQ(0, strncmp(buffer, "def", 3)); | 313 EXPECT_EQ(0, strncmp(buffer, "def", 3)); |
313 | 314 |
314 // Now we have space to bufer this. | 315 // Now we have space to bufer this. |
315 EXPECT_TRUE(sequencer_->OnFrame(12, "mno")); | 316 EXPECT_TRUE(sequencer_->OnFrame(12, "mno")); |
316 | 317 |
317 // Read the remaining 9 bytes. | 318 // Read the remaining 9 bytes. |
318 iov[1].iov_len = 19; | 319 iov[1].iov_len = 19; |
319 EXPECT_EQ(9, sequencer_->Readv(iov, 2)); | 320 EXPECT_EQ(9, sequencer_->Readv(iov, 2)); |
320 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9)); | 321 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9)); |
321 | 322 |
322 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr")); | 323 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr")); |
323 } | 324 } |
324 | 325 |
325 // Same as above, just using a different method for reading. | 326 // Same as above, just using a different method for reading. |
326 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) { | 327 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) { |
327 sequencer_->SetMemoryLimit(9); | 328 sequencer_->SetMemoryLimit(9); |
328 | 329 |
329 InSequence s; | 330 InSequence s; |
330 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 331 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
331 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0)); | 332 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(0)); |
332 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3)); | 333 EXPECT_CALL(stream_, ProcessRawData(StrEq("pqr"), 3)).WillOnce(Return(3)); |
333 | 334 |
334 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 335 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
335 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 336 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
336 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); | 337 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); |
337 EXPECT_FALSE(sequencer_->OnFrame(12, "mno")); | 338 EXPECT_FALSE(sequencer_->OnFrame(12, "mno")); |
338 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 339 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
339 | 340 |
340 // Read 3 bytes. | 341 // Read 3 bytes. |
341 const char* expected[] = {"def", "ghi", "jkl"}; | 342 const char* expected[] = {"def", "ghi", "jkl"}; |
342 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 343 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
(...skipping 11 matching lines...) Expand all Loading... |
354 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1)); | 355 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1)); |
355 | 356 |
356 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr")); | 357 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr")); |
357 } | 358 } |
358 | 359 |
359 // Same as above, just using a different method for reading. | 360 // Same as above, just using a different method for reading. |
360 TEST_F(QuicStreamSequencerTest, MarkConsumed) { | 361 TEST_F(QuicStreamSequencerTest, MarkConsumed) { |
361 sequencer_->SetMemoryLimit(9); | 362 sequencer_->SetMemoryLimit(9); |
362 | 363 |
363 InSequence s; | 364 InSequence s; |
364 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 365 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
365 | 366 |
366 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 367 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
367 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 368 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
368 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); | 369 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi")); |
369 | 370 |
370 // Peek into the data. | 371 // Peek into the data. |
371 const char* expected[] = {"abc", "def", "ghi"}; | 372 const char* expected[] = {"abc", "def", "ghi"}; |
372 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 373 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
373 | 374 |
374 // Consume 1 byte. | 375 // Consume 1 byte. |
(...skipping 11 matching lines...) Expand all Loading... |
386 // Consume 5 bytes. | 387 // Consume 5 bytes. |
387 sequencer_->MarkConsumed(5); | 388 sequencer_->MarkConsumed(5); |
388 // Verify data. | 389 // Verify data. |
389 const char* expected4[] = {"i"}; | 390 const char* expected4[] = {"i"}; |
390 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); | 391 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); |
391 } | 392 } |
392 | 393 |
393 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { | 394 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { |
394 // TODO(rch): enable when chromium supports EXPECT_DFATAL. | 395 // TODO(rch): enable when chromium supports EXPECT_DFATAL. |
395 /* | 396 /* |
396 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 397 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
397 | 398 |
398 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 399 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
399 EXPECT_TRUE(sequencer_->OnFrame(9, "jklmnopqrstuvwxyz")); | 400 EXPECT_TRUE(sequencer_->OnFrame(9, "jklmnopqrstuvwxyz")); |
400 | 401 |
401 // Peek into the data. Only the first chunk should be readable | 402 // Peek into the data. Only the first chunk should be readable |
402 // because of the missing data. | 403 // because of the missing data. |
403 const char* expected[] = {"abc"}; | 404 const char* expected[] = {"abc"}; |
404 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 405 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
405 | 406 |
406 // Now, attempt to mark consumed more data than was readable | 407 // Now, attempt to mark consumed more data than was readable |
407 // and expect the stream to be closed. | 408 // and expect the stream to be closed. |
408 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM)); | 409 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM)); |
409 EXPECT_DFATAL(sequencer_->MarkConsumed(4), | 410 EXPECT_DFATAL(sequencer_->MarkConsumed(4), |
410 "Invalid argument to MarkConsumed. num_bytes_consumed_: 3 " | 411 "Invalid argument to MarkConsumed. num_bytes_consumed_: 3 " |
411 "end_offset: 4 offset: 9 length: 17"); | 412 "end_offset: 4 offset: 9 length: 17"); |
412 */ | 413 */ |
413 } | 414 } |
414 | 415 |
415 TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) { | 416 TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) { |
416 InSequence s; | 417 InSequence s; |
417 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 418 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
418 | 419 |
419 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 420 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
420 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 421 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
421 // Missing packet: 6, ghi | 422 // Missing packet: 6, ghi |
422 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); | 423 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl")); |
423 | 424 |
424 const char* expected[] = {"abc", "def"}; | 425 const char* expected[] = {"abc", "def"}; |
425 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 426 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
426 | 427 |
427 sequencer_->MarkConsumed(6); | 428 sequencer_->MarkConsumed(6); |
428 } | 429 } |
429 | 430 |
430 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { | 431 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { |
431 InSequence s; | 432 InSequence s; |
432 | 433 |
433 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 434 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
434 EXPECT_CALL(stream_, OnFinRead()); | 435 EXPECT_CALL(stream_, OnFinRead()); |
435 EXPECT_TRUE(sequencer_->OnFinFrame(0, "abc")); | 436 EXPECT_TRUE(sequencer_->OnFinFrame(0, "abc")); |
436 | 437 |
437 EXPECT_EQ(3u, sequencer_->close_offset()); | 438 EXPECT_EQ(3u, sequencer_->close_offset()); |
438 } | 439 } |
439 | 440 |
440 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { | 441 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { |
441 sequencer_->OnFinFrame(6, ""); | 442 sequencer_->OnFinFrame(6, ""); |
442 EXPECT_EQ(6u, sequencer_->close_offset()); | 443 EXPECT_EQ(6u, sequencer_->close_offset()); |
443 InSequence s; | 444 InSequence s; |
444 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 445 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
445 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); | 446 EXPECT_CALL(stream_, ProcessRawData(StrEq("def"), 3)).WillOnce(Return(3)); |
446 EXPECT_CALL(stream_, OnFinRead()); | 447 EXPECT_CALL(stream_, OnFinRead()); |
447 | 448 |
448 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); | 449 EXPECT_TRUE(sequencer_->OnFrame(3, "def")); |
449 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 450 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
450 } | 451 } |
451 | 452 |
452 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { | 453 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { |
453 sequencer_->OnFinFrame(3, ""); | 454 sequencer_->OnFinFrame(3, ""); |
454 EXPECT_EQ(3u, sequencer_->close_offset()); | 455 EXPECT_EQ(3u, sequencer_->close_offset()); |
455 InSequence s; | 456 InSequence s; |
456 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); | 457 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(3)); |
457 EXPECT_CALL(stream_, OnFinRead()); | 458 EXPECT_CALL(stream_, OnFinRead()); |
458 | 459 |
459 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 460 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
460 } | 461 } |
461 | 462 |
462 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { | 463 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { |
463 char buffer[3]; | 464 char buffer[3]; |
464 | 465 |
465 sequencer_->OnFinFrame(3, ""); | 466 sequencer_->OnFinFrame(3, ""); |
466 EXPECT_EQ(3u, sequencer_->close_offset()); | 467 EXPECT_EQ(3u, sequencer_->close_offset()); |
467 | 468 |
468 EXPECT_FALSE(sequencer_->IsClosed()); | 469 EXPECT_FALSE(sequencer_->IsClosed()); |
469 | 470 |
470 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); | 471 EXPECT_CALL(stream_, ProcessRawData(StrEq("abc"), 3)).WillOnce(Return(0)); |
471 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); | 472 EXPECT_TRUE(sequencer_->OnFrame(0, "abc")); |
472 | 473 |
473 iovec iov = { &buffer[0], 3 }; | 474 iovec iov = { &buffer[0], 3 }; |
474 int bytes_read = sequencer_->Readv(&iov, 1); | 475 int bytes_read = sequencer_->Readv(&iov, 1); |
475 EXPECT_EQ(3, bytes_read); | 476 EXPECT_EQ(3, bytes_read); |
476 EXPECT_TRUE(sequencer_->IsClosed()); | 477 EXPECT_TRUE(sequencer_->IsClosed()); |
477 } | 478 } |
478 | 479 |
479 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { | 480 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { |
480 sequencer_->OnFinFrame(3, ""); | 481 sequencer_->OnFinFrame(3, ""); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 string output_; | 529 string output_; |
529 FrameList list_; | 530 FrameList list_; |
530 }; | 531 }; |
531 | 532 |
532 // All frames are processed as soon as we have sequential data. | 533 // All frames are processed as soon as we have sequential data. |
533 // Infinite buffering, so all frames are acked right away. | 534 // Infinite buffering, so all frames are acked right away. |
534 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) { | 535 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) { |
535 InSequence s; | 536 InSequence s; |
536 for (size_t i = 0; i < list_.size(); ++i) { | 537 for (size_t i = 0; i < list_.size(); ++i) { |
537 string* data = &list_[i].second; | 538 string* data = &list_[i].second; |
538 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size())) | 539 EXPECT_CALL(stream_, ProcessRawData(StrEq(*data), data->size())) |
539 .WillOnce(Return(data->size())); | 540 .WillOnce(Return(data->size())); |
540 } | 541 } |
541 | 542 |
542 while (!list_.empty()) { | 543 while (!list_.empty()) { |
543 int index = OneToN(list_.size()) - 1; | 544 int index = OneToN(list_.size()) - 1; |
544 LOG(ERROR) << "Sending index " << index << " " | 545 LOG(ERROR) << "Sending index " << index << " " |
545 << list_[index].second.data(); | 546 << list_[index].second.data(); |
546 EXPECT_TRUE(sequencer_->OnFrame(list_[index].first, | 547 EXPECT_TRUE(sequencer_->OnFrame(list_[index].first, |
547 list_[index].second.data())); | 548 list_[index].second.data())); |
548 | 549 |
549 list_.erase(list_.begin() + index); | 550 list_.erase(list_.begin() + index); |
550 } | 551 } |
551 } | 552 } |
552 | 553 |
553 // All frames are processed as soon as we have sequential data. | 554 // All frames are processed as soon as we have sequential data. |
554 // Buffering, so some frames are rejected. | 555 // Buffering, so some frames are rejected. |
555 TEST_F(QuicSequencerRandomTest, RandomFramesDroppingNoBackup) { | 556 TEST_F(QuicSequencerRandomTest, RandomFramesDroppingNoBackup) { |
556 sequencer_->SetMemoryLimit(26); | 557 sequencer_->SetMemoryLimit(26); |
557 | 558 |
558 InSequence s; | 559 InSequence s; |
559 for (size_t i = 0; i < list_.size(); ++i) { | 560 for (size_t i = 0; i < list_.size(); ++i) { |
560 string* data = &list_[i].second; | 561 string* data = &list_[i].second; |
561 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size())) | 562 EXPECT_CALL(stream_, ProcessRawData(StrEq(*data), data->size())) |
562 .WillOnce(Return(data->size())); | 563 .WillOnce(Return(data->size())); |
563 } | 564 } |
564 | 565 |
565 while (!list_.empty()) { | 566 while (!list_.empty()) { |
566 int index = OneToN(list_.size()) - 1; | 567 int index = OneToN(list_.size()) - 1; |
567 LOG(ERROR) << "Sending index " << index << " " | 568 LOG(ERROR) << "Sending index " << index << " " |
568 << list_[index].second.data(); | 569 << list_[index].second.data(); |
569 bool acked = sequencer_->OnFrame(list_[index].first, | 570 bool acked = sequencer_->OnFrame(list_[index].first, |
570 list_[index].second.data()); | 571 list_[index].second.data()); |
571 | 572 |
572 if (acked) { | 573 if (acked) { |
573 list_.erase(list_.begin() + index); | 574 list_.erase(list_.begin() + index); |
574 } | 575 } |
575 } | 576 } |
576 } | 577 } |
577 | 578 |
578 } // namespace | 579 } // namespace |
579 } // namespace test | 580 } // namespace test |
580 } // namespace net | 581 } // namespace net |
OLD | NEW |