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/reliable_quic_stream.h" | 5 #include "net/quic/reliable_quic_stream.h" |
6 | 6 |
7 #include "net/quic/quic_ack_notifier.h" | 7 #include "net/quic/quic_ack_notifier.h" |
8 #include "net/quic/quic_connection.h" | 8 #include "net/quic/quic_connection.h" |
9 #include "net/quic/quic_flags.h" | 9 #include "net/quic/quic_flags.h" |
10 #include "net/quic/quic_utils.h" | 10 #include "net/quic/quic_utils.h" |
11 #include "net/quic/quic_write_blocked_list.h" | 11 #include "net/quic/quic_write_blocked_list.h" |
12 #include "net/quic/spdy_utils.h" | 12 #include "net/quic/spdy_utils.h" |
| 13 #include "net/quic/test_tools/quic_flow_controller_peer.h" |
13 #include "net/quic/test_tools/quic_session_peer.h" | 14 #include "net/quic/test_tools/quic_session_peer.h" |
14 #include "net/quic/test_tools/quic_test_utils.h" | 15 #include "net/quic/test_tools/quic_test_utils.h" |
15 #include "net/quic/test_tools/reliable_quic_stream_peer.h" | 16 #include "net/quic/test_tools/reliable_quic_stream_peer.h" |
16 #include "net/test/gtest_util.h" | 17 #include "net/test/gtest_util.h" |
17 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
18 #include "testing/gmock_mutant.h" | 19 #include "testing/gmock_mutant.h" |
19 | 20 |
20 using base::StringPiece; | 21 using base::StringPiece; |
21 using std::min; | 22 using std::min; |
22 using testing::_; | 23 using testing::_; |
(...skipping 28 matching lines...) Expand all Loading... |
51 EXPECT_NE(0u, data_len); | 52 EXPECT_NE(0u, data_len); |
52 DVLOG(1) << "ProcessData data_len: " << data_len; | 53 DVLOG(1) << "ProcessData data_len: " << data_len; |
53 data_ += string(data, data_len); | 54 data_ += string(data, data_len); |
54 return should_process_data_ ? data_len : 0; | 55 return should_process_data_ ? data_len : 0; |
55 } | 56 } |
56 | 57 |
57 virtual QuicPriority EffectivePriority() const OVERRIDE { | 58 virtual QuicPriority EffectivePriority() const OVERRIDE { |
58 return QuicUtils::HighestPriority(); | 59 return QuicUtils::HighestPriority(); |
59 } | 60 } |
60 | 61 |
61 virtual bool IsFlowControlEnabled() const OVERRIDE { | |
62 return true; | |
63 } | |
64 | |
65 using ReliableQuicStream::WriteOrBufferData; | 62 using ReliableQuicStream::WriteOrBufferData; |
66 using ReliableQuicStream::CloseReadSide; | 63 using ReliableQuicStream::CloseReadSide; |
67 using ReliableQuicStream::CloseWriteSide; | 64 using ReliableQuicStream::CloseWriteSide; |
68 using ReliableQuicStream::OnClose; | 65 using ReliableQuicStream::OnClose; |
69 | 66 |
70 private: | 67 private: |
71 bool should_process_data_; | 68 bool should_process_data_; |
72 string data_; | 69 string data_; |
73 }; | 70 }; |
74 | 71 |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stream_flow_control, true); | 311 ValueRestore<bool> old_flag(&FLAGS_enable_quic_stream_flow_control, true); |
315 set_initial_flow_control_window_bytes(1000); | 312 set_initial_flow_control_window_bytes(1000); |
316 | 313 |
317 Initialize(kShouldProcessData); | 314 Initialize(kShouldProcessData); |
318 | 315 |
319 // If we receive multiple WINDOW_UPDATES (potentially out of order), then we | 316 // If we receive multiple WINDOW_UPDATES (potentially out of order), then we |
320 // want to make sure we latch the largest offset we see. | 317 // want to make sure we latch the largest offset we see. |
321 | 318 |
322 // Initially should be default. | 319 // Initially should be default. |
323 EXPECT_EQ(initial_flow_control_window_bytes_, | 320 EXPECT_EQ(initial_flow_control_window_bytes_, |
324 ReliableQuicStreamPeer::SendWindowOffset(stream_.get())); | 321 QuicFlowControllerPeer::SendWindowOffset( |
| 322 stream_.get()->flow_controller())); |
325 | 323 |
326 // Check a single WINDOW_UPDATE results in correct offset. | 324 // Check a single WINDOW_UPDATE results in correct offset. |
327 QuicWindowUpdateFrame window_update_1(stream_->id(), 1234); | 325 QuicWindowUpdateFrame window_update_1(stream_->id(), 1234); |
328 stream_->OnWindowUpdateFrame(window_update_1); | 326 stream_->OnWindowUpdateFrame(window_update_1); |
329 EXPECT_EQ(window_update_1.byte_offset, | 327 EXPECT_EQ(window_update_1.byte_offset, |
330 ReliableQuicStreamPeer::SendWindowOffset(stream_.get())); | 328 QuicFlowControllerPeer::SendWindowOffset( |
| 329 stream_.get()->flow_controller())); |
331 | 330 |
332 // Now send a few more WINDOW_UPDATES and make sure that only the largest is | 331 // Now send a few more WINDOW_UPDATES and make sure that only the largest is |
333 // remembered. | 332 // remembered. |
334 QuicWindowUpdateFrame window_update_2(stream_->id(), 1); | 333 QuicWindowUpdateFrame window_update_2(stream_->id(), 1); |
335 QuicWindowUpdateFrame window_update_3(stream_->id(), 9999); | 334 QuicWindowUpdateFrame window_update_3(stream_->id(), 9999); |
336 QuicWindowUpdateFrame window_update_4(stream_->id(), 5678); | 335 QuicWindowUpdateFrame window_update_4(stream_->id(), 5678); |
337 stream_->OnWindowUpdateFrame(window_update_2); | 336 stream_->OnWindowUpdateFrame(window_update_2); |
338 stream_->OnWindowUpdateFrame(window_update_3); | 337 stream_->OnWindowUpdateFrame(window_update_3); |
339 stream_->OnWindowUpdateFrame(window_update_4); | 338 stream_->OnWindowUpdateFrame(window_update_4); |
340 EXPECT_EQ(window_update_3.byte_offset, | 339 EXPECT_EQ(window_update_3.byte_offset, |
341 ReliableQuicStreamPeer::SendWindowOffset(stream_.get())); | 340 QuicFlowControllerPeer::SendWindowOffset( |
| 341 stream_.get()->flow_controller())); |
342 } | 342 } |
343 | 343 |
344 void SaveProxyAckNotifierDelegate( | 344 void SaveProxyAckNotifierDelegate( |
345 scoped_refptr<QuicAckNotifier::DelegateInterface>* delegate_out, | 345 scoped_refptr<QuicAckNotifier::DelegateInterface>* delegate_out, |
346 QuicAckNotifier::DelegateInterface* delegate) { | 346 QuicAckNotifier::DelegateInterface* delegate) { |
347 *delegate_out = delegate; | 347 *delegate_out = delegate; |
348 } | 348 } |
349 TEST_F(ReliableQuicStreamTest, WriteOrBufferDataWithQuicAckNotifier) { | 349 TEST_F(ReliableQuicStreamTest, WriteOrBufferDataWithQuicAckNotifier) { |
350 Initialize(kShouldProcessData); | 350 Initialize(kShouldProcessData); |
351 | 351 |
352 scoped_refptr<MockAckNotifierDelegate> delegate( | 352 scoped_refptr<MockAckNotifierDelegate> delegate( |
353 new StrictMock<MockAckNotifierDelegate>); | 353 new StrictMock<MockAckNotifierDelegate>); |
354 | 354 |
355 const int kDataSize = 16 * 1024; | 355 const int kDataSize = 16 * 1024; |
356 const string kData(kDataSize, 'a'); | 356 const string kData(kDataSize, 'a'); |
357 | 357 |
358 const int kFirstWriteSize = 100; | 358 const int kFirstWriteSize = 100; |
359 const int kSecondWriteSize = 50; | 359 const int kSecondWriteSize = 50; |
360 const int kLastWriteSize = kDataSize - kFirstWriteSize - kSecondWriteSize; | 360 const int kLastWriteSize = kDataSize - kFirstWriteSize - kSecondWriteSize; |
361 | 361 |
| 362 // Set a large flow control send window so this doesn't interfere with test. |
| 363 stream_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); |
| 364 |
362 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; | 365 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; |
363 | 366 |
364 EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce(DoAll( | 367 EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce(DoAll( |
365 WithArgs<4>(Invoke(CreateFunctor( | 368 WithArgs<4>(Invoke(CreateFunctor( |
366 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 369 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
367 Return(QuicConsumedData(kFirstWriteSize, false)))); | 370 Return(QuicConsumedData(kFirstWriteSize, false)))); |
368 stream_->WriteOrBufferData(kData, false, delegate.get()); | 371 stream_->WriteOrBufferData(kData, false, delegate.get()); |
369 EXPECT_TRUE(write_blocked_list_->HasWriteBlockedStreams()); | 372 EXPECT_TRUE(write_blocked_list_->HasWriteBlockedStreams()); |
370 | 373 |
371 EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, proxy_delegate.get())). | 374 EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, proxy_delegate.get())). |
(...skipping 29 matching lines...) Expand all Loading... |
401 Initialize(kShouldProcessData); | 404 Initialize(kShouldProcessData); |
402 | 405 |
403 scoped_refptr<MockAckNotifierDelegate> delegate( | 406 scoped_refptr<MockAckNotifierDelegate> delegate( |
404 new StrictMock<MockAckNotifierDelegate>); | 407 new StrictMock<MockAckNotifierDelegate>); |
405 | 408 |
406 const int kDataSize = 16 * 1024; | 409 const int kDataSize = 16 * 1024; |
407 const string kData(kDataSize, 'a'); | 410 const string kData(kDataSize, 'a'); |
408 | 411 |
409 const int kInitialWriteSize = 100; | 412 const int kInitialWriteSize = 100; |
410 | 413 |
| 414 // Set a large flow control send window so this doesn't interfere with test. |
| 415 stream_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1); |
| 416 |
411 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; | 417 scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate; |
412 | 418 |
413 EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce(DoAll( | 419 EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce(DoAll( |
414 WithArgs<4>(Invoke(CreateFunctor( | 420 WithArgs<4>(Invoke(CreateFunctor( |
415 &SaveProxyAckNotifierDelegate, &proxy_delegate))), | 421 &SaveProxyAckNotifierDelegate, &proxy_delegate))), |
416 Return(QuicConsumedData(kInitialWriteSize, false)))); | 422 Return(QuicConsumedData(kInitialWriteSize, false)))); |
417 stream_->WriteOrBufferData(kData, false, delegate.get()); | 423 stream_->WriteOrBufferData(kData, false, delegate.get()); |
418 EXPECT_TRUE(write_blocked_list_->HasWriteBlockedStreams()); | 424 EXPECT_TRUE(write_blocked_list_->HasWriteBlockedStreams()); |
419 | 425 |
420 // Handle the ack of the first write. | 426 // Handle the ack of the first write. |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 | 509 |
504 // Handle the acks. | 510 // Handle the acks. |
505 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); | 511 proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_); |
506 EXPECT_CALL(*delegate, OnAckNotification(11, 22, 33, 44, zero_)); | 512 EXPECT_CALL(*delegate, OnAckNotification(11, 22, 33, 44, zero_)); |
507 proxy_delegate->OnAckNotification(10, 20, 30, 40, zero_); | 513 proxy_delegate->OnAckNotification(10, 20, 30, 40, zero_); |
508 } | 514 } |
509 | 515 |
510 } // namespace | 516 } // namespace |
511 } // namespace test | 517 } // namespace test |
512 } // namespace net | 518 } // namespace net |
OLD | NEW |