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

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

Issue 100173005: Break out the basic reliable QUIC stream functionality from the (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years 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_session_test.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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_session_test.cc ('k') | net/quic/reliable_quic_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698