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

Side by Side Diff: net/quic/core/quic_spdy_stream_test.cc

Issue 2740453006: Add QuicStringPiece which is actually StringPiece. (Closed)
Patch Set: fix compile error and rebase Created 3 years, 9 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
« no previous file with comments | « net/quic/core/quic_spdy_stream.cc ('k') | net/quic/core/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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/core/quic_spdy_stream.h" 5 #include "net/quic/core/quic_spdy_stream.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "net/quic/core/quic_connection.h" 10 #include "net/quic/core/quic_connection.h"
11 #include "net/quic/core/quic_utils.h" 11 #include "net/quic/core/quic_utils.h"
12 #include "net/quic/core/quic_write_blocked_list.h" 12 #include "net/quic/core/quic_write_blocked_list.h"
13 #include "net/quic/core/spdy_utils.h" 13 #include "net/quic/core/spdy_utils.h"
14 #include "net/quic/platform/api/quic_ptr_util.h" 14 #include "net/quic/platform/api/quic_ptr_util.h"
15 #include "net/quic/platform/api/quic_string_piece.h"
15 #include "net/quic/platform/api/quic_text_utils.h" 16 #include "net/quic/platform/api/quic_text_utils.h"
16 #include "net/quic/test_tools/quic_flow_controller_peer.h" 17 #include "net/quic/test_tools/quic_flow_controller_peer.h"
17 #include "net/quic/test_tools/quic_session_peer.h" 18 #include "net/quic/test_tools/quic_session_peer.h"
18 #include "net/quic/test_tools/quic_stream_peer.h" 19 #include "net/quic/test_tools/quic_stream_peer.h"
19 #include "net/quic/test_tools/quic_test_utils.h" 20 #include "net/quic/test_tools/quic_test_utils.h"
20 #include "testing/gmock/include/gmock/gmock.h" 21 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
22 23
23 using base::StringPiece;
24 using std::string; 24 using std::string;
25 using testing::AnyNumber; 25 using testing::AnyNumber;
26 using testing::Invoke; 26 using testing::Invoke;
27 using testing::Return; 27 using testing::Return;
28 using testing::StrictMock; 28 using testing::StrictMock;
29 using testing::_; 29 using testing::_;
30 30
31 namespace net { 31 namespace net {
32 namespace test { 32 namespace test {
33 namespace { 33 namespace {
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 243
244 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBody) { 244 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBody) {
245 Initialize(kShouldProcessData); 245 Initialize(kShouldProcessData);
246 246
247 string body = "this is the body"; 247 string body = "this is the body";
248 248
249 EXPECT_EQ("", stream_->data()); 249 EXPECT_EQ("", stream_->data());
250 QuicHeaderList headers = ProcessHeaders(false, headers_); 250 QuicHeaderList headers = ProcessHeaders(false, headers_);
251 EXPECT_EQ(headers, stream_->header_list()); 251 EXPECT_EQ(headers, stream_->header_list());
252 stream_->ConsumeHeaderList(); 252 stream_->ConsumeHeaderList();
253 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 253 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body));
254 stream_->OnStreamFrame(frame); 254 stream_->OnStreamFrame(frame);
255 EXPECT_EQ(QuicHeaderList(), stream_->header_list()); 255 EXPECT_EQ(QuicHeaderList(), stream_->header_list());
256 EXPECT_EQ(body, stream_->data()); 256 EXPECT_EQ(body, stream_->data());
257 } 257 }
258 258
259 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragments) { 259 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragments) {
260 string body = "this is the body"; 260 string body = "this is the body";
261 261
262 for (size_t fragment_size = 1; fragment_size < body.size(); ++fragment_size) { 262 for (size_t fragment_size = 1; fragment_size < body.size(); ++fragment_size) {
263 Initialize(kShouldProcessData); 263 Initialize(kShouldProcessData);
264 QuicHeaderList headers = ProcessHeaders(false, headers_); 264 QuicHeaderList headers = ProcessHeaders(false, headers_);
265 ASSERT_EQ(headers, stream_->header_list()); 265 ASSERT_EQ(headers, stream_->header_list());
266 stream_->ConsumeHeaderList(); 266 stream_->ConsumeHeaderList();
267 for (size_t offset = 0; offset < body.size(); offset += fragment_size) { 267 for (size_t offset = 0; offset < body.size(); offset += fragment_size) {
268 size_t remaining_data = body.size() - offset; 268 size_t remaining_data = body.size() - offset;
269 StringPiece fragment(body.data() + offset, 269 QuicStringPiece fragment(body.data() + offset,
270 std::min(fragment_size, remaining_data)); 270 std::min(fragment_size, remaining_data));
271 QuicStreamFrame frame(kClientDataStreamId1, false, offset, 271 QuicStreamFrame frame(kClientDataStreamId1, false, offset,
272 StringPiece(fragment)); 272 QuicStringPiece(fragment));
273 stream_->OnStreamFrame(frame); 273 stream_->OnStreamFrame(frame);
274 } 274 }
275 ASSERT_EQ(body, stream_->data()) << "fragment_size: " << fragment_size; 275 ASSERT_EQ(body, stream_->data()) << "fragment_size: " << fragment_size;
276 } 276 }
277 } 277 }
278 278
279 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragmentsSplit) { 279 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragmentsSplit) {
280 string body = "this is the body"; 280 string body = "this is the body";
281 281
282 for (size_t split_point = 1; split_point < body.size() - 1; ++split_point) { 282 for (size_t split_point = 1; split_point < body.size() - 1; ++split_point) {
283 Initialize(kShouldProcessData); 283 Initialize(kShouldProcessData);
284 QuicHeaderList headers = ProcessHeaders(false, headers_); 284 QuicHeaderList headers = ProcessHeaders(false, headers_);
285 ASSERT_EQ(headers, stream_->header_list()); 285 ASSERT_EQ(headers, stream_->header_list());
286 stream_->ConsumeHeaderList(); 286 stream_->ConsumeHeaderList();
287 287
288 StringPiece fragment1(body.data(), split_point); 288 QuicStringPiece fragment1(body.data(), split_point);
289 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, 289 QuicStreamFrame frame1(kClientDataStreamId1, false, 0,
290 StringPiece(fragment1)); 290 QuicStringPiece(fragment1));
291 stream_->OnStreamFrame(frame1); 291 stream_->OnStreamFrame(frame1);
292 292
293 StringPiece fragment2(body.data() + split_point, body.size() - split_point); 293 QuicStringPiece fragment2(body.data() + split_point,
294 body.size() - split_point);
294 QuicStreamFrame frame2(kClientDataStreamId1, false, split_point, 295 QuicStreamFrame frame2(kClientDataStreamId1, false, split_point,
295 StringPiece(fragment2)); 296 QuicStringPiece(fragment2));
296 stream_->OnStreamFrame(frame2); 297 stream_->OnStreamFrame(frame2);
297 298
298 ASSERT_EQ(body, stream_->data()) << "split_point: " << split_point; 299 ASSERT_EQ(body, stream_->data()) << "split_point: " << split_point;
299 } 300 }
300 } 301 }
301 302
302 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyReadv) { 303 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyReadv) {
303 Initialize(!kShouldProcessData); 304 Initialize(!kShouldProcessData);
304 305
305 string body = "this is the body"; 306 string body = "this is the body";
306 307
307 ProcessHeaders(false, headers_); 308 ProcessHeaders(false, headers_);
308 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 309 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body));
309 stream_->OnStreamFrame(frame); 310 stream_->OnStreamFrame(frame);
310 stream_->ConsumeHeaderList(); 311 stream_->ConsumeHeaderList();
311 312
312 char buffer[2048]; 313 char buffer[2048];
313 ASSERT_LT(body.length(), arraysize(buffer)); 314 ASSERT_LT(body.length(), arraysize(buffer));
314 struct iovec vec; 315 struct iovec vec;
315 vec.iov_base = buffer; 316 vec.iov_base = buffer;
316 vec.iov_len = arraysize(buffer); 317 vec.iov_len = arraysize(buffer);
317 318
318 size_t bytes_read = stream_->Readv(&vec, 1); 319 size_t bytes_read = stream_->Readv(&vec, 1);
319 EXPECT_EQ(body.length(), bytes_read); 320 EXPECT_EQ(body.length(), bytes_read);
320 EXPECT_EQ(body, string(buffer, bytes_read)); 321 EXPECT_EQ(body, string(buffer, bytes_read));
321 } 322 }
322 323
323 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyMarkConsumed) { 324 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyMarkConsumed) {
324 Initialize(!kShouldProcessData); 325 Initialize(!kShouldProcessData);
325 326
326 string body = "this is the body"; 327 string body = "this is the body";
327 328
328 ProcessHeaders(false, headers_); 329 ProcessHeaders(false, headers_);
329 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 330 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body));
330 stream_->OnStreamFrame(frame); 331 stream_->OnStreamFrame(frame);
331 stream_->ConsumeHeaderList(); 332 stream_->ConsumeHeaderList();
332 333
333 struct iovec vec; 334 struct iovec vec;
334 335
335 EXPECT_EQ(1, stream_->GetReadableRegions(&vec, 1)); 336 EXPECT_EQ(1, stream_->GetReadableRegions(&vec, 1));
336 EXPECT_EQ(body.length(), vec.iov_len); 337 EXPECT_EQ(body.length(), vec.iov_len);
337 EXPECT_EQ(body, string(static_cast<char*>(vec.iov_base), vec.iov_len)); 338 EXPECT_EQ(body, string(static_cast<char*>(vec.iov_base), vec.iov_len));
338 339
339 stream_->MarkConsumed(body.length()); 340 stream_->MarkConsumed(body.length());
340 EXPECT_EQ(body.length(), stream_->flow_controller()->bytes_consumed()); 341 EXPECT_EQ(body.length(), stream_->flow_controller()->bytes_consumed());
341 } 342 }
342 343
343 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyIncrementalReadv) { 344 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyIncrementalReadv) {
344 Initialize(!kShouldProcessData); 345 Initialize(!kShouldProcessData);
345 346
346 string body = "this is the body"; 347 string body = "this is the body";
347 ProcessHeaders(false, headers_); 348 ProcessHeaders(false, headers_);
348 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 349 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body));
349 stream_->OnStreamFrame(frame); 350 stream_->OnStreamFrame(frame);
350 stream_->ConsumeHeaderList(); 351 stream_->ConsumeHeaderList();
351 352
352 char buffer[1]; 353 char buffer[1];
353 struct iovec vec; 354 struct iovec vec;
354 vec.iov_base = buffer; 355 vec.iov_base = buffer;
355 vec.iov_len = arraysize(buffer); 356 vec.iov_len = arraysize(buffer);
356 357
357 for (size_t i = 0; i < body.length(); ++i) { 358 for (size_t i = 0; i < body.length(); ++i) {
358 size_t bytes_read = stream_->Readv(&vec, 1); 359 size_t bytes_read = stream_->Readv(&vec, 1);
359 ASSERT_EQ(1u, bytes_read); 360 ASSERT_EQ(1u, bytes_read);
360 EXPECT_EQ(body.data()[i], buffer[0]); 361 EXPECT_EQ(body.data()[i], buffer[0]);
361 } 362 }
362 } 363 }
363 364
364 TEST_P(QuicSpdyStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) { 365 TEST_P(QuicSpdyStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) {
365 Initialize(!kShouldProcessData); 366 Initialize(!kShouldProcessData);
366 367
367 string body = "this is the body"; 368 string body = "this is the body";
368 ProcessHeaders(false, headers_); 369 ProcessHeaders(false, headers_);
369 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 370 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body));
370 stream_->OnStreamFrame(frame); 371 stream_->OnStreamFrame(frame);
371 stream_->ConsumeHeaderList(); 372 stream_->ConsumeHeaderList();
372 373
373 char buffer1[1]; 374 char buffer1[1];
374 char buffer2[1]; 375 char buffer2[1];
375 struct iovec vec[2]; 376 struct iovec vec[2];
376 vec[0].iov_base = buffer1; 377 vec[0].iov_base = buffer1;
377 vec[0].iov_len = arraysize(buffer1); 378 vec[0].iov_len = arraysize(buffer1);
378 vec[1].iov_base = buffer2; 379 vec[1].iov_base = buffer2;
379 vec[1].iov_len = arraysize(buffer2); 380 vec[1].iov_len = arraysize(buffer2);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 kWindow); 435 kWindow);
435 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), 436 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(),
436 kWindow); 437 kWindow);
437 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( 438 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset(
438 stream_->flow_controller())); 439 stream_->flow_controller()));
439 440
440 // Stream receives enough data to fill a fraction of the receive window. 441 // Stream receives enough data to fill a fraction of the receive window.
441 string body(kWindow / 3, 'a'); 442 string body(kWindow / 3, 'a');
442 ProcessHeaders(false, headers_); 443 ProcessHeaders(false, headers_);
443 444
444 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); 445 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, QuicStringPiece(body));
445 stream_->OnStreamFrame(frame1); 446 stream_->OnStreamFrame(frame1);
446 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize( 447 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize(
447 stream_->flow_controller())); 448 stream_->flow_controller()));
448 449
449 // Now receive another frame which results in the receive window being over 450 // Now receive another frame which results in the receive window being over
450 // half full. This should all be buffered, decreasing the receive window but 451 // half full. This should all be buffered, decreasing the receive window but
451 // not sending WINDOW_UPDATE. 452 // not sending WINDOW_UPDATE.
452 QuicStreamFrame frame2(kClientDataStreamId1, false, kWindow / 3, 453 QuicStreamFrame frame2(kClientDataStreamId1, false, kWindow / 3,
453 StringPiece(body)); 454 QuicStringPiece(body));
454 stream_->OnStreamFrame(frame2); 455 stream_->OnStreamFrame(frame2);
455 EXPECT_EQ( 456 EXPECT_EQ(
456 kWindow - (2 * kWindow / 3), 457 kWindow - (2 * kWindow / 3),
457 QuicFlowControllerPeer::ReceiveWindowSize(stream_->flow_controller())); 458 QuicFlowControllerPeer::ReceiveWindowSize(stream_->flow_controller()));
458 } 459 }
459 460
460 TEST_P(QuicSpdyStreamTest, StreamFlowControlWindowUpdate) { 461 TEST_P(QuicSpdyStreamTest, StreamFlowControlWindowUpdate) {
461 // Tests that on receipt of data, the stream updates its receive window offset 462 // Tests that on receipt of data, the stream updates its receive window offset
462 // appropriately, and sends WINDOW_UPDATE frames when its receive window drops 463 // appropriately, and sends WINDOW_UPDATE frames when its receive window drops
463 // too low. 464 // too low.
464 Initialize(kShouldProcessData); 465 Initialize(kShouldProcessData);
465 466
466 // Set a small flow control limit. 467 // Set a small flow control limit.
467 const uint64_t kWindow = 36; 468 const uint64_t kWindow = 36;
468 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 469 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
469 kWindow); 470 kWindow);
470 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(), 471 QuicFlowControllerPeer::SetMaxReceiveWindow(stream_->flow_controller(),
471 kWindow); 472 kWindow);
472 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset( 473 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowOffset(
473 stream_->flow_controller())); 474 stream_->flow_controller()));
474 475
475 // Stream receives enough data to fill a fraction of the receive window. 476 // Stream receives enough data to fill a fraction of the receive window.
476 string body(kWindow / 3, 'a'); 477 string body(kWindow / 3, 'a');
477 ProcessHeaders(false, headers_); 478 ProcessHeaders(false, headers_);
478 stream_->ConsumeHeaderList(); 479 stream_->ConsumeHeaderList();
479 480
480 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); 481 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, QuicStringPiece(body));
481 stream_->OnStreamFrame(frame1); 482 stream_->OnStreamFrame(frame1);
482 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize( 483 EXPECT_EQ(kWindow - (kWindow / 3), QuicFlowControllerPeer::ReceiveWindowSize(
483 stream_->flow_controller())); 484 stream_->flow_controller()));
484 485
485 // Now receive another frame which results in the receive window being over 486 // Now receive another frame which results in the receive window being over
486 // half full. This will trigger the stream to increase its receive window 487 // half full. This will trigger the stream to increase its receive window
487 // offset and send a WINDOW_UPDATE. The result will be again an available 488 // offset and send a WINDOW_UPDATE. The result will be again an available
488 // window of kWindow bytes. 489 // window of kWindow bytes.
489 QuicStreamFrame frame2(kClientDataStreamId1, false, kWindow / 3, 490 QuicStreamFrame frame2(kClientDataStreamId1, false, kWindow / 3,
490 StringPiece(body)); 491 QuicStringPiece(body));
491 EXPECT_CALL(*connection_, 492 EXPECT_CALL(*connection_,
492 SendWindowUpdate(kClientDataStreamId1, 493 SendWindowUpdate(kClientDataStreamId1,
493 QuicFlowControllerPeer::ReceiveWindowOffset( 494 QuicFlowControllerPeer::ReceiveWindowOffset(
494 stream_->flow_controller()) + 495 stream_->flow_controller()) +
495 2 * kWindow / 3)); 496 2 * kWindow / 3));
496 stream_->OnStreamFrame(frame2); 497 stream_->OnStreamFrame(frame2);
497 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowSize( 498 EXPECT_EQ(kWindow, QuicFlowControllerPeer::ReceiveWindowSize(
498 stream_->flow_controller())); 499 stream_->flow_controller()));
499 } 500 }
500 501
(...skipping 23 matching lines...) Expand all
524 stream_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(), 525 stream_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(),
525 headers); 526 headers);
526 stream_->ConsumeHeaderList(); 527 stream_->ConsumeHeaderList();
527 stream2_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(), 528 stream2_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(),
528 headers); 529 headers);
529 stream2_->ConsumeHeaderList(); 530 stream2_->ConsumeHeaderList();
530 531
531 // Each stream gets a quarter window of data. This should not trigger a 532 // Each stream gets a quarter window of data. This should not trigger a
532 // WINDOW_UPDATE for either stream, nor for the connection. 533 // WINDOW_UPDATE for either stream, nor for the connection.
533 string body(kWindow / 4, 'a'); 534 string body(kWindow / 4, 'a');
534 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, StringPiece(body)); 535 QuicStreamFrame frame1(kClientDataStreamId1, false, 0, QuicStringPiece(body));
535 stream_->OnStreamFrame(frame1); 536 stream_->OnStreamFrame(frame1);
536 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, StringPiece(body)); 537 QuicStreamFrame frame2(kClientDataStreamId2, false, 0, QuicStringPiece(body));
537 stream2_->OnStreamFrame(frame2); 538 stream2_->OnStreamFrame(frame2);
538 539
539 // Now receive a further single byte on one stream - again this does not 540 // Now receive a further single byte on one stream - again this does not
540 // trigger a stream WINDOW_UPDATE, but now the connection flow control window 541 // trigger a stream WINDOW_UPDATE, but now the connection flow control window
541 // is over half full and thus a connection WINDOW_UPDATE is sent. 542 // is over half full and thus a connection WINDOW_UPDATE is sent.
542 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId1, _)).Times(0); 543 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId1, _)).Times(0);
543 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId2, _)).Times(0); 544 EXPECT_CALL(*connection_, SendWindowUpdate(kClientDataStreamId2, _)).Times(0);
544 EXPECT_CALL(*connection_, 545 EXPECT_CALL(*connection_,
545 SendWindowUpdate(0, 546 SendWindowUpdate(0,
546 QuicFlowControllerPeer::ReceiveWindowOffset( 547 QuicFlowControllerPeer::ReceiveWindowOffset(
547 session_->flow_controller()) + 548 session_->flow_controller()) +
548 1 + kWindow / 2)); 549 1 + kWindow / 2));
549 QuicStreamFrame frame3(kClientDataStreamId1, false, (kWindow / 4), 550 QuicStreamFrame frame3(kClientDataStreamId1, false, (kWindow / 4),
550 StringPiece("a")); 551 QuicStringPiece("a"));
551 stream_->OnStreamFrame(frame3); 552 stream_->OnStreamFrame(frame3);
552 } 553 }
553 554
554 TEST_P(QuicSpdyStreamTest, StreamFlowControlViolation) { 555 TEST_P(QuicSpdyStreamTest, StreamFlowControlViolation) {
555 // Tests that on if the peer sends too much data (i.e. violates the flow 556 // Tests that on if the peer sends too much data (i.e. violates the flow
556 // control protocol), then we terminate the connection. 557 // control protocol), then we terminate the connection.
557 558
558 // Stream should not process data, so that data gets buffered in the 559 // Stream should not process data, so that data gets buffered in the
559 // sequencer, triggering flow control limits. 560 // sequencer, triggering flow control limits.
560 Initialize(!kShouldProcessData); 561 Initialize(!kShouldProcessData);
561 562
562 // Set a small flow control limit. 563 // Set a small flow control limit.
563 const uint64_t kWindow = 50; 564 const uint64_t kWindow = 50;
564 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 565 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
565 kWindow); 566 kWindow);
566 567
567 ProcessHeaders(false, headers_); 568 ProcessHeaders(false, headers_);
568 569
569 // Receive data to overflow the window, violating flow control. 570 // Receive data to overflow the window, violating flow control.
570 string body(kWindow + 1, 'a'); 571 string body(kWindow + 1, 'a');
571 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 572 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body));
572 EXPECT_CALL(*connection_, 573 EXPECT_CALL(*connection_,
573 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); 574 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
574 stream_->OnStreamFrame(frame); 575 stream_->OnStreamFrame(frame);
575 } 576 }
576 577
577 TEST_P(QuicSpdyStreamTest, TestHandlingQuicRstStreamNoError) { 578 TEST_P(QuicSpdyStreamTest, TestHandlingQuicRstStreamNoError) {
578 Initialize(kShouldProcessData); 579 Initialize(kShouldProcessData);
579 ProcessHeaders(false, headers_); 580 ProcessHeaders(false, headers_);
580 581
581 stream_->OnStreamReset( 582 stream_->OnStreamReset(
(...skipping 17 matching lines...) Expand all
599 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(), 600 QuicFlowControllerPeer::SetReceiveWindowOffset(stream_->flow_controller(),
600 kStreamWindow); 601 kStreamWindow);
601 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(), 602 QuicFlowControllerPeer::SetReceiveWindowOffset(session_->flow_controller(),
602 kConnectionWindow); 603 kConnectionWindow);
603 604
604 ProcessHeaders(false, headers_); 605 ProcessHeaders(false, headers_);
605 606
606 // Send enough data to overflow the connection level flow control window. 607 // Send enough data to overflow the connection level flow control window.
607 string body(kConnectionWindow + 1, 'a'); 608 string body(kConnectionWindow + 1, 'a');
608 EXPECT_LT(body.size(), kStreamWindow); 609 EXPECT_LT(body.size(), kStreamWindow);
609 QuicStreamFrame frame(kClientDataStreamId1, false, 0, StringPiece(body)); 610 QuicStreamFrame frame(kClientDataStreamId1, false, 0, QuicStringPiece(body));
610 611
611 EXPECT_CALL(*connection_, 612 EXPECT_CALL(*connection_,
612 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _)); 613 CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
613 stream_->OnStreamFrame(frame); 614 stream_->OnStreamFrame(frame);
614 } 615 }
615 616
616 TEST_P(QuicSpdyStreamTest, StreamFlowControlFinNotBlocked) { 617 TEST_P(QuicSpdyStreamTest, StreamFlowControlFinNotBlocked) {
617 // An attempt to write a FIN with no data should not be flow control blocked, 618 // An attempt to write a FIN with no data should not be flow control blocked,
618 // even if the send window is 0. 619 // even if the send window is 0.
619 620
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
944 945
945 // Writing Trailers should fail, as the FIN has already been sent. 946 // Writing Trailers should fail, as the FIN has already been sent.
946 // populated with the number of body bytes written. 947 // populated with the number of body bytes written.
947 EXPECT_QUIC_BUG(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr), 948 EXPECT_QUIC_BUG(stream_->WriteTrailers(SpdyHeaderBlock(), nullptr),
948 "Trailers cannot be sent after a FIN"); 949 "Trailers cannot be sent after a FIN");
949 } 950 }
950 951
951 } // namespace 952 } // namespace
952 } // namespace test 953 } // namespace test
953 } // namespace net 954 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_spdy_stream.cc ('k') | net/quic/core/quic_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698