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

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

Issue 2535373002: QUIC - bugfix for forced head of line blocking experiment. Guarded by ENABLED --FLAGS_quic_bugfix_f… (Closed)
Patch Set: Created 4 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
« no previous file with comments | « net/quic/core/quic_headers_stream.cc ('k') | net/quic/core/quic_spdy_session.cc » ('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_headers_stream.h" 5 #include "net/quic/core/quic_headers_stream.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "net/quic/core/quic_bug_tracker.h" 10 #include "net/quic/core/quic_bug_tracker.h"
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 const iovec* iov = data.iov; 253 const iovec* iov = data.iov;
254 int count = data.iov_count; 254 int count = data.iov_count;
255 int consumed = 0; 255 int consumed = 0;
256 for (int i = 0; i < count; ++i) { 256 for (int i = 0; i < count; ++i) {
257 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len); 257 saved_data_.append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len);
258 consumed += iov[i].iov_len; 258 consumed += iov[i].iov_len;
259 } 259 }
260 return QuicConsumedData(consumed, false); 260 return QuicConsumedData(consumed, false);
261 } 261 }
262 262
263 QuicConsumedData SaveIovShort(const QuicIOVector& data) {
264 const iovec* iov = data.iov;
265 int consumed = 1;
266 saved_data_.append(static_cast<char*>(iov[0].iov_base), consumed);
267 return QuicConsumedData(consumed, false);
268 }
269
263 QuicConsumedData SaveIovAndNotifyAckListener( 270 QuicConsumedData SaveIovAndNotifyAckListener(
264 const QuicIOVector& data, 271 const QuicIOVector& data,
265 QuicAckListenerInterface* ack_listener) { 272 QuicAckListenerInterface* ack_listener) {
266 QuicConsumedData result = SaveIov(data); 273 QuicConsumedData result = SaveIov(data);
267 if (ack_listener) { 274 if (ack_listener) {
268 ack_listener->OnPacketAcked(result.bytes_consumed, 275 ack_listener->OnPacketAcked(result.bytes_consumed,
269 QuicTime::Delta::Zero()); 276 QuicTime::Delta::Zero());
270 } 277 }
271 return result; 278 return result;
272 } 279 }
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 // Notice, acked bytes doesn't include extra bytes used by 993 // Notice, acked bytes doesn't include extra bytes used by
987 // HTTP/2 DATA frame headers. 994 // HTTP/2 DATA frame headers.
988 EXPECT_EQ(ack_listener->total_acked_bytes(), data_len); 995 EXPECT_EQ(ack_listener->total_acked_bytes(), data_len);
989 } 996 }
990 saved_data_.clear(); 997 saved_data_.clear();
991 saved_payloads_.clear(); 998 saved_payloads_.clear();
992 } 999 }
993 } 1000 }
994 } 1001 }
995 1002
1003 TEST_P(QuicHeadersStreamTest, WritevStreamDataFinOnly) {
1004 FLAGS_quic_bugfix_fhol_writev_fin_only_v2 = true;
1005 struct iovec iov;
1006 string data;
1007
1008 EXPECT_CALL(session_,
1009 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _))
1010 .WillOnce(WithArgs<2, 5>(
1011 Invoke(this, &QuicHeadersStreamTest::SaveIovAndNotifyAckListener)));
1012
1013 QuicConsumedData consumed_data = headers_stream_->WritevStreamData(
1014 kClientDataStreamId1, MakeIOVector(data, &iov), 0, true, nullptr);
1015
1016 EXPECT_EQ(consumed_data.bytes_consumed, 0u);
1017 EXPECT_EQ(consumed_data.fin_consumed, true);
1018 }
1019
1020 TEST_P(QuicHeadersStreamTest, WritevStreamDataSendBlocked) {
1021 FLAGS_quic_bugfix_fhol_writev_fin_only_v2 = true;
1022 QuicStreamId id = kClientDataStreamId1;
1023 QuicStreamOffset offset = 0;
1024 struct iovec iov;
1025 string data;
1026
1027 // This test will issue a write that will require fragmenting into
1028 // multiple HTTP/2 DATA frames. It will ensure that only 1 frame
1029 // will go out in the case that the underlying session becomes write
1030 // blocked. Buffering is required to preserve framing, but the
1031 // amount of buffering is limited to one HTTP/2 data frame.
1032 const int kMinDataFrames = 4;
1033 const size_t data_len = kSpdyInitialFrameSizeLimit * kMinDataFrames + 1024;
1034 // Set headers stream send window large enough for data written below.
1035 headers_stream_->flow_controller()->UpdateSendWindowOffset(data_len * 2 * 4);
1036 test::GenerateBody(&data, data_len);
1037
1038 bool fin = true;
1039 // So force the underlying |WritevData| to consume only 1 byte.
1040 // In that case, |WritevStreamData| should consume just one
1041 // HTTP/2 data frame's worth of data.
1042 EXPECT_CALL(session_,
1043 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _))
1044 .WillOnce(
1045 WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIovShort)));
1046
1047 QuicConsumedData consumed_data = headers_stream_->WritevStreamData(
1048 id, MakeIOVector(data, &iov), offset, fin, nullptr);
1049
1050 // bytes_consumed is max HTTP/2 data frame size minus the HTTP/2
1051 // data header size.
1052 EXPECT_EQ(consumed_data.bytes_consumed,
1053 kSpdyInitialFrameSizeLimit -
1054 SpdyConstants::GetDataFrameMinimumSize(HTTP2));
1055 EXPECT_EQ(consumed_data.fin_consumed, false);
1056
1057 // If session already blocked, then bytes_consumed should be zero.
1058 consumed_data = headers_stream_->WritevStreamData(
1059 id, MakeIOVector(data, &iov), offset, fin, nullptr);
1060
1061 EXPECT_EQ(consumed_data.bytes_consumed, 0u);
1062 EXPECT_EQ(consumed_data.fin_consumed, false);
1063 }
1064
996 } // namespace 1065 } // namespace
997 } // namespace test 1066 } // namespace test
998 } // namespace net 1067 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_headers_stream.cc ('k') | net/quic/core/quic_spdy_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698