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

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

Issue 20227003: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Land Recent QUIC changes Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_stream_sequencer.cc ('k') | net/quic/reliable_quic_stream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_stream_sequencer.h" 5 #include "net/quic/quic_stream_sequencer.h"
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/rand_util.h" 10 #include "base/rand_util.h"
(...skipping 14 matching lines...) Expand all
25 namespace net { 25 namespace net {
26 namespace test { 26 namespace test {
27 27
28 class QuicStreamSequencerPeer : public QuicStreamSequencer { 28 class QuicStreamSequencerPeer : public QuicStreamSequencer {
29 public: 29 public:
30 explicit QuicStreamSequencerPeer(ReliableQuicStream* stream) 30 explicit QuicStreamSequencerPeer(ReliableQuicStream* stream)
31 : QuicStreamSequencer(stream) { 31 : QuicStreamSequencer(stream) {
32 } 32 }
33 33
34 QuicStreamSequencerPeer(int32 max_mem, ReliableQuicStream* stream) 34 QuicStreamSequencerPeer(int32 max_mem, ReliableQuicStream* stream)
35 : QuicStreamSequencer(max_mem, stream) {} 35 : QuicStreamSequencer(max_mem, stream) {
36 }
36 37
37 virtual bool OnFrame(QuicStreamOffset byte_offset, 38 virtual bool OnFinFrame(QuicStreamOffset byte_offset,
38 const char* data, 39 const char* data) {
39 uint32 data_len) {
40 QuicStreamFrame frame; 40 QuicStreamFrame frame;
41 frame.stream_id = 1; 41 frame.stream_id = 1;
42 frame.offset = byte_offset; 42 frame.offset = byte_offset;
43 frame.data = StringPiece(data, data_len); 43 frame.data = StringPiece(data);
44 frame.fin = true;
44 return OnStreamFrame(frame); 45 return OnStreamFrame(frame);
45 } 46 }
46 47
48 virtual bool OnFrame(QuicStreamOffset byte_offset,
49 const char* data) {
50 QuicStreamFrame frame;
51 frame.stream_id = 1;
52 frame.offset = byte_offset;
53 frame.data = StringPiece(data);
54 frame.fin = false;
55 return OnStreamFrame(frame);
56 }
57
47 void SetMemoryLimit(size_t limit) { 58 void SetMemoryLimit(size_t limit) {
48 max_frame_memory_ = limit; 59 max_frame_memory_ = limit;
49 } 60 }
50 61
51 const ReliableQuicStream* stream() const { return stream_; } 62 const ReliableQuicStream* stream() const { return stream_; }
52 uint64 num_bytes_consumed() const { return num_bytes_consumed_; } 63 uint64 num_bytes_consumed() const { return num_bytes_consumed_; }
53 const FrameMap* frames() const { return &frames_; } 64 const FrameMap* frames() const { return &frames_; }
54 int32 max_frame_memory() const { return max_frame_memory_; } 65 int32 max_frame_memory() const { return max_frame_memory_; }
55 QuicStreamOffset close_offset() const { return close_offset_; } 66 QuicStreamOffset close_offset() const { return close_offset_; }
56 }; 67 };
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 131
121 QuicSession* session_; 132 QuicSession* session_;
122 testing::StrictMock<MockStream> stream_; 133 testing::StrictMock<MockStream> stream_;
123 scoped_ptr<QuicStreamSequencerPeer> sequencer_; 134 scoped_ptr<QuicStreamSequencerPeer> sequencer_;
124 }; 135 };
125 136
126 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { 137 TEST_F(QuicStreamSequencerTest, RejectOldFrame) {
127 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)) 138 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3))
128 .WillOnce(Return(3)); 139 .WillOnce(Return(3));
129 140
130 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 141 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
131 EXPECT_EQ(0u, sequencer_->frames()->size()); 142 EXPECT_EQ(0u, sequencer_->frames()->size());
132 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 143 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
133 // Ignore this - it matches a past sequence number and we should not see it 144 // Ignore this - it matches a past sequence number and we should not see it
134 // again. 145 // again.
135 EXPECT_TRUE(sequencer_->OnFrame(0, "def", 3)); 146 EXPECT_TRUE(sequencer_->OnFrame(0, "def"));
136 EXPECT_EQ(0u, sequencer_->frames()->size()); 147 EXPECT_EQ(0u, sequencer_->frames()->size());
137 } 148 }
138 149
139 TEST_F(QuicStreamSequencerTest, RejectOverlyLargeFrame) { 150 TEST_F(QuicStreamSequencerTest, RejectOverlyLargeFrame) {
140 /* 151 /*
141 EXPECT_DFATAL(sequencer_.reset(new QuicStreamSequencerPeer(2, &stream_)), 152 EXPECT_DFATAL(sequencer_.reset(new QuicStreamSequencerPeer(2, &stream_)),
142 "Setting max frame memory to 2. " 153 "Setting max frame memory to 2. "
143 "Some frames will be impossible to handle."); 154 "Some frames will be impossible to handle.");
144 155
145 EXPECT_DEBUG_DEATH(sequencer_->OnFrame(0, "abc", 3), ""); 156 EXPECT_DEBUG_DEATH(sequencer_->OnFrame(0, "abc"), "");
146 */ 157 */
147 } 158 }
148 159
149 TEST_F(QuicStreamSequencerTest, DropFramePastBuffering) { 160 TEST_F(QuicStreamSequencerTest, DropFramePastBuffering) {
150 sequencer_->SetMemoryLimit(3); 161 sequencer_->SetMemoryLimit(3);
151 162
152 EXPECT_FALSE(sequencer_->OnFrame(3, "abc", 3)); 163 EXPECT_FALSE(sequencer_->OnFrame(3, "abc"));
153 } 164 }
154 165
155 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { 166 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) {
156 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)); 167 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3));
157 168
158 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 169 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
159 EXPECT_EQ(1u, sequencer_->frames()->size()); 170 EXPECT_EQ(1u, sequencer_->frames()->size());
160 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 171 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
161 // Ignore this - it matches a buffered frame. 172 // Ignore this - it matches a buffered frame.
162 // Right now there's no checking that the payload is consistent. 173 // Right now there's no checking that the payload is consistent.
163 EXPECT_TRUE(sequencer_->OnFrame(0, "def", 3)); 174 EXPECT_TRUE(sequencer_->OnFrame(0, "def"));
164 EXPECT_EQ(1u, sequencer_->frames()->size()); 175 EXPECT_EQ(1u, sequencer_->frames()->size());
165 } 176 }
166 177
167 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { 178 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) {
168 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 179 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
169 180
170 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 181 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
171 EXPECT_EQ(0u, sequencer_->frames()->size()); 182 EXPECT_EQ(0u, sequencer_->frames()->size());
172 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 183 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
173 } 184 }
174 185
186 TEST_F(QuicStreamSequencerTest, EmptyFrame) {
187 EXPECT_TRUE(sequencer_->OnFrame(0, ""));
188 EXPECT_EQ(0u, sequencer_->frames()->size());
189 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
190 }
191
192 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) {
193 EXPECT_CALL(stream_, TerminateFromPeer(true));
194 EXPECT_TRUE(sequencer_->OnFinFrame(0, ""));
195 EXPECT_EQ(0u, sequencer_->frames()->size());
196 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
197 }
198
175 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { 199 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) {
176 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(2)); 200 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(2));
177 201
178 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 202 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
179 EXPECT_EQ(1u, sequencer_->frames()->size()); 203 EXPECT_EQ(1u, sequencer_->frames()->size());
180 EXPECT_EQ(2u, sequencer_->num_bytes_consumed()); 204 EXPECT_EQ(2u, sequencer_->num_bytes_consumed());
181 EXPECT_EQ("c", sequencer_->frames()->find(2)->second); 205 EXPECT_EQ("c", sequencer_->frames()->find(2)->second);
182 } 206 }
183 207
184 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { 208 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) {
185 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); 209 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
186 210
187 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 211 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
188 EXPECT_EQ(1u, sequencer_->frames()->size()); 212 EXPECT_EQ(1u, sequencer_->frames()->size());
189 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 213 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
190 EXPECT_EQ("abc", sequencer_->frames()->find(0)->second); 214 EXPECT_EQ("abc", sequencer_->frames()->find(0)->second);
191 } 215 }
192 216
193 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { 217 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) {
194 EXPECT_TRUE(sequencer_->OnFrame(3, "abc", 3)); 218 EXPECT_TRUE(sequencer_->OnFrame(3, "abc"));
195 EXPECT_EQ(1u, sequencer_->frames()->size()); 219 EXPECT_EQ(1u, sequencer_->frames()->size());
196 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 220 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
197 EXPECT_EQ("abc", sequencer_->frames()->find(3)->second); 221 EXPECT_EQ("abc", sequencer_->frames()->find(3)->second);
198 } 222 }
199 223
200 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { 224 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) {
201 // Buffer the first 225 // Buffer the first
202 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3)); 226 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
203 EXPECT_EQ(1u, sequencer_->frames()->size()); 227 EXPECT_EQ(1u, sequencer_->frames()->size());
204 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 228 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
205 // Buffer the second 229 // Buffer the second
206 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); 230 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
207 EXPECT_EQ(2u, sequencer_->frames()->size()); 231 EXPECT_EQ(2u, sequencer_->frames()->size());
208 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 232 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
209 233
210 InSequence s; 234 InSequence s;
211 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 235 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
212 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); 236 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
213 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3)); 237 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3));
214 238
215 // Ack right away 239 // Ack right away
216 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 240 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
217 EXPECT_EQ(9u, sequencer_->num_bytes_consumed()); 241 EXPECT_EQ(9u, sequencer_->num_bytes_consumed());
218 242
219 EXPECT_EQ(0u, sequencer_->frames()->size()); 243 EXPECT_EQ(0u, sequencer_->frames()->size());
220 } 244 }
221 245
222 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesProcessedWithBuffering) { 246 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesProcessedWithBuffering) {
223 sequencer_->SetMemoryLimit(9); 247 sequencer_->SetMemoryLimit(9);
224 248
225 // Too far to buffer. 249 // Too far to buffer.
226 EXPECT_FALSE(sequencer_->OnFrame(9, "jkl", 3)); 250 EXPECT_FALSE(sequencer_->OnFrame(9, "jkl"));
227 251
228 // We can afford to buffer this. 252 // We can afford to buffer this.
229 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3)); 253 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
230 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); 254 EXPECT_EQ(0u, sequencer_->num_bytes_consumed());
231 255
232 InSequence s; 256 InSequence s;
233 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 257 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
234 258
235 // Ack right away 259 // Ack right away
236 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 260 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
237 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 261 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
238 262
239 // We should be willing to buffer this now. 263 // We should be willing to buffer this now.
240 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl", 3)); 264 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl"));
241 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); 265 EXPECT_EQ(3u, sequencer_->num_bytes_consumed());
242 266
243 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); 267 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
244 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3)); 268 EXPECT_CALL(stream_, ProcessData(StrEq("ghi"), 3)).WillOnce(Return(3));
245 EXPECT_CALL(stream_, ProcessData(StrEq("jkl"), 3)).WillOnce(Return(3)); 269 EXPECT_CALL(stream_, ProcessData(StrEq("jkl"), 3)).WillOnce(Return(3));
246 270
247 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); 271 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
248 EXPECT_EQ(12u, sequencer_->num_bytes_consumed()); 272 EXPECT_EQ(12u, sequencer_->num_bytes_consumed());
249 EXPECT_EQ(0u, sequencer_->frames()->size()); 273 EXPECT_EQ(0u, sequencer_->frames()->size());
250 } 274 }
251 275
252 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) { 276 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithReadv) {
253 sequencer_->SetMemoryLimit(9); 277 sequencer_->SetMemoryLimit(9);
254 char buffer[20]; 278 char buffer[20];
255 iovec iov[2]; 279 iovec iov[2];
256 iov[0].iov_base = &buffer[0]; 280 iov[0].iov_base = &buffer[0];
257 iov[0].iov_len = 1; 281 iov[0].iov_len = 1;
258 iov[1].iov_base = &buffer[1]; 282 iov[1].iov_base = &buffer[1];
259 iov[1].iov_len = 2; 283 iov[1].iov_len = 2;
260 284
261 // Push abc - process. 285 // Push abc - process.
262 // Push jkl - buffer (not next data) 286 // Push jkl - buffer (not next data)
263 // Push def - don't process. 287 // Push def - don't process.
264 // Push mno - drop (too far out) 288 // Push mno - drop (too far out)
265 // Push ghi - buffer (def not processed) 289 // Push ghi - buffer (def not processed)
266 // Read 2. 290 // Read 2.
267 // Push mno - buffer (not all read) 291 // Push mno - buffer (not all read)
268 // Read all 292 // Read all
269 // Push pqr - process 293 // Push pqr - process
270 294
271 InSequence s; 295 InSequence s;
272 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 296 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
273 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0)); 297 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0));
274 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3)); 298 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3));
275 299
276 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 300 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
277 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); 301 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
278 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl", 3)); 302 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl"));
279 EXPECT_FALSE(sequencer_->OnFrame(12, "mno", 3)); 303 EXPECT_FALSE(sequencer_->OnFrame(12, "mno"));
280 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3)); 304 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
281 305
282 // Read 3 bytes. 306 // Read 3 bytes.
283 EXPECT_EQ(3, sequencer_->Readv(iov, 2)); 307 EXPECT_EQ(3, sequencer_->Readv(iov, 2));
284 EXPECT_EQ(0, strncmp(buffer, "def", 3)); 308 EXPECT_EQ(0, strncmp(buffer, "def", 3));
285 309
286 // Now we have space to bufer this. 310 // Now we have space to bufer this.
287 EXPECT_TRUE(sequencer_->OnFrame(12, "mno", 3)); 311 EXPECT_TRUE(sequencer_->OnFrame(12, "mno"));
288 312
289 // Read the remaining 9 bytes. 313 // Read the remaining 9 bytes.
290 iov[1].iov_len = 19; 314 iov[1].iov_len = 19;
291 EXPECT_EQ(9, sequencer_->Readv(iov, 2)); 315 EXPECT_EQ(9, sequencer_->Readv(iov, 2));
292 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9)); 316 EXPECT_EQ(0, strncmp(buffer, "ghijklmno", 9));
293 317
294 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr", 3)); 318 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr"));
295 } 319 }
296 320
297 // Same as above, just using a different method for reading. 321 // Same as above, just using a different method for reading.
298 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) { 322 TEST_F(QuicStreamSequencerTest, OutOfOrderFramesBlockignWithGetReadableRegion) {
299 sequencer_->SetMemoryLimit(9); 323 sequencer_->SetMemoryLimit(9);
300 324
301 InSequence s; 325 InSequence s;
302 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 326 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
303 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0)); 327 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(0));
304 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3)); 328 EXPECT_CALL(stream_, ProcessData(StrEq("pqr"), 3)).WillOnce(Return(3));
305 329
306 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 330 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
307 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); 331 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
308 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl", 3)); 332 EXPECT_TRUE(sequencer_->OnFrame(9, "jkl"));
309 EXPECT_FALSE(sequencer_->OnFrame(12, "mno", 3)); 333 EXPECT_FALSE(sequencer_->OnFrame(12, "mno"));
310 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3)); 334 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
311 335
312 // Read 3 bytes. 336 // Read 3 bytes.
313 const char* expected[] = {"def", "ghi", "jkl"}; 337 const char* expected[] = {"def", "ghi", "jkl"};
314 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); 338 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
315 char buffer[9]; 339 char buffer[9];
316 iovec read_iov = { &buffer[0], 3 }; 340 iovec read_iov = { &buffer[0], 3 };
317 ASSERT_EQ(3, sequencer_->Readv(&read_iov, 1)); 341 ASSERT_EQ(3, sequencer_->Readv(&read_iov, 1));
318 342
319 // Now we have space to bufer this. 343 // Now we have space to bufer this.
320 EXPECT_TRUE(sequencer_->OnFrame(12, "mno", 3)); 344 EXPECT_TRUE(sequencer_->OnFrame(12, "mno"));
321 345
322 // Read the remaining 9 bytes. 346 // Read the remaining 9 bytes.
323 const char* expected2[] = {"ghi", "jkl", "mno"}; 347 const char* expected2[] = {"ghi", "jkl", "mno"};
324 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2))); 348 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
325 read_iov.iov_len = 9; 349 read_iov.iov_len = 9;
326 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1)); 350 ASSERT_EQ(9, sequencer_->Readv(&read_iov, 1));
327 351
328 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr", 3)); 352 EXPECT_TRUE(sequencer_->OnFrame(15, "pqr"));
329 } 353 }
330 354
331 // Same as above, just using a different method for reading. 355 // Same as above, just using a different method for reading.
332 TEST_F(QuicStreamSequencerTest, MarkConsumed) { 356 TEST_F(QuicStreamSequencerTest, MarkConsumed) {
333 sequencer_->SetMemoryLimit(9); 357 sequencer_->SetMemoryLimit(9);
334 358
335 InSequence s; 359 InSequence s;
336 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); 360 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
337 361
338 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 362 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
339 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); 363 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
340 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi", 3)); 364 EXPECT_TRUE(sequencer_->OnFrame(6, "ghi"));
341 365
342 // Peek into the data. 366 // Peek into the data.
343 const char* expected[] = {"abc", "def", "ghi"}; 367 const char* expected[] = {"abc", "def", "ghi"};
344 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); 368 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected)));
345 369
346 // Consume 1 byte. 370 // Consume 1 byte.
347 sequencer_->MarkConsumed(1); 371 sequencer_->MarkConsumed(1);
348 // Verify data. 372 // Verify data.
349 const char* expected2[] = {"bc", "def", "ghi"}; 373 const char* expected2[] = {"bc", "def", "ghi"};
350 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2))); 374 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2)));
351 375
352 // Consume 2 bytes. 376 // Consume 2 bytes.
353 sequencer_->MarkConsumed(2); 377 sequencer_->MarkConsumed(2);
354 // Verify data. 378 // Verify data.
355 const char* expected3[] = {"def", "ghi"}; 379 const char* expected3[] = {"def", "ghi"};
356 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); 380 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3)));
357 381
358 // Consume 5 bytes. 382 // Consume 5 bytes.
359 sequencer_->MarkConsumed(5); 383 sequencer_->MarkConsumed(5);
360 // Verify data. 384 // Verify data.
361 const char* expected4[] = {"i"}; 385 const char* expected4[] = {"i"};
362 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); 386 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4)));
363 } 387 }
364 388
365 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { 389 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) {
366 InSequence s; 390 InSequence s;
367 391
368 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 392 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
369 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 393 EXPECT_CALL(stream_, TerminateFromPeer(true));
394 EXPECT_TRUE(sequencer_->OnFinFrame(0, "abc"));
370 395
371 EXPECT_CALL(stream_, TerminateFromPeer(true));
372 sequencer_->CloseStreamAtOffset(3);
373 EXPECT_EQ(3u, sequencer_->close_offset()); 396 EXPECT_EQ(3u, sequencer_->close_offset());
374 } 397 }
375 398
376 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { 399 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) {
377 sequencer_->CloseStreamAtOffset(6); 400 sequencer_->OnFinFrame(6, "");
378 EXPECT_EQ(6u, sequencer_->close_offset()); 401 EXPECT_EQ(6u, sequencer_->close_offset());
379 InSequence s; 402 InSequence s;
380 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 403 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
381 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3)); 404 EXPECT_CALL(stream_, ProcessData(StrEq("def"), 3)).WillOnce(Return(3));
382 EXPECT_CALL(stream_, TerminateFromPeer(true)); 405 EXPECT_CALL(stream_, TerminateFromPeer(true));
383 406
384 EXPECT_TRUE(sequencer_->OnFrame(3, "def", 3)); 407 EXPECT_TRUE(sequencer_->OnFrame(3, "def"));
385 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 408 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
386 } 409 }
387 410
388 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { 411 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) {
389 sequencer_->CloseStreamAtOffset(3); 412 sequencer_->OnFinFrame(3, "");
390 EXPECT_EQ(3u, sequencer_->close_offset()); 413 EXPECT_EQ(3u, sequencer_->close_offset());
391 InSequence s; 414 InSequence s;
392 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3)); 415 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(3));
393 EXPECT_CALL(stream_, TerminateFromPeer(true)); 416 EXPECT_CALL(stream_, TerminateFromPeer(true));
394 417
395 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 418 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
396 } 419 }
397 420
398 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { 421 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) {
399 char buffer[3]; 422 char buffer[3];
400 423
401 sequencer_->CloseStreamAtOffset(3); 424 sequencer_->OnFinFrame(3, "");
402 EXPECT_EQ(3u, sequencer_->close_offset()); 425 EXPECT_EQ(3u, sequencer_->close_offset());
403 426
404 EXPECT_FALSE(sequencer_->IsHalfClosed()); 427 EXPECT_FALSE(sequencer_->IsHalfClosed());
405 428
406 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0)); 429 EXPECT_CALL(stream_, ProcessData(StrEq("abc"), 3)).WillOnce(Return(0));
407 EXPECT_TRUE(sequencer_->OnFrame(0, "abc", 3)); 430 EXPECT_TRUE(sequencer_->OnFrame(0, "abc"));
408 431
409 iovec iov = { &buffer[0], 3 }; 432 iovec iov = { &buffer[0], 3 };
410 int bytes_read = sequencer_->Readv(&iov, 1); 433 int bytes_read = sequencer_->Readv(&iov, 1);
411 EXPECT_EQ(3, bytes_read); 434 EXPECT_EQ(3, bytes_read);
412 EXPECT_TRUE(sequencer_->IsHalfClosed()); 435 EXPECT_TRUE(sequencer_->IsHalfClosed());
413 } 436 }
414 437
415 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { 438 TEST_F(QuicStreamSequencerTest, MutipleOffsets) {
416 sequencer_->CloseStreamAtOffset(3); 439 sequencer_->OnFinFrame(3, "");
417 EXPECT_EQ(3u, sequencer_->close_offset()); 440 EXPECT_EQ(3u, sequencer_->close_offset());
418 441
419 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS)); 442 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS));
420 sequencer_->CloseStreamAtOffset(5); 443 sequencer_->OnFinFrame(5, "");
421 EXPECT_EQ(3u, sequencer_->close_offset()); 444 EXPECT_EQ(3u, sequencer_->close_offset());
422 445
423 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS)); 446 EXPECT_CALL(stream_, Close(QUIC_MULTIPLE_TERMINATION_OFFSETS));
424 sequencer_->CloseStreamAtOffset(1); 447 sequencer_->OnFinFrame(1, "");
425 EXPECT_EQ(3u, sequencer_->close_offset()); 448 EXPECT_EQ(3u, sequencer_->close_offset());
426 449
427 sequencer_->CloseStreamAtOffset(3); 450 sequencer_->OnFinFrame(3, "");
428 EXPECT_EQ(3u, sequencer_->close_offset()); 451 EXPECT_EQ(3u, sequencer_->close_offset());
429 } 452 }
430 453
431 class QuicSequencerRandomTest : public QuicStreamSequencerTest { 454 class QuicSequencerRandomTest : public QuicStreamSequencerTest {
432 public: 455 public:
433 typedef pair<int, string> Frame; 456 typedef pair<int, string> Frame;
434 typedef vector<Frame> FrameList; 457 typedef vector<Frame> FrameList;
435 458
436 void CreateFrames() { 459 void CreateFrames() {
437 int payload_size = arraysize(kPayload) - 1; 460 int payload_size = arraysize(kPayload) - 1;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
472 for (size_t i = 0; i < list_.size(); ++i) { 495 for (size_t i = 0; i < list_.size(); ++i) {
473 string* data = &list_[i].second; 496 string* data = &list_[i].second;
474 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size())) 497 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size()))
475 .WillOnce(Return(data->size())); 498 .WillOnce(Return(data->size()));
476 } 499 }
477 500
478 while (list_.size() != 0) { 501 while (list_.size() != 0) {
479 int index = OneToN(list_.size()) - 1; 502 int index = OneToN(list_.size()) - 1;
480 LOG(ERROR) << "Sending index " << index << " " 503 LOG(ERROR) << "Sending index " << index << " "
481 << list_[index].second.data(); 504 << list_[index].second.data();
482 EXPECT_TRUE(sequencer_->OnFrame( 505 EXPECT_TRUE(sequencer_->OnFrame(list_[index].first,
483 list_[index].first, list_[index].second.data(), 506 list_[index].second.data()));
484 list_[index].second.size())); 507
485 list_.erase(list_.begin() + index); 508 list_.erase(list_.begin() + index);
486 } 509 }
487 } 510 }
488 511
489 // All frames are processed as soon as we have sequential data. 512 // All frames are processed as soon as we have sequential data.
490 // Buffering, so some frames are rejected. 513 // Buffering, so some frames are rejected.
491 TEST_F(QuicSequencerRandomTest, RandomFramesDroppingNoBackup) { 514 TEST_F(QuicSequencerRandomTest, RandomFramesDroppingNoBackup) {
492 sequencer_->SetMemoryLimit(26); 515 sequencer_->SetMemoryLimit(26);
493 516
494 InSequence s; 517 InSequence s;
495 for (size_t i = 0; i < list_.size(); ++i) { 518 for (size_t i = 0; i < list_.size(); ++i) {
496 string* data = &list_[i].second; 519 string* data = &list_[i].second;
497 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size())) 520 EXPECT_CALL(stream_, ProcessData(StrEq(*data), data->size()))
498 .WillOnce(Return(data->size())); 521 .WillOnce(Return(data->size()));
499 } 522 }
500 523
501 while (list_.size() != 0) { 524 while (list_.size() != 0) {
502 int index = OneToN(list_.size()) - 1; 525 int index = OneToN(list_.size()) - 1;
503 LOG(ERROR) << "Sending index " << index << " " 526 LOG(ERROR) << "Sending index " << index << " "
504 << list_[index].second.data(); 527 << list_[index].second.data();
505 bool acked = sequencer_->OnFrame( 528 bool acked = sequencer_->OnFrame(list_[index].first,
506 list_[index].first, list_[index].second.data(), 529 list_[index].second.data());
507 list_[index].second.size()); 530
508 if (acked) { 531 if (acked) {
509 list_.erase(list_.begin() + index); 532 list_.erase(list_.begin() + index);
510 } 533 }
511 } 534 }
512 } 535 }
513 536
514 } // namespace 537 } // namespace
515 } // namespace test 538 } // namespace test
516 } // namespace net 539 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_stream_sequencer.cc ('k') | net/quic/reliable_quic_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698