summaryrefslogtreecommitdiff
path: root/chromium/net/quic
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-07-31 15:50:41 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-08-30 12:35:23 +0000
commit7b2ffa587235a47d4094787d72f38102089f402a (patch)
tree30e82af9cbab08a7fa028bb18f4f2987a3f74dfa /chromium/net/quic
parentd94af01c90575348c4e81a418257f254b6f8d225 (diff)
downloadqtwebengine-chromium-7b2ffa587235a47d4094787d72f38102089f402a.tar.gz
BASELINE: Update Chromium to 76.0.3809.94
Change-Id: I321c3f5f929c105aec0f98c5091ef6108822e647 Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/net/quic')
-rw-r--r--chromium/net/quic/address_utils.h48
-rw-r--r--chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc40
-rw-r--r--chromium/net/quic/crypto/proof_verifier_chromium.cc31
-rw-r--r--chromium/net/quic/crypto/proof_verifier_chromium.h2
-rw-r--r--chromium/net/quic/crypto/proof_verifier_chromium_test.cc9
-rw-r--r--chromium/net/quic/mock_crypto_client_stream.cc9
-rw-r--r--chromium/net/quic/mock_decrypter.cc17
-rw-r--r--chromium/net/quic/mock_decrypter.h8
-rw-r--r--chromium/net/quic/mock_encrypter.cc18
-rw-r--r--chromium/net/quic/mock_encrypter.h6
-rw-r--r--chromium/net/quic/platform/impl/quic_containers_impl.h4
-rw-r--r--chromium/net/quic/platform/impl/quic_default_proof_providers_impl.cc10
-rw-r--r--chromium/net/quic/platform/impl/quic_epoll_clock.cc4
-rw-r--r--chromium/net/quic/platform/impl/quic_epoll_clock.h14
-rw-r--r--chromium/net/quic/platform/impl/quic_epoll_clock_test.cc10
-rw-r--r--chromium/net/quic/platform/impl/quic_epoll_impl.h10
-rw-r--r--chromium/net/quic/platform/impl/quic_epoll_test_tools_impl.h4
-rw-r--r--chromium/net/quic/platform/impl/quic_flag_utils_impl.h4
-rw-r--r--chromium/net/quic/platform/impl/quic_flags_impl.cc5
-rw-r--r--chromium/net/quic/platform/impl/quic_flags_impl.h26
-rw-r--r--chromium/net/quic/platform/impl/quic_flags_test.cc14
-rw-r--r--chromium/net/quic/platform/impl/quic_ip_address_impl.cc10
-rw-r--r--chromium/net/quic/platform/impl/quic_ip_address_impl.h4
-rw-r--r--chromium/net/quic/platform/impl/quic_mem_slice_impl.h4
-rw-r--r--chromium/net/quic/platform/impl/quic_mem_slice_span_impl.cc5
-rw-r--r--chromium/net/quic/platform/impl/quic_mem_slice_span_impl.h5
-rw-r--r--chromium/net/quic/platform/impl/quic_mem_slice_storage_impl.h2
-rw-r--r--chromium/net/quic/platform/impl/quic_optional_impl.h17
-rw-r--r--chromium/net/quic/platform/impl/quic_socket_address_impl.cc5
-rw-r--r--chromium/net/quic/platform/impl/quic_socket_address_impl.h4
-rw-r--r--chromium/net/quic/platform/impl/quic_system_event_loop_impl.h2
-rw-r--r--chromium/net/quic/platform/impl/quic_test_impl.cc12
-rw-r--r--chromium/net/quic/platform/impl/quic_test_impl.h16
-rw-r--r--chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.cc14
-rw-r--r--chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.h7
-rw-r--r--chromium/net/quic/quic_chromium_client_session.cc230
-rw-r--r--chromium/net/quic/quic_chromium_client_session.h3
-rw-r--r--chromium/net/quic/quic_chromium_client_session_test.cc141
-rw-r--r--chromium/net/quic/quic_chromium_client_stream.cc6
-rw-r--r--chromium/net/quic/quic_chromium_client_stream_test.cc15
-rw-r--r--chromium/net/quic/quic_connection_logger.cc231
-rw-r--r--chromium/net/quic/quic_connectivity_probing_manager.cc33
-rw-r--r--chromium/net/quic/quic_end_to_end_unittest.cc38
-rw-r--r--chromium/net/quic/quic_flags_list.h125
-rw-r--r--chromium/net/quic/quic_http_stream.cc18
-rw-r--r--chromium/net/quic/quic_http_stream_test.cc49
-rw-r--r--chromium/net/quic/quic_http_utils.cc45
-rw-r--r--chromium/net/quic/quic_http_utils.h18
-rw-r--r--chromium/net/quic/quic_http_utils_test.cc19
-rw-r--r--chromium/net/quic/quic_network_transaction_unittest.cc788
-rw-r--r--chromium/net/quic/quic_proxy_client_socket.cc8
-rw-r--r--chromium/net/quic/quic_proxy_client_socket_unittest.cc52
-rw-r--r--chromium/net/quic/quic_stream_factory.cc63
-rw-r--r--chromium/net/quic/quic_stream_factory.h10
-rw-r--r--chromium/net/quic/quic_stream_factory_fuzzer.cc17
-rw-r--r--chromium/net/quic/quic_stream_factory_test.cc1824
-rw-r--r--chromium/net/quic/quic_test_packet_maker.cc193
-rw-r--r--chromium/net/quic/quic_test_packet_maker.h14
58 files changed, 2838 insertions, 1502 deletions
diff --git a/chromium/net/quic/address_utils.h b/chromium/net/quic/address_utils.h
new file mode 100644
index 00000000000..f067db7f9b0
--- /dev/null
+++ b/chromium/net/quic/address_utils.h
@@ -0,0 +1,48 @@
+#ifndef NET_QUIC_ADDRESS_UTILS_H_
+#define NET_QUIC_ADDRESS_UTILS_H_
+
+#include "net/base/ip_address.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_ip_address.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_ip_address_family.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
+
+namespace net {
+
+inline IPEndPoint ToIPEndPoint(quic::QuicSocketAddress address) {
+ if (!address.IsInitialized()) {
+ return IPEndPoint();
+ }
+
+ IPEndPoint result;
+ sockaddr_storage storage = address.generic_address();
+ const bool success = result.FromSockAddr(
+ reinterpret_cast<const sockaddr*>(&storage), sizeof(storage));
+ DCHECK(success);
+ return result;
+}
+
+inline IPAddress ToIPAddress(quic::QuicIpAddress address) {
+ if (!address.IsInitialized()) {
+ return IPAddress();
+ }
+
+ switch (address.address_family()) {
+ case quic::IpAddressFamily::IP_V4: {
+ in_addr raw_address = address.GetIPv4();
+ return IPAddress(reinterpret_cast<const uint8_t*>(&raw_address),
+ sizeof(raw_address));
+ }
+ case quic::IpAddressFamily::IP_V6: {
+ in6_addr raw_address = address.GetIPv6();
+ return IPAddress(reinterpret_cast<const uint8_t*>(&raw_address),
+ sizeof(raw_address));
+ }
+ default:
+ DCHECK_EQ(address.address_family(), quic::IpAddressFamily::IP_UNSPEC);
+ return IPAddress();
+ }
+}
+
+} // namespace net
+
+#endif // NET_QUIC_ADDRESS_UTILS_H_
diff --git a/chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc b/chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc
index 0a7fab132bf..3256fa84450 100644
--- a/chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/chromium/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -6,7 +6,6 @@
#include <utility>
-#include "base/callback_helpers.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
@@ -139,7 +138,7 @@ class TestDelegateBase : public BidirectionalStreamImpl::Delegate {
++on_data_read_count_;
CHECK_GE(bytes_read, OK);
data_received_.append(read_buf_->data(), bytes_read);
- base::ResetAndReturn(&callback_).Run(bytes_read);
+ std::move(callback_).Run(bytes_read);
}
void OnDataSent() override {
@@ -393,7 +392,7 @@ class DeleteStreamDelegate : public TestDelegateBase {
class BidirectionalStreamQuicImplTest
: public ::testing::TestWithParam<
- std::tuple<quic::QuicTransportVersion, bool>>,
+ std::tuple<quic::ParsedQuicVersion, bool>>,
public WithScopedTaskEnvironment {
protected:
static const bool kFin = true;
@@ -500,8 +499,7 @@ class BidirectionalStreamQuicImplTest
helper_.get(), alarm_factory_.get(),
new QuicChromiumPacketWriter(socket.get(), runner_.get()),
true /* owns_writer */, quic::Perspective::IS_CLIENT,
- quic::test::SupportedVersions(
- quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, version_)));
+ quic::test::SupportedVersions(version_));
if (connection_->version().KnowsWhichDecrypterToUse()) {
connection_->InstallDecrypter(quic::ENCRYPTION_FORWARD_SECURE,
quic::QuicMakeUnique<quic::NullDecrypter>(
@@ -822,11 +820,12 @@ class BidirectionalStreamQuicImplTest
QuicChromiumClientSession* session() const { return session_.get(); }
quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
- return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+ return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+ version_.transport_version, n);
}
std::string ConstructDataHeader(size_t body_len) {
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
return "";
}
quic::HttpEncoder encoder;
@@ -836,7 +835,7 @@ class BidirectionalStreamQuicImplTest
}
protected:
- const quic::QuicTransportVersion version_;
+ const quic::ParsedQuicVersion version_;
const bool client_headers_include_h2_stream_dependency_;
BoundTestNetLog net_log_;
scoped_refptr<TestTaskRunner> runner_;
@@ -869,9 +868,8 @@ class BidirectionalStreamQuicImplTest
INSTANTIATE_TEST_SUITE_P(
Version,
BidirectionalStreamQuicImplTest,
- ::testing::Combine(
- ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
- ::testing::Bool()));
+ ::testing::Combine(::testing::ValuesIn(quic::AllVersionsExcept99()),
+ ::testing::Bool()));
TEST_P(BidirectionalStreamQuicImplTest, GetRequest) {
SetRequest("GET", "/", DEFAULT_PRIORITY);
@@ -1065,7 +1063,7 @@ TEST_P(BidirectionalStreamQuicImplTest, CoalesceDataBuffersNotHeadersFrame) {
AddWrite(ConstructRequestHeadersPacketInner(
2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
&spdy_request_headers_frame_length, &header_stream_offset));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, !kFin,
0, {kBody1, kBody2}));
} else {
@@ -1083,7 +1081,7 @@ TEST_P(BidirectionalStreamQuicImplTest, CoalesceDataBuffersNotHeadersFrame) {
std::string header5 = ConstructDataHeader(strlen(kBody5));
quic::QuicStreamOffset data_offset =
strlen(kBody1) + strlen(kBody2) + header.length() + header2.length();
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
AddWrite(ConstructClientMultipleDataFramesPacket(
5, !kIncludeVersion, kFin, data_offset, {kBody3, kBody4, kBody5}));
} else {
@@ -1200,7 +1198,7 @@ TEST_P(BidirectionalStreamQuicImplTest,
AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset));
const char kBody1[] = "here are some data";
std::string header = ConstructDataHeader(strlen(kBody1));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket(
2, !kFin, DEFAULT_PRIORITY, &header_stream_offset,
&spdy_request_headers_frame_length, {header, kBody1}));
@@ -1215,7 +1213,7 @@ TEST_P(BidirectionalStreamQuicImplTest,
const char kBody2[] = "really small";
std::string header2 = ConstructDataHeader(strlen(kBody2));
quic::QuicStreamOffset data_offset = strlen(kBody1) + header.length();
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
AddWrite(ConstructClientMultipleDataFramesPacket(
4, !kIncludeVersion, kFin, data_offset, {header2, kBody2}));
} else {
@@ -1319,7 +1317,7 @@ TEST_P(BidirectionalStreamQuicImplTest,
std::string header = ConstructDataHeader(strlen(kBody1));
std::string header2 = ConstructDataHeader(strlen(kBody2));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket(
2, !kFin, DEFAULT_PRIORITY, &header_stream_offset,
&spdy_request_headers_frame_length, {header, kBody1, header2, kBody2}));
@@ -1339,7 +1337,7 @@ TEST_P(BidirectionalStreamQuicImplTest,
std::string header5 = ConstructDataHeader(strlen(kBody5));
quic::QuicStreamOffset data_offset =
strlen(kBody1) + strlen(kBody2) + header.length() + header2.length();
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
AddWrite(ConstructClientMultipleDataFramesPacket(
4, !kIncludeVersion, kFin, data_offset,
{header3, kBody3, header4, kBody4, header5, kBody5}));
@@ -1526,7 +1524,7 @@ TEST_P(BidirectionalStreamQuicImplTest, PostRequest) {
2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
&spdy_request_headers_frame_length, &header_stream_offset));
std::string header = ConstructDataHeader(strlen(kUploadData));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
0, {header, kUploadData}));
} else {
@@ -1619,7 +1617,7 @@ TEST_P(BidirectionalStreamQuicImplTest, EarlyDataOverrideRequest) {
2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
&spdy_request_headers_frame_length, &header_stream_offset));
std::string header = ConstructDataHeader(strlen(kUploadData));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
0, {header, kUploadData}));
} else {
@@ -1714,7 +1712,7 @@ TEST_P(BidirectionalStreamQuicImplTest, InterleaveReadDataAndSendData) {
&spdy_request_headers_frame_length, &header_stream_offset));
std::string header = ConstructDataHeader(strlen(kUploadData));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
AddWrite(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, 2, !kFin, 0,
kUploadData, &client_maker_));
AddWrite(ConstructAckAndDataPacket(4, !kIncludeVersion, 3, 3, 3, kFin,
@@ -2263,7 +2261,7 @@ TEST_P(BidirectionalStreamQuicImplTest, AsyncFinRead) {
2, GetNthClientInitiatedBidirectionalStreamId(0), !kFin, DEFAULT_PRIORITY,
&spdy_request_headers_frame_length, &header_stream_offset));
std::string header = ConstructDataHeader(strlen(kBody));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
AddWrite(ConstructClientMultipleDataFramesPacket(3, kIncludeVersion, kFin,
0, {header, kBody}));
} else {
diff --git a/chromium/net/quic/crypto/proof_verifier_chromium.cc b/chromium/net/quic/crypto/proof_verifier_chromium.cc
index f9bbdd92500..e222a7e0ec5 100644
--- a/chromium/net/quic/crypto/proof_verifier_chromium.cc
+++ b/chromium/net/quic/crypto/proof_verifier_chromium.cc
@@ -80,6 +80,8 @@ class ProofVerifierChromium::Job {
quic::QuicAsyncStatus VerifyCertChain(
const std::string& hostname,
const std::vector<std::string>& certs,
+ const std::string& ocsp_response,
+ const std::string& cert_sct,
std::string* error_details,
std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
std::unique_ptr<quic::ProofVerifierCallback> callback);
@@ -101,6 +103,8 @@ class ProofVerifierChromium::Job {
quic::QuicAsyncStatus VerifyCert(
const string& hostname,
const uint16_t port,
+ const std::string& ocsp_response,
+ const std::string& cert_sct,
std::string* error_details,
std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
std::unique_ptr<quic::ProofVerifierCallback> callback);
@@ -133,6 +137,10 @@ class ProofVerifierChromium::Job {
std::string hostname_;
// |port| specifies the target port for the connection.
uint16_t port_;
+ // Encoded stapled OCSP response for |certs|.
+ std::string ocsp_response_;
+ // Encoded SignedCertificateTimestampList for |certs|.
+ std::string cert_sct_;
std::unique_ptr<quic::ProofVerifierCallback> callback_;
std::unique_ptr<ProofVerifyDetailsChromium> verify_details_;
@@ -242,13 +250,15 @@ quic::QuicAsyncStatus ProofVerifierChromium::Job::VerifyProof(
}
DCHECK(enforce_policy_checking_);
- return VerifyCert(hostname, port, error_details, verify_details,
- std::move(callback));
+ return VerifyCert(hostname, port, /*ocsp_response=*/std::string(), cert_sct,
+ error_details, verify_details, std::move(callback));
}
quic::QuicAsyncStatus ProofVerifierChromium::Job::VerifyCertChain(
const string& hostname,
const std::vector<string>& certs,
+ const std::string& ocsp_response,
+ const std::string& cert_sct,
std::string* error_details,
std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
std::unique_ptr<quic::ProofVerifierCallback> callback) {
@@ -272,8 +282,8 @@ quic::QuicAsyncStatus ProofVerifierChromium::Job::VerifyCertChain(
enforce_policy_checking_ = false;
// |port| is not needed because |enforce_policy_checking_| is false.
- return VerifyCert(hostname, /*port=*/0, error_details, verify_details,
- std::move(callback));
+ return VerifyCert(hostname, /*port=*/0, ocsp_response, cert_sct,
+ error_details, verify_details, std::move(callback));
}
bool ProofVerifierChromium::Job::GetX509Certificate(
@@ -307,11 +317,15 @@ bool ProofVerifierChromium::Job::GetX509Certificate(
quic::QuicAsyncStatus ProofVerifierChromium::Job::VerifyCert(
const string& hostname,
const uint16_t port,
+ const std::string& ocsp_response,
+ const std::string& cert_sct,
std::string* error_details,
std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
std::unique_ptr<quic::ProofVerifierCallback> callback) {
hostname_ = hostname;
port_ = port;
+ ocsp_response_ = ocsp_response;
+ cert_sct_ = cert_sct;
next_state_ = STATE_VERIFY_CERT;
switch (DoLoop(OK)) {
@@ -369,7 +383,7 @@ int ProofVerifierChromium::Job::DoVerifyCert(int result) {
return verifier_->Verify(
CertVerifier::RequestParams(cert_, hostname_, cert_verify_flags_,
- std::string()),
+ ocsp_response_, cert_sct_),
&verify_details_->cert_verify_result,
base::Bind(&ProofVerifierChromium::Job::OnIOComplete,
base::Unretained(this)),
@@ -606,6 +620,8 @@ quic::QuicAsyncStatus ProofVerifierChromium::VerifyProof(
quic::QuicAsyncStatus ProofVerifierChromium::VerifyCertChain(
const std::string& hostname,
const std::vector<std::string>& certs,
+ const std::string& ocsp_response,
+ const std::string& cert_sct,
const quic::ProofVerifyContext* verify_context,
std::string* error_details,
std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
@@ -620,8 +636,9 @@ quic::QuicAsyncStatus ProofVerifierChromium::VerifyCertChain(
this, cert_verifier_, ct_policy_enforcer_, transport_security_state_,
cert_transparency_verifier_, chromium_context->cert_verify_flags,
chromium_context->net_log);
- quic::QuicAsyncStatus status = job->VerifyCertChain(
- hostname, certs, error_details, verify_details, std::move(callback));
+ quic::QuicAsyncStatus status =
+ job->VerifyCertChain(hostname, certs, ocsp_response, cert_sct,
+ error_details, verify_details, std::move(callback));
if (status == quic::QUIC_PENDING) {
Job* job_ptr = job.get();
active_jobs_[job_ptr] = std::move(job);
diff --git a/chromium/net/quic/crypto/proof_verifier_chromium.h b/chromium/net/quic/crypto/proof_verifier_chromium.h
index abadc174468..8581056b2ae 100644
--- a/chromium/net/quic/crypto/proof_verifier_chromium.h
+++ b/chromium/net/quic/crypto/proof_verifier_chromium.h
@@ -93,6 +93,8 @@ class NET_EXPORT_PRIVATE ProofVerifierChromium : public quic::ProofVerifier {
quic::QuicAsyncStatus VerifyCertChain(
const std::string& hostname,
const std::vector<std::string>& certs,
+ const std::string& ocsp_response,
+ const std::string& cert_sct,
const quic::ProofVerifyContext* verify_context,
std::string* error_details,
std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
diff --git a/chromium/net/quic/crypto/proof_verifier_chromium_test.cc b/chromium/net/quic/crypto/proof_verifier_chromium_test.cc
index 7d60c11c957..591f37ebfb5 100644
--- a/chromium/net/quic/crypto/proof_verifier_chromium_test.cc
+++ b/chromium/net/quic/crypto/proof_verifier_chromium_test.cc
@@ -123,8 +123,8 @@ class ProofVerifierChromiumTest : public ::testing::Test {
.WillRepeatedly(
Return(ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS));
- scoped_refptr<const CTLogVerifier> log(CTLogVerifier::Create(
- ct::GetTestPublicKey(), kLogDescription, "dns.example.com"));
+ scoped_refptr<const CTLogVerifier> log(
+ CTLogVerifier::Create(ct::GetTestPublicKey(), kLogDescription));
ASSERT_TRUE(log);
log_verifiers_.push_back(log);
@@ -1004,8 +1004,9 @@ TEST_F(ProofVerifierChromiumTest, VerifyCertChain) {
std::unique_ptr<DummyProofVerifierCallback> callback(
new DummyProofVerifierCallback);
quic::QuicAsyncStatus status = proof_verifier.VerifyCertChain(
- kTestHostname, certs_, verify_context_.get(), &error_details_, &details_,
- std::move(callback));
+ kTestHostname, certs_, /*ocsp_response=*/std::string(),
+ /*cert_sct=*/std::string(), verify_context_.get(), &error_details_,
+ &details_, std::move(callback));
ASSERT_EQ(quic::QUIC_SUCCESS, status);
ASSERT_TRUE(details_.get());
diff --git a/chromium/net/quic/mock_crypto_client_stream.cc b/chromium/net/quic/mock_crypto_client_stream.cc
index c1144481e9d..3406b2c2968 100644
--- a/chromium/net/quic/mock_crypto_client_stream.cc
+++ b/chromium/net/quic/mock_crypto_client_stream.cc
@@ -275,11 +275,14 @@ void MockCryptoClientStream::SetConfigNegotiated() {
QuicTime::Delta::FromSeconds(2 * kMaximumIdleTimeoutSecs),
QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs));
config.SetBytesForConnectionIdToSend(PACKET_8BYTE_CONNECTION_ID);
- config.SetMaxIncomingDynamicStreamsToSend(kDefaultMaxStreamsPerConnection /
- 2);
+ config.SetMaxIncomingBidirectionalStreamsToSend(
+ kDefaultMaxStreamsPerConnection / 2);
+ config.SetMaxIncomingUnidirectionalStreamsToSend(
+ kDefaultMaxStreamsPerConnection / 2);
CryptoHandshakeMessage msg;
- config.ToHandshakeMessage(&msg);
+ config.ToHandshakeMessage(
+ &msg, session()->connection()->version().transport_version);
std::string error_details;
const QuicErrorCode error =
session()->config()->ProcessPeerHello(msg, CLIENT, &error_details);
diff --git a/chromium/net/quic/mock_decrypter.cc b/chromium/net/quic/mock_decrypter.cc
index 689c58d0558..9576ea7c31e 100644
--- a/chromium/net/quic/mock_decrypter.cc
+++ b/chromium/net/quic/mock_decrypter.cc
@@ -11,10 +11,15 @@ using quic::DiversificationNonce;
using quic::Perspective;
using quic::QuicPacketNumber;
using quic::QuicStringPiece;
-using quic::QuicTransportVersion;
namespace net {
+namespace {
+
+const size_t kPaddingSize = 12;
+
+} // namespace
+
MockDecrypter::MockDecrypter(Perspective perspective) {}
bool MockDecrypter::SetKey(QuicStringPiece key) {
@@ -54,12 +59,16 @@ bool MockDecrypter::DecryptPacket(uint64_t /*packet_number*/,
char* output,
size_t* output_length,
size_t max_output_length) {
- if (ciphertext.length() > max_output_length) {
+ if (ciphertext.length() < kPaddingSize) {
+ return false;
+ }
+ size_t plaintext_size = ciphertext.length() - kPaddingSize;
+ if (plaintext_size > max_output_length) {
return false;
}
- memcpy(output, ciphertext.data(), ciphertext.length());
- *output_length = ciphertext.length();
+ memcpy(output, ciphertext.data(), plaintext_size);
+ *output_length = plaintext_size;
return true;
}
diff --git a/chromium/net/quic/mock_decrypter.h b/chromium/net/quic/mock_decrypter.h
index 7b9256f281e..5b7f0e22483 100644
--- a/chromium/net/quic/mock_decrypter.h
+++ b/chromium/net/quic/mock_decrypter.h
@@ -17,10 +17,10 @@
namespace net {
-// A MockDecrypter is a QuicDecrypter that does no validation of
-// the given ciphertext and returns it untouched, ignoring the
-// associated data. This is used to allow fuzzing to mutate
-// plaintext packets.
+// A MockDecrypter is a QuicDecrypter that strips the last 12 bytes of
+// ciphertext (which should be zeroes, but are ignored), and returns the
+// remaining ciphertext untouched and ignores the associated data. This is used
+// to allow fuzzing to mutate plaintext packets.
class MockDecrypter : public quic::QuicDecrypter {
public:
explicit MockDecrypter(quic::Perspective perspective);
diff --git a/chromium/net/quic/mock_encrypter.cc b/chromium/net/quic/mock_encrypter.cc
index 147cddaa81c..f1ed64da051 100644
--- a/chromium/net/quic/mock_encrypter.cc
+++ b/chromium/net/quic/mock_encrypter.cc
@@ -11,10 +11,15 @@ using quic::DiversificationNonce;
using quic::Perspective;
using quic::QuicPacketNumber;
using quic::QuicStringPiece;
-using quic::QuicTransportVersion;
namespace net {
+namespace {
+
+const size_t kPaddingSize = 12;
+
+} // namespace
+
MockEncrypter::MockEncrypter(Perspective perspective) {}
bool MockEncrypter::SetKey(QuicStringPiece key) {
@@ -35,11 +40,12 @@ bool MockEncrypter::EncryptPacket(uint64_t /*packet_number*/,
char* output,
size_t* output_length,
size_t max_output_length) {
- if (max_output_length < plaintext.size()) {
+ size_t ciphertext_size = plaintext.size() + kPaddingSize;
+ if (max_output_length < ciphertext_size) {
return false;
}
- memcpy(output, plaintext.data(), plaintext.length());
- *output_length = plaintext.size();
+ memcpy(output, plaintext.data(), ciphertext_size);
+ *output_length = ciphertext_size;
return true;
}
@@ -65,11 +71,11 @@ size_t MockEncrypter::GetIVSize() const {
}
size_t MockEncrypter::GetMaxPlaintextSize(size_t ciphertext_size) const {
- return ciphertext_size;
+ return ciphertext_size - kPaddingSize;
}
size_t MockEncrypter::GetCiphertextSize(size_t plaintext_size) const {
- return plaintext_size;
+ return plaintext_size + kPaddingSize;
}
QuicStringPiece MockEncrypter::GetKey() const {
diff --git a/chromium/net/quic/mock_encrypter.h b/chromium/net/quic/mock_encrypter.h
index 9200cf1a4ae..3deda2d9a9e 100644
--- a/chromium/net/quic/mock_encrypter.h
+++ b/chromium/net/quic/mock_encrypter.h
@@ -16,9 +16,9 @@
namespace net {
-// A MockEncrypter is a QuicEncrypter that returns a plaintext
-// unmodified. No encryption or MAC is applied. This is used
-// to allow fuzzing to mutate plaintext packets.
+// A MockEncrypter is a QuicEncrypter that returns this plaintext followed by 12
+// bytes of zeroes. No encryption or MAC is applied. This is used to allow
+// fuzzing to mutate plaintext packets.
class MockEncrypter : public quic::QuicEncrypter {
public:
explicit MockEncrypter(quic::Perspective perspective);
diff --git a/chromium/net/quic/platform/impl/quic_containers_impl.h b/chromium/net/quic/platform/impl/quic_containers_impl.h
index c7d4de9c27c..1b619a7adf0 100644
--- a/chromium/net/quic/platform/impl/quic_containers_impl.h
+++ b/chromium/net/quic/platform/impl/quic_containers_impl.h
@@ -13,7 +13,7 @@
#include "base/containers/queue.h"
#include "base/containers/small_map.h"
#include "net/base/interval_set.h"
-#include "net/base/linked_hash_map.h"
+#include "net/third_party/quiche/src/common/simple_linked_hash_map.h"
namespace quic {
@@ -43,7 +43,7 @@ using QuicUnorderedSetImpl = std::unordered_set<Key, Hash, Eq, Alloc>;
// A map which offers insertion-ordered iteration.
template <typename Key, typename Value, typename Hash>
-using QuicLinkedHashMapImpl = net::linked_hash_map<Key, Value, Hash>;
+using QuicLinkedHashMapImpl = quiche::SimpleLinkedHashMap<Key, Value, Hash>;
// A map which is faster than (for example) hash_map for a certain number of
// unique key-value-pair elements, and upgrades itself to unordered_map when
diff --git a/chromium/net/quic/platform/impl/quic_default_proof_providers_impl.cc b/chromium/net/quic/platform/impl/quic_default_proof_providers_impl.cc
index 1a80e1be0c6..d40162d639d 100644
--- a/chromium/net/quic/platform/impl/quic_default_proof_providers_impl.cc
+++ b/chromium/net/quic/platform/impl/quic_default_proof_providers_impl.cc
@@ -7,6 +7,8 @@
#include <utility>
#include "base/files/file_path.h"
+#include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
#include "net/cert/cert_verifier.h"
#include "net/cert/ct_log_verifier.h"
#include "net/cert/ct_policy_enforcer.h"
@@ -53,7 +55,7 @@ class ProofVerifierChromiumWithOwnership : public net::ProofVerifierChromium {
std::unique_ptr<ProofVerifier> CreateDefaultProofVerifierImpl() {
std::unique_ptr<net::CertVerifier> cert_verifier =
- net::CertVerifier::CreateDefault();
+ net::CertVerifier::CreateDefault(/*cert_net_fetcher=*/nullptr);
return QuicMakeUnique<ProofVerifierChromiumWithOwnership>(
std::move(cert_verifier));
}
@@ -61,8 +63,14 @@ std::unique_ptr<ProofVerifier> CreateDefaultProofVerifierImpl() {
std::unique_ptr<ProofSource> CreateDefaultProofSourceImpl() {
auto proof_source = std::make_unique<net::ProofSourceChromium>();
CHECK(proof_source->Initialize(
+#if defined(OS_WIN)
+ base::FilePath(base::UTF8ToWide(GetQuicFlag(FLAGS_certificate_file))),
+ base::FilePath(base::UTF8ToWide(GetQuicFlag(FLAGS_key_file))),
+ base::FilePath()));
+#else
base::FilePath(GetQuicFlag(FLAGS_certificate_file)),
base::FilePath(GetQuicFlag(FLAGS_key_file)), base::FilePath()));
+#endif
return std::move(proof_source);
}
diff --git a/chromium/net/quic/platform/impl/quic_epoll_clock.cc b/chromium/net/quic/platform/impl/quic_epoll_clock.cc
index dfba1552335..7a84a684f34 100644
--- a/chromium/net/quic/platform/impl/quic_epoll_clock.cc
+++ b/chromium/net/quic/platform/impl/quic_epoll_clock.cc
@@ -4,13 +4,13 @@
#include "net/quic/platform/impl/quic_epoll_clock.h"
+#include "net/third_party/quiche/src/epoll_server/simple_epoll_server.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
-#include "net/tools/epoll_server/epoll_server.h"
namespace quic {
-QuicEpollClock::QuicEpollClock(net::EpollServer* epoll_server)
+QuicEpollClock::QuicEpollClock(epoll_server::SimpleEpollServer* epoll_server)
: epoll_server_(epoll_server), largest_time_(QuicTime::Zero()) {}
QuicEpollClock::~QuicEpollClock() {}
diff --git a/chromium/net/quic/platform/impl/quic_epoll_clock.h b/chromium/net/quic/platform/impl/quic_epoll_clock.h
index f20df24aa40..cece73fba46 100644
--- a/chromium/net/quic/platform/impl/quic_epoll_clock.h
+++ b/chromium/net/quic/platform/impl/quic_epoll_clock.h
@@ -10,17 +10,19 @@
#include "net/third_party/quiche/src/quic/core/quic_time.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_clock.h"
-namespace quic {} // namespace quic
-namespace net {
-class EpollServer;
-} // namespace net
+namespace epoll_server {
+
+class SimpleEpollServer;
+
+} // namespace epoll_server
+
namespace quic {
// Clock to efficiently retrieve an approximately accurate time from an
// net::EpollServer.
class QuicEpollClock : public QuicClock {
public:
- explicit QuicEpollClock(net::EpollServer* epoll_server);
+ explicit QuicEpollClock(epoll_server::SimpleEpollServer* epoll_server);
~QuicEpollClock() override;
// Returns the approximate current time as a QuicTime object.
@@ -40,7 +42,7 @@ class QuicEpollClock : public QuicClock {
const QuicWallTime& walltime) const override;
protected:
- net::EpollServer* epoll_server_;
+ epoll_server::SimpleEpollServer* epoll_server_;
// Largest time returned from Now() so far.
mutable QuicTime largest_time_;
diff --git a/chromium/net/quic/platform/impl/quic_epoll_clock_test.cc b/chromium/net/quic/platform/impl/quic_epoll_clock_test.cc
index 75caf111c99..d641f54a852 100644
--- a/chromium/net/quic/platform/impl/quic_epoll_clock_test.cc
+++ b/chromium/net/quic/platform/impl/quic_epoll_clock_test.cc
@@ -4,9 +4,9 @@
#include "net/quic/platform/impl/quic_epoll_clock.h"
+#include "net/third_party/quiche/src/epoll_server/fake_simple_epoll_server.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
-#include "net/tools/epoll_server/fake_epoll_server.h"
namespace quic {
namespace test {
@@ -14,7 +14,7 @@ namespace test {
class QuicEpollClockTest : public QuicTest {};
TEST_F(QuicEpollClockTest, ApproximateNowInUsec) {
- FakeEpollServer epoll_server;
+ epoll_server::test::FakeSimpleEpollServer epoll_server;
QuicEpollClock clock(&epoll_server);
epoll_server.set_now_in_usec(1000000);
@@ -35,7 +35,7 @@ TEST_F(QuicEpollClockTest, ApproximateNowInUsec) {
}
TEST_F(QuicEpollClockTest, NowInUsec) {
- FakeEpollServer epoll_server;
+ epoll_server::test::FakeSimpleEpollServer epoll_server;
QuicEpollClock clock(&epoll_server);
epoll_server.set_now_in_usec(1000000);
@@ -47,7 +47,7 @@ TEST_F(QuicEpollClockTest, NowInUsec) {
TEST_F(QuicEpollClockTest, MonotonicityWithRealEpollClock) {
SetQuicReloadableFlag(quic_monotonic_epoll_clock, true);
- net::EpollServer epoll_server;
+ epoll_server::SimpleEpollServer epoll_server;
QuicEpollClock clock(&epoll_server);
quic::QuicTime last_now = clock.Now();
@@ -61,7 +61,7 @@ TEST_F(QuicEpollClockTest, MonotonicityWithRealEpollClock) {
}
TEST_F(QuicEpollClockTest, MonotonicityWithFakeEpollClock) {
- FakeEpollServer epoll_server;
+ epoll_server::test::FakeSimpleEpollServer epoll_server;
QuicEpollClock clock(&epoll_server);
epoll_server.set_now_in_usec(100);
diff --git a/chromium/net/quic/platform/impl/quic_epoll_impl.h b/chromium/net/quic/platform/impl/quic_epoll_impl.h
index 94a5b0b0218..f53ef8bce2b 100644
--- a/chromium/net/quic/platform/impl/quic_epoll_impl.h
+++ b/chromium/net/quic/platform/impl/quic_epoll_impl.h
@@ -10,14 +10,14 @@
#ifndef NET_QUIC_PLATFORM_IMPL_QUIC_EPOLL_IMPL_H_
#define NET_QUIC_PLATFORM_IMPL_QUIC_EPOLL_IMPL_H_
-#include "net/tools/epoll_server/epoll_server.h"
+#include "net/third_party/quiche/src/epoll_server/simple_epoll_server.h"
namespace quic {
-using QuicEpollServerImpl = ::net::EpollServer;
-using QuicEpollEventImpl = ::net::EpollEvent;
-using QuicEpollAlarmBaseImpl = ::net::EpollAlarm;
-using QuicEpollCallbackInterfaceImpl = ::net::EpollCallbackInterface;
+using QuicEpollServerImpl = epoll_server::SimpleEpollServer;
+using QuicEpollEventImpl = epoll_server::EpollEvent;
+using QuicEpollAlarmBaseImpl = epoll_server::EpollAlarm;
+using QuicEpollCallbackInterfaceImpl = epoll_server::EpollCallbackInterface;
} // namespace quic
diff --git a/chromium/net/quic/platform/impl/quic_epoll_test_tools_impl.h b/chromium/net/quic/platform/impl/quic_epoll_test_tools_impl.h
index ed7443c0caa..1cde56a3a1a 100644
--- a/chromium/net/quic/platform/impl/quic_epoll_test_tools_impl.h
+++ b/chromium/net/quic/platform/impl/quic_epoll_test_tools_impl.h
@@ -5,8 +5,8 @@
#ifndef NET_QUIC_PLATFORM_IMPL_QUIC_EPOLL_TEST_TOOLS_IMPL_H_
#define NET_QUIC_PLATFORM_IMPL_QUIC_EPOLL_TEST_TOOLS_IMPL_H_
-#include "net/tools/epoll_server/fake_epoll_server.h"
+#include "net/third_party/quiche/src/epoll_server/fake_simple_epoll_server.h"
-using QuicFakeEpollServerImpl = quic::test::FakeEpollServer;
+using QuicFakeEpollServerImpl = epoll_server::test::FakeSimpleEpollServer;
#endif // NET_QUIC_PLATFORM_IMPL_QUIC_EPOLL_TEST_TOOLS_IMPL_H_
diff --git a/chromium/net/quic/platform/impl/quic_flag_utils_impl.h b/chromium/net/quic/platform/impl/quic_flag_utils_impl.h
index 846826c7970..b50e3e0a98f 100644
--- a/chromium/net/quic/platform/impl/quic_flag_utils_impl.h
+++ b/chromium/net/quic/platform/impl/quic_flag_utils_impl.h
@@ -8,12 +8,12 @@
#include "base/logging.h"
#define QUIC_RELOADABLE_FLAG_COUNT_IMPL(flag) \
- DVLOG(2) << "FLAG_" #flag ": " << FLAGS_quic_reloadable_flag_##flag
+ DVLOG(3) << "FLAG_" #flag ": " << FLAGS_quic_reloadable_flag_##flag
#define QUIC_RELOADABLE_FLAG_COUNT_N_IMPL(flag, instance, total) \
QUIC_RELOADABLE_FLAG_COUNT_IMPL(flag)
#define QUIC_RESTART_FLAG_COUNT_IMPL(flag) \
- DVLOG(2) << "FLAG_" #flag ": " << FLAGS_quic_restart_flag_##flag
+ DVLOG(3) << "FLAG_" #flag ": " << FLAGS_quic_restart_flag_##flag
#define QUIC_RESTART_FLAG_COUNT_N_IMPL(flag, instance, total) \
QUIC_RESTART_FLAG_COUNT_IMPL(flag)
diff --git a/chromium/net/quic/platform/impl/quic_flags_impl.cc b/chromium/net/quic/platform/impl/quic_flags_impl.cc
index d3a9e8dc5cd..3cd9d447e09 100644
--- a/chromium/net/quic/platform/impl/quic_flags_impl.cc
+++ b/chromium/net/quic/platform/impl/quic_flags_impl.cc
@@ -201,6 +201,11 @@ std::vector<std::string> QuicParseCommandLineFlagsImpl(
if (result.exit_status.has_value()) {
exit(*result.exit_status);
}
+
+ logging::LoggingSettings settings;
+ settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
+ CHECK(logging::InitLogging(settings));
+
return result.non_flag_args;
}
diff --git a/chromium/net/quic/platform/impl/quic_flags_impl.h b/chromium/net/quic/platform/impl/quic_flags_impl.h
index 6ec16b7bdf4..fbc9a93a81c 100644
--- a/chromium/net/quic/platform/impl/quic_flags_impl.h
+++ b/chromium/net/quic/platform/impl/quic_flags_impl.h
@@ -46,27 +46,7 @@ inline std::string GetQuicFlagImpl(const std::string& flag) {
return flag;
}
-inline void SetQuicFlagImpl(bool* f, bool v) {
- *f = v;
-}
-inline void SetQuicFlagImpl(int32_t* f, int32_t v) {
- *f = v;
-}
-inline void SetQuicFlagImpl(uint32_t* f, uint32_t v) {
- *f = v;
-}
-inline void SetQuicFlagImpl(int64_t* f, int64_t v) {
- *f = v;
-}
-inline void SetQuicFlagImpl(uint64_t* f, uint64_t v) {
- *f = v;
-}
-inline void SetQuicFlagImpl(double* f, double v) {
- *f = v;
-}
-inline void SetQuicFlagImpl(std::string* f, const std::string& v) {
- *f = v;
-}
+#define SetQuicFlagImpl(flag, value) ((flag) = (value))
namespace quic {
@@ -207,10 +187,10 @@ QUIC_EXPORT_PRIVATE void QuicPrintCommandLineFlagHelpImpl(const char* usage);
#define GetQuicReloadableFlagImpl(flag) GetQuicFlag(RELOADABLE_FLAG(flag))
#define SetQuicReloadableFlagImpl(flag, value) \
- SetQuicFlag(&RELOADABLE_FLAG(flag), value)
+ SetQuicFlag(RELOADABLE_FLAG(flag), value)
#define GetQuicRestartFlagImpl(flag) GetQuicFlag(RESTART_FLAG(flag))
#define SetQuicRestartFlagImpl(flag, value) \
- SetQuicFlag(&RESTART_FLAG(flag), value)
+ SetQuicFlag(RESTART_FLAG(flag), value)
} // namespace quic
#endif // NET_QUIC_PLATFORM_IMPL_QUIC_FLAGS_IMPL_H_
diff --git a/chromium/net/quic/platform/impl/quic_flags_test.cc b/chromium/net/quic/platform/impl/quic_flags_test.cc
index aeb1599a99d..ce96ce91853 100644
--- a/chromium/net/quic/platform/impl/quic_flags_test.cc
+++ b/chromium/net/quic/platform/impl/quic_flags_test.cc
@@ -77,7 +77,7 @@ TEST_F(QuicCommandLineFlagTest, NotSpecified) {
TEST_F(QuicCommandLineFlagTest, BoolFlag) {
for (const char* s :
{"--foo", "--foo=1", "--foo=t", "--foo=True", "--foo=Y", "--foo=yes"}) {
- SetQuicFlag(&FLAGS_foo, false);
+ SetQuicFlag(FLAGS_foo, false);
const char* argv[]{"argv0", s};
auto parse_result = QuicParseCommandLineFlagsForTest(
"usage message", base::size(argv), argv);
@@ -88,7 +88,7 @@ TEST_F(QuicCommandLineFlagTest, BoolFlag) {
for (const char* s :
{"--foo=0", "--foo=f", "--foo=False", "--foo=N", "--foo=no"}) {
- SetQuicFlag(&FLAGS_foo, true);
+ SetQuicFlag(FLAGS_foo, true);
const char* argv[]{"argv0", s};
auto parse_result = QuicParseCommandLineFlagsForTest(
"usage message", base::size(argv), argv);
@@ -98,7 +98,7 @@ TEST_F(QuicCommandLineFlagTest, BoolFlag) {
}
for (const char* s : {"--foo=7", "--foo=abc", "--foo=trueish"}) {
- SetQuicFlag(&FLAGS_foo, false);
+ SetQuicFlag(FLAGS_foo, false);
const char* argv[]{"argv0", s};
testing::internal::CaptureStderr();
@@ -117,7 +117,7 @@ TEST_F(QuicCommandLineFlagTest, BoolFlag) {
TEST_F(QuicCommandLineFlagTest, Int32Flag) {
for (const int i : {-1, 0, 100, 38239832}) {
- SetQuicFlag(&FLAGS_bar, 0);
+ SetQuicFlag(FLAGS_bar, 0);
std::string flag_str = base::StringPrintf("--bar=%d", i);
const char* argv[]{"argv0", flag_str.c_str()};
auto parse_result = QuicParseCommandLineFlagsForTest(
@@ -128,7 +128,7 @@ TEST_F(QuicCommandLineFlagTest, Int32Flag) {
}
for (const char* s : {"--bar", "--bar=a", "--bar=9999999999999"}) {
- SetQuicFlag(&FLAGS_bar, 0);
+ SetQuicFlag(FLAGS_bar, 0);
const char* argv[]{"argv0", s};
testing::internal::CaptureStderr();
@@ -147,7 +147,7 @@ TEST_F(QuicCommandLineFlagTest, Int32Flag) {
TEST_F(QuicCommandLineFlagTest, StringFlag) {
{
- SetQuicFlag(&FLAGS_baz, "whee");
+ SetQuicFlag(FLAGS_baz, "whee");
const char* argv[]{"argv0", "--baz"};
auto parse_result = QuicParseCommandLineFlagsForTest(
"usage message", base::size(argv), argv);
@@ -157,7 +157,7 @@ TEST_F(QuicCommandLineFlagTest, StringFlag) {
}
for (const char* s : {"", "12345", "abcdefg"}) {
- SetQuicFlag(&FLAGS_baz, "qux");
+ SetQuicFlag(FLAGS_baz, "qux");
std::string flag_str = base::StrCat({"--baz=", s});
const char* argv[]{"argv0", flag_str.c_str()};
auto parse_result = QuicParseCommandLineFlagsForTest(
diff --git a/chromium/net/quic/platform/impl/quic_ip_address_impl.cc b/chromium/net/quic/platform/impl/quic_ip_address_impl.cc
index 85af5747be0..37fa7427277 100644
--- a/chromium/net/quic/platform/impl/quic_ip_address_impl.cc
+++ b/chromium/net/quic/platform/impl/quic_ip_address_impl.cc
@@ -140,4 +140,14 @@ bool QuicIpAddressImpl::InSameSubnet(const QuicIpAddressImpl& other,
subnet_length);
}
+in_addr QuicIpAddressImpl::GetIPv4() const {
+ DCHECK_EQ(sizeof(in_addr), ip_address_.bytes().size());
+ return *(reinterpret_cast<const in_addr*>(ip_address_.bytes().data()));
+}
+
+in6_addr QuicIpAddressImpl::GetIPv6() const {
+ DCHECK_EQ(sizeof(in6_addr), ip_address_.bytes().size());
+ return *(reinterpret_cast<const in6_addr*>(ip_address_.bytes().data()));
+}
+
} // namespace quic
diff --git a/chromium/net/quic/platform/impl/quic_ip_address_impl.h b/chromium/net/quic/platform/impl/quic_ip_address_impl.h
index 6eefe666386..84579fe06b7 100644
--- a/chromium/net/quic/platform/impl/quic_ip_address_impl.h
+++ b/chromium/net/quic/platform/impl/quic_ip_address_impl.h
@@ -56,8 +56,10 @@ class QUIC_EXPORT_PRIVATE QuicIpAddressImpl {
bool FromString(std::string str);
bool IsIPv4() const;
bool IsIPv6() const;
-
bool InSameSubnet(const QuicIpAddressImpl& other, int subnet_length);
+
+ in_addr GetIPv4() const;
+ in6_addr GetIPv6() const;
const net::IPAddress& ip_address() const { return ip_address_; }
private:
diff --git a/chromium/net/quic/platform/impl/quic_mem_slice_impl.h b/chromium/net/quic/platform/impl/quic_mem_slice_impl.h
index 27ef7729c46..95cddf3aa4a 100644
--- a/chromium/net/quic/platform/impl/quic_mem_slice_impl.h
+++ b/chromium/net/quic/platform/impl/quic_mem_slice_impl.h
@@ -45,6 +45,10 @@ class QUIC_EXPORT_PRIVATE QuicMemSliceImpl {
bool empty() const { return length_ == 0; }
+ scoped_refptr<net::IOBuffer>* impl() { return &io_buffer_; }
+
+ size_t* impl_length() { return &length_; }
+
private:
scoped_refptr<net::IOBuffer> io_buffer_;
// Length of io_buffer_.
diff --git a/chromium/net/quic/platform/impl/quic_mem_slice_span_impl.cc b/chromium/net/quic/platform/impl/quic_mem_slice_span_impl.cc
index 606c0d7ed12..a7837f43313 100644
--- a/chromium/net/quic/platform/impl/quic_mem_slice_span_impl.cc
+++ b/chromium/net/quic/platform/impl/quic_mem_slice_span_impl.cc
@@ -8,10 +8,13 @@ namespace quic {
QuicMemSliceSpanImpl::QuicMemSliceSpanImpl(
const scoped_refptr<net::IOBuffer>* buffers,
- const int* lengths,
+ const size_t* lengths,
size_t num_buffers)
: buffers_(buffers), lengths_(lengths), num_buffers_(num_buffers) {}
+QuicMemSliceSpanImpl::QuicMemSliceSpanImpl(QuicMemSliceImpl* slice)
+ : QuicMemSliceSpanImpl(slice->impl(), slice->impl_length(), 1) {}
+
QuicMemSliceSpanImpl::QuicMemSliceSpanImpl(const QuicMemSliceSpanImpl& other) =
default;
QuicMemSliceSpanImpl& QuicMemSliceSpanImpl::operator=(
diff --git a/chromium/net/quic/platform/impl/quic_mem_slice_span_impl.h b/chromium/net/quic/platform/impl/quic_mem_slice_span_impl.h
index 90785fe499b..ba63a3e938d 100644
--- a/chromium/net/quic/platform/impl/quic_mem_slice_span_impl.h
+++ b/chromium/net/quic/platform/impl/quic_mem_slice_span_impl.h
@@ -17,8 +17,9 @@ namespace quic {
class QUIC_EXPORT_PRIVATE QuicMemSliceSpanImpl {
public:
QuicMemSliceSpanImpl(const scoped_refptr<net::IOBuffer>* buffers,
- const int* lengths,
+ const size_t* lengths,
size_t num_buffers);
+ explicit QuicMemSliceSpanImpl(QuicMemSliceImpl* slice);
QuicMemSliceSpanImpl(const QuicMemSliceSpanImpl& other);
QuicMemSliceSpanImpl& operator=(const QuicMemSliceSpanImpl& other);
@@ -54,7 +55,7 @@ class QUIC_EXPORT_PRIVATE QuicMemSliceSpanImpl {
private:
const scoped_refptr<net::IOBuffer>* buffers_;
- const int* lengths_;
+ const size_t* lengths_;
// Not const so that the move operator can work properly.
size_t num_buffers_;
};
diff --git a/chromium/net/quic/platform/impl/quic_mem_slice_storage_impl.h b/chromium/net/quic/platform/impl/quic_mem_slice_storage_impl.h
index 9987942367c..9e91fff9a37 100644
--- a/chromium/net/quic/platform/impl/quic_mem_slice_storage_impl.h
+++ b/chromium/net/quic/platform/impl/quic_mem_slice_storage_impl.h
@@ -35,7 +35,7 @@ class QUIC_EXPORT_PRIVATE QuicMemSliceStorageImpl {
private:
std::vector<scoped_refptr<net::IOBuffer>> buffers_;
- std::vector<int> lengths_;
+ std::vector<size_t> lengths_;
};
} // namespace quic
diff --git a/chromium/net/quic/platform/impl/quic_optional_impl.h b/chromium/net/quic/platform/impl/quic_optional_impl.h
new file mode 100644
index 00000000000..a21af4ea67f
--- /dev/null
+++ b/chromium/net/quic/platform/impl/quic_optional_impl.h
@@ -0,0 +1,17 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_QUIC_PLATFORM_IMPL_QUIC_OPTIONAL_IMPL_H_
+#define NET_QUIC_PLATFORM_IMPL_QUIC_OPTIONAL_IMPL_H_
+
+#include "base/optional.h"
+
+namespace quic {
+
+template <typename T>
+using QuicOptionalImpl = base::Optional<T>;
+
+} // namespace quic
+
+#endif // NET_QUIC_PLATFORM_IMPL_QUIC_OPTIONAL_IMPL_H_
diff --git a/chromium/net/quic/platform/impl/quic_socket_address_impl.cc b/chromium/net/quic/platform/impl/quic_socket_address_impl.cc
index bc228d077c8..952a1823f1d 100644
--- a/chromium/net/quic/platform/impl/quic_socket_address_impl.cc
+++ b/chromium/net/quic/platform/impl/quic_socket_address_impl.cc
@@ -5,6 +5,7 @@
#include "net/quic/platform/impl/quic_socket_address_impl.h"
#include "net/base/sockaddr_storage.h"
+#include "net/quic/address_utils.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
using std::string;
@@ -14,9 +15,9 @@ namespace quic {
QuicSocketAddressImpl::QuicSocketAddressImpl(const net::IPEndPoint& address)
: socket_address_(address) {}
-QuicSocketAddressImpl::QuicSocketAddressImpl(QuicIpAddressImpl address,
+QuicSocketAddressImpl::QuicSocketAddressImpl(QuicIpAddress address,
uint16_t port)
- : socket_address_(address.ip_address(), port) {}
+ : socket_address_(net::ToIPAddress(address), port) {}
QuicSocketAddressImpl::QuicSocketAddressImpl(
const struct sockaddr_storage& saddr) {
diff --git a/chromium/net/quic/platform/impl/quic_socket_address_impl.h b/chromium/net/quic/platform/impl/quic_socket_address_impl.h
index e6d08d2a8c0..a6fa5439fe5 100644
--- a/chromium/net/quic/platform/impl/quic_socket_address_impl.h
+++ b/chromium/net/quic/platform/impl/quic_socket_address_impl.h
@@ -6,8 +6,8 @@
#define NET_QUIC_PLATFORM_IMPL_QUIC_SOCKET_ADDRESS_IMPL_H_
#include "net/base/ip_endpoint.h"
-#include "net/quic/platform/impl/quic_ip_address_impl.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_ip_address.h"
namespace quic {
@@ -15,7 +15,7 @@ class QUIC_EXPORT_PRIVATE QuicSocketAddressImpl {
public:
QuicSocketAddressImpl() = default;
explicit QuicSocketAddressImpl(const net::IPEndPoint& addr);
- QuicSocketAddressImpl(QuicIpAddressImpl address, uint16_t port);
+ QuicSocketAddressImpl(QuicIpAddress address, uint16_t port);
explicit QuicSocketAddressImpl(const struct sockaddr_storage& saddr);
explicit QuicSocketAddressImpl(const struct sockaddr& saddr);
QuicSocketAddressImpl(const QuicSocketAddressImpl& other) = default;
diff --git a/chromium/net/quic/platform/impl/quic_system_event_loop_impl.h b/chromium/net/quic/platform/impl/quic_system_event_loop_impl.h
index b3afccac3dc..e4654c59c36 100644
--- a/chromium/net/quic/platform/impl/quic_system_event_loop_impl.h
+++ b/chromium/net/quic/platform/impl/quic_system_event_loop_impl.h
@@ -16,7 +16,7 @@ inline void QuicRunSystemEventLoopIterationImpl() {
class QuicSystemEventLoopImpl {
public:
QuicSystemEventLoopImpl(std::string context_name) {
- base::ThreadPool::CreateAndStartWithDefaultParams(context_name);
+ base::ThreadPoolInstance::CreateAndStartWithDefaultParams(context_name);
}
private:
diff --git a/chromium/net/quic/platform/impl/quic_test_impl.cc b/chromium/net/quic/platform/impl/quic_test_impl.cc
index f1c3c06bdfe..a7e57370c45 100644
--- a/chromium/net/quic/platform/impl/quic_test_impl.cc
+++ b/chromium/net/quic/platform/impl/quic_test_impl.cc
@@ -27,3 +27,15 @@ std::string QuicGetTestMemoryCachePathImpl() {
// The file path is known to be an ascii string.
return path.MaybeAsASCII();
}
+
+namespace quic {
+ParsedQuicVersionVector AllVersionsExcept99() {
+ ParsedQuicVersionVector result;
+ for (const ParsedQuicVersion& version : AllSupportedVersions()) {
+ if (version.transport_version != QUIC_VERSION_99) {
+ result.push_back(version);
+ }
+ }
+ return result;
+}
+} // namespace quic
diff --git a/chromium/net/quic/platform/impl/quic_test_impl.h b/chromium/net/quic/platform/impl/quic_test_impl.h
index a95fe606ba7..72f248533bc 100644
--- a/chromium/net/quic/platform/impl/quic_test_impl.h
+++ b/chromium/net/quic/platform/impl/quic_test_impl.h
@@ -7,9 +7,11 @@
#include "base/logging.h"
#include "net/test/test_with_scoped_task_environment.h"
+#include "net/third_party/quiche/src/quic/core/quic_versions.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
-#include "testing/gmock/include/gmock/gmock.h" // IWYU pragma: export
-#include "testing/gtest/include/gtest/gtest.h" // IWYU pragma: export
+#include "testing/gmock/include/gmock/gmock.h" // IWYU pragma: export
+#include "testing/gtest/include/gtest/gtest-spi.h" // IWYU pragma: export
+#include "testing/gtest/include/gtest/gtest.h" // IWYU pragma: export
// When constructed, saves the current values of all QUIC flags. When
// destructed, restores all QUIC flags to the saved values.
@@ -65,4 +67,14 @@ class ScopedEnvironmentForThreadsImpl {
std::string QuicGetTestMemoryCachePathImpl();
+namespace quic {
+// A utility function that returns all versions except v99. Intended to be a
+// drop-in replacement for quic::AllSupportedVersion() when disabling v99 in a
+// large test file is required.
+//
+// TODO(vasilvv): all of the tests should be fixed for v99, so that this
+// function can be removed.
+ParsedQuicVersionVector AllVersionsExcept99();
+} // namespace quic
+
#endif // NET_QUIC_PLATFORM_IMPL_QUIC_TEST_IMPL_H_
diff --git a/chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.cc b/chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.cc
index ff0c376f4f6..b1c3198d973 100644
--- a/chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.cc
+++ b/chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.cc
@@ -21,6 +21,20 @@ QuicTestMemSliceVectorImpl::QuicTestMemSliceVectorImpl(
}
}
+QuicTestMemSliceVectorImpl::QuicTestMemSliceVectorImpl(
+ QuicTestMemSliceVectorImpl&& other) {
+ *this = std::move(other);
+}
+
+QuicTestMemSliceVectorImpl& QuicTestMemSliceVectorImpl::operator=(
+ QuicTestMemSliceVectorImpl&& other) {
+ if (this != &other) {
+ buffers_ = std::move(other.buffers_);
+ lengths_ = std::move(other.lengths_);
+ }
+ return *this;
+}
+
QuicMemSliceSpanImpl QuicTestMemSliceVectorImpl::span() {
return QuicMemSliceSpanImpl(buffers_.data(), lengths_.data(),
buffers_.size());
diff --git a/chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.h b/chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.h
index 26acc2f30c1..3b2ac14ee47 100644
--- a/chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.h
+++ b/chromium/net/quic/platform/impl/quic_test_mem_slice_vector_impl.h
@@ -5,6 +5,8 @@
#ifndef NET_QUIC_PLATFORM_IMPL_QUIC_TEST_MEM_SLICE_VECTOR_IMPL_H_
#define NET_QUIC_PLATFORM_IMPL_QUIC_TEST_MEM_SLICE_VECTOR_IMPL_H_
+#include <memory>
+
#include "net/quic/platform/impl/quic_mem_slice_span_impl.h"
namespace quic {
@@ -25,11 +27,14 @@ class QuicTestMemSliceVectorImpl {
std::vector<std::pair<char*, size_t>> buffers);
~QuicTestMemSliceVectorImpl();
+ QuicTestMemSliceVectorImpl(QuicTestMemSliceVectorImpl&& other);
+ QuicTestMemSliceVectorImpl& operator=(QuicTestMemSliceVectorImpl&& other);
+
QuicMemSliceSpanImpl span();
private:
std::vector<scoped_refptr<net::IOBuffer>> buffers_;
- std::vector<int> lengths_;
+ std::vector<size_t> lengths_;
};
} // namespace test
diff --git a/chromium/net/quic/quic_chromium_client_session.cc b/chromium/net/quic/quic_chromium_client_session.cc
index b9744c8b598..dfd04101031 100644
--- a/chromium/net/quic/quic_chromium_client_session.cc
+++ b/chromium/net/quic/quic_chromium_client_session.cc
@@ -7,7 +7,6 @@
#include <utility>
#include "base/bind.h"
-#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_functions.h"
@@ -28,6 +27,7 @@
#include "net/http/transport_security_state.h"
#include "net/log/net_log_event_type.h"
#include "net/log/net_log_source_type.h"
+#include "net/quic/address_utils.h"
#include "net/quic/crypto/proof_verifier_chromium.h"
#include "net/quic/quic_chromium_connection_helper.h"
#include "net/quic/quic_chromium_packet_writer.h"
@@ -39,7 +39,6 @@
#include "net/spdy/spdy_http_utils.h"
#include "net/spdy/spdy_log_util.h"
#include "net/spdy/spdy_session.h"
-#include "net/ssl/channel_id_service.h"
#include "net/ssl/ssl_connection_status_flags.h"
#include "net/ssl/ssl_info.h"
#include "net/third_party/quiche/src/quic/core/http/quic_client_promised_info.h"
@@ -103,38 +102,70 @@ void RecordUnexpectedNotGoingAway(Location location) {
NUM_LOCATIONS);
}
+void RecordConnectionCloseErrorCode(quic::QuicErrorCode error,
+ quic::ConnectionCloseSource source,
+ const std::string& hostname,
+ bool handshake_confirmed) {
+ bool is_google_host = HasGoogleHost(GURL("https://" + hostname));
+ std::string histogram = "Net.QuicSession.ConnectionCloseErrorCode";
+
+ if (source == quic::ConnectionCloseSource::FROM_PEER) {
+ histogram += "Server";
+ } else {
+ histogram += "Client";
+ }
+ base::UmaHistogramSparse(histogram, error);
+
+ if (handshake_confirmed) {
+ base::UmaHistogramSparse(histogram + ".HandshakeConfirmed", error);
+ } else {
+ base::UmaHistogramSparse(histogram + ".HandshakeNotConfirmed", error);
+ }
+
+ if (is_google_host) {
+ histogram += "Google";
+ base::UmaHistogramSparse(histogram, error);
+
+ if (handshake_confirmed) {
+ base::UmaHistogramSparse(histogram + ".HandshakeConfirmed", error);
+ } else {
+ base::UmaHistogramSparse(histogram + ".HandshakeNotConfirmed", error);
+ }
+ }
+}
+
NetLogParametersCallback NetLogQuicConnectionMigrationTriggerCallback(
const char* trigger) {
return NetLog::StringCallback("trigger", trigger);
}
-std::unique_ptr<base::Value> NetLogQuicConnectionMigrationFailureCallback(
+base::Value NetLogQuicConnectionMigrationFailureCallback(
quic::QuicConnectionId connection_id,
std::string reason,
NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("connection_id", connection_id.ToString());
- dict->SetString("reason", reason);
+ base::DictionaryValue dict;
+ dict.SetString("connection_id", connection_id.ToString());
+ dict.SetString("reason", reason);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicConnectionMigrationSuccessCallback(
+base::Value NetLogQuicConnectionMigrationSuccessCallback(
quic::QuicConnectionId connection_id,
NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("connection_id", connection_id.ToString());
+ base::DictionaryValue dict;
+ dict.SetString("connection_id", connection_id.ToString());
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogProbingResultCallback(
+base::Value NetLogProbingResultCallback(
NetworkChangeNotifier::NetworkHandle network,
const quic::QuicSocketAddress* peer_address,
bool is_success,
NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("network", base::NumberToString(network));
- dict->SetString("peer address", peer_address->ToString());
- dict->SetBoolean("is_success", is_success);
+ base::DictionaryValue dict;
+ dict.SetString("network", base::NumberToString(network));
+ dict.SetString("peer address", peer_address->ToString());
+ dict.SetBoolean("is_success", is_success);
return std::move(dict);
}
@@ -191,29 +222,29 @@ std::string ConnectionMigrationCauseToString(ConnectionMigrationCause cause) {
return "InvalidCause";
}
-std::unique_ptr<base::Value> NetLogQuicClientSessionCallback(
+base::Value NetLogQuicClientSessionCallback(
const quic::QuicServerId* server_id,
int cert_verify_flags,
bool require_confirmation,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("host", server_id->host());
- dict->SetInteger("port", server_id->port());
- dict->SetBoolean("privacy_mode", server_id->privacy_mode_enabled());
- dict->SetBoolean("require_confirmation", require_confirmation);
- dict->SetInteger("cert_verify_flags", cert_verify_flags);
+ base::DictionaryValue dict;
+ dict.SetString("host", server_id->host());
+ dict.SetInteger("port", server_id->port());
+ dict.SetBoolean("privacy_mode", server_id->privacy_mode_enabled());
+ dict.SetBoolean("require_confirmation", require_confirmation);
+ dict.SetInteger("cert_verify_flags", cert_verify_flags);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicPushPromiseReceivedCallback(
+base::Value NetLogQuicPushPromiseReceivedCallback(
const spdy::SpdyHeaderBlock* headers,
spdy::SpdyStreamId stream_id,
spdy::SpdyStreamId promised_stream_id,
NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->Set("headers", ElideSpdyHeaderBlockForNetLog(*headers, capture_mode));
- dict->SetInteger("id", stream_id);
- dict->SetInteger("promised_stream_id", promised_stream_id);
+ base::DictionaryValue dict;
+ dict.SetKey("headers", ElideSpdyHeaderBlockForNetLog(*headers, capture_mode));
+ dict.SetInteger("id", stream_id);
+ dict.SetInteger("promised_stream_id", promised_stream_id);
return std::move(dict);
}
@@ -461,7 +492,7 @@ int QuicChromiumClientSession::Handle::GetPeerAddress(
if (!session_)
return ERR_CONNECTION_CLOSED;
- *address = session_->peer_address().impl().socket_address();
+ *address = ToIPEndPoint(session_->peer_address());
return OK;
}
@@ -470,7 +501,7 @@ int QuicChromiumClientSession::Handle::GetSelfAddress(
if (!session_)
return ERR_CONNECTION_CLOSED;
- *address = session_->self_address().impl().socket_address();
+ *address = ToIPEndPoint(session_->self_address());
return OK;
}
@@ -522,7 +553,7 @@ void QuicChromiumClientSession::Handle::OnRendezvousResult(
if (push_callback_) {
DCHECK(push_handle_);
push_handle_ = nullptr;
- base::ResetAndReturn(&push_callback_).Run(rv);
+ std::move(push_callback_).Run(rv);
}
}
@@ -600,7 +631,7 @@ void QuicChromiumClientSession::StreamRequest::DoCallback(int rv) {
// The client callback can do anything, including destroying this class,
// so any pending callback must be issued after everything else is done.
- base::ResetAndReturn(&callback_).Run(rv);
+ std::move(callback_).Run(rv);
}
int QuicChromiumClientSession::StreamRequest::DoLoop(int rv) {
@@ -788,7 +819,7 @@ QuicChromiumClientSession::QuicChromiumClientSession(
}
connect_timing_.dns_start = dns_resolution_start_time;
connect_timing_.dns_end = dns_resolution_end_time;
- if (migrate_session_early_v2_) {
+ if (!retransmittable_on_wire_timeout.IsZero()) {
connection->set_retransmittable_on_wire_timeout(
retransmittable_on_wire_timeout);
}
@@ -799,17 +830,17 @@ QuicChromiumClientSession::~QuicChromiumClientSession() {
net_log_.EndEvent(NetLogEventType::QUIC_SESSION);
DCHECK(waiting_for_confirmation_callbacks_.empty());
- if (!dynamic_streams().empty())
+ if (HasActiveRequestStreams())
RecordUnexpectedOpenStreams(DESTRUCTOR);
if (!handles_.empty())
RecordUnexpectedObservers(DESTRUCTOR);
if (!going_away_)
RecordUnexpectedNotGoingAway(DESTRUCTOR);
- while (!dynamic_streams().empty() || !handles_.empty() ||
+ while (HasActiveRequestStreams() || !handles_.empty() ||
!stream_requests_.empty()) {
// The session must be closed before it is destroyed.
- DCHECK(dynamic_streams().empty());
+ DCHECK(!HasActiveRequestStreams());
CloseAllStreams(ERR_UNEXPECTED);
DCHECK(handles_.empty());
CloseAllHandles(ERR_UNEXPECTED);
@@ -1143,7 +1174,7 @@ const quic::QuicCryptoClientStream* QuicChromiumClientSession::GetCryptoStream()
}
bool QuicChromiumClientSession::GetRemoteEndpoint(IPEndPoint* endpoint) {
- *endpoint = peer_address().impl().socket_address();
+ *endpoint = ToIPEndPoint(peer_address());
return true;
}
@@ -1408,11 +1439,9 @@ void QuicChromiumClientSession::SendRstStream(
quic::QuicStreamOffset bytes_written) {
if (quic::QuicUtils::IsServerInitiatedStreamId(
connection()->transport_version(), id)) {
- StreamHandler handler = GetOrCreateStreamImpl(id, /*may_buffer=*/true);
- if (handler.is_pending) {
- bytes_pushed_count_ += handler.pending->stream_bytes_read();
- } else if (handler.stream) {
- bytes_pushed_count_ += handler.stream->stream_bytes_read();
+ quic::QuicStream* stream = GetOrCreateStream(id);
+ if (stream) {
+ bytes_pushed_count_ += stream->stream_bytes_read();
}
}
@@ -1442,7 +1471,7 @@ void QuicChromiumClientSession::OnConfigNegotiated() {
// Server has sent an alternate address to connect to.
IPEndPoint new_address =
- config()->ReceivedAlternateServerAddress().impl().socket_address();
+ ToIPEndPoint(config()->ReceivedAlternateServerAddress());
IPEndPoint old_address;
GetDefaultSocket()->GetPeerAddress(&old_address);
@@ -1480,7 +1509,7 @@ void QuicChromiumClientSession::OnCryptoHandshakeEvent(
// could be called because there are no error events in CryptoHandshakeEvent
// enum. If error events are added to CryptoHandshakeEvent, then the
// following code needs to changed.
- base::ResetAndReturn(&callback_).Run(OK);
+ std::move(callback_).Run(OK);
}
if (event == HANDSHAKE_CONFIRMED) {
if (stream_factory_)
@@ -1530,7 +1559,7 @@ void QuicChromiumClientSession::OnCryptoHandshakeMessageSent(
void QuicChromiumClientSession::OnCryptoHandshakeMessageReceived(
const quic::CryptoHandshakeMessage& message) {
logger_->OnCryptoHandshakeMessageReceived(message);
- if (message.tag() == quic::kREJ || message.tag() == quic::kSREJ) {
+ if (message.tag() == quic::kREJ) {
UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.RejectLength",
message.GetSerialized().length(), 1000, 10000,
50);
@@ -1558,7 +1587,9 @@ void QuicChromiumClientSession::OnConnectionClosed(
quic::ConnectionCloseSource source) {
DCHECK(!connection()->connected());
logger_->OnConnectionClosed(error, error_details, source);
- bool is_google_host = HasGoogleHost(GURL("https://" + session_key_.host()));
+
+ RecordConnectionCloseErrorCode(error, source, session_key_.host(),
+ IsCryptoHandshakeConfirmed());
if (source == quic::ConnectionCloseSource::FROM_PEER) {
if (error == quic::QUIC_PUBLIC_RESET) {
// is_from_google_server will be true if the received EPID is
@@ -1583,15 +1614,6 @@ void QuicChromiumClientSession::OnConnectionClosed(
}
}
if (IsCryptoHandshakeConfirmed()) {
- if (is_google_host) {
- base::UmaHistogramSparse(
- "Net.QuicSession.ConnectionCloseErrorCodeServerGoogle."
- "HandshakeConfirmed",
- error);
- }
- base::UmaHistogramSparse(
- "Net.QuicSession.ConnectionCloseErrorCodeServer.HandshakeConfirmed",
- error);
base::HistogramBase* histogram = base::SparseHistogram::FactoryGet(
"Net.QuicSession.StreamCloseErrorCodeServer.HandshakeConfirmed",
base::HistogramBase::kUmaTargetedHistogramFlag);
@@ -1599,23 +1621,8 @@ void QuicChromiumClientSession::OnConnectionClosed(
if (num_streams > 0)
histogram->AddCount(error, num_streams);
}
- if (is_google_host) {
- base::UmaHistogramSparse(
- "Net.QuicSession.ConnectionCloseErrorCodeServerGoogle", error);
- }
- base::UmaHistogramSparse("Net.QuicSession.ConnectionCloseErrorCodeServer",
- error);
} else {
if (IsCryptoHandshakeConfirmed()) {
- if (is_google_host) {
- base::UmaHistogramSparse(
- "Net.QuicSession.ConnectionCloseErrorCodeClientGoogle."
- "HandshakeConfirmed",
- error);
- }
- base::UmaHistogramSparse(
- "Net.QuicSession.ConnectionCloseErrorCodeClient.HandshakeConfirmed",
- error);
base::HistogramBase* histogram = base::SparseHistogram::FactoryGet(
"Net.QuicSession.StreamCloseErrorCodeClient.HandshakeConfirmed",
base::HistogramBase::kUmaTargetedHistogramFlag);
@@ -1629,12 +1636,6 @@ void QuicChromiumClientSession::OnConnectionClosed(
connection()->IsPathDegrading());
}
}
- if (is_google_host) {
- base::UmaHistogramSparse(
- "Net.QuicSession.ConnectionCloseErrorCodeClientGoogle", error);
- }
- base::UmaHistogramSparse("Net.QuicSession.ConnectionCloseErrorCodeClient",
- error);
if (error == quic::QUIC_TOO_MANY_RTOS) {
UMA_HISTOGRAM_COUNTS_1000(
"Net.QuicSession.ClosedByRtoAtClient.ReceivedPacketCount",
@@ -1707,13 +1708,13 @@ void QuicChromiumClientSession::OnConnectionClosed(
quic::QuicSession::OnConnectionClosed(error, error_details, source);
if (!callback_.is_null()) {
- base::ResetAndReturn(&callback_).Run(ERR_QUIC_PROTOCOL_ERROR);
+ std::move(callback_).Run(ERR_QUIC_PROTOCOL_ERROR);
}
for (auto& socket : sockets_) {
socket->Close();
}
- DCHECK(dynamic_streams().empty());
+ DCHECK(!HasActiveRequestStreams());
CloseAllStreams(ERR_UNEXPECTED);
CloseAllHandles(ERR_UNEXPECTED);
CancelAllRequests(ERR_CONNECTION_CLOSED);
@@ -1862,7 +1863,7 @@ void QuicChromiumClientSession::MigrateSessionOnWriteError(
NetLogEventType::QUIC_CONNECTION_MIGRATION_TRIGGERED,
NetLogQuicConnectionMigrationTriggerCallback("WriteError"));
MigrationResult result =
- Migrate(new_network, connection()->peer_address().impl().socket_address(),
+ Migrate(new_network, ToIPEndPoint(connection()->peer_address()),
/*close_session_on_error=*/false, migration_net_log);
migration_net_log.EndEvent(
NetLogEventType::QUIC_CONNECTION_MIGRATION_TRIGGERED);
@@ -2201,7 +2202,7 @@ void QuicChromiumClientSession::MigrateNetworkImmediately(
probing_manager_.CancelProbing(network, peer_address());
MigrationResult result =
- Migrate(network, connection()->peer_address().impl().socket_address(),
+ Migrate(network, ToIPEndPoint(connection()->peer_address()),
/*close_session_on_error=*/true, net_log_);
if (result == MigrationResult::FAILURE)
return;
@@ -2375,7 +2376,7 @@ void QuicChromiumClientSession::CloseSessionOnError(
base::UmaHistogramSparse("Net.QuicSession.CloseSessionOnError", -net_error);
if (!callback_.is_null()) {
- base::ResetAndReturn(&callback_).Run(net_error);
+ std::move(callback_).Run(net_error);
}
CloseAllStreams(net_error);
@@ -2398,7 +2399,7 @@ void QuicChromiumClientSession::CloseSessionOnErrorLater(
base::UmaHistogramSparse("Net.QuicSession.CloseSessionOnError", -net_error);
if (!callback_.is_null()) {
- base::ResetAndReturn(&callback_).Run(net_error);
+ std::move(callback_).Run(net_error);
}
CloseAllStreams(net_error);
CloseAllHandles(net_error);
@@ -2413,11 +2414,26 @@ void QuicChromiumClientSession::CloseSessionOnErrorLater(
}
void QuicChromiumClientSession::CloseAllStreams(int net_error) {
- while (!dynamic_streams().empty()) {
- quic::QuicStream* stream = dynamic_streams().begin()->second.get();
- quic::QuicStreamId id = stream->id();
- static_cast<QuicChromiumClientStream*>(stream)->OnError(net_error);
- CloseStream(id);
+ if (!eliminate_static_stream_map()) {
+ while (!dynamic_streams().empty()) {
+ quic::QuicStream* stream = dynamic_streams().begin()->second.get();
+ quic::QuicStreamId id = stream->id();
+ static_cast<QuicChromiumClientStream*>(stream)->OnError(net_error);
+ CloseStream(id);
+ }
+ } else {
+ quic::QuicSmallMap<quic::QuicStreamId, quic::QuicStream*, 10>
+ non_static_streams;
+ for (const auto& stream : dynamic_streams()) {
+ if (!stream.second->is_static()) {
+ non_static_streams[stream.first] = stream.second.get();
+ }
+ }
+ for (const auto& stream : non_static_streams) {
+ quic::QuicStreamId id = stream.first;
+ static_cast<QuicChromiumClientStream*>(stream.second)->OnError(net_error);
+ CloseStream(id);
+ }
}
}
@@ -2492,9 +2508,9 @@ ProbingResult QuicChromiumClientSession::StartProbeNetwork(
// Create and configure socket on |network|.
std::unique_ptr<DatagramClientSocket> probing_socket =
stream_factory_->CreateSocket(net_log_.net_log(), net_log_.source());
- if (stream_factory_->ConfigureSocket(
- probing_socket.get(), peer_address.impl().socket_address(), network,
- session_key_.socket_tag()) != OK) {
+ if (stream_factory_->ConfigureSocket(probing_socket.get(),
+ ToIPEndPoint(peer_address), network,
+ session_key_.socket_tag()) != OK) {
HistogramAndLogMigrationFailure(
migration_net_log, MIGRATION_STATUS_INTERNAL_ERROR, connection_id(),
"Socket configuration failed");
@@ -2626,6 +2642,10 @@ void QuicChromiumClientSession::ResetNonMigratableStreams() {
auto it = dynamic_streams().begin();
// Stream may be deleted when iterating through the map.
while (it != dynamic_streams().end()) {
+ if (eliminate_static_stream_map() && it->second->is_static()) {
+ it++;
+ continue;
+ }
QuicChromiumClientStream* stream =
static_cast<QuicChromiumClientStream*>(it->second.get());
if (!stream->can_migrate_to_cellular_network()) {
@@ -2738,34 +2758,36 @@ void QuicChromiumClientSession::HistogramAndLogMigrationSuccess(
base::Bind(&NetLogQuicConnectionMigrationSuccessCallback, connection_id));
}
-std::unique_ptr<base::Value> QuicChromiumClientSession::GetInfoAsValue(
+base::Value QuicChromiumClientSession::GetInfoAsValue(
const std::set<HostPortPair>& aliases) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("version",
- QuicVersionToString(connection()->transport_version()));
- dict->SetInteger("open_streams", GetNumOpenOutgoingStreams());
+ base::DictionaryValue dict;
+ dict.SetString("version",
+ QuicVersionToString(connection()->transport_version()));
+ dict.SetInteger("open_streams", GetNumOpenOutgoingStreams());
std::unique_ptr<base::ListValue> stream_list(new base::ListValue());
for (DynamicStreamMap::const_iterator it = dynamic_streams().begin();
it != dynamic_streams().end(); ++it) {
+ if (eliminate_static_stream_map() && it->second->is_static())
+ continue;
stream_list->AppendString(base::NumberToString(it->second->id()));
}
- dict->Set("active_streams", std::move(stream_list));
+ dict.Set("active_streams", std::move(stream_list));
- dict->SetInteger("total_streams", num_total_streams_);
- dict->SetString("peer_address", peer_address().ToString());
- dict->SetString("connection_id", connection_id().ToString());
- dict->SetBoolean("connected", connection()->connected());
+ dict.SetInteger("total_streams", num_total_streams_);
+ dict.SetString("peer_address", peer_address().ToString());
+ dict.SetString("connection_id", connection_id().ToString());
+ dict.SetBoolean("connected", connection()->connected());
const quic::QuicConnectionStats& stats = connection()->GetStats();
- dict->SetInteger("packets_sent", stats.packets_sent);
- dict->SetInteger("packets_received", stats.packets_received);
- dict->SetInteger("packets_lost", stats.packets_lost);
+ dict.SetInteger("packets_sent", stats.packets_sent);
+ dict.SetInteger("packets_received", stats.packets_received);
+ dict.SetInteger("packets_lost", stats.packets_lost);
SSLInfo ssl_info;
std::unique_ptr<base::ListValue> alias_list(new base::ListValue());
for (const auto& alias : aliases) {
alias_list->AppendString(alias.ToString());
}
- dict->Set("aliases", std::move(alias_list));
+ dict.Set("aliases", std::move(alias_list));
return std::move(dict);
}
@@ -2831,7 +2853,7 @@ void QuicChromiumClientSession::NotifyFactoryOfSessionGoingAway() {
}
void QuicChromiumClientSession::NotifyFactoryOfSessionClosedLater() {
- if (!dynamic_streams().empty())
+ if (HasActiveRequestStreams())
RecordUnexpectedOpenStreams(NOTIFY_FACTORY_OF_SESSION_CLOSED_LATER);
if (!going_away_)
@@ -2847,7 +2869,7 @@ void QuicChromiumClientSession::NotifyFactoryOfSessionClosedLater() {
}
void QuicChromiumClientSession::NotifyFactoryOfSessionClosed() {
- if (!dynamic_streams().empty())
+ if (HasActiveRequestStreams())
RecordUnexpectedOpenStreams(NOTIFY_FACTORY_OF_SESSION_CLOSED);
if (!going_away_)
diff --git a/chromium/net/quic/quic_chromium_client_session.h b/chromium/net/quic/quic_chromium_client_session.h
index 4f0faef437d..51111ee9542 100644
--- a/chromium/net/quic/quic_chromium_client_session.h
+++ b/chromium/net/quic/quic_chromium_client_session.h
@@ -537,8 +537,7 @@ class NET_EXPORT_PRIVATE QuicChromiumClientSession
quic::QuicErrorCode quic_error,
quic::ConnectionCloseBehavior behavior);
- std::unique_ptr<base::Value> GetInfoAsValue(
- const std::set<HostPortPair>& aliases);
+ base::Value GetInfoAsValue(const std::set<HostPortPair>& aliases);
const NetLogWithSource& net_log() const { return net_log_; }
diff --git a/chromium/net/quic/quic_chromium_client_session_test.cc b/chromium/net/quic/quic_chromium_client_session_test.cc
index 6c0a8dbd488..830144abf82 100644
--- a/chromium/net/quic/quic_chromium_client_session_test.cc
+++ b/chromium/net/quic/quic_chromium_client_session_test.cc
@@ -83,7 +83,7 @@ class TestingQuicChromiumClientSession : public QuicChromiumClientSession {
class QuicChromiumClientSessionTest
: public ::testing::TestWithParam<
- std::tuple<quic::QuicTransportVersion, bool>>,
+ std::tuple<quic::ParsedQuicVersion, bool>>,
public WithScopedTaskEnvironment {
public:
QuicChromiumClientSessionTest()
@@ -140,8 +140,7 @@ class QuicChromiumClientSessionTest
quic::QuicUtils::CreateRandomConnectionId(&random_),
quic::QuicSocketAddress(quic::QuicSocketAddressImpl(kIpEndPoint)),
&helper_, &alarm_factory_, writer, true, quic::Perspective::IS_CLIENT,
- quic::test::SupportedVersions(
- quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, version_)));
+ quic::test::SupportedVersions(version_));
session_.reset(new TestingQuicChromiumClientSession(
connection, std::move(socket),
/*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_,
@@ -199,25 +198,31 @@ class QuicChromiumClientSessionTest
}
quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
- return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+ return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+ version_.transport_version, n);
}
quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
- return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
+ return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
+ version_.transport_version, n);
}
size_t GetMaxAllowedOutgoingBidirectionalStreams() {
quic::QuicSession* quic_session =
dynamic_cast<quic::QuicSession*>(&*session_);
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
return quic::test::QuicSessionPeer::GetStreamIdManager(quic_session)
->max_open_outgoing_streams();
}
+ // For version99, the count will include both static and dynamic streams.
+ // These tests are only concerned with dynamic streams (that is, the number
+ // of streams that they can create), so back out the static header stream.
return quic::test::QuicSessionPeer::v99_streamid_manager(quic_session)
- ->max_allowed_outgoing_bidirectional_streams();
+ ->max_allowed_outgoing_bidirectional_streams() -
+ 1;
}
- const quic::QuicTransportVersion version_;
+ const quic::ParsedQuicVersion version_;
const bool client_headers_include_h2_stream_dependency_;
QuicFlagSaver flags_; // Save/restore all QUIC flag values.
quic::QuicCryptoClientConfig crypto_config_;
@@ -248,9 +253,8 @@ class QuicChromiumClientSessionTest
INSTANTIATE_TEST_SUITE_P(
VersionIncludeStreamDependencySequence,
QuicChromiumClientSessionTest,
- ::testing::Combine(
- ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
- ::testing::Bool()));
+ ::testing::Combine(::testing::ValuesIn(quic::AllSupportedVersions()),
+ ::testing::Bool()));
TEST_P(QuicChromiumClientSessionTest, IsFatalErrorNotSetForNonFatalError) {
MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
@@ -326,7 +330,7 @@ TEST_P(QuicChromiumClientSessionTest, Handle) {
session_->CreateHandle(destination_);
EXPECT_TRUE(handle->IsConnected());
EXPECT_FALSE(handle->IsCryptoHandshakeConfirmed());
- EXPECT_EQ(version_, handle->GetQuicVersion());
+ EXPECT_EQ(version_.transport_version, handle->GetQuicVersion());
EXPECT_EQ(session_key_.server_id(), handle->server_id());
EXPECT_EQ(session_net_log.source().type, handle->net_log().source().type);
EXPECT_EQ(session_net_log.source().id, handle->net_log().source().id);
@@ -355,7 +359,7 @@ TEST_P(QuicChromiumClientSessionTest, Handle) {
// Veirfy that the handle works correctly after the session is closed.
EXPECT_FALSE(handle->IsConnected());
EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed());
- EXPECT_EQ(version_, handle->GetQuicVersion());
+ EXPECT_EQ(version_.transport_version, handle->GetQuicVersion());
EXPECT_EQ(session_key_.server_id(), handle->server_id());
EXPECT_EQ(session_net_log.source().type, handle->net_log().source().type);
EXPECT_EQ(session_net_log.source().id, handle->net_log().source().id);
@@ -380,7 +384,7 @@ TEST_P(QuicChromiumClientSessionTest, Handle) {
// Veirfy that the handle works correctly after the session is deleted.
EXPECT_FALSE(handle->IsConnected());
EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed());
- EXPECT_EQ(version_, handle->GetQuicVersion());
+ EXPECT_EQ(version_.transport_version, handle->GetQuicVersion());
EXPECT_EQ(session_key_.server_id(), handle->server_id());
EXPECT_EQ(session_net_log.source().type, handle->net_log().source().type);
EXPECT_EQ(session_net_log.source().id, handle->net_log().source().id);
@@ -507,24 +511,24 @@ TEST_P(QuicChromiumClientSessionTest, AsyncStreamRequest) {
MockQuicData quic_data;
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeInitialSettingsPacket(1, nullptr));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
// The open stream limit is set to 50 by
// MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
- // requested, a STREAM_ID_BLOCKED will be sent.
- quic_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
+ // requested, a STREAMS_BLOCKED will be sent, indicating that it's blocked
+ // at the limit of 50. The +1 accounts for the header stream.
+ quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 2, true, 50 + 1,
+ /*unidirectional=*/false));
quic_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(
3, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED, 0,
/*include_stop_sending_if_v99=*/false));
- // After the STREAM_ID_BLOCKED is sent, receive a MAX_STREAM_ID to increase
- // the limit.
+ // After the STREAMS_BLOCKED is sent, receive a MAX_STREAMS to increase
+ // the limit to 53.
quic_data.AddRead(
- ASYNC, server_maker_.MakeMaxStreamIdPacket(
- 1, true, GetNthClientInitiatedBidirectionalStreamId(50)));
+ ASYNC, server_maker_.MakeMaxStreamsPacket(1, true, 53,
+ /*unidirectional=*/false));
} else {
quic_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(
@@ -559,7 +563,7 @@ TEST_P(QuicChromiumClientSessionTest, AsyncStreamRequest) {
GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED, 0);
session_->OnRstStream(rst);
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
// For version99, to close the stream completely, we also must receive a
// STOP_SENDING frame:
quic::QuicStopSendingFrame stop_sending(
@@ -584,18 +588,17 @@ TEST_P(QuicChromiumClientSessionTest, ClosedWithAsyncStreamRequest) {
MockQuicData quic_data;
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeInitialSettingsPacket(1, nullptr));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
// The open stream limit is set to 50 by
// MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
- // requested, a STREAM_ID_BLOCKED will be sent.
- quic_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
- quic_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 3, true, GetNthClientInitiatedBidirectionalStreamId(49)));
+ // requested, a STREAMS_BLOCKED will be sent, indicating that it's blocked
+ // at the limit of 50. The +1 accounts for the header streams.
+ quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 2, true, 50 + 1,
+ /*unidirectional=*/false));
+ quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 3, true, 50 + 1,
+ /*unidirectional=*/false));
}
quic_data.AddRead(ASYNC, ERR_IO_PENDING);
quic_data.AddRead(ASYNC, OK); // EOF
@@ -648,14 +651,13 @@ TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) {
MockQuicData quic_data;
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeInitialSettingsPacket(1, nullptr));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
// The open stream limit is set to 50 by
// MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
- // requested, a STREAM_ID_BLOCKED will be sent.
- quic_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
+ // requested, a STREAMS_BLOCKED will be sent.
+ quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 2, true, 51,
+ /*unidirectional=*/false));
// This node receives the RST_STREAM+STOP_SENDING, it responds
// with only a RST_STREAM.
quic_data.AddWrite(
@@ -701,7 +703,7 @@ TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) {
GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED, 0);
session_->OnRstStream(rst);
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
// For version99, we require a STOP_SENDING as well as a RESET_STREAM to
// fully close the stream.
quic::QuicStopSendingFrame stop_sending(
@@ -784,11 +786,10 @@ TEST_P(QuicChromiumClientSessionTest, ConnectionCloseWithPendingStreamRequest) {
MockQuicData quic_data;
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeInitialSettingsPacket(1, nullptr));
- if (version_ == quic::QUIC_VERSION_99) {
- quic_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
+ quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 2, true, 51,
+ /*unidirectional=*/false));
}
quic_data.AddRead(ASYNC, ERR_IO_PENDING);
quic_data.AddRead(
@@ -832,24 +833,25 @@ TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) {
MockQuicData quic_data;
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeInitialSettingsPacket(1, nullptr));
- if (version_ == quic::QUIC_VERSION_99) {
- // stream id blocked, stream id blocked on is #102, which is
- // the 51st stream id...
- quic_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
+ // Initial configuration is 50 dynamic streams. Taking into account
+ // the static stream (headers), expect to block on when hitting the limit
+ // of 51 streams
+ quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 2, true, 50 + 1,
+ /*unidirectional=*/false));
quic_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(
3, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_RST_ACKNOWLEDGEMENT));
- quic_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 4, true, GetNthClientInitiatedBidirectionalStreamId(49)));
+ // For the second CreateOutgoingStream that fails because of hitting the
+ // stream count limit.
+ quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 4, true, 50 + 1,
+ /*unidirectional=*/false));
quic_data.AddRead(
- ASYNC, server_maker_.MakeMaxStreamIdPacket(
- 1, true, GetNthClientInitiatedBidirectionalStreamId(50)));
+ ASYNC, server_maker_.MakeMaxStreamsPacket(1, true, 50 + 2,
+ /*unidirectional=*/false));
} else {
quic_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(
@@ -871,6 +873,7 @@ TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) {
EXPECT_TRUE(stream);
streams.push_back(stream);
}
+ // This stream, the 51st dynamic stream, can not be opened.
EXPECT_FALSE(
QuicChromiumClientSessionPeer::CreateOutgoingStream(session_.get()));
@@ -1174,18 +1177,17 @@ TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) {
MockQuicData quic_data;
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeInitialSettingsPacket(1, nullptr));
- if (version_ == quic::QUIC_VERSION_99) {
- quic_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
+ quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 2, true, 51,
+ /*unidirectional=*/false));
quic_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(
3, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_RST_ACKNOWLEDGEMENT));
quic_data.AddRead(
- ASYNC, server_maker_.MakeMaxStreamIdPacket(
- 1, true, GetNthClientInitiatedBidirectionalStreamId(50)));
+ ASYNC, server_maker_.MakeMaxStreamsPacket(1, true, 53,
+ /*unidirectional=*/false));
} else {
quic_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(
@@ -1199,7 +1201,6 @@ TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) {
Initialize();
CompleteCryptoHandshake();
const size_t kMaxOpenStreams = GetMaxAllowedOutgoingBidirectionalStreams();
-
std::vector<QuicChromiumClientStream*> streams;
for (size_t i = 0; i < kMaxOpenStreams; i++) {
QuicChromiumClientStream* stream =
@@ -1550,10 +1551,6 @@ TEST_P(QuicChromiumClientSessionTest, MigrateToSocketReadError) {
}
TEST_P(QuicChromiumClientSessionTest, DetectPathDegradingDuringHandshake) {
- if (version_ >= quic::QUIC_VERSION_47) {
- // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
- return;
- }
migrate_session_early_v2_ = true;
MockQuicData quic_data;
diff --git a/chromium/net/quic/quic_chromium_client_stream.cc b/chromium/net/quic/quic_chromium_client_stream.cc
index 34c9b6a4a6b..45e4b802118 100644
--- a/chromium/net/quic/quic_chromium_client_stream.cc
+++ b/chromium/net/quic/quic_chromium_client_stream.cc
@@ -661,7 +661,8 @@ bool QuicChromiumClientStream::DeliverInitialHeaders(
headers_delivered_ = true;
net_log_.AddEvent(
NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_HEADERS,
- base::Bind(&SpdyHeaderBlockNetLogCallback, &initial_headers_));
+ base::BindRepeating(&QuicResponseNetLogCallback, id(), fin_received(),
+ &initial_headers_));
*headers = std::move(initial_headers_);
*frame_len = initial_headers_frame_len_;
@@ -676,7 +677,8 @@ bool QuicChromiumClientStream::DeliverTrailingHeaders(
net_log_.AddEvent(
NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_READ_RESPONSE_TRAILERS,
- base::Bind(&SpdyHeaderBlockNetLogCallback, &received_trailers()));
+ base::BindRepeating(&QuicResponseNetLogCallback, id(), fin_received(),
+ &received_trailers()));
*headers = received_trailers().Clone();
*frame_len = trailing_headers_frame_len_;
diff --git a/chromium/net/quic/quic_chromium_client_stream_test.cc b/chromium/net/quic/quic_chromium_client_stream_test.cc
index 90ee9828cae..7fc2ffe1507 100644
--- a/chromium/net/quic/quic_chromium_client_stream_test.cc
+++ b/chromium/net/quic/quic_chromium_client_stream_test.cc
@@ -544,6 +544,11 @@ TEST_P(QuicChromiumClientStreamTest, OnError) {
}
TEST_P(QuicChromiumClientStreamTest, OnTrailers) {
+ // TODO(vasilvv): reenable this for v99.
+ if (GetParam() == quic::QUIC_VERSION_99) {
+ return;
+ }
+
InitializeHeaders();
ProcessHeadersFull(headers_);
@@ -596,6 +601,11 @@ TEST_P(QuicChromiumClientStreamTest, OnTrailers) {
// Tests that trailers are marked as consumed only before delegate is to be
// immediately notified about trailers.
TEST_P(QuicChromiumClientStreamTest, MarkTrailersConsumedWhenNotifyDelegate) {
+ // TODO(vasilvv): reenable this for v99.
+ if (GetParam() == quic::QUIC_VERSION_99) {
+ return;
+ }
+
InitializeHeaders();
ProcessHeadersFull(headers_);
@@ -655,6 +665,11 @@ TEST_P(QuicChromiumClientStreamTest, MarkTrailersConsumedWhenNotifyDelegate) {
// are received but not yet delivered, Read() will return ERR_IO_PENDING instead
// of 0 (EOF).
TEST_P(QuicChromiumClientStreamTest, ReadAfterTrailersReceivedButNotDelivered) {
+ // TODO(vasilvv): reenable this for v99.
+ if (GetParam() == quic::QUIC_VERSION_99) {
+ return;
+ }
+
InitializeHeaders();
ProcessHeadersFull(headers_);
diff --git a/chromium/net/quic/quic_connection_logger.cc b/chromium/net/quic/quic_connection_logger.cc
index 36e41480ad6..0e6cf4223cb 100644
--- a/chromium/net/quic/quic_connection_logger.cc
+++ b/chromium/net/quic/quic_connection_logger.cc
@@ -22,6 +22,7 @@
#include "net/log/net_log.h"
#include "net/log/net_log_capture_mode.h"
#include "net/log/net_log_event_type.h"
+#include "net/quic/address_utils.h"
#include "net/quic/quic_address_mismatch.h"
#include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake_message.h"
#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
@@ -38,97 +39,95 @@ namespace net {
namespace {
-std::unique_ptr<base::Value> NetLogQuicPacketCallback(
- const IPEndPoint* self_address,
- const IPEndPoint* peer_address,
+base::Value NetLogQuicPacketCallback(
+ const quic::QuicSocketAddress* self_address,
+ const quic::QuicSocketAddress* peer_address,
size_t packet_size,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("self_address", self_address->ToString());
- dict->SetString("peer_address", peer_address->ToString());
- dict->SetInteger("size", packet_size);
+ base::DictionaryValue dict;
+ dict.SetString("self_address", self_address->ToString());
+ dict.SetString("peer_address", peer_address->ToString());
+ dict.SetInteger("size", packet_size);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicPacketSentCallback(
+base::Value NetLogQuicPacketSentCallback(
const quic::SerializedPacket& serialized_packet,
quic::TransmissionType transmission_type,
quic::QuicTime sent_time,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("transmission_type", transmission_type);
- dict->SetKey("packet_number",
- NetLogNumberValue(serialized_packet.packet_number.ToUint64()));
- dict->SetInteger("size", serialized_packet.encrypted_length);
- dict->SetKey("sent_time_us", NetLogNumberValue(sent_time.ToDebuggingValue()));
+ base::DictionaryValue dict;
+ dict.SetInteger("transmission_type", transmission_type);
+ dict.SetKey("packet_number",
+ NetLogNumberValue(serialized_packet.packet_number.ToUint64()));
+ dict.SetInteger("size", serialized_packet.encrypted_length);
+ dict.SetKey("sent_time_us", NetLogNumberValue(sent_time.ToDebuggingValue()));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicPacketRetransmittedCallback(
+base::Value NetLogQuicPacketRetransmittedCallback(
quic::QuicPacketNumber old_packet_number,
quic::QuicPacketNumber new_packet_number,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetKey("old_packet_number",
- NetLogNumberValue(old_packet_number.ToUint64()));
- dict->SetKey("new_packet_number",
- NetLogNumberValue(new_packet_number.ToUint64()));
+ base::DictionaryValue dict;
+ dict.SetKey("old_packet_number",
+ NetLogNumberValue(old_packet_number.ToUint64()));
+ dict.SetKey("new_packet_number",
+ NetLogNumberValue(new_packet_number.ToUint64()));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicPacketLostCallback(
+base::Value NetLogQuicPacketLostCallback(
quic::QuicPacketNumber packet_number,
quic::TransmissionType transmission_type,
quic::QuicTime detection_time,
NetLogCaptureMode /*capture_mode*/) {
- auto dict = std::make_unique<base::DictionaryValue>();
- dict->SetInteger("transmission_type", transmission_type);
- dict->SetKey("packet_number", NetLogNumberValue(packet_number.ToUint64()));
- dict->SetKey("detection_time_us",
- NetLogNumberValue(detection_time.ToDebuggingValue()));
- return dict;
+ base::DictionaryValue dict;
+ dict.SetInteger("transmission_type", transmission_type);
+ dict.SetKey("packet_number", NetLogNumberValue(packet_number.ToUint64()));
+ dict.SetKey("detection_time_us",
+ NetLogNumberValue(detection_time.ToDebuggingValue()));
+ return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicDuplicatePacketCallback(
+base::Value NetLogQuicDuplicatePacketCallback(
quic::QuicPacketNumber packet_number,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetKey("packet_number", NetLogNumberValue(packet_number.ToUint64()));
+ base::DictionaryValue dict;
+ dict.SetKey("packet_number", NetLogNumberValue(packet_number.ToUint64()));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicPacketHeaderCallback(
+base::Value NetLogQuicPacketHeaderCallback(
const quic::QuicPacketHeader* header,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("connection_id",
- header->destination_connection_id.ToString());
- dict->SetInteger("reset_flag", header->reset_flag);
- dict->SetInteger("version_flag", header->version_flag);
- dict->SetKey("packet_number",
- NetLogNumberValue(header->packet_number.ToUint64()));
+ base::DictionaryValue dict;
+ dict.SetString("connection_id", header->destination_connection_id.ToString());
+ dict.SetInteger("reset_flag", header->reset_flag);
+ dict.SetInteger("version_flag", header->version_flag);
+ dict.SetKey("packet_number",
+ NetLogNumberValue(header->packet_number.ToUint64()));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicStreamFrameCallback(
+base::Value NetLogQuicStreamFrameCallback(
const quic::QuicStreamFrame& frame,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("stream_id", frame.stream_id);
- dict->SetBoolean("fin", frame.fin);
- dict->SetKey("offset", NetLogNumberValue(frame.offset));
- dict->SetInteger("length", frame.data_length);
+ base::DictionaryValue dict;
+ dict.SetInteger("stream_id", frame.stream_id);
+ dict.SetBoolean("fin", frame.fin);
+ dict.SetKey("offset", NetLogNumberValue(frame.offset));
+ dict.SetInteger("length", frame.data_length);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicAckFrameCallback(
- const quic::QuicAckFrame* frame,
- NetLogCaptureMode /* capture_mode */) {
- auto dict = std::make_unique<base::DictionaryValue>();
- dict->SetKey("largest_observed",
- NetLogNumberValue(frame->largest_acked.ToUint64()));
- dict->SetKey("delta_time_largest_observed_us",
- NetLogNumberValue(frame->ack_delay_time.ToMicroseconds()));
+base::Value NetLogQuicAckFrameCallback(const quic::QuicAckFrame* frame,
+ NetLogCaptureMode /* capture_mode */) {
+ base::DictionaryValue dict;
+ dict.SetKey("largest_observed",
+ NetLogNumberValue(frame->largest_acked.ToUint64()));
+ dict.SetKey("delta_time_largest_observed_us",
+ NetLogNumberValue(frame->ack_delay_time.ToMicroseconds()));
auto missing = std::make_unique<base::ListValue>();
if (!frame->packets.Empty()) {
@@ -141,7 +140,7 @@ std::unique_ptr<base::Value> NetLogQuicAckFrameCallback(
}
}
}
- dict->Set("missing_packets", std::move(missing));
+ dict.Set("missing_packets", std::move(missing));
auto received = std::make_unique<base::ListValue>();
const quic::PacketTimeVector& received_times = frame->received_packet_times;
@@ -151,124 +150,124 @@ std::unique_ptr<base::Value> NetLogQuicAckFrameCallback(
info->SetKey("received", NetLogNumberValue(it->second.ToDebuggingValue()));
received->Append(std::move(info));
}
- dict->Set("received_packet_times", std::move(received));
+ dict.Set("received_packet_times", std::move(received));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicRstStreamFrameCallback(
+base::Value NetLogQuicRstStreamFrameCallback(
const quic::QuicRstStreamFrame* frame,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("stream_id", frame->stream_id);
- dict->SetInteger("quic_rst_stream_error", frame->error_code);
+ base::DictionaryValue dict;
+ dict.SetInteger("stream_id", frame->stream_id);
+ dict.SetInteger("quic_rst_stream_error", frame->error_code);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicConnectionCloseFrameCallback(
+base::Value NetLogQuicConnectionCloseFrameCallback(
const quic::QuicConnectionCloseFrame* frame,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("quic_error", frame->quic_error_code);
- dict->SetString("details", frame->error_details);
+ base::DictionaryValue dict;
+ dict.SetInteger("quic_error", frame->quic_error_code);
+ dict.SetString("details", frame->error_details);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicWindowUpdateFrameCallback(
+base::Value NetLogQuicWindowUpdateFrameCallback(
const quic::QuicWindowUpdateFrame* frame,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("stream_id", frame->stream_id);
- dict->SetKey("byte_offset", NetLogNumberValue(frame->byte_offset));
+ base::DictionaryValue dict;
+ dict.SetInteger("stream_id", frame->stream_id);
+ dict.SetKey("byte_offset", NetLogNumberValue(frame->byte_offset));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicBlockedFrameCallback(
+base::Value NetLogQuicBlockedFrameCallback(
const quic::QuicBlockedFrame* frame,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("stream_id", frame->stream_id);
+ base::DictionaryValue dict;
+ dict.SetInteger("stream_id", frame->stream_id);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicGoAwayFrameCallback(
+base::Value NetLogQuicGoAwayFrameCallback(
const quic::QuicGoAwayFrame* frame,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("quic_error", frame->error_code);
- dict->SetInteger("last_good_stream_id", frame->last_good_stream_id);
- dict->SetString("reason_phrase", frame->reason_phrase);
+ base::DictionaryValue dict;
+ dict.SetInteger("quic_error", frame->error_code);
+ dict.SetInteger("last_good_stream_id", frame->last_good_stream_id);
+ dict.SetString("reason_phrase", frame->reason_phrase);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicStopWaitingFrameCallback(
+base::Value NetLogQuicStopWaitingFrameCallback(
const quic::QuicStopWaitingFrame* frame,
NetLogCaptureMode /* capture_mode */) {
- auto dict = std::make_unique<base::DictionaryValue>();
+ base::DictionaryValue dict;
auto sent_info = std::make_unique<base::DictionaryValue>();
sent_info->SetKey("least_unacked",
NetLogNumberValue(frame->least_unacked.ToUint64()));
- dict->Set("sent_info", std::move(sent_info));
+ dict.Set("sent_info", std::move(sent_info));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicVersionNegotiationPacketCallback(
+base::Value NetLogQuicVersionNegotiationPacketCallback(
const quic::QuicVersionNegotiationPacket* packet,
NetLogCaptureMode /* capture_mode */) {
- auto dict = std::make_unique<base::DictionaryValue>();
+ base::DictionaryValue dict;
auto versions = std::make_unique<base::ListValue>();
for (auto it = packet->versions.begin(); it != packet->versions.end(); ++it) {
versions->AppendString(ParsedQuicVersionToString(*it));
}
- dict->Set("versions", std::move(versions));
+ dict.Set("versions", std::move(versions));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicPublicResetPacketCallback(
+base::Value NetLogQuicPublicResetPacketCallback(
const IPEndPoint* server_hello_address,
- const IPEndPoint* public_reset_address,
+ const quic::QuicSocketAddress* public_reset_address,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("server_hello_address", server_hello_address->ToString());
- dict->SetString("public_reset_address", public_reset_address->ToString());
+ base::DictionaryValue dict;
+ dict.SetString("server_hello_address", server_hello_address->ToString());
+ dict.SetString("public_reset_address", public_reset_address->ToString());
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicCryptoHandshakeMessageCallback(
+base::Value NetLogQuicCryptoHandshakeMessageCallback(
const quic::CryptoHandshakeMessage* message,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("quic_crypto_handshake_message", message->DebugString());
+ base::DictionaryValue dict;
+ dict.SetString("quic_crypto_handshake_message", message->DebugString());
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicOnConnectionClosedCallback(
+base::Value NetLogQuicOnConnectionClosedCallback(
quic::QuicErrorCode error,
string error_details,
quic::ConnectionCloseSource source,
NetLogCaptureMode /* capture_mode */) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("quic_error", error);
- dict->SetString("details", error_details);
- dict->SetBoolean("from_peer", source == quic::ConnectionCloseSource::FROM_PEER
- ? true
- : false);
+ base::DictionaryValue dict;
+ dict.SetInteger("quic_error", error);
+ dict.SetString("details", error_details);
+ dict.SetBoolean("from_peer", source == quic::ConnectionCloseSource::FROM_PEER
+ ? true
+ : false);
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogQuicCertificateVerifiedCallback(
+base::Value NetLogQuicCertificateVerifiedCallback(
scoped_refptr<X509Certificate> cert,
NetLogCaptureMode /* capture_mode */) {
// Only the subjects are logged so that we can investigate connection pooling.
// More fields could be logged in the future.
std::vector<std::string> dns_names;
cert->GetSubjectAltName(&dns_names, nullptr);
- auto dict = std::make_unique<base::DictionaryValue>();
+ base::DictionaryValue dict;
auto subjects = std::make_unique<base::ListValue>();
for (auto& dns_name : dns_names) {
subjects->GetList().emplace_back(std::move(dns_name));
}
- dict->Set("subjects", std::move(subjects));
+ dict.Set("subjects", std::move(subjects));
return std::move(dict);
}
@@ -395,9 +394,9 @@ void QuicConnectionLogger::OnFrameAddedToPacket(const quic::QuicFrame& frame) {
break;
case quic::NEW_CONNECTION_ID_FRAME:
break;
- case quic::MAX_STREAM_ID_FRAME:
+ case quic::MAX_STREAMS_FRAME:
break;
- case quic::STREAM_ID_BLOCKED_FRAME:
+ case quic::STREAMS_BLOCKED_FRAME:
break;
case quic::PATH_RESPONSE_FRAME:
break;
@@ -479,9 +478,9 @@ void QuicConnectionLogger::OnFrameAddedToPacket(const quic::QuicFrame& frame) {
break;
case quic::NEW_CONNECTION_ID_FRAME:
break;
- case quic::MAX_STREAM_ID_FRAME:
+ case quic::MAX_STREAMS_FRAME:
break;
- case quic::STREAM_ID_BLOCKED_FRAME:
+ case quic::STREAMS_BLOCKED_FRAME:
break;
case quic::PATH_RESPONSE_FRAME:
break;
@@ -543,10 +542,10 @@ void QuicConnectionLogger::OnPacketReceived(
const quic::QuicSocketAddress& peer_address,
const quic::QuicEncryptedPacket& packet) {
if (local_address_from_self_.GetFamily() == ADDRESS_FAMILY_UNSPECIFIED) {
- local_address_from_self_ = self_address.impl().socket_address();
+ local_address_from_self_ = ToIPEndPoint(self_address);
UMA_HISTOGRAM_ENUMERATION(
"Net.QuicSession.ConnectionTypeFromSelf",
- GetRealAddressFamily(self_address.impl().socket_address().address()),
+ GetRealAddressFamily(ToIPEndPoint(self_address).address()),
ADDRESS_FAMILY_LAST);
}
@@ -554,11 +553,9 @@ void QuicConnectionLogger::OnPacketReceived(
last_received_packet_size_ = packet.length();
if (!net_log_is_capturing_)
return;
- net_log_.AddEvent(
- NetLogEventType::QUIC_SESSION_PACKET_RECEIVED,
- base::Bind(&NetLogQuicPacketCallback,
- &self_address.impl().socket_address(),
- &peer_address.impl().socket_address(), packet.length()));
+ net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PACKET_RECEIVED,
+ base::Bind(&NetLogQuicPacketCallback, &self_address,
+ &peer_address, packet.length()));
}
void QuicConnectionLogger::OnUnauthenticatedHeader(
@@ -740,13 +737,13 @@ void QuicConnectionLogger::OnPingFrame(const quic::QuicPingFrame& frame) {
void QuicConnectionLogger::OnPublicResetPacket(
const quic::QuicPublicResetPacket& packet) {
UpdatePublicResetAddressMismatchHistogram(
- local_address_from_shlo_, packet.client_address.impl().socket_address());
+ local_address_from_shlo_, ToIPEndPoint(packet.client_address));
if (!net_log_is_capturing_)
return;
- net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PUBLIC_RESET_PACKET_RECEIVED,
- base::Bind(&NetLogQuicPublicResetPacketCallback,
- &local_address_from_shlo_,
- &packet.client_address.impl().socket_address()));
+ net_log_.AddEvent(
+ NetLogEventType::QUIC_SESSION_PUBLIC_RESET_PACKET_RECEIVED,
+ base::Bind(&NetLogQuicPublicResetPacketCallback,
+ &local_address_from_shlo_, &packet.client_address));
}
void QuicConnectionLogger::OnVersionNegotiationPacket(
@@ -766,7 +763,7 @@ void QuicConnectionLogger::OnCryptoHandshakeMessageReceived(
if (message.GetStringPiece(quic::kCADR, &address) &&
decoder.Decode(address.data(), address.size())) {
local_address_from_shlo_ =
- IPEndPoint(decoder.ip().impl().ip_address(), decoder.port());
+ IPEndPoint(ToIPAddress(decoder.ip()), decoder.port());
UMA_HISTOGRAM_ENUMERATION(
"Net.QuicSession.ConnectionTypeFromPeer",
GetRealAddressFamily(local_address_from_shlo_.address()),
@@ -813,8 +810,8 @@ void QuicConnectionLogger::UpdateReceivedFrameCounts(
quic::QuicStreamId stream_id,
int num_frames_received,
int num_duplicate_frames_received) {
- if (stream_id != quic::QuicUtils::GetCryptoStreamId(
- session_->connection()->transport_version())) {
+ if (!quic::QuicUtils::IsCryptoStreamId(session_->transport_version(),
+ stream_id)) {
num_frames_received_ += num_frames_received;
num_duplicate_frames_received_ += num_duplicate_frames_received;
}
diff --git a/chromium/net/quic/quic_connectivity_probing_manager.cc b/chromium/net/quic/quic_connectivity_probing_manager.cc
index 78e8461cbb3..7f335131789 100644
--- a/chromium/net/quic/quic_connectivity_probing_manager.cc
+++ b/chromium/net/quic/quic_connectivity_probing_manager.cc
@@ -9,6 +9,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/values.h"
#include "net/log/net_log.h"
+#include "net/quic/address_utils.h"
namespace net {
@@ -17,38 +18,38 @@ namespace {
// Default to 2 seconds timeout as the maximum timeout.
const int64_t kMaxProbingTimeoutMs = 2000;
-std::unique_ptr<base::Value> NetLogStartProbingCallback(
+base::Value NetLogStartProbingCallback(
NetworkChangeNotifier::NetworkHandle network,
const quic::QuicSocketAddress* peer_address,
base::TimeDelta initial_timeout,
NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetKey("network", NetLogNumberValue(network));
- dict->SetString("peer address", peer_address->ToString());
- dict->SetKey("initial_timeout_ms",
- NetLogNumberValue(initial_timeout.InMilliseconds()));
+ base::DictionaryValue dict;
+ dict.SetKey("network", NetLogNumberValue(network));
+ dict.SetString("peer address", peer_address->ToString());
+ dict.SetKey("initial_timeout_ms",
+ NetLogNumberValue(initial_timeout.InMilliseconds()));
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogProbeReceivedCallback(
+base::Value NetLogProbeReceivedCallback(
NetworkChangeNotifier::NetworkHandle network,
const IPEndPoint* self_address,
const quic::QuicSocketAddress* peer_address,
NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetKey("network", NetLogNumberValue(network));
- dict->SetString("self address", self_address->ToString());
- dict->SetString("peer address", peer_address->ToString());
+ base::DictionaryValue dict;
+ dict.SetKey("network", NetLogNumberValue(network));
+ dict.SetString("self address", self_address->ToString());
+ dict.SetString("peer address", peer_address->ToString());
return std::move(dict);
}
-std::unique_ptr<base::Value> NetLogProbingDestinationCallback(
+base::Value NetLogProbingDestinationCallback(
NetworkChangeNotifier::NetworkHandle network,
const quic::QuicSocketAddress* peer_address,
NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString("network", base::NumberToString(network));
- dict->SetString("peer address", peer_address->ToString());
+ base::DictionaryValue dict;
+ dict.SetString("network", base::NumberToString(network));
+ dict.SetString("peer address", peer_address->ToString());
return std::move(dict);
}
@@ -173,7 +174,7 @@ void QuicConnectivityProbingManager::OnConnectivityProbingReceived(
<< local_address.ToString() << ", to peer ip:port "
<< peer_address_.ToString();
- if (quic::QuicSocketAddressImpl(local_address) != self_address.impl() ||
+ if (local_address != ToIPEndPoint(self_address) ||
peer_address_ != peer_address) {
DVLOG(1) << "Received probing response from peer ip:port "
<< peer_address.ToString() << ", to self ip:port "
diff --git a/chromium/net/quic/quic_end_to_end_unittest.cc b/chromium/net/quic/quic_end_to_end_unittest.cc
index d9b9de532a6..85dabee8522 100644
--- a/chromium/net/quic/quic_end_to_end_unittest.cc
+++ b/chromium/net/quic/quic_end_to_end_unittest.cc
@@ -80,24 +80,9 @@ class TestTransactionFactory : public HttpTransactionFactory {
std::unique_ptr<HttpNetworkSession> session_;
};
-struct TestParams {
- explicit TestParams(bool use_stateless_rejects)
- : use_stateless_rejects(use_stateless_rejects) {}
-
- friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
- os << "{ use_stateless_rejects: " << p.use_stateless_rejects << " }";
- return os;
- }
- bool use_stateless_rejects;
-};
-
-std::vector<TestParams> GetTestParams() {
- return std::vector<TestParams>{TestParams(true), TestParams(false)};
-}
-
} // namespace
-class QuicEndToEndTest : public ::testing::TestWithParam<TestParams>,
+class QuicEndToEndTest : public ::testing::Test,
public WithScopedTaskEnvironment {
protected:
QuicEndToEndTest()
@@ -115,9 +100,6 @@ class QuicEndToEndTest : public ::testing::TestWithParam<TestParams>,
net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
session_params_.enable_quic = true;
- if (GetParam().use_stateless_rejects) {
- session_params_.quic_connection_options.push_back(quic::kSREJ);
- }
session_context_.quic_random = nullptr;
session_context_.host_resolver = &host_resolver_;
@@ -256,11 +238,7 @@ class QuicEndToEndTest : public ::testing::TestWithParam<TestParams>,
bool strike_register_no_startup_period_;
};
-INSTANTIATE_TEST_SUITE_P(Tests,
- QuicEndToEndTest,
- ::testing::ValuesIn(GetTestParams()));
-
-TEST_P(QuicEndToEndTest, LargeGetWithNoPacketLoss) {
+TEST_F(QuicEndToEndTest, LargeGetWithNoPacketLoss) {
std::string response(10 * 1024, 'x');
AddToCache(request_.url.PathForRequest(), 200, "OK", response);
@@ -277,9 +255,9 @@ TEST_P(QuicEndToEndTest, LargeGetWithNoPacketLoss) {
// crbug.com/559173
#if defined(THREAD_SANITIZER)
-TEST_P(QuicEndToEndTest, DISABLED_LargePostWithNoPacketLoss) {
+TEST_F(QuicEndToEndTest, DISABLED_LargePostWithNoPacketLoss) {
#else
-TEST_P(QuicEndToEndTest, LargePostWithNoPacketLoss) {
+TEST_F(QuicEndToEndTest, LargePostWithNoPacketLoss) {
#endif
InitializePostRequest(1024 * 1024);
@@ -297,9 +275,9 @@ TEST_P(QuicEndToEndTest, LargePostWithNoPacketLoss) {
// crbug.com/559173
#if defined(THREAD_SANITIZER)
-TEST_P(QuicEndToEndTest, DISABLED_LargePostWithPacketLoss) {
+TEST_F(QuicEndToEndTest, DISABLED_LargePostWithPacketLoss) {
#else
-TEST_P(QuicEndToEndTest, LargePostWithPacketLoss) {
+TEST_F(QuicEndToEndTest, LargePostWithPacketLoss) {
#endif
// FLAGS_fake_packet_loss_percentage = 30;
InitializePostRequest(1024 * 1024);
@@ -319,9 +297,9 @@ TEST_P(QuicEndToEndTest, LargePostWithPacketLoss) {
// crbug.com/536845
#if defined(THREAD_SANITIZER)
-TEST_P(QuicEndToEndTest, DISABLED_UberTest) {
+TEST_F(QuicEndToEndTest, DISABLED_UberTest) {
#else
-TEST_P(QuicEndToEndTest, UberTest) {
+TEST_F(QuicEndToEndTest, UberTest) {
#endif
// FLAGS_fake_packet_loss_percentage = 30;
diff --git a/chromium/net/quic/quic_flags_list.h b/chromium/net/quic/quic_flags_list.h
index f739eb56aca..9f68e2cf365 100644
--- a/chromium/net/quic/quic_flags_list.h
+++ b/chromium/net/quic/quic_flags_list.h
@@ -28,7 +28,7 @@ QUIC_FLAG(int64_t, FLAGS_quic_time_wait_list_max_connections, 600000)
// Enables server-side support for QUIC stateless rejects.
QUIC_FLAG(bool,
FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support,
- true)
+ false)
// If true, require handshake confirmation for QUIC connections, functionally
// disabling 0-rtt handshakes.
@@ -47,7 +47,7 @@ QUIC_FLAG(bool, FLAGS_quic_enforce_single_packet_chlo, true)
// connection.
QUIC_FLAG(bool,
FLAGS_quic_reloadable_flag_quic_use_cheap_stateless_rejects,
- true)
+ false)
// If true, allows packets to be buffered in anticipation of a future CHLO, and
// allow CHLO packets to be buffered until next iteration of the event loop.
@@ -64,6 +64,11 @@ QUIC_FLAG(double, FLAGS_quic_bbr_cwnd_gain, 2.0f)
// reordering window for every spurious retransmit.
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_adaptive_time_loss, false)
+// If true, adjust congestion window when doing bandwidth resumption in BBR.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_fix_bbr_cwnd_in_bandwidth_resumption,
+ true)
+
// When true, defaults to BBR congestion control instead of Cubic.
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_default_to_bbr, false)
@@ -79,10 +84,7 @@ QUIC_FLAG(uint32_t, FLAGS_quic_send_buffer_max_data_slice_size, 4096u)
QUIC_FLAG(bool, FLAGS_quic_supports_tls_handshake, false)
// Allow QUIC to accept initial packet numbers that are random, not 1.
-QUIC_FLAG(bool, FLAGS_quic_restart_flag_quic_enable_accept_random_ipn, false)
-
-// If true, enable QUIC v43.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_43, true)
+QUIC_FLAG(bool, FLAGS_quic_restart_flag_quic_enable_accept_random_ipn, true)
// Enables 3 new connection options to make PROBE_RTT more aggressive
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_less_probe_rtt, false)
@@ -101,6 +103,12 @@ QUIC_FLAG(int32_t, FLAGS_quic_lumpy_pacing_size, 1)
// pacing.
QUIC_FLAG(double, FLAGS_quic_lumpy_pacing_cwnd_fraction, 0.25f)
+// If true, static streams in a QuicSession will be stored inside dynamic
+// stream map. static_stream_map will no longer be used.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_eliminate_static_stream_map_3,
+ false)
+
// Default enables QUIC ack decimation and adds a connection option to disable
// it.
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_ack_decimation, false)
@@ -115,9 +123,7 @@ QUIC_FLAG(int32_t, FLAGS_quic_max_pace_time_into_future_ms, 10)
QUIC_FLAG(double, FLAGS_quic_pace_time_into_future_srtt_fraction, 0.125f)
// Mechanism to override version label and ALPN for IETF interop.
-QUIC_FLAG(int32_t, // allow-non-std-int
- FLAGS_quic_ietf_draft_version,
- 0)
+QUIC_FLAG(int32_t, FLAGS_quic_ietf_draft_version, 0)
// If true, enable QUIC v44.
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_44, true)
@@ -145,7 +151,7 @@ QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_one_mss_conservation, false)
// Add 3 connection options to decrease the pacing and CWND gain in QUIC BBR
// STARTUP.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_slower_startup3, false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_slower_startup3, true)
// When true, the LOSS connection option allows for 1/8 RTT of reording instead
// of the current 1/8th threshold which has been found to be too large for fast
@@ -190,7 +196,7 @@ QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_send_timestamps, false)
// connection, such that version negotiation is not supported in connection.
QUIC_FLAG(bool,
FLAGS_quic_restart_flag_quic_no_server_conn_ver_negotiation2,
- false)
+ true)
// If true, enable QUIC version 46.
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_46, true)
@@ -206,6 +212,13 @@ QUIC_FLAG(
// allocated.
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_common_stream_check, false)
+// When true, remove packets from inflight where they're declared lost,
+// rather than in MarkForRetransmission. Also no longer marks handshake
+// packets as no longer inflight when they're retransmitted.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_loss_removes_from_inflight,
+ false)
+
// If true, QuicEpollClock::Now() will monotonically increase.
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_monotonic_epoll_clock, false)
@@ -225,12 +238,6 @@ QUIC_FLAG(bool,
FLAGS_quic_reloadable_flag_quic_bbr_startup_rate_reduction,
false)
-// If true, QuicPacketCreator::SetTransmissionType will set the transmission
-// type of the next successfully added frame.
-QUIC_FLAG(bool,
- FLAGS_quic_reloadable_flag_quic_set_transmission_type_for_next_frame,
- true)
-
// If true, log leaf cert subject name into warning log.
QUIC_FLAG(bool,
FLAGS_quic_reloadable_flag_quic_log_cert_name_for_empty_sct,
@@ -243,20 +250,14 @@ QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_47, false)
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_disable_version_39, false)
// If true, use one loss algorithm per encryption level.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_uber_loss_algorithm, false)
-
-// When true, QuicFramer will use AppendIetfConnectionIdsNew instead of
-// AppendIetfConnectionId.
-QUIC_FLAG(bool,
- FLAGS_quic_reloadable_flag_quic_use_new_append_connection_id,
- false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_uber_loss_algorithm, true)
// If true, QuicStreamSequencerBuffer will switch to a new
// QuicIntervalSet::AddOptimizedForAppend method in OnStreamData().
QUIC_FLAG(
bool,
FLAGS_quic_reloadable_flag_quic_faster_interval_add_in_sequence_buffer,
- false)
+ true)
// If true, GFE time wait list will send termination packets based on current
// packet's encryption level.
@@ -266,34 +267,28 @@ QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_termination_packets, true)
// from QuicConnection.
QUIC_FLAG(bool,
FLAGS_quic_reloadable_flag_quic_deprecate_ack_bundling_mode,
- false)
+ true)
// If both this flag and gfe2_reloadable_flag_quic_deprecate_ack_bundling_mode
// are true, QuicReceivedPacketManager decides when to send ACKs.
QUIC_FLAG(bool,
FLAGS_quic_reloadable_flag_quic_rpm_decides_when_to_send_acks,
- false)
-
-// If true, instead of send encryption none termination packets, send stateless
-// reset in reponse to short headers.
-QUIC_FLAG(bool,
- FLAGS_quic_reloadable_flag_quic_always_reset_short_header_packets,
true)
// In QUIC, do not close connection if received an in-order ACK with decreased
// largest_acked.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_tolerate_reneging, false)
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_tolerate_reneging, true)
QUIC_FLAG(
bool,
FLAGS_quic_reloadable_flag_quic_validate_packet_number_post_decryption,
- false)
+ true)
// If this flag and quic_rpm_decides_when_to_send_acks is true, use uber
// received packet manager instead of the single received packet manager.
QUIC_FLAG(bool,
FLAGS_quic_reloadable_flag_quic_use_uber_received_packet_manager,
- false)
+ true)
// If true and using Leto for QUIC shared-key calculations, GFE will react to a
// failure to contact Leto by sending a REJ containing a fallback ServerConfig,
@@ -328,3 +323,63 @@ QUIC_FLAG(bool,
// If true, non-ASCII QUIC tags are printed as hex instead of integers."
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_print_tag_hex, false)
+
+// If true, terminate Google QUIC connections similary as IETF QUIC.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_terminate_gquic_connection_as_ietf,
+ true)
+
+// If true, disable QUIC trial decryption in V44 and above.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_v44_disable_trial_decryption,
+ false)
+
+// In v44 and above, where STOP_WAITING is never sent, close the connection if
+// it's received.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_do_not_accept_stop_waiting,
+ false)
+
+// If true, deprecate queued_control_frames_ from QuicPacketGenerator.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_deprecate_queued_control_frames,
+ false)
+
+// When true, QUIC server will drop IETF QUIC Version Negotiation packets.
+QUIC_FLAG(bool,
+ FLAGS_quic_restart_flag_quic_server_drop_version_negotiation,
+ false)
+
+// When true, version negotiation packets sent by the server will set the fixed
+// bit.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_send_version_negotiation_fixed_bit,
+ false)
+
+// When true, allow variable length QUIC connection IDs for unsupported
+// versions. This allows performing version negotiation when the client-chosen
+// server connection ID length is not 8.
+QUIC_FLAG(
+ bool,
+ FLAGS_quic_restart_flag_quic_allow_variable_length_connection_id_for_negotiation,
+ false)
+
+// If true, set burst token to 2 in cwnd bootstrapping experiment.
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_conservative_bursts, false)
+
+// If true, make QuicDispatcher no longer have an instance of QuicFramer.
+QUIC_FLAG(bool,
+ FLAGS_quic_restart_flag_quic_no_framer_object_in_dispatcher,
+ false)
+
+// When true, QuicFramer will not override connection IDs in headers and will
+// instead respect the source/destination direction as expected by IETF QUIC.
+QUIC_FLAG(bool,
+ FLAGS_quic_restart_flag_quic_do_not_override_connection_id,
+ false)
+
+// Do not send STOP_WAITING if no_stop_waiting_frame_ is true.
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_simplify_stop_waiting, false)
+
+// If true, export number of packets written per write operation histogram.")
+QUIC_FLAG(bool, FLAGS_quic_export_server_num_packets_per_write_histogram, false)
diff --git a/chromium/net/quic/quic_http_stream.cc b/chromium/net/quic/quic_http_stream.cc
index 265847a6e31..740f2298f8e 100644
--- a/chromium/net/quic/quic_http_stream.cc
+++ b/chromium/net/quic/quic_http_stream.cc
@@ -8,7 +8,6 @@
#include "base/auto_reset.h"
#include "base/bind.h"
-#include "base/callback_helpers.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/string_split.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -35,13 +34,12 @@ namespace net {
namespace {
-std::unique_ptr<base::Value> NetLogQuicPushStreamCallback(
- quic::QuicStreamId stream_id,
- const GURL* url,
- NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetInteger("stream_id", stream_id);
- dict->SetString("url", url->spec());
+base::Value NetLogQuicPushStreamCallback(quic::QuicStreamId stream_id,
+ const GURL* url,
+ NetLogCaptureMode capture_mode) {
+ base::DictionaryValue dict;
+ dict.SetInteger("stream_id", stream_id);
+ dict.SetString("url", url->spec());
return std::move(dict);
}
@@ -94,6 +92,8 @@ HttpResponseInfo::ConnectionInfo QuicHttpStream::ConnectionInfoFromQuicVersion(
return HttpResponseInfo::CONNECTION_INFO_QUIC_47;
case quic::QUIC_VERSION_99:
return HttpResponseInfo::CONNECTION_INFO_QUIC_99;
+ case quic::QUIC_VERSION_RESERVED_FOR_NEGOTIATION:
+ return HttpResponseInfo::CONNECTION_INFO_QUIC_999;
}
NOTREACHED();
return HttpResponseInfo::CONNECTION_INFO_QUIC_UNKNOWN_VERSION;
@@ -456,7 +456,7 @@ void QuicHttpStream::DoCallback(int rv) {
// The client callback can do anything, including destroying this class,
// so any pending callback must be issued after everything else is done.
- base::ResetAndReturn(&callback_).Run(MapStreamError(rv));
+ std::move(callback_).Run(MapStreamError(rv));
}
int QuicHttpStream::DoLoop(int rv) {
diff --git a/chromium/net/quic/quic_http_stream_test.cc b/chromium/net/quic/quic_http_stream_test.cc
index b2e826e51ac..51384856d78 100644
--- a/chromium/net/quic/quic_http_stream_test.cc
+++ b/chromium/net/quic/quic_http_stream_test.cc
@@ -171,7 +171,7 @@ class QuicHttpStreamPeer {
};
class QuicHttpStreamTest : public ::testing::TestWithParam<
- std::tuple<quic::QuicTransportVersion, bool>>,
+ std::tuple<quic::ParsedQuicVersion, bool>>,
public WithScopedTaskEnvironment {
public:
void CloseStream(QuicHttpStream* stream, int /*rv*/) { stream->Close(false); }
@@ -296,9 +296,8 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<
alarm_factory_.reset(new QuicChromiumAlarmFactory(runner_.get(), &clock_));
connection_ = new TestQuicConnection(
- quic::test::SupportedVersions(
- quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, version_)),
- connection_id_, peer_addr_, helper_.get(), alarm_factory_.get(),
+ quic::test::SupportedVersions(version_), connection_id_, peer_addr_,
+ helper_.get(), alarm_factory_.get(),
new QuicChromiumPacketWriter(
socket.get(), base::ThreadTaskRunnerHandle::Get().get()));
connection_->set_visitor(&visitor_);
@@ -639,7 +638,7 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<
}
std::string ConstructDataHeader(size_t body_len) {
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
return "";
}
quic::HttpEncoder encoder;
@@ -670,14 +669,16 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<
}
quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
- return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+ return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+ version_.transport_version, n);
}
quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
- return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
+ return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
+ version_.transport_version, n);
}
- const quic::QuicTransportVersion version_;
+ const quic::ParsedQuicVersion version_;
const bool client_headers_include_h2_stream_dependency_;
BoundTestNetLog net_log_;
@@ -729,9 +730,8 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<
INSTANTIATE_TEST_SUITE_P(
VersionIncludeStreamDependencySequence,
QuicHttpStreamTest,
- ::testing::Combine(
- ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
- ::testing::Bool()));
+ ::testing::Combine(::testing::ValuesIn(quic::AllVersionsExcept99()),
+ ::testing::Bool()));
TEST_P(QuicHttpStreamTest, RenewStreamForAuth) {
Initialize();
@@ -1245,7 +1245,7 @@ TEST_P(QuicHttpStreamTest, SendPostRequest) {
AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
std::string header = ConstructDataHeader(strlen(kUploadData));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
AddWrite(ConstructRequestHeadersAndDataFramesPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, kFin,
DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1326,7 +1326,7 @@ TEST_P(QuicHttpStreamTest, SendPostRequestAndReceiveSoloFin) {
quic::QuicStreamOffset header_stream_offset = 0;
AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
std::string header = ConstructDataHeader(strlen(kUploadData));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
AddWrite(ConstructRequestHeadersAndDataFramesPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion, kFin,
DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1410,7 +1410,7 @@ TEST_P(QuicHttpStreamTest, SendChunkedPostRequest) {
quic::QuicStreamOffset header_stream_offset = 0;
AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
std::string header = ConstructDataHeader(chunk_size);
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
AddWrite(ConstructRequestHeadersAndDataFramesPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
!kFin, DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1497,7 +1497,7 @@ TEST_P(QuicHttpStreamTest, SendChunkedPostRequestWithFinalEmptyDataPacket) {
AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
std::string header = ConstructDataHeader(chunk_size);
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
AddWrite(ConstructRequestHeadersAndDataFramesPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
!kFin, DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1734,7 +1734,7 @@ TEST_P(QuicHttpStreamTest, SessionClosedDuringDoLoop) {
quic::QuicStreamOffset header_stream_offset = 0;
AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
std::string header = ConstructDataHeader(strlen(kUploadData));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
AddWrite(ConstructRequestHeadersAndDataFramesPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
!kFin, DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -1895,7 +1895,7 @@ TEST_P(QuicHttpStreamTest, SessionClosedBeforeSendBundledBodyComplete) {
quic::QuicStreamOffset header_stream_offset = 0;
AddWrite(ConstructInitialSettingsPacket(&header_stream_offset));
std::string header = ConstructDataHeader(strlen(kUploadData));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
AddWrite(ConstructRequestHeadersAndDataFramesPacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), kIncludeVersion,
!kFin, DEFAULT_PRIORITY, 0, &header_stream_offset,
@@ -2312,16 +2312,16 @@ TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) {
uint64_t client_packet_number = 2;
if (client_headers_include_h2_stream_dependency_ &&
- version_ >= quic::QUIC_VERSION_43) {
+ version_.transport_version >= quic::QUIC_VERSION_43) {
AddWrite(ConstructClientPriorityPacket(
client_packet_number++, kIncludeVersion, promise_id_, 0,
DEFAULT_PRIORITY, &header_stream_offset));
}
AddWrite(ConstructClientRstStreamVaryMismatchAndRequestHeadersPacket(
client_packet_number++,
- stream_id_ + quic::QuicUtils::StreamIdDelta(version_), !kIncludeVersion,
- kFin, DEFAULT_PRIORITY, promise_id_, &spdy_request_header_frame_length,
- &header_stream_offset));
+ stream_id_ + quic::QuicUtils::StreamIdDelta(version_.transport_version),
+ !kIncludeVersion, kFin, DEFAULT_PRIORITY, promise_id_,
+ &spdy_request_header_frame_length, &header_stream_offset));
AddWrite(ConstructClientAckPacket(client_packet_number++, 3, 1, 2));
AddWrite(ConstructClientRstStreamCancelledPacket(client_packet_number++));
@@ -2381,7 +2381,7 @@ TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) {
EXPECT_EQ(
QuicHttpStreamPeer::GetQuicChromiumClientStream(promised_stream_.get())
->id(),
- stream_id_ + quic::QuicUtils::StreamIdDelta(version_));
+ stream_id_ + quic::QuicUtils::StreamIdDelta(version_.transport_version));
// After rendezvous failure, the push stream has been cancelled.
EXPECT_EQ(session_->GetPromisedByUrl(promise_url_), nullptr);
@@ -2395,8 +2395,9 @@ TEST_P(QuicHttpStreamTest, ServerPushVaryCheckFail) {
SetResponse("404 Not Found", string());
size_t spdy_response_header_frame_length;
ProcessPacket(InnerConstructResponseHeadersPacket(
- 3, stream_id_ + quic::QuicUtils::StreamIdDelta(version_), kFin,
- &spdy_response_header_frame_length));
+ 3,
+ stream_id_ + quic::QuicUtils::StreamIdDelta(version_.transport_version),
+ kFin, &spdy_response_header_frame_length));
base::RunLoop().RunUntilIdle();
diff --git a/chromium/net/quic/quic_http_utils.cc b/chromium/net/quic/quic_http_utils.cc
index 4245e685c44..1f1f2762c80 100644
--- a/chromium/net/quic/quic_http_utils.cc
+++ b/chromium/net/quic/quic_http_utils.cc
@@ -36,31 +36,39 @@ RequestPriority ConvertQuicPriorityToRequestPriority(
: static_cast<RequestPriority>(HIGHEST - priority);
}
-std::unique_ptr<base::Value> QuicRequestNetLogCallback(
- quic::QuicStreamId stream_id,
- const spdy::SpdyHeaderBlock* headers,
- spdy::SpdyPriority priority,
- NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(
- static_cast<base::DictionaryValue*>(
- SpdyHeaderBlockNetLogCallback(headers, capture_mode).release()));
- dict->SetInteger("quic_priority", static_cast<int>(priority));
- dict->SetInteger("quic_stream_id", static_cast<int>(stream_id));
- return std::move(dict);
+base::Value QuicRequestNetLogCallback(quic::QuicStreamId stream_id,
+ const spdy::SpdyHeaderBlock* headers,
+ spdy::SpdyPriority priority,
+ NetLogCaptureMode capture_mode) {
+ base::Value dict = SpdyHeaderBlockNetLogCallback(headers, capture_mode);
+ DCHECK(dict.is_dict());
+ dict.SetIntKey("quic_priority", static_cast<int>(priority));
+ dict.SetIntKey("quic_stream_id", static_cast<int>(stream_id));
+ return dict;
}
-quic::QuicTransportVersionVector FilterSupportedAltSvcVersions(
+base::Value QuicResponseNetLogCallback(quic::QuicStreamId stream_id,
+ bool fin_received,
+ const spdy::SpdyHeaderBlock* headers,
+ NetLogCaptureMode capture_mode) {
+ base::Value dict = SpdyHeaderBlockNetLogCallback(headers, capture_mode);
+ dict.SetIntKey("quic_stream_id", static_cast<int>(stream_id));
+ dict.SetBoolKey("fin", fin_received);
+ return dict;
+}
+
+quic::ParsedQuicVersionVector FilterSupportedAltSvcVersions(
const spdy::SpdyAltSvcWireFormat::AlternativeService& quic_alt_svc,
- const quic::QuicTransportVersionVector& supported_versions,
+ const quic::ParsedQuicVersionVector& supported_versions,
bool support_ietf_format_quic_altsvc) {
- quic::QuicTransportVersionVector supported_alt_svc_versions;
+ quic::ParsedQuicVersionVector supported_alt_svc_versions;
if (support_ietf_format_quic_altsvc && quic_alt_svc.protocol_id == "hq") {
// Using IETF format for advertising QUIC. In this case,
// |alternative_service_entry.version| will store QUIC version labels.
for (uint32_t quic_version_label : quic_alt_svc.version) {
- for (quic::QuicTransportVersion supported : supported_versions) {
+ for (quic::ParsedQuicVersion supported : supported_versions) {
quic::QuicVersionLabel supported_version_label_network_order =
- QuicVersionToQuicVersionLabel(supported);
+ CreateQuicVersionLabel(supported);
if (supported_version_label_network_order == quic_version_label) {
supported_alt_svc_versions.push_back(supported);
RecordAltSvcFormat(IETF_FORMAT);
@@ -69,8 +77,9 @@ quic::QuicTransportVersionVector FilterSupportedAltSvcVersions(
}
} else if (quic_alt_svc.protocol_id == "quic") {
for (uint32_t quic_version : quic_alt_svc.version) {
- for (quic::QuicTransportVersion supported : supported_versions) {
- if (static_cast<uint32_t>(supported) == quic_version) {
+ for (quic::ParsedQuicVersion supported : supported_versions) {
+ if (static_cast<uint32_t>(supported.transport_version) ==
+ quic_version) {
supported_alt_svc_versions.push_back(supported);
RecordAltSvcFormat(GOOGLE_FORMAT);
}
diff --git a/chromium/net/quic/quic_http_utils.h b/chromium/net/quic/quic_http_utils.h
index 31a99de1dca..3fe19fcce64 100644
--- a/chromium/net/quic/quic_http_utils.h
+++ b/chromium/net/quic/quic_http_utils.h
@@ -21,18 +21,26 @@ NET_EXPORT_PRIVATE spdy::SpdyPriority ConvertRequestPriorityToQuicPriority(
NET_EXPORT_PRIVATE RequestPriority
ConvertQuicPriorityToRequestPriority(spdy::SpdyPriority priority);
-// Converts a spdy::SpdyHeaderBlock and priority into NetLog event parameters.
-NET_EXPORT std::unique_ptr<base::Value> QuicRequestNetLogCallback(
+// Converts a spdy::SpdyHeaderBlock, stream_id and priority into NetLog event
+// parameters.
+NET_EXPORT base::Value QuicRequestNetLogCallback(
quic::QuicStreamId stream_id,
const spdy::SpdyHeaderBlock* headers,
spdy::SpdyPriority priority,
NetLogCaptureMode capture_mode);
-// Parses |alt_svc_versions| into a quic::QuicTransportVersionVector and removes
+// Converts a spdy::SpdyHeaderBlock and stream into NetLog event parameters.
+NET_EXPORT base::Value QuicResponseNetLogCallback(
+ quic::QuicStreamId stream_id,
+ bool fin_received,
+ const spdy::SpdyHeaderBlock* headers,
+ NetLogCaptureMode capture_mode);
+
+// Parses |alt_svc_versions| into a quic::ParsedQuicVersionVector and removes
// all entries that aren't found in |supported_versions|.
-NET_EXPORT quic::QuicTransportVersionVector FilterSupportedAltSvcVersions(
+NET_EXPORT quic::ParsedQuicVersionVector FilterSupportedAltSvcVersions(
const spdy::SpdyAltSvcWireFormat::AlternativeService& quic_alt_svc,
- const quic::QuicTransportVersionVector& supported_versions,
+ const quic::ParsedQuicVersionVector& supported_versions,
bool support_ietf_format_quic_altsvc);
} // namespace net
diff --git a/chromium/net/quic/quic_http_utils_test.cc b/chromium/net/quic/quic_http_utils_test.cc
index 2d070e2ad5c..8a92955fa74 100644
--- a/chromium/net/quic/quic_http_utils_test.cc
+++ b/chromium/net/quic/quic_http_utils_test.cc
@@ -12,6 +12,9 @@
#include "net/third_party/quiche/src/spdy/core/spdy_alt_svc_wire_format.h"
#include "testing/gtest/include/gtest/gtest.h"
+using quic::ParsedQuicVersion;
+using quic::PROTOCOL_QUIC_CRYPTO;
+
namespace net {
namespace test {
@@ -38,8 +41,10 @@ TEST(QuicHttpUtilsTest, ConvertQuicPriorityToRequestPriority) {
}
TEST(QuicHttpUtilsTest, FilterSupportedAltSvcVersions) {
- quic::QuicTransportVersionVector supported_versions = {
- quic::QUIC_VERSION_46, quic::QUIC_VERSION_39, quic::QUIC_VERSION_44};
+ quic::ParsedQuicVersionVector supported_versions = {
+ ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_46),
+ ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_39),
+ ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_44)};
std::vector<uint32_t> alt_svc_versions_google = {quic::QUIC_VERSION_44,
quic::QUIC_VERSION_43};
@@ -47,8 +52,8 @@ TEST(QuicHttpUtilsTest, FilterSupportedAltSvcVersions) {
QuicVersionToQuicVersionLabel(quic::QUIC_VERSION_44),
QuicVersionToQuicVersionLabel(quic::QUIC_VERSION_43)};
- quic::QuicTransportVersionVector supported_alt_svc_versions = {
- quic::QUIC_VERSION_44};
+ quic::ParsedQuicVersionVector supported_alt_svc_versions = {
+ ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_44)};
spdy::SpdyAltSvcWireFormat::AlternativeService altsvc;
altsvc.protocol_id = "quic";
@@ -62,14 +67,14 @@ TEST(QuicHttpUtilsTest, FilterSupportedAltSvcVersions) {
altsvc.version = alt_svc_versions_ietf;
EXPECT_EQ(supported_alt_svc_versions,
FilterSupportedAltSvcVersions(altsvc, supported_versions, true));
- EXPECT_EQ(quic::QuicTransportVersionVector(),
+ EXPECT_EQ(quic::ParsedQuicVersionVector(),
FilterSupportedAltSvcVersions(altsvc, supported_versions, false));
altsvc.protocol_id = "invalid_protocol";
altsvc.version = alt_svc_versions_ietf;
- EXPECT_EQ(quic::QuicTransportVersionVector(),
+ EXPECT_EQ(quic::ParsedQuicVersionVector(),
FilterSupportedAltSvcVersions(altsvc, supported_versions, true));
- EXPECT_EQ(quic::QuicTransportVersionVector(),
+ EXPECT_EQ(quic::ParsedQuicVersionVector(),
FilterSupportedAltSvcVersions(altsvc, supported_versions, false));
}
diff --git a/chromium/net/quic/quic_network_transaction_unittest.cc b/chromium/net/quic/quic_network_transaction_unittest.cc
index 17f9ac870e2..ca519c5d65c 100644
--- a/chromium/net/quic/quic_network_transaction_unittest.cc
+++ b/chromium/net/quic/quic_network_transaction_unittest.cc
@@ -119,7 +119,7 @@ const char kDifferentHostname[] = "different.example.com";
struct PoolingTestParams {
friend std::ostream& operator<<(std::ostream& os,
const PoolingTestParams& p) {
- os << "{ version: " << QuicVersionToString(p.version)
+ os << "{ version: " << ParsedQuicVersionToString(p.version)
<< ", destination_type: ";
switch (p.destination_type) {
case SAME_AS_FIRST:
@@ -138,27 +138,27 @@ struct PoolingTestParams {
return os;
}
- quic::QuicTransportVersion version;
+ quic::ParsedQuicVersion version;
DestinationType destination_type;
bool client_headers_include_h2_stream_dependency;
};
std::string GenerateQuicVersionsListForAltSvcHeader(
- const quic::QuicTransportVersionVector& versions) {
+ const quic::ParsedQuicVersionVector& versions) {
std::string result = "";
- for (const quic::QuicTransportVersion& version : versions) {
+ for (const quic::ParsedQuicVersion& version : versions) {
if (!result.empty())
result.append(",");
- result.append(base::NumberToString(version));
+ result.append(base::NumberToString(version.transport_version));
}
return result;
}
std::vector<PoolingTestParams> GetPoolingTestParams() {
std::vector<PoolingTestParams> params;
- quic::QuicTransportVersionVector all_supported_versions =
- quic::AllSupportedTransportVersions();
- for (const quic::QuicTransportVersion version : all_supported_versions) {
+ quic::ParsedQuicVersionVector all_supported_versions =
+ quic::AllVersionsExcept99();
+ for (const quic::ParsedQuicVersion version : all_supported_versions) {
params.push_back(PoolingTestParams{version, SAME_AS_FIRST, false});
params.push_back(PoolingTestParams{version, SAME_AS_FIRST, true});
params.push_back(PoolingTestParams{version, SAME_AS_SECOND, false});
@@ -256,13 +256,13 @@ class TestSocketPerformanceWatcherFactory
class QuicNetworkTransactionTest
: public PlatformTest,
public ::testing::WithParamInterface<
- std::tuple<quic::QuicTransportVersion, bool>>,
+ std::tuple<quic::ParsedQuicVersion, bool>>,
public WithScopedTaskEnvironment {
protected:
QuicNetworkTransactionTest()
: version_(std::get<0>(GetParam())),
client_headers_include_h2_stream_dependency_(std::get<1>(GetParam())),
- supported_versions_(quic::test::SupportedTransportVersions(version_)),
+ supported_versions_(quic::test::SupportedVersions(version_)),
random_generator_(0),
client_maker_(
version_,
@@ -278,6 +278,7 @@ class QuicNetworkTransactionTest
kDefaultServerHostName,
quic::Perspective::IS_SERVER,
false),
+ quic_task_runner_(new TestTaskRunner(&clock_)),
cert_transparency_verifier_(new MultiLogCTVerifier()),
ssl_config_service_(new SSLConfigServiceDefaults),
proxy_resolution_service_(ProxyResolutionService::CreateDirect()),
@@ -675,7 +676,7 @@ class QuicNetworkTransactionTest
}
std::string ConstructDataHeader(size_t body_len) {
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
return "";
}
quic::HttpEncoder encoder;
@@ -684,8 +685,7 @@ class QuicNetworkTransactionTest
return std::string(buffer.get(), header_length);
}
- void CreateSession(
- const quic::QuicTransportVersionVector& supported_versions) {
+ void CreateSession(const quic::ParsedQuicVersionVector& supported_versions) {
session_params_.enable_quic = true;
session_params_.quic_supported_versions = supported_versions;
session_params_.quic_headers_include_h2_stream_dependency =
@@ -725,7 +725,8 @@ class QuicNetworkTransactionTest
EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
EXPECT_TRUE(response->was_fetched_via_spdy);
EXPECT_TRUE(response->was_alpn_negotiated);
- EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(version_),
+ EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(
+ version_.transport_version),
response->connection_info);
}
@@ -935,11 +936,13 @@ class QuicNetworkTransactionTest
}
quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
- return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+ return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+ version_.transport_version, n);
}
quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
- return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
+ return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
+ version_.transport_version, n);
}
static void AddCertificate(SSLSocketDataProvider* ssl_data) {
@@ -948,14 +951,15 @@ class QuicNetworkTransactionTest
ASSERT_TRUE(ssl_data->ssl_info.cert);
}
- const quic::QuicTransportVersion version_;
+ const quic::ParsedQuicVersion version_;
const bool client_headers_include_h2_stream_dependency_;
- quic::QuicTransportVersionVector supported_versions_;
+ quic::ParsedQuicVersionVector supported_versions_;
QuicFlagSaver flags_; // Save/restore all QUIC flag values.
quic::MockClock clock_;
quic::test::MockRandom random_generator_;
QuicTestPacketMaker client_maker_;
QuicTestPacketMaker server_maker_;
+ scoped_refptr<TestTaskRunner> quic_task_runner_;
std::unique_ptr<HttpNetworkSession> session_;
MockClientSocketFactory socket_factory_;
ProofVerifyDetailsChromium verify_details_;
@@ -1004,9 +1008,8 @@ class QuicNetworkTransactionTest
INSTANTIATE_TEST_SUITE_P(
VersionIncludeStreamDependencySequence,
QuicNetworkTransactionTest,
- ::testing::Combine(
- ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
- ::testing::Bool()));
+ ::testing::Combine(::testing::ValuesIn(quic::AllVersionsExcept99()),
+ ::testing::Bool()));
TEST_P(QuicNetworkTransactionTest, WriteErrorHandshakeConfirmed) {
session_params_.retry_without_alt_svc_on_quic_errors = false;
@@ -1213,7 +1216,7 @@ TEST_P(QuicNetworkTransactionTest, ForceQuic) {
int log_stream_id;
ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id));
- EXPECT_EQ(quic::QuicUtils::GetHeadersStreamId(version_),
+ EXPECT_EQ(quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
static_cast<quic::QuicStreamId>(log_stream_id));
}
@@ -1251,10 +1254,12 @@ TEST_P(QuicNetworkTransactionTest, LargeResponseHeaders) {
for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
size_t len = std::min(chunk_size, spdy_frame.size() - offset);
mock_quic_data.AddRead(
- ASYNC, ConstructServerDataPacket(
- packet_number++,
- quic::QuicUtils::GetHeadersStreamId(version_), false, false,
- offset, base::StringPiece(spdy_frame.data() + offset, len)));
+ ASYNC,
+ ConstructServerDataPacket(
+ packet_number++,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, offset,
+ base::StringPiece(spdy_frame.data() + offset, len)));
}
std::string header = ConstructDataHeader(6);
@@ -1272,6 +1277,8 @@ TEST_P(QuicNetworkTransactionTest, LargeResponseHeaders) {
CreateSession();
SendRequestAndExpectQuicResponse("hello!");
+ EXPECT_TRUE(mock_quic_data.AllReadDataConsumed());
+ EXPECT_TRUE(mock_quic_data.AllWriteDataConsumed());
}
TEST_P(QuicNetworkTransactionTest, TooLargeResponseHeaders) {
@@ -1310,10 +1317,12 @@ TEST_P(QuicNetworkTransactionTest, TooLargeResponseHeaders) {
for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
size_t len = std::min(chunk_size, spdy_frame.size() - offset);
mock_quic_data.AddRead(
- ASYNC, ConstructServerDataPacket(
- packet_number++,
- quic::QuicUtils::GetHeadersStreamId(version_), false, false,
- offset, base::StringPiece(spdy_frame.data() + offset, len)));
+ ASYNC,
+ ConstructServerDataPacket(
+ packet_number++,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, offset,
+ base::StringPiece(spdy_frame.data() + offset, len)));
}
std::string header = ConstructDataHeader(6);
@@ -1523,12 +1532,10 @@ TEST_P(QuicNetworkTransactionTest, AlternativeServicesDifferentHost) {
}
TEST_P(QuicNetworkTransactionTest, DoNotUseQuicForUnsupportedVersion) {
- quic::QuicTransportVersion unsupported_version =
- quic::QUIC_VERSION_UNSUPPORTED;
+ quic::ParsedQuicVersion unsupported_version = quic::UnsupportedQuicVersion();
// Add support for another QUIC version besides |version_|. Also find a
// unsupported version.
- for (const quic::QuicTransportVersion& version :
- quic::AllSupportedTransportVersions()) {
+ for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
if (version == version_)
continue;
if (supported_versions_.size() != 2) {
@@ -1538,7 +1545,7 @@ TEST_P(QuicNetworkTransactionTest, DoNotUseQuicForUnsupportedVersion) {
unsupported_version = version;
break;
}
- DCHECK_NE(unsupported_version, quic::QUIC_VERSION_UNSUPPORTED);
+ DCHECK_NE(unsupported_version, quic::UnsupportedQuicVersion());
// Set up alternative service to use QUIC with a version that is not
// supported.
@@ -1562,8 +1569,7 @@ TEST_P(QuicNetworkTransactionTest, DoNotUseQuicForUnsupportedVersion) {
// the response from the server will advertise new Alt-Svc with supported
// versions.
std::string advertised_versions_list_str =
- GenerateQuicVersionsListForAltSvcHeader(
- quic::AllSupportedTransportVersions());
+ GenerateQuicVersionsListForAltSvcHeader(quic::AllSupportedVersions());
std::string altsvc_header =
base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%s\"\r\n\r\n",
advertised_versions_list_str.c_str());
@@ -1618,7 +1624,11 @@ TEST_P(QuicNetworkTransactionTest, DoNotUseQuicForUnsupportedVersion) {
EXPECT_EQ(kProtoQUIC, alt_svc_info_vector[0].alternative_service().protocol);
EXPECT_EQ(2u, alt_svc_info_vector[0].advertised_versions().size());
// Advertised versions will be lised in a sorted order.
- std::sort(supported_versions_.begin(), supported_versions_.end());
+ std::sort(
+ supported_versions_.begin(), supported_versions_.end(),
+ [](const quic::ParsedQuicVersion& a, const quic::ParsedQuicVersion& b) {
+ return a.transport_version < b.transport_version;
+ });
EXPECT_EQ(supported_versions_[0],
alt_svc_info_vector[0].advertised_versions()[0]);
EXPECT_EQ(supported_versions_[1],
@@ -1813,10 +1823,8 @@ TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceWithVersionForQuic1) {
// Add support for another QUIC version besides |version_| on the client side.
// Also find a different version advertised by the server.
- quic::QuicTransportVersion advertised_version_2 =
- quic::QUIC_VERSION_UNSUPPORTED;
- for (const quic::QuicTransportVersion& version :
- quic::AllSupportedTransportVersions()) {
+ quic::ParsedQuicVersion advertised_version_2 = quic::UnsupportedQuicVersion();
+ for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
if (version == version_)
continue;
if (supported_versions_.size() != 2) {
@@ -1826,11 +1834,11 @@ TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceWithVersionForQuic1) {
advertised_version_2 = version;
break;
}
- DCHECK_NE(advertised_version_2, quic::QUIC_VERSION_UNSUPPORTED);
+ DCHECK_NE(advertised_version_2, quic::UnsupportedQuicVersion());
- std::string QuicAltSvcWithVersionHeader =
- base::StringPrintf("Alt-Svc: quic=\":443\";v=\"%d,%d\"\r\n\r\n",
- advertised_version_2, version_);
+ std::string QuicAltSvcWithVersionHeader = base::StringPrintf(
+ "Alt-Svc: quic=\":443\";v=\"%d,%d\"\r\n\r\n",
+ advertised_version_2.transport_version, version_.transport_version);
MockRead http_reads[] = {
MockRead("HTTP/1.1 200 OK\r\n"),
@@ -1879,21 +1887,21 @@ TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceWithVersionForQuic2) {
// The QuicStreamFactoy will pick the preferred QUIC_VERSION: |version_|,
// which is verified as the PacketMakers are using |version_|.
- quic::QuicTransportVersion common_version_2 = quic::QUIC_VERSION_UNSUPPORTED;
- for (const quic::QuicTransportVersion& version :
- quic::AllSupportedTransportVersions()) {
+ quic::ParsedQuicVersion common_version_2 = quic::UnsupportedQuicVersion();
+ for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
if (version == version_)
continue;
common_version_2 = version;
break;
}
- DCHECK_NE(common_version_2, quic::QUIC_VERSION_UNSUPPORTED);
+ DCHECK_NE(common_version_2, quic::UnsupportedQuicVersion());
supported_versions_.push_back(
common_version_2); // Supported but unpreferred.
std::string QuicAltSvcWithVersionHeader = base::StringPrintf(
- "Alt-Svc: quic=\":443\";v=\"%d,%d\"\r\n\r\n", common_version_2, version_);
+ "Alt-Svc: quic=\":443\";v=\"%d,%d\"\r\n\r\n",
+ common_version_2.transport_version, version_.transport_version);
MockRead http_reads[] = {
MockRead("HTTP/1.1 200 OK\r\n"),
@@ -2051,8 +2059,7 @@ TEST_P(QuicNetworkTransactionTest, DoNotGetAltSvcForDifferentOrigin) {
TEST_P(QuicNetworkTransactionTest,
StoreMutuallySupportedVersionsWhenProcessAltSvc) {
// Add support for another QUIC version besides |version_|.
- for (const quic::QuicTransportVersion& version :
- quic::AllSupportedTransportVersions()) {
+ for (const quic::ParsedQuicVersion& version : quic::AllSupportedVersions()) {
if (version == version_)
continue;
supported_versions_.push_back(version);
@@ -2060,8 +2067,7 @@ TEST_P(QuicNetworkTransactionTest,
}
std::string advertised_versions_list_str =
- GenerateQuicVersionsListForAltSvcHeader(
- quic::AllSupportedTransportVersions());
+ GenerateQuicVersionsListForAltSvcHeader(quic::AllSupportedVersions());
std::string altsvc_header =
base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%s\"\r\n\r\n",
advertised_versions_list_str.c_str());
@@ -2116,7 +2122,11 @@ TEST_P(QuicNetworkTransactionTest,
EXPECT_EQ(kProtoQUIC, alt_svc_info_vector[0].alternative_service().protocol);
EXPECT_EQ(2u, alt_svc_info_vector[0].advertised_versions().size());
// Advertised versions will be lised in a sorted order.
- std::sort(supported_versions_.begin(), supported_versions_.end());
+ std::sort(
+ supported_versions_.begin(), supported_versions_.end(),
+ [](const quic::ParsedQuicVersion& a, const quic::ParsedQuicVersion& b) {
+ return a.transport_version < b.transport_version;
+ });
EXPECT_EQ(supported_versions_[0],
alt_svc_info_vector[0].advertised_versions()[0]);
EXPECT_EQ(supported_versions_[1],
@@ -2124,8 +2134,8 @@ TEST_P(QuicNetworkTransactionTest,
}
TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceAllSupportedVersion) {
- std::string altsvc_header =
- base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", version_);
+ std::string altsvc_header = base::StringPrintf(
+ "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", version_.transport_version);
MockRead http_reads[] = {
MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
MockRead("hello world"),
@@ -2169,7 +2179,7 @@ TEST_P(QuicNetworkTransactionTest, UseAlternativeServiceAllSupportedVersion) {
}
TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
// Not available under version 99
return;
}
@@ -2247,10 +2257,6 @@ TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) {
// alternate network as well, QUIC is marked as broken and the brokenness will
// not expire when default network changes.
TEST_P(QuicNetworkTransactionTest, QuicFailsOnBothNetworksWhileTCPSucceeds) {
- if (version_ >= quic::QUIC_VERSION_47) {
- // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
- return;
- }
SetUpTestForRetryConnectionOnAlternateNetwork();
std::string request_data;
@@ -2272,7 +2278,7 @@ TEST_P(QuicNetworkTransactionTest, QuicFailsOnBothNetworksWhileTCPSucceeds) {
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeDummyCHLOPacket(packet_num++));
// TODO(zhongyi): remove condition check once b/115926584 is fixed.
- if (version_ <= quic::QUIC_VERSION_39) {
+ if (version_.transport_version <= quic::QUIC_VERSION_39) {
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeDummyCHLOPacket(packet_num++));
}
@@ -2311,7 +2317,6 @@ TEST_P(QuicNetworkTransactionTest, QuicFailsOnBothNetworksWhileTCPSucceeds) {
CreateSession();
session_->quic_stream_factory()->set_require_confirmation(true);
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -2367,10 +2372,6 @@ TEST_P(QuicNetworkTransactionTest, QuicFailsOnBothNetworksWhileTCPSucceeds) {
// alternate network, QUIC is marked as broken. The brokenness will expire when
// the default network changes.
TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPSucceeds) {
- if (version_ >= quic::QUIC_VERSION_47) {
- // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
- return;
- }
SetUpTestForRetryConnectionOnAlternateNetwork();
std::string request_data;
@@ -2392,7 +2393,7 @@ TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPSucceeds) {
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeDummyCHLOPacket(packet_num++));
// TODO(zhongyi): remove condition check once b/115926584 is fixed.
- if (version_ <= quic::QUIC_VERSION_39) {
+ if (version_.transport_version <= quic::QUIC_VERSION_39) {
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeDummyCHLOPacket(packet_num++));
}
@@ -2438,7 +2439,6 @@ TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPSucceeds) {
CreateSession();
session_->quic_stream_factory()->set_require_confirmation(true);
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -2501,10 +2501,6 @@ TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPSucceeds) {
// before handshake is confirmed. If TCP doesn't succeed but QUIC on the
// alternative network succeeds, QUIC is not marked as broken.
TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPHanging) {
- if (version_ >= quic::QUIC_VERSION_47) {
- // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
- return;
- }
SetUpTestForRetryConnectionOnAlternateNetwork();
std::string request_data;
@@ -2527,7 +2523,7 @@ TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPHanging) {
client_maker_.MakeDummyCHLOPacket(packet_num++));
// TODO(zhongyi): remove condition check once b/115926584 is fixed, i.e.,
// quic_fix_has_pending_crypto_data is introduced and enabled.
- if (version_ <= quic::QUIC_VERSION_39) {
+ if (version_.transport_version <= quic::QUIC_VERSION_39) {
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeDummyCHLOPacket(packet_num++));
}
@@ -2578,7 +2574,6 @@ TEST_P(QuicNetworkTransactionTest, RetryOnAlternateNetworkWhileTCPHanging) {
CreateSession();
session_->quic_stream_factory()->set_require_confirmation(true);
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -2654,42 +2649,50 @@ TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmed) {
client_maker_.MakeInitialSettingsPacketAndSaveData(
2, &header_stream_offset, &settings_data));
// TLP 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 3, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// TLP 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 4, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 5, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 6, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 7, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 8, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 3
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 9, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 10, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
11, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
@@ -2710,7 +2713,6 @@ TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmed) {
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -2764,51 +2766,61 @@ TEST_P(QuicNetworkTransactionTest, TooManyRtosAfterHandshakeConfirmed) {
client_maker_.MakeInitialSettingsPacketAndSaveData(
2, &header_stream_offset, &settings_data));
// TLP 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 3, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// TLP 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 4, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 5, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 6, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 7, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 8, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 3
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 9, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 10, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 4
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 11, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 12, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 12, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 5
quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
13, true, quic::QUIC_TOO_MANY_RTOS,
@@ -2828,7 +2840,6 @@ TEST_P(QuicNetworkTransactionTest, TooManyRtosAfterHandshakeConfirmed) {
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -2887,51 +2898,58 @@ TEST_P(QuicNetworkTransactionTest,
3, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED));
// TLP 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 4, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// TLP 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 5, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 1
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeRstPacket(
6, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 7, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// RTO 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 8, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeRstPacket(
9, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED));
// RTO 3
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 10, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 11, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 4
quic_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(
12, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 13, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 13, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// RTO 5
quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
14, true, quic::QUIC_TOO_MANY_RTOS,
@@ -2951,7 +2969,6 @@ TEST_P(QuicNetworkTransactionTest,
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -3075,42 +3092,50 @@ TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmedThenBroken) {
client_maker_.MakeInitialSettingsPacketAndSaveData(
2, &header_stream_offset, &settings_data));
// TLP 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 3, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// TLP 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 4, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 5, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 6, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 7, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 8, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 3
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 9, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 10, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
11, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
@@ -3145,7 +3170,6 @@ TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmedThenBroken) {
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -3209,42 +3233,50 @@ TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmedThenBroken2) {
client_maker_.MakeInitialSettingsPacketAndSaveData(
2, &header_stream_offset, &settings_data));
// TLP 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 3, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// TLP 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 4, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 5, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 6, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 7, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 8, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 3
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 9, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 10, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
11, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
@@ -3279,7 +3311,6 @@ TEST_P(QuicNetworkTransactionTest, TimeoutAfterHandshakeConfirmedThenBroken2) {
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -3358,41 +3389,49 @@ TEST_P(QuicNetworkTransactionTest,
// TLP 1
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 4, quic::QuicUtils::GetHeadersStreamId(version_), false,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, 0, request_data));
// TLP 2
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 5, quic::QuicUtils::GetHeadersStreamId(version_), false,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, settings_offset, settings_data));
// RTO 1
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 6, quic::QuicUtils::GetHeadersStreamId(version_), false,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 7, quic::QuicUtils::GetHeadersStreamId(version_), false,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, settings_offset, settings_data));
// RTO 2
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 8, quic::QuicUtils::GetHeadersStreamId(version_), false,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 9, quic::QuicUtils::GetHeadersStreamId(version_), false,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, settings_offset, settings_data));
// RTO 3
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 10, quic::QuicUtils::GetHeadersStreamId(version_), false,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 11, quic::QuicUtils::GetHeadersStreamId(version_), false,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, settings_offset, settings_data));
if (GetQuicReloadableFlag(
quic_fix_time_of_first_packet_sent_after_receiving)) {
@@ -3425,7 +3464,6 @@ TEST_P(QuicNetworkTransactionTest,
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -3492,51 +3530,61 @@ TEST_P(QuicNetworkTransactionTest,
client_maker_.MakeInitialSettingsPacketAndSaveData(
2, &header_stream_offset, &settings_data));
// TLP 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 3, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// TLP 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 4, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 5, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 6, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 6, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 7, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 8, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 3
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 9, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 10, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 9, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 4
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 11, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 12, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 12, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
13, true, quic::QUIC_TOO_MANY_RTOS,
@@ -3570,7 +3618,6 @@ TEST_P(QuicNetworkTransactionTest,
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -3640,51 +3687,58 @@ TEST_P(QuicNetworkTransactionTest,
3, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED));
// TLP 1
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 4, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 4, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// TLP 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 5, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 5, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 1
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeRstPacket(
6, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED));
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 7, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 7, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// RTO 2
- quic_data.AddWrite(SYNCHRONOUS,
- client_maker_.MakeDataPacket(
- 8, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ quic_data.AddWrite(
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 8, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
quic_data.AddWrite(SYNCHRONOUS,
client_maker_.MakeRstPacket(
9, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED));
// RTO 3
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 10, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 10, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 11, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, settings_offset, settings_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 11, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, settings_offset, settings_data));
// RTO 4
quic_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(
12, true, GetNthClientInitiatedBidirectionalStreamId(0),
quic::QUIC_STREAM_CANCELLED));
quic_data.AddWrite(
- SYNCHRONOUS, client_maker_.MakeDataPacket(
- 13, quic::QuicUtils::GetHeadersStreamId(version_), true,
- false, 0, request_data));
+ SYNCHRONOUS,
+ client_maker_.MakeDataPacket(
+ 13, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ true, false, 0, request_data));
// RTO 5
quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
14, true, quic::QUIC_TOO_MANY_RTOS,
@@ -3704,7 +3758,6 @@ TEST_P(QuicNetworkTransactionTest,
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -4077,7 +4130,6 @@ TEST_P(QuicNetworkTransactionTest,
socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
CreateSession();
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -4117,8 +4169,9 @@ TEST_P(QuicNetworkTransactionTest,
TEST_P(QuicNetworkTransactionTest,
DoNotUseAlternativeServiceQuicUnsupportedVersion) {
- std::string altsvc_header = base::StringPrintf(
- "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", version_ - 1);
+ std::string altsvc_header =
+ base::StringPrintf("Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n",
+ version_.transport_version - 1);
MockRead http_reads[] = {
MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()),
MockRead("hello world"),
@@ -4210,7 +4263,6 @@ TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
AddHangingNonAlternateProtocolSocketData();
CreateSession();
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -4292,7 +4344,6 @@ TEST_P(QuicNetworkTransactionTest, UseExistingQUICAlternativeProxy) {
request_.url = GURL("http://mail.example.org/");
CreateSession();
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -4363,7 +4414,6 @@ TEST_P(QuicNetworkTransactionTest, PoolByOrigin) {
AddHangingNonAlternateProtocolSocketData();
CreateSession();
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -4457,7 +4507,6 @@ TEST_P(QuicNetworkTransactionTest, PoolByDestination) {
AddHangingNonAlternateProtocolSocketData();
CreateSession();
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -4588,7 +4637,6 @@ TEST_P(QuicNetworkTransactionTest,
AddHangingNonAlternateProtocolSocketData();
CreateSession();
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -5032,8 +5080,8 @@ TEST_P(QuicNetworkTransactionTest, ZeroRTTWithTooEarlyResponse) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
client_maker_.MakeDataPacket(
- 3, quic::QuicUtils::GetHeadersStreamId(version_), false, false,
- client_header_stream_offset,
+ 3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, client_header_stream_offset,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())));
client_header_stream_offset += spdy_frame.size();
@@ -5069,7 +5117,6 @@ TEST_P(QuicNetworkTransactionTest, ZeroRTTWithTooEarlyResponse) {
AddHangingNonAlternateProtocolSocketData();
CreateSession();
AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -5125,8 +5172,8 @@ TEST_P(QuicNetworkTransactionTest, ZeroRTTWithMultipleTooEarlyResponse) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
client_maker_.MakeDataPacket(
- 3, quic::QuicUtils::GetHeadersStreamId(version_), false, false,
- client_header_stream_offset,
+ 3, quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, client_header_stream_offset,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size())));
client_header_stream_offset += spdy_frame.size();
@@ -5160,7 +5207,6 @@ TEST_P(QuicNetworkTransactionTest, ZeroRTTWithMultipleTooEarlyResponse) {
AddHangingNonAlternateProtocolSocketData();
CreateSession();
AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
@@ -5188,8 +5234,9 @@ TEST_P(QuicNetworkTransactionTest, ZeroRTTWithMultipleTooEarlyResponse) {
EXPECT_EQ("HTTP/1.1 425 TOO_EARLY", response->headers->GetStatusLine());
EXPECT_TRUE(response->was_fetched_via_spdy);
EXPECT_TRUE(response->was_alpn_negotiated);
- EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(version_),
- response->connection_info);
+ EXPECT_EQ(
+ QuicHttpStream::ConnectionInfoFromQuicVersion(version_.transport_version),
+ response->connection_info);
}
TEST_P(QuicNetworkTransactionTest,
@@ -5357,8 +5404,9 @@ TEST_P(QuicNetworkTransactionTest, RstSteamErrorHandling) {
EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
EXPECT_TRUE(response->was_fetched_via_spdy);
EXPECT_TRUE(response->was_alpn_negotiated);
- EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(version_),
- response->connection_info);
+ EXPECT_EQ(
+ QuicHttpStream::ConnectionInfoFromQuicVersion(version_.transport_version),
+ response->connection_info);
std::string response_data;
ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR, ReadTransaction(&trans, &response_data));
@@ -5739,10 +5787,6 @@ TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolOnConnectFailure) {
}
TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
- if (version_ >= quic::QUIC_VERSION_47) {
- // TODO(nharper): reenable once MakeDummyCHLOPacket() fixed
- return;
- }
MockQuicData mock_quic_data;
mock_quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
mock_quic_data.AddRead(ASYNC, ConstructServerConnectionClosePacket(1));
@@ -6101,7 +6145,6 @@ TEST_P(QuicNetworkTransactionTest, MaxRetriesAfterAsyncNoBufferSpace) {
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetTaskRunner(session_->quic_stream_factory(),
quic_task_runner_.get());
@@ -6139,7 +6182,6 @@ TEST_P(QuicNetworkTransactionTest, MaxRetriesAfterSynchronousNoBufferSpace) {
CreateSession();
// Use a TestTaskRunner to avoid waiting in real time for timeouts.
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetTaskRunner(session_->quic_stream_factory(),
quic_task_runner_.get());
@@ -6218,7 +6260,7 @@ TEST_P(QuicNetworkTransactionTest, QuicServerPush) {
GetRequestHeaders("GET", "https", "/pushed.jpg"),
&server_header_offset, &server_maker_));
if (client_headers_include_h2_stream_dependency_ &&
- version_ >= quic::QUIC_VERSION_43) {
+ version_.transport_version >= quic::QUIC_VERSION_43) {
mock_quic_data.AddWrite(SYNCHRONOUS,
ConstructClientPriorityPacket(
client_packet_number++, false,
@@ -6312,7 +6354,7 @@ TEST_P(QuicNetworkTransactionTest, CancelServerPushAfterConnectionClose) {
GetRequestHeaders("GET", "https", "/pushed.jpg"),
&server_header_offset, &server_maker_));
if (client_headers_include_h2_stream_dependency_ &&
- version_ >= quic::QUIC_VERSION_43) {
+ version_.transport_version >= quic::QUIC_VERSION_43) {
mock_quic_data.AddWrite(SYNCHRONOUS,
ConstructClientPriorityPacket(
client_packet_number++, false,
@@ -6388,7 +6430,7 @@ TEST_P(QuicNetworkTransactionTest, QuicForceHolBlocking) {
write_packet_index++, &offset));
std::string header = ConstructDataHeader(1);
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientRequestHeadersAndDataFramesPacket(
@@ -6570,7 +6612,7 @@ TEST_P(QuicNetworkTransactionTest, RawHeaderSizeSuccessfullPushHeadersFirst) {
&server_header_offset, &server_maker_));
if (client_headers_include_h2_stream_dependency_ &&
- version_ >= quic::QUIC_VERSION_43) {
+ version_.transport_version >= quic::QUIC_VERSION_43) {
mock_quic_data.AddWrite(SYNCHRONOUS,
ConstructClientPriorityPacket(
client_packet_number++, false,
@@ -6724,7 +6766,7 @@ class QuicNetworkTransactionWithDestinationTest
: version_(GetParam().version),
client_headers_include_h2_stream_dependency_(
GetParam().client_headers_include_h2_stream_dependency),
- supported_versions_(quic::test::SupportedTransportVersions(version_)),
+ supported_versions_(quic::test::SupportedVersions(version_)),
destination_type_(GetParam().destination_type),
cert_transparency_verifier_(new MultiLogCTVerifier()),
ssl_config_service_(new SSLConfigServiceDefaults),
@@ -6860,7 +6902,7 @@ class QuicNetworkTransactionWithDestinationTest
quic::QuicStreamId stream_id,
QuicTestPacketMaker* maker) {
std::string header = "";
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
quic::HttpEncoder encoder;
std::unique_ptr<char[]> buffer;
auto header_length = encoder.SerializeDataFrameHeader(5, &buffer);
@@ -6940,19 +6982,21 @@ class QuicNetworkTransactionWithDestinationTest
EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
EXPECT_TRUE(response->was_fetched_via_spdy);
EXPECT_TRUE(response->was_alpn_negotiated);
- EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(version_),
+ EXPECT_EQ(QuicHttpStream::ConnectionInfoFromQuicVersion(
+ version_.transport_version),
response->connection_info);
EXPECT_EQ(443, response->remote_endpoint.port());
}
quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
- return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+ return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+ version_.transport_version, n);
}
quic::MockClock clock_;
- const quic::QuicTransportVersion version_;
+ const quic::ParsedQuicVersion version_;
const bool client_headers_include_h2_stream_dependency_;
- quic::QuicTransportVersionVector supported_versions_;
+ quic::ParsedQuicVersionVector supported_versions_;
DestinationType destination_type_;
std::string origin1_;
std::string origin2_;
@@ -7103,10 +7147,10 @@ TEST_P(QuicNetworkTransactionWithDestinationTest, PoolIfCertificateValid) {
AddHangingSocketData();
AddHangingSocketData();
- scoped_refptr<TestTaskRunner> quic_task_runner_(new TestTaskRunner(&clock_));
+ scoped_refptr<TestTaskRunner> quic_task_runner(new TestTaskRunner(&clock_));
QuicStreamFactoryPeer::SetAlarmFactory(
session_->quic_stream_factory(),
- std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner_.get(),
+ std::make_unique<QuicChromiumAlarmFactory>(quic_task_runner.get(),
&clock_));
SendRequestAndExpectQuicResponse(origin1_);
@@ -7244,7 +7288,7 @@ TEST_P(QuicNetworkTransactionTest, QuicServerPushMatchesRequestWithBody) {
GetRequestHeaders("GET", "https", "/pushed.jpg"),
&server_header_offset, &server_maker_));
if (client_headers_include_h2_stream_dependency_ &&
- version_ >= quic::QUIC_VERSION_43) {
+ version_.transport_version >= quic::QUIC_VERSION_43) {
mock_quic_data.AddWrite(SYNCHRONOUS,
ConstructClientPriorityPacket(
client_packet_number++, false,
@@ -7286,7 +7330,7 @@ TEST_P(QuicNetworkTransactionTest, QuicServerPushMatchesRequestWithBody) {
quic::QUIC_STREAM_CANCELLED, 5, 5, 1));
const char kBody[] = "1";
std::string header3 = ConstructDataHeader(1);
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientRequestHeadersAndDataFramesPacket(
@@ -7435,7 +7479,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectHttpsServer) {
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
std::string header = ConstructDataHeader(strlen(get_request));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientAckAndDataPacket(
@@ -7528,7 +7572,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectSpdyServer) {
spdy::SpdySerializedFrame get_frame =
spdy_util.ConstructSpdyGet("https://mail.example.org/", 1, LOWEST);
std::string header = ConstructDataHeader(get_frame.size());
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientAckAndDataPacket(
@@ -7633,7 +7677,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectReuseTransportSocket) {
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
std::string header = ConstructDataHeader(strlen(get_request_1));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientAckAndDataPacket(
@@ -7677,7 +7721,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectReuseTransportSocket) {
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
std::string header4 = ConstructDataHeader(strlen(get_request_2));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientMultipleDataFramesPacket(
@@ -7797,7 +7841,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectReuseQuicSession) {
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
std::string header = ConstructDataHeader(strlen(get_request));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientAckAndDataPacket(
@@ -7845,7 +7889,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectReuseQuicSession) {
spdy::SpdySerializedFrame get_frame =
spdy_util.ConstructSpdyGet("https://different.example.org/", 1, LOWEST);
std::string header4 = ConstructDataHeader(get_frame.size());
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientAckAndDataPacket(
@@ -8070,7 +8114,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyConnectBadCertificate) {
"Host: mail.example.org\r\n"
"Connection: keep-alive\r\n\r\n";
std::string header = ConstructDataHeader(strlen(get_request));
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data.AddWrite(
SYNCHRONOUS,
ConstructClientAckAndDataPacket(
@@ -8478,7 +8522,7 @@ TEST_P(QuicNetworkTransactionTest, QuicProxyAuth) {
TEST_P(QuicNetworkTransactionTest, QuicServerPushUpdatesPriority) {
// Only run this test if HTTP/2 stream dependency info is sent by client (sent
// in HEADERS frames for requests and PRIORITY frames).
- if (version_ < quic::QUIC_VERSION_43 ||
+ if (version_.transport_version < quic::QUIC_VERSION_43 ||
!client_headers_include_h2_stream_dependency_) {
return;
}
diff --git a/chromium/net/quic/quic_proxy_client_socket.cc b/chromium/net/quic/quic_proxy_client_socket.cc
index e6f2b811d18..3e925c90bee 100644
--- a/chromium/net/quic/quic_proxy_client_socket.cc
+++ b/chromium/net/quic/quic_proxy_client_socket.cc
@@ -409,14 +409,6 @@ int QuicProxyClientSocket::DoReadReplyComplete(int result) {
next_state_ = STATE_CONNECT_COMPLETE;
return OK;
- case 302: // Found / Moved Temporarily
- // Try to return a sanitized response so we can follow auth redirects.
- // If we can't, fail the tunnel connection.
- if (!SanitizeProxyRedirect(&response_))
- return ERR_TUNNEL_CONNECTION_FAILED;
- next_state_ = STATE_DISCONNECTED;
- return ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT;
-
case 407: // Proxy Authentication Required
next_state_ = STATE_CONNECT_COMPLETE;
if (!SanitizeProxyAuth(&response_))
diff --git a/chromium/net/quic/quic_proxy_client_socket_unittest.cc b/chromium/net/quic/quic_proxy_client_socket_unittest.cc
index 60e259eb66c..9f3b4384dff 100644
--- a/chromium/net/quic/quic_proxy_client_socket_unittest.cc
+++ b/chromium/net/quic/quic_proxy_client_socket_unittest.cc
@@ -83,7 +83,7 @@ namespace test {
class QuicProxyClientSocketTest
: public ::testing::TestWithParam<
- std::tuple<quic::QuicTransportVersion, bool>>,
+ std::tuple<quic::ParsedQuicVersion, bool>>,
public WithScopedTaskEnvironment {
protected:
static const bool kFin = true;
@@ -94,7 +94,7 @@ class QuicProxyClientSocketTest
static size_t GetStreamFrameDataLengthFromPacketLength(
quic::QuicByteCount packet_length,
- quic::QuicTransportVersion version,
+ quic::ParsedQuicVersion version,
bool include_version,
bool include_diversification_nonce,
quic::QuicConnectionIdLength connection_id_length,
@@ -103,7 +103,8 @@ class QuicProxyClientSocketTest
quic::QuicVariableLengthIntegerLength retry_token_length_length =
quic::VARIABLE_LENGTH_INTEGER_LENGTH_0;
quic::QuicVariableLengthIntegerLength length_length =
- quic::QuicVersionHasLongHeaderLengths(version) && include_version
+ quic::QuicVersionHasLongHeaderLengths(version.transport_version) &&
+ include_version
? quic::VARIABLE_LENGTH_INTEGER_LENGTH_2
: quic::VARIABLE_LENGTH_INTEGER_LENGTH_0;
size_t min_data_length = 1;
@@ -111,7 +112,7 @@ class QuicProxyClientSocketTest
quic::NullEncrypter(quic::Perspective::IS_CLIENT)
.GetCiphertextSize(min_data_length) +
quic::QuicPacketCreator::StreamFramePacketOverhead(
- version, quic::PACKET_8BYTE_CONNECTION_ID,
+ version.transport_version, quic::PACKET_8BYTE_CONNECTION_ID,
quic::PACKET_0BYTE_CONNECTION_ID, include_version,
include_diversification_nonce, packet_number_length,
retry_token_length_length, length_length, offset);
@@ -122,8 +123,9 @@ class QuicProxyClientSocketTest
QuicProxyClientSocketTest()
: version_(std::get<0>(GetParam())),
- client_data_stream_id1_(quic::QuicUtils::GetHeadersStreamId(version_) +
- quic::QuicUtils::StreamIdDelta(version_)),
+ client_data_stream_id1_(
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version) +
+ quic::QuicUtils::StreamIdDelta(version_.transport_version)),
client_headers_include_h2_stream_dependency_(std::get<1>(GetParam())),
crypto_config_(quic::test::crypto_test_utils::ProofVerifierForTesting(),
quic::TlsClientHandshaker::CreateSslCtx()),
@@ -193,9 +195,7 @@ class QuicProxyClientSocketTest
connection_id_,
quic::QuicSocketAddress(quic::QuicSocketAddressImpl(peer_addr_)),
helper_.get(), alarm_factory_.get(), writer, true /* owns_writer */,
- quic::Perspective::IS_CLIENT,
- quic::test::SupportedVersions(
- quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO, version_)));
+ quic::Perspective::IS_CLIENT, quic::test::SupportedVersions(version_));
connection->set_visitor(&visitor_);
quic::test::QuicConnectionPeer::SetSendAlgorithm(connection,
send_algorithm_);
@@ -553,7 +553,7 @@ class QuicProxyClientSocketTest
}
std::string ConstructDataHeader(size_t body_len) {
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
return "";
}
quic::HttpEncoder encoder;
@@ -562,7 +562,7 @@ class QuicProxyClientSocketTest
return std::string(buffer.get(), header_length);
}
- const quic::QuicTransportVersion version_;
+ const quic::ParsedQuicVersion version_;
const quic::QuicStreamId client_data_stream_id1_;
const bool client_headers_include_h2_stream_dependency_;
@@ -674,6 +674,7 @@ TEST_P(QuicProxyClientSocketTest, ConnectWithAuthCredentials) {
ASSERT_EQ(200, response->headers->response_code());
}
+// Tests that a redirect response from a CONNECT fails.
TEST_P(QuicProxyClientSocketTest, ConnectRedirects) {
mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructSettingsPacket(1));
mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructConnectRequestPacket(2));
@@ -686,15 +687,14 @@ TEST_P(QuicProxyClientSocketTest, ConnectRedirects) {
Initialize();
- AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT);
+ AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED);
const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
ASSERT_TRUE(response != nullptr);
const HttpResponseHeaders* headers = response->headers.get();
ASSERT_EQ(302, headers->response_code());
- ASSERT_FALSE(headers->HasHeader("set-cookie"));
- ASSERT_TRUE(headers->HasHeaderValue("content-length", "0"));
+ ASSERT_TRUE(headers->HasHeader("set-cookie"));
std::string location;
ASSERT_TRUE(headers->IsRedirect(&location));
@@ -855,7 +855,7 @@ TEST_P(QuicProxyClientSocketTest, WriteSendsDataInDataFrame) {
mock_quic_data_.AddWrite(SYNCHRONOUS, ConstructConnectRequestPacket(2));
mock_quic_data_.AddRead(ASYNC, ConstructServerConnectReplyPacket(1, !kFin));
mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
std::string header = ConstructDataHeader(kLen1);
mock_quic_data_.AddWrite(
SYNCHRONOUS, ConstructAckAndMultipleDataFramesPacket(
@@ -897,7 +897,7 @@ TEST_P(QuicProxyClientSocketTest, WriteSplitsLargeDataIntoMultiplePackets) {
mock_quic_data_.AddRead(ASYNC, ConstructServerConnectReplyPacket(1, !kFin));
mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
std::string header = ConstructDataHeader(kLen1);
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data_.AddWrite(
SYNCHRONOUS, ConstructAckAndDataPacket(write_packet_index++, 1, 1, 1, 0,
std::string(kMsg1, kLen1)));
@@ -914,7 +914,7 @@ TEST_P(QuicProxyClientSocketTest, WriteSplitsLargeDataIntoMultiplePackets) {
std::string data(numDataPackets * quic::kDefaultMaxPacketSize, 'x');
quic::QuicStreamOffset offset = kLen1 + header.length();
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
numDataPackets++;
}
size_t total_data_length = 0;
@@ -923,7 +923,7 @@ TEST_P(QuicProxyClientSocketTest, WriteSplitsLargeDataIntoMultiplePackets) {
quic::kDefaultMaxPacketSize, version_, !kIncludeVersion,
!kIncludeDiversificationNonce, quic::PACKET_8BYTE_CONNECTION_ID,
quic::PACKET_1BYTE_PACKET_NUMBER, offset);
- if (version_ == quic::QUIC_VERSION_99 && i == 0) {
+ if (version_.transport_version == quic::QUIC_VERSION_99 && i == 0) {
// 3973 is the data frame length from packet length.
std::string header2 = ConstructDataHeader(3973);
mock_quic_data_.AddWrite(
@@ -932,7 +932,8 @@ TEST_P(QuicProxyClientSocketTest, WriteSplitsLargeDataIntoMultiplePackets) {
{header2, std::string(data.c_str(),
max_packet_data_length - 7)}));
offset += max_packet_data_length - header2.length() - 1;
- } else if (version_ == quic::QUIC_VERSION_99 && i == numDataPackets - 1) {
+ } else if (version_.transport_version == quic::QUIC_VERSION_99 &&
+ i == numDataPackets - 1) {
mock_quic_data_.AddWrite(
SYNCHRONOUS, ConstructDataPacket(write_packet_index++, offset,
std::string(data.c_str(), 7)));
@@ -1281,7 +1282,7 @@ TEST_P(QuicProxyClientSocketTest, AsyncReadAroundWrite) {
ConstructAckPacket(write_packet_index++, 2, 1, 1));
std::string header2 = ConstructDataHeader(kLen2);
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
mock_quic_data_.AddWrite(
SYNCHRONOUS,
ConstructMultipleDataFramesPacket(
@@ -1346,7 +1347,7 @@ TEST_P(QuicProxyClientSocketTest, AsyncWriteAroundReads) {
mock_quic_data_.AddWrite(ASYNC, ERR_IO_PENDING); // Pause
std::string header3 = ConstructDataHeader(kLen2);
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data_.AddWrite(
ASYNC, ConstructDataPacket(4, 0, std::string(kMsg2, kLen2)));
mock_quic_data_.AddWrite(
@@ -1627,7 +1628,7 @@ TEST_P(QuicProxyClientSocketTest, RstWithReadAndWritePending) {
ASYNC, ConstructServerRstPacket(2, quic::QUIC_STREAM_CANCELLED, 0));
mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
std::string header = ConstructDataHeader(kLen2);
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data_.AddWrite(
ASYNC,
ConstructAckAndDataPacket(3, 1, 1, 1, 0, std::string(kMsg2, kLen2)));
@@ -1759,7 +1760,7 @@ TEST_P(QuicProxyClientSocketTest, RstWithReadAndWritePendingDelete) {
mock_quic_data_.AddRead(
ASYNC, ConstructServerRstPacket(2, quic::QUIC_STREAM_CANCELLED, 0));
mock_quic_data_.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
mock_quic_data_.AddWrite(
ASYNC,
ConstructAckAndDataPacket(3, 1, 1, 1, 0, std::string(kMsg1, kLen1)));
@@ -1806,9 +1807,8 @@ TEST_P(QuicProxyClientSocketTest, RstWithReadAndWritePendingDelete) {
INSTANTIATE_TEST_SUITE_P(
VersionIncludeStreamDependencySequence,
QuicProxyClientSocketTest,
- ::testing::Combine(
- ::testing::ValuesIn(quic::AllSupportedTransportVersions()),
- ::testing::Bool()));
+ ::testing::Combine(::testing::ValuesIn(quic::AllVersionsExcept99()),
+ ::testing::Bool()));
} // namespace test
} // namespace net
diff --git a/chromium/net/quic/quic_stream_factory.cc b/chromium/net/quic/quic_stream_factory.cc
index 31037583f34..7a73796abd8 100644
--- a/chromium/net/quic/quic_stream_factory.cc
+++ b/chromium/net/quic/quic_stream_factory.cc
@@ -10,7 +10,6 @@
#include <utility>
#include "base/bind.h"
-#include "base/callback_helpers.h"
#include "base/location.h"
#include "base/metrics/field_trial.h"
#include "base/metrics/histogram_functions.h"
@@ -37,6 +36,7 @@
#include "net/log/net_log_capture_mode.h"
#include "net/log/net_log_event_type.h"
#include "net/log/net_log_source_type.h"
+#include "net/quic/address_utils.h"
#include "net/quic/crypto/proof_verifier_chromium.h"
#include "net/quic/properties_based_quic_server_info.h"
#include "net/quic/quic_chromium_alarm_factory.h"
@@ -105,11 +105,11 @@ const int32_t kQuicSocketReceiveBufferSize = 1024 * 1024; // 1MB
// Set the maximum number of undecryptable packets the connection will store.
const int32_t kMaxUndecryptablePackets = 100;
-std::unique_ptr<base::Value> NetLogQuicStreamFactoryJobCallback(
+base::Value NetLogQuicStreamFactoryJobCallback(
const quic::QuicServerId* server_id,
NetLogCaptureMode capture_mode) {
- std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
- dict->SetString(
+ base::DictionaryValue dict;
+ dict.SetString(
"server_id",
"https://" +
HostPortPair(server_id->host(), server_id->port()).ToString() +
@@ -274,8 +274,9 @@ class QuicStreamFactory::CertVerifierJob {
auto* verify_callback_ptr = verify_callback.get();
quic::QuicAsyncStatus status =
crypto_config->proof_verifier()->VerifyCertChain(
- server_id_.host(), cached->certs(), verify_context_.get(),
- &verify_error_details_, &verify_details_,
+ server_id_.host(), cached->certs(),
+ /*ocsp_response=*/std::string(), cached->cert_sct(),
+ verify_context_.get(), &verify_error_details_, &verify_details_,
std::move(verify_callback));
if (status == quic::QUIC_PENDING) {
verify_callback_ = verify_callback_ptr;
@@ -288,7 +289,7 @@ class QuicStreamFactory::CertVerifierJob {
UMA_HISTOGRAM_TIMES("Net.QuicSession.CertVerifierJob.CompleteTime",
base::TimeTicks::Now() - start_time_);
if (!callback_.is_null())
- base::ResetAndReturn(&callback_).Run(OK);
+ std::move(callback_).Run(OK);
}
const quic::QuicServerId& server_id() const { return server_id_; }
@@ -412,7 +413,7 @@ class QuicStreamFactory::Job {
bool DoesPeerAddressMatchWithFreshAddressList() {
std::vector<net::IPEndPoint> endpoints =
fresh_resolve_host_request_->GetAddressResults().value().endpoints();
- IPEndPoint stale_address = session_->peer_address().impl().socket_address();
+ IPEndPoint stale_address = ToIPEndPoint(session_->peer_address());
if (std::find(endpoints.begin(), endpoints.end(), stale_address) !=
endpoints.end()) {
@@ -589,7 +590,7 @@ void QuicStreamFactory::Job::OnResolveHostComplete(int rv) {
LogConnectionIpPooling(true);
CloseStaleHostConnection();
if (!callback_.is_null())
- base::ResetAndReturn(&callback_).Run(OK);
+ std::move(callback_).Run(OK);
return;
} else if (io_state_ != STATE_HOST_VALIDATION) {
// Case where host resolution returns successfully, but stale connection
@@ -623,7 +624,7 @@ void QuicStreamFactory::Job::OnResolveHostComplete(int rv) {
}
if (rv != ERR_IO_PENDING && !callback_.is_null())
- base::ResetAndReturn(&callback_).Run(rv);
+ std::move(callback_).Run(rv);
}
void QuicStreamFactory::Job::OnConnectComplete(int rv) {
@@ -634,7 +635,7 @@ void QuicStreamFactory::Job::OnConnectComplete(int rv) {
rv = DoLoop(rv);
if (rv != ERR_IO_PENDING && !callback_.is_null())
- base::ResetAndReturn(&callback_).Run(rv);
+ std::move(callback_).Run(rv);
}
void QuicStreamFactory::Job::PopulateNetErrorDetails(
@@ -658,6 +659,7 @@ int QuicStreamFactory::Job::DoResolveHost() {
HostResolver::ResolveHostParameters parameters;
parameters.initial_priority = priority_;
if (race_stale_dns_on_connection_) {
+ // Allow host resolver to return stale result immediately.
parameters.cache_usage =
HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
}
@@ -665,6 +667,8 @@ int QuicStreamFactory::Job::DoResolveHost() {
host_resolver_->CreateRequest(key_.destination(), net_log_, parameters);
// Unretained is safe because |this| owns the request, ensuring cancellation
// on destruction.
+ // When race_stale_dns_on_connection_ is on, this request will query for stale
+ // cache if no fresh host result is available.
int rv = resolve_host_request_->Start(base::BindOnce(
&QuicStreamFactory::Job::OnResolveHostComplete, base::Unretained(this)));
@@ -685,6 +689,7 @@ int QuicStreamFactory::Job::DoResolveHost() {
host_resolver_->CreateRequest(key_.destination(), net_log_, parameters);
// Unretained is safe because |this| owns the request, ensuring cancellation
// on destruction.
+ // This request will only query fresh host resolution.
int fresh_rv = fresh_resolve_host_request_->Start(base::BindOnce(
&QuicStreamFactory::Job::OnResolveHostComplete, base::Unretained(this)));
if (fresh_rv != ERR_IO_PENDING) {
@@ -694,6 +699,10 @@ int QuicStreamFactory::Job::DoResolveHost() {
return rv;
}
+ // No fresh host resolution is available at this time, but there is available
+ // stale result. End time for stale host resolution is recorded and connection
+ // from stale host will be tried.
+ dns_resolution_end_time_ = base::TimeTicks().Now();
io_state_ = STATE_CONNECT;
LogStaleHostRacing(true);
return OK;
@@ -721,6 +730,7 @@ int QuicStreamFactory::Job::DoResolveHostComplete(int rv) {
}
int QuicStreamFactory::Job::DoConnect() {
+ DCHECK(dns_resolution_end_time_ != base::TimeTicks());
io_state_ = STATE_CONNECT_COMPLETE;
bool require_confirmation = was_alternative_service_recently_broken_;
net_log_.BeginEvent(
@@ -880,8 +890,7 @@ int QuicStreamFactory::Job::DoConfirmConnection(int rv) {
DCHECK(!factory_->HasActiveSession(key_.session_key()));
// There may well now be an active session for this IP. If so, use the
// existing session instead.
- AddressList address(
- session_->connection()->peer_address().impl().socket_address());
+ AddressList address(ToIPEndPoint(session_->connection()->peer_address()));
if (factory_->HasMatchingIpSession(key_, address)) {
LogConnectionIpPooling(true);
session_->connection()->CloseConnection(
@@ -960,12 +969,12 @@ void QuicStreamRequest::SetSession(
void QuicStreamRequest::OnConnectionFailedOnDefaultNetwork() {
if (!failed_on_default_network_callback_.is_null())
- base::ResetAndReturn(&failed_on_default_network_callback_).Run(OK);
+ std::move(failed_on_default_network_callback_).Run(OK);
}
void QuicStreamRequest::OnRequestComplete(int rv) {
factory_ = nullptr;
- base::ResetAndReturn(&callback_).Run(rv);
+ std::move(callback_).Run(rv);
}
void QuicStreamRequest::ExpectOnHostResolution() {
@@ -976,7 +985,7 @@ void QuicStreamRequest::OnHostResolutionComplete(int rv) {
DCHECK(expect_on_host_resolution_);
expect_on_host_resolution_ = false;
if (!host_resolution_callback_.is_null()) {
- base::ResetAndReturn(&host_resolution_callback_).Run(rv);
+ std::move(host_resolution_callback_).Run(rv);
}
}
@@ -1040,7 +1049,8 @@ QuicStreamFactory::QuicStreamFactory(
bool headers_include_h2_stream_dependency,
const quic::QuicTagVector& connection_options,
const quic::QuicTagVector& client_connection_options,
- bool enable_socket_recv_optimization)
+ bool enable_socket_recv_optimization,
+ int initial_rtt_for_handshake_milliseconds)
: require_confirmation_(true),
net_log_(net_log),
host_resolver_(host_resolver),
@@ -1110,6 +1120,8 @@ QuicStreamFactory::QuicStreamFactory(
task_runner_(nullptr),
ssl_config_service_(ssl_config_service),
enable_socket_recv_optimization_(enable_socket_recv_optimization),
+ initial_rtt_for_handshake_milliseconds_(
+ initial_rtt_for_handshake_milliseconds),
weak_factory_(this) {
DCHECK(transport_security_state_);
DCHECK(http_server_properties_);
@@ -1125,6 +1137,12 @@ QuicStreamFactory::QuicStreamFactory(
if (migrate_sessions_early_v2 || retry_on_alternate_network_before_handshake)
DCHECK(migrate_sessions_on_network_change_v2);
+ if (retransmittable_on_wire_timeout_milliseconds == 0 &&
+ migrate_sessions_early_v2) {
+ retransmittable_on_wire_timeout_ = quic::QuicTime::Delta::FromMilliseconds(
+ kDefaultRetransmittableOnWireTimeoutMillisecs);
+ }
+
// goaway_sessions_on_ip_change and close_sessions_on_ip_change should never
// be simultaneously set to true.
DCHECK(!(close_sessions_on_ip_change_ && goaway_sessions_on_ip_change_));
@@ -1536,7 +1554,7 @@ std::unique_ptr<base::Value> QuicStreamFactory::QuicStreamFactoryInfoToValue()
hosts.insert(HostPortPair(alias_it->server_id().host(),
alias_it->server_id().port()));
}
- list->Append(session->GetInfoAsValue(hosts));
+ list->GetList().push_back(session->GetInfoAsValue(hosts));
}
}
return std::move(list);
@@ -1886,7 +1904,7 @@ void QuicStreamFactory::ActivateSession(const QuicSessionAliasKey& key,
active_sessions_[key.session_key()] = session;
session_aliases_[session].insert(key);
const IPEndPoint peer_address =
- session->connection()->peer_address().impl().socket_address();
+ ToIPEndPoint(session->connection()->peer_address());
DCHECK(!base::ContainsKey(ip_aliases_[peer_address], session));
ip_aliases_[peer_address].insert(session);
DCHECK(!base::ContainsKey(session_peer_ip_, session));
@@ -1916,6 +1934,13 @@ void QuicStreamFactory::ConfigureInitialRttEstimate(
return;
}
+ if (initial_rtt_for_handshake_milliseconds_ > 0) {
+ SetInitialRttEstimate(base::TimeDelta::FromMilliseconds(
+ initial_rtt_for_handshake_milliseconds_),
+ INITIAL_RTT_DEFAULT, config);
+ return;
+ }
+
SetInitialRttEstimate(base::TimeDelta(), INITIAL_RTT_DEFAULT, config);
}
diff --git a/chromium/net/quic/quic_stream_factory.h b/chromium/net/quic/quic_stream_factory.h
index aa5973891bc..bae47ec979e 100644
--- a/chromium/net/quic/quic_stream_factory.h
+++ b/chromium/net/quic/quic_stream_factory.h
@@ -83,8 +83,8 @@ const int kIdleConnectionTimeoutSeconds = 30;
// Sessions can migrate if they have been idle for less than this period.
const int kDefaultIdleSessionMigrationPeriodSeconds = 30;
-// The maximum time allowed to have no retransmittable packets on the wire
-// (after sending the first retransmittable packet) if
+// The default maximum time allowed to have no retransmittable packets on the
+// wire (after sending the first retransmittable packet) if
// |migrate_session_early_v2_| is true. PING frames will be sent as needed to
// enforce this.
const int64_t kDefaultRetransmittableOnWireTimeoutMillisecs = 100;
@@ -275,7 +275,8 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
bool headers_include_h2_stream_dependency,
const quic::QuicTagVector& connection_options,
const quic::QuicTagVector& client_connection_options,
- bool enable_socket_recv_optimization);
+ bool enable_socket_recv_optimization,
+ int initial_rtt_for_handshake_milliseconds);
~QuicStreamFactory() override;
// Returns true if there is an existing session for |session_key| or if the
@@ -628,6 +629,9 @@ class NET_EXPORT_PRIVATE QuicStreamFactory
// experimental optimization enabled for receiving data.
bool enable_socket_recv_optimization_;
+ // The initial rtt for handshake.
+ const int initial_rtt_for_handshake_milliseconds_;
+
base::WeakPtrFactory<QuicStreamFactory> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(QuicStreamFactory);
diff --git a/chromium/net/quic/quic_stream_factory_fuzzer.cc b/chromium/net/quic/quic_stream_factory_fuzzer.cc
index ad443436ec0..60d828be793 100644
--- a/chromium/net/quic/quic_stream_factory_fuzzer.cc
+++ b/chromium/net/quic/quic_stream_factory_fuzzer.cc
@@ -12,7 +12,8 @@
#include "net/cert/do_nothing_ct_verifier.h"
#include "net/cert/mock_cert_verifier.h"
#include "net/cert/x509_certificate.h"
-#include "net/dns/fuzzed_context_host_resolver.h"
+#include "net/dns/context_host_resolver.h"
+#include "net/dns/fuzzed_host_resolver_util.h"
#include "net/http/http_server_properties_impl.h"
#include "net/http/transport_security_state.h"
#include "net/quic/mock_crypto_client_stream_factory.h"
@@ -83,9 +84,10 @@ static struct Env* env = new Env();
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
base::FuzzedDataProvider data_provider(data, size);
- FuzzedContextHostResolver host_resolver(HostResolver::Options(), nullptr,
- &data_provider,
- true /* enable_caching */);
+ std::unique_ptr<ContextHostResolver> host_resolver =
+ CreateFuzzedContextHostResolver(HostResolver::ManagerOptions(), nullptr,
+ &data_provider,
+ true /* enable_caching */);
FuzzedSocketFactory socket_factory(&data_provider);
// Initialize this on each loop since some options mutate this.
@@ -128,8 +130,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
std::unique_ptr<QuicStreamFactory> factory =
std::make_unique<QuicStreamFactory>(
- env->net_log.net_log(), &host_resolver, env->ssl_config_service.get(),
- &socket_factory, &http_server_properties, env->cert_verifier.get(),
+ env->net_log.net_log(), host_resolver.get(),
+ env->ssl_config_service.get(), &socket_factory,
+ &http_server_properties, env->cert_verifier.get(),
&env->ct_policy_enforcer, &env->transport_security_state,
env->cert_transparency_verifier.get(), nullptr,
&env->crypto_client_stream_factory, &env->random_generator,
@@ -151,7 +154,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
go_away_on_path_degrading, race_cert_verification,
estimate_initial_rtt, headers_include_h2_stream_dependency,
env->connection_options, env->client_connection_options,
- enable_socket_recv_optimization);
+ enable_socket_recv_optimization, 0);
QuicStreamRequest request(factory.get());
TestCompletionCallback callback;
diff --git a/chromium/net/quic/quic_stream_factory_test.cc b/chromium/net/quic/quic_stream_factory_test.cc
index 4fa477949a2..4c909798498 100644
--- a/chromium/net/quic/quic_stream_factory_test.cc
+++ b/chromium/net/quic/quic_stream_factory_test.cc
@@ -27,10 +27,12 @@
#include "net/http/http_util.h"
#include "net/http/transport_security_state.h"
#include "net/http/transport_security_state_test_util.h"
+#include "net/quic/address_utils.h"
#include "net/quic/crypto/proof_verifier_chromium.h"
#include "net/quic/mock_crypto_client_stream_factory.h"
#include "net/quic/mock_quic_data.h"
#include "net/quic/properties_based_quic_server_info.h"
+#include "net/quic/quic_chromium_alarm_factory.h"
#include "net/quic/quic_http_stream.h"
#include "net/quic/quic_http_utils.h"
#include "net/quic/quic_server_info.h"
@@ -117,20 +119,20 @@ const char kNonCachedIPAddress[] = "192.168.0.1";
// and enable_connection_racting.
struct TestParams {
friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
- os << "{ version: " << QuicVersionToString(p.version)
+ os << "{ version: " << ParsedQuicVersionToString(p.version)
<< ", client_headers_include_h2_stream_dependency: "
<< p.client_headers_include_h2_stream_dependency << " }";
return os;
}
- quic::QuicTransportVersion version;
+ quic::ParsedQuicVersion version;
bool client_headers_include_h2_stream_dependency;
};
std::vector<TestParams> GetTestParams() {
std::vector<TestParams> params;
- quic::QuicTransportVersionVector all_supported_versions =
- quic::AllSupportedTransportVersions();
+ quic::ParsedQuicVersionVector all_supported_versions =
+ quic::AllVersionsExcept99();
for (const auto& version : all_supported_versions) {
params.push_back(TestParams{version, false});
params.push_back(TestParams{version, true});
@@ -143,7 +145,7 @@ std::vector<TestParams> GetTestParams() {
struct PoolingTestParams {
friend std::ostream& operator<<(std::ostream& os,
const PoolingTestParams& p) {
- os << "{ version: " << QuicVersionToString(p.version)
+ os << "{ version: " << ParsedQuicVersionToString(p.version)
<< ", destination_type: ";
switch (p.destination_type) {
case SAME_AS_FIRST:
@@ -162,16 +164,16 @@ struct PoolingTestParams {
return os;
}
- quic::QuicTransportVersion version;
+ quic::ParsedQuicVersion version;
DestinationType destination_type;
bool client_headers_include_h2_stream_dependency;
};
std::vector<PoolingTestParams> GetPoolingTestParams() {
std::vector<PoolingTestParams> params;
- quic::QuicTransportVersionVector all_supported_versions =
- quic::AllSupportedTransportVersions();
- for (const quic::QuicTransportVersion version : all_supported_versions) {
+ quic::ParsedQuicVersionVector all_supported_versions =
+ quic::AllVersionsExcept99();
+ for (const quic::ParsedQuicVersion version : all_supported_versions) {
params.push_back(PoolingTestParams{version, SAME_AS_FIRST, false});
params.push_back(PoolingTestParams{version, SAME_AS_FIRST, true});
params.push_back(PoolingTestParams{version, SAME_AS_SECOND, false});
@@ -218,7 +220,7 @@ class TestConnectionMigrationSocketFactory : public MockClientSocketFactory {
class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
protected:
- QuicStreamFactoryTestBase(quic::QuicTransportVersion version,
+ QuicStreamFactoryTestBase(quic::ParsedQuicVersion version,
bool client_headers_include_h2_stream_dependency)
: host_resolver_(new MockHostResolver),
ssl_config_service_(new MockSSLConfigService),
@@ -296,7 +298,8 @@ class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
test_params_.quic_headers_include_h2_stream_dependency,
test_params_.quic_connection_options,
test_params_.quic_client_connection_options,
- test_params_.quic_enable_socket_recv_optimization));
+ test_params_.quic_enable_socket_recv_optimization,
+ test_params_.quic_initial_rtt_for_handshake_milliseconds));
}
void InitializeConnectionMigrationV2Test(
@@ -384,12 +387,12 @@ class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
QuicStreamRequest request(factory_.get());
GURL url("https://" + destination.host() + "/");
- EXPECT_EQ(
- ERR_IO_PENDING,
- request.Request(
- destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ destination, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
std::unique_ptr<HttpStream> stream = CreateStream(&request);
@@ -545,8 +548,8 @@ class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -733,7 +736,8 @@ class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
HostPortPair(quic_server_id.host(), quic_server_id.port()),
- version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ version_.transport_version, privacy_mode_, DEFAULT_PRIORITY,
+ SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -768,7 +772,8 @@ class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
HostPortPair(quic_server_id2.host(), quic_server_id2.port()),
- version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ version_.transport_version, privacy_mode_, DEFAULT_PRIORITY,
+ SocketTag(),
/*cert_verify_flags=*/0, GURL("https://mail.example.org/"),
net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -795,11 +800,34 @@ class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
}
quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) {
- return quic::test::GetNthClientInitiatedBidirectionalStreamId(version_, n);
+ return quic::test::GetNthClientInitiatedBidirectionalStreamId(
+ version_.transport_version, n);
+ }
+
+ std::string ConstructDataHeader(size_t body_len) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
+ return "";
+ }
+ quic::HttpEncoder encoder;
+ std::unique_ptr<char[]> buffer;
+ auto header_length = encoder.SerializeDataFrameHeader(body_len, &buffer);
+ return std::string(buffer.get(), header_length);
+ }
+
+ std::unique_ptr<quic::QuicEncryptedPacket> ConstructServerDataPacket(
+ uint64_t packet_number,
+ quic::QuicStreamId stream_id,
+ bool should_include_version,
+ bool fin,
+ quic::QuicStreamOffset offset,
+ quic::QuicStringPiece data) {
+ return server_maker_.MakeDataPacket(
+ packet_number, stream_id, should_include_version, fin, offset, data);
}
quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
- return quic::test::GetNthServerInitiatedUnidirectionalStreamId(version_, n);
+ return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
+ version_.transport_version, n);
}
void OnFailedOnDefaultNetwork(int rv) { failed_on_default_network_ = true; }
@@ -847,7 +875,7 @@ class QuicStreamFactoryTestBase : public WithScopedTaskEnvironment {
quic::test::MockRandom random_generator_;
quic::MockClock clock_;
scoped_refptr<TestTaskRunner> runner_;
- const quic::QuicTransportVersion version_;
+ const quic::ParsedQuicVersion version_;
QuicTestPacketMaker client_maker_;
QuicTestPacketMaker server_maker_;
HttpServerPropertiesImpl http_server_properties_;
@@ -902,8 +930,8 @@ TEST_P(QuicStreamFactoryTest, Create) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -914,8 +942,8 @@ TEST_P(QuicStreamFactoryTest, Create) {
EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -928,8 +956,8 @@ TEST_P(QuicStreamFactoryTest, Create) {
// TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
// in streams on different sessions.
QuicStreamRequest request3(factory_.get());
- EXPECT_EQ(OK, request3.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request3.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -958,8 +986,8 @@ TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
"192.168.0.1", "");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -984,8 +1012,8 @@ TEST_P(QuicStreamFactoryTest, DefaultInitialRtt) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1012,8 +1040,8 @@ TEST_P(QuicStreamFactoryTest, FactoryDestroyedWhenJobPending) {
auto request = std::make_unique<QuicStreamRequest>(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request->Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
request.reset();
@@ -1042,8 +1070,8 @@ TEST_P(QuicStreamFactoryTest, RequireConfirmation) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1083,8 +1111,8 @@ TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) {
QuicStreamRequest request(factory_.get());
EXPECT_THAT(request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()),
IsOk());
@@ -1123,8 +1151,8 @@ TEST_P(QuicStreamFactoryTest, CachedInitialRtt) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1156,8 +1184,8 @@ TEST_P(QuicStreamFactoryTest, 2gInitialRtt) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1189,8 +1217,8 @@ TEST_P(QuicStreamFactoryTest, 3gInitialRtt) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1217,8 +1245,8 @@ TEST_P(QuicStreamFactoryTest, GoAway) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1249,8 +1277,8 @@ TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1294,8 +1322,8 @@ TEST_P(QuicStreamFactoryTest, Pooling) {
host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -1305,11 +1333,12 @@ TEST_P(QuicStreamFactoryTest, Pooling) {
TestCompletionCallback callback;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK,
- request2.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback.callback()));
+ EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback.callback()));
std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
EXPECT_TRUE(stream2.get());
@@ -1358,7 +1387,8 @@ TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ server2, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback.callback()));
EXPECT_EQ(OK, callback.WaitForResult());
@@ -1392,8 +1422,8 @@ TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -1403,11 +1433,12 @@ TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
TestCompletionCallback callback;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK,
- request2.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback.callback()));
+ EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback.callback()));
std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
EXPECT_TRUE(stream2.get());
@@ -1417,11 +1448,12 @@ TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
TestCompletionCallback callback3;
QuicStreamRequest request3(factory_.get());
- EXPECT_EQ(OK,
- request3.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback3.callback()));
+ EXPECT_EQ(OK, request3.Request(server2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback3.callback()));
std::unique_ptr<HttpStream> stream3 = CreateStream(&request3);
EXPECT_TRUE(stream3.get());
@@ -1452,21 +1484,23 @@ TEST_P(QuicStreamFactoryTest, HttpsPooling) {
host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK,
- request.Request(
- server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, request.Request(server1, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback_.callback()));
std::unique_ptr<HttpStream> stream = CreateStream(&request);
EXPECT_TRUE(stream.get());
TestCompletionCallback callback;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK,
- request2.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback_.callback()));
std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
EXPECT_TRUE(stream2.get());
@@ -1500,21 +1534,23 @@ TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK,
- request.Request(
- server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, request.Request(server1, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback_.callback()));
std::unique_ptr<HttpStream> stream = CreateStream(&request);
EXPECT_TRUE(stream.get());
TestCompletionCallback callback;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK,
- request2.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback_.callback()));
std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
EXPECT_TRUE(stream2.get());
@@ -1559,21 +1595,23 @@ TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK,
- request.Request(
- server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, request.Request(server1, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback_.callback()));
std::unique_ptr<HttpStream> stream = CreateStream(&request);
EXPECT_TRUE(stream.get());
TestCompletionCallback callback;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK,
- request2.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback_.callback()));
std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
EXPECT_TRUE(stream2.get());
@@ -1603,8 +1641,8 @@ TEST_P(QuicStreamFactoryTest, Goaway) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1625,8 +1663,8 @@ TEST_P(QuicStreamFactoryTest, Goaway) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -1655,11 +1693,10 @@ TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
quic::QuicStreamId stream_id = GetNthClientInitiatedBidirectionalStreamId(0);
MockQuicData socket_data;
socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
- if (version_ == quic::QUIC_VERSION_99) {
- socket_data.AddWrite(
- SYNCHRONOUS,
- client_maker_.MakeStreamIdBlockedPacket(
- 2, true, GetNthClientInitiatedBidirectionalStreamId(49)));
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
+ socket_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
+ 2, true, 51,
+ /*unidirectional=*/false));
socket_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(3, true, stream_id,
quic::QUIC_STREAM_CANCELLED));
@@ -1667,8 +1704,8 @@ TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
quic::QUIC_STREAM_CANCELLED));
socket_data.AddRead(
- ASYNC, server_maker_.MakeMaxStreamIdPacket(
- 4, true, GetNthClientInitiatedBidirectionalStreamId(50)));
+ ASYNC, server_maker_.MakeMaxStreamsPacket(4, true, 52,
+ /*unidirectional=*/false));
} else {
socket_data.AddWrite(
SYNCHRONOUS, client_maker_.MakeRstPacket(2, true, stream_id,
@@ -1690,7 +1727,8 @@ TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
for (size_t i = 0; i < quic::kDefaultMaxStreamsPerConnection / 2; i++) {
QuicStreamRequest request(factory_.get());
int rv = request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback());
if (i == 0) {
@@ -1708,8 +1746,8 @@ TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
}
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -1749,8 +1787,8 @@ TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1770,8 +1808,8 @@ TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1791,8 +1829,8 @@ TEST_P(QuicStreamFactoryTest, CancelCreate) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
}
@@ -1800,8 +1838,8 @@ TEST_P(QuicStreamFactoryTest, CancelCreate) {
base::RunLoop().RunUntilIdle();
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -1839,8 +1877,8 @@ TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1864,8 +1902,8 @@ TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -1900,8 +1938,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
@@ -1921,8 +1959,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_FALSE(HasActiveSession(host_port_pair_));
@@ -1966,8 +2004,8 @@ TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
// Check no active session, or active jobs left for this server.
@@ -1987,8 +2025,8 @@ TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_FALSE(HasActiveSession(host_port_pair_));
@@ -2036,8 +2074,8 @@ TEST_P(QuicStreamFactoryTest, CloseSessionsOnIPAddressChanged) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -2071,8 +2109,8 @@ TEST_P(QuicStreamFactoryTest, CloseSessionsOnIPAddressChanged) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -2129,8 +2167,8 @@ TEST_P(QuicStreamFactoryTest, GoAwaySessionsOnIPAddressChanged) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2175,8 +2213,8 @@ TEST_P(QuicStreamFactoryTest, GoAwaySessionsOnIPAddressChanged) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2214,8 +2252,8 @@ TEST_P(QuicStreamFactoryTest, OnIPAddressChangedWithConnectionMigration) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -2237,8 +2275,8 @@ TEST_P(QuicStreamFactoryTest, OnIPAddressChangedWithConnectionMigration) {
// Attempting a new request to the same origin uses the same connection.
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -2315,8 +2353,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnNetworkMadeDefault(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2494,8 +2532,8 @@ TEST_P(QuicStreamFactoryTest, MigratedToBlockedSocketAfterProbing) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2638,8 +2676,8 @@ TEST_P(QuicStreamFactoryTest, MigrationTimeoutWithNoNewNetwork) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2755,8 +2793,8 @@ void QuicStreamFactoryTestBase::TestOnNetworkMadeDefaultNonMigratableStream(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2820,8 +2858,8 @@ TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultConnectionMigrationDisabled) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2912,8 +2950,8 @@ void QuicStreamFactoryTestBase::TestOnNetworkDisconnectedNonMigratableStream(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -2976,8 +3014,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3065,8 +3103,8 @@ void QuicStreamFactoryTestBase::TestOnNetworkMadeDefaultNoOpenStreams(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3133,8 +3171,8 @@ void QuicStreamFactoryTestBase::TestOnNetworkDisconnectedNoOpenStreams(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3206,8 +3244,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnNetworkDisconnected(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3325,8 +3363,8 @@ TEST_P(QuicStreamFactoryTest, NewNetworkConnectedAfterNoNetwork) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3488,8 +3526,8 @@ TEST_P(QuicStreamFactoryTest, MigrateToProbingSocket) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3662,8 +3700,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnPathDegrading(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3800,8 +3838,8 @@ TEST_P(QuicStreamFactoryTest, GoawayOnPathDegrading) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cerf_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3841,8 +3879,8 @@ TEST_P(QuicStreamFactoryTest, GoawayOnPathDegrading) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -3917,8 +3955,8 @@ TEST_P(QuicStreamFactoryTest, DoNotMigrateToBadSocketOnPathDegrading) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4020,8 +4058,12 @@ void QuicStreamFactoryTestBase::TestMigrateSessionWithDrainingStream(
ASYNC, ConstructOkResponsePacket(
2, GetNthClientInitiatedBidirectionalStreamId(0), false,
true)); // keep sending version.
- quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
- packet_number++, 2, 2, 2, 1, true));
+ if (!GetQuicRestartFlag(quic_enable_accept_random_ipn)) {
+ // Packet 2 is considered as out of order packet and an ACK will be sent
+ // immediately.
+ quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeAckPacket(
+ packet_number++, 2, 2, 2, 1, true));
+ }
quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
quic_data1.AddSocketDataToFactory(socket_factory_.get());
@@ -4055,8 +4097,8 @@ void QuicStreamFactoryTestBase::TestMigrateSessionWithDrainingStream(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4212,8 +4254,8 @@ TEST_P(QuicStreamFactoryTest, MigrateOnNewNetworkConnectAfterPathDegrading) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4351,21 +4393,23 @@ TEST_P(QuicStreamFactoryTest,
// Create request and QuicHttpStream to create session1.
QuicStreamRequest request1(factory_.get());
- EXPECT_EQ(OK,
- request1.Request(
- server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, request1.Request(server1, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback_.callback()));
std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
EXPECT_TRUE(stream1.get());
// Create request and QuicHttpStream to create session2.
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK,
- request2.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback_.callback()));
std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
EXPECT_TRUE(stream2.get());
@@ -4476,8 +4520,8 @@ TEST_P(QuicStreamFactoryTest, MigrateOnPathDegradingWithNoNewNetwork) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4590,8 +4634,8 @@ void QuicStreamFactoryTestBase::TestMigrateSessionEarlyNonMigratableStream(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4656,8 +4700,8 @@ TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4758,8 +4802,8 @@ TEST_P(QuicStreamFactoryTest, MigrateSessionOnAysncWriteError) {
QuicStreamRequest request1(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request1.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -4778,8 +4822,8 @@ TEST_P(QuicStreamFactoryTest, MigrateSessionOnAysncWriteError) {
// Request #2 returns synchronously because it pools to existing session.
TestCompletionCallback callback2;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -4895,8 +4939,8 @@ TEST_P(QuicStreamFactoryTest, MigrateBackToDefaultPostMigrationOnWriteError) {
QuicStreamRequest request1(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request1.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -5017,8 +5061,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -5078,8 +5122,8 @@ void QuicStreamFactoryTestBase::TestNoAlternateNetworkBeforeHandshake(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -5200,8 +5244,8 @@ void QuicStreamFactoryTestBase::
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -5317,8 +5361,8 @@ TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
@@ -5338,8 +5382,8 @@ TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_FALSE(HasActiveSession(host_port_pair_));
@@ -5412,8 +5456,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
// Ensure that the session is alive but not active.
@@ -5482,8 +5526,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteError(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -5579,8 +5623,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -5716,8 +5760,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithMultipleRequests(
QuicStreamRequest request1(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request1.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -5736,8 +5780,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithMultipleRequests(
// Second request returns synchronously because it pools to existing session.
TestCompletionCallback callback2;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -5852,8 +5896,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams(
QuicStreamRequest request1(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request1.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -5872,8 +5916,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams(
// Second request returns synchronously because it pools to existing session.
TestCompletionCallback callback2;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -5999,8 +6043,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams2(
QuicStreamRequest request1(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request1.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -6019,8 +6063,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams2(
// Second request returns synchronously because it pools to existing session.
TestCompletionCallback callback2;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -6132,8 +6176,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6219,8 +6263,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMigrationDisabled(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6345,8 +6389,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnMultipleWriteErrors(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6440,8 +6484,8 @@ TEST_P(QuicStreamFactoryTest, NoMigrationBeforeHandshakeOnNetworkDisconnected) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
// Deliver the network notification, which should cause the connection to be
@@ -6479,8 +6523,8 @@ void QuicStreamFactoryTestBase::
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6613,8 +6657,8 @@ void QuicStreamFactoryTestBase::
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6753,8 +6797,8 @@ void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorPauseBeforeConnected(
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -6884,8 +6928,8 @@ TEST_P(QuicStreamFactoryTest, IgnoreWriteErrorFromOldWriterAfterMigration) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -6988,8 +7032,8 @@ TEST_P(QuicStreamFactoryTest, IgnoreReadErrorFromOldReaderAfterMigration) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7102,8 +7146,8 @@ TEST_P(QuicStreamFactoryTest, IgnoreReadErrorOnOldReaderDuringMigration) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7184,12 +7228,880 @@ TEST_P(QuicStreamFactoryTest, IgnoreReadErrorOnOldReaderDuringMigration) {
EXPECT_EQ(200, response.headers->response_code());
stream.reset();
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed());
+ EXPECT_TRUE(socket_data1.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
+}
+
+// This test verifies that when connection migration on path degrading is
+// enabled, and no custom retransmittable on wire timeout is specified, the
+// default value is used.
+TEST_P(QuicStreamFactoryTest, DefaultRetransmittableOnWireTimeoutForMigration) {
+ InitializeConnectionMigrationV2Test(
+ {kDefaultNetworkForTests, kNewNetworkForTests});
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+ // Using a testing task runner.
+ auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
+ QuicStreamFactoryPeer::SetAlarmFactory(
+ factory_.get(),
+ std::make_unique<QuicChromiumAlarmFactory>(task_runner.get(), &clock_));
+
+ MockQuicData socket_data;
+ quic::QuicStreamOffset header_stream_offset = 0;
+ socket_data.AddWrite(
+ SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
+ socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
+ socket_data.AddSocketDataToFactory(socket_factory_.get());
+
+ // Set up second socket data provider that is used after
+ // migration. The request is written to this new socket, and the
+ // response to the request is read on this new socket.
+ MockQuicData socket_data1;
+ // The PING packet sent post migration.
+ socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakePingPacket(2, true));
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructGetRequestPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), true,
+ true, &header_stream_offset));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ // Read two packets so that client will send ACK immedaitely.
+ spdy::SpdyHeaderBlock response_headers =
+ server_maker_.GetResponseHeaders("200 OK");
+ response_headers["key1"] = std::string(2000, 'A');
+ spdy::SpdyHeadersIR headers_frame(
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ std::move(response_headers));
+ spdy::SpdyFramer response_framer(spdy::SpdyFramer::ENABLE_COMPRESSION);
+ spdy::SpdySerializedFrame spdy_frame =
+ response_framer.SerializeFrame(headers_frame);
+ size_t chunk_size = 1200;
+ unsigned int packet_number = 1;
+ for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
+ size_t len = std::min(chunk_size, spdy_frame.size() - offset);
+ socket_data1.AddRead(
+ ASYNC,
+ server_maker_.MakeDataPacket(
+ packet_number++,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, offset,
+ base::StringPiece(spdy_frame.data() + offset, len)));
+ }
+ // Read an ACK from server which acks all client data.
+ socket_data1.AddRead(SYNCHRONOUS,
+ server_maker_.MakeAckPacket(3, 3, 1, 1, false));
+ socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(4, 2, 1, 1, false));
+ // The PING packet sent for retransmittable on wire.
+ socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakePingPacket(5, false));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ std::string header = ConstructDataHeader(6);
+ socket_data1.AddRead(
+ ASYNC, ConstructServerDataPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
+ 0, header + "hello!"));
+ socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
+ socket_data1.AddWrite(
+ SYNCHRONOUS, client_maker_.MakeRstPacket(
+ 6, false, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED));
+ socket_data1.AddSocketDataToFactory(socket_factory_.get());
+
+ // Create request and QuicHttpStream.
+ QuicStreamRequest request(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, callback_.WaitForResult());
+ std::unique_ptr<HttpStream> stream = CreateStream(&request);
+ EXPECT_TRUE(stream.get());
+
+ // Cause QUIC stream to be created.
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.example.org/");
+ request_info.traffic_annotation =
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
+ net_log_, CompletionOnceCallback()));
+
+ // Ensure that session is alive and active.
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+ // Now notify network is disconnected, cause the migration to complete
+ // immediately.
+ scoped_mock_network_change_notifier_->mock_network_change_notifier()
+ ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
+
+ // Complete migration.
+ task_runner->RunUntilIdle();
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ // Send GET request on stream.
+ HttpResponseInfo response;
+ HttpRequestHeaders request_headers;
+ EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+ callback_.callback()));
+ socket_data1.Resume();
+ // Spin up the message loop to read incoming data from server till the ACK.
+ base::RunLoop().RunUntilIdle();
+
+ // Ack delay time.
+ int delay = task_runner->NextPendingTaskDelay().InMilliseconds();
+ EXPECT_GT(kDefaultRetransmittableOnWireTimeoutMillisecs, delay);
+ // Fire the ack alarm, since ack has been sent, no ack will be sent.
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ // Fire the ping alarm with retransmittable-on-wire timeout, send PING.
+ delay = kDefaultRetransmittableOnWireTimeoutMillisecs - delay;
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(delay),
+ task_runner->NextPendingTaskDelay());
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ socket_data1.Resume();
+
+ // Verify that response headers on the migrated socket were delivered to the
+ // stream.
+ EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
+ EXPECT_EQ(200, response.headers->response_code());
+
+ // Resume the old socket data, a read error will be delivered to the old
+ // packet reader. Verify that the session is not affected.
+ socket_data.Resume();
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ stream.reset();
+ EXPECT_TRUE(socket_data.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed());
+ EXPECT_TRUE(socket_data1.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
+}
+
+// This test verifies that when connection migration on path degrading is
+// enabled, and a custom retransmittable on wire timeout is specified, the
+// custom value is used.
+TEST_P(QuicStreamFactoryTest, CustomRetransmittableOnWireTimeoutForMigration) {
+ int custom_timeout_value = 200;
+ test_params_.quic_retransmittable_on_wire_timeout_milliseconds =
+ custom_timeout_value;
+ InitializeConnectionMigrationV2Test(
+ {kDefaultNetworkForTests, kNewNetworkForTests});
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+ // Using a testing task runner.
+ auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
+ QuicStreamFactoryPeer::SetAlarmFactory(
+ factory_.get(),
+ std::make_unique<QuicChromiumAlarmFactory>(task_runner.get(), &clock_));
+
+ MockQuicData socket_data;
+ quic::QuicStreamOffset header_stream_offset = 0;
+ socket_data.AddWrite(
+ SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
+ socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
+ socket_data.AddSocketDataToFactory(socket_factory_.get());
+
+ // Set up second socket data provider that is used after
+ // migration. The request is written to this new socket, and the
+ // response to the request is read on this new socket.
+ MockQuicData socket_data1;
+ // The PING packet sent post migration.
+ socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakePingPacket(2, true));
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructGetRequestPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), true,
+ true, &header_stream_offset));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ // Read two packets so that client will send ACK immedaitely.
+ spdy::SpdyHeaderBlock response_headers =
+ server_maker_.GetResponseHeaders("200 OK");
+ response_headers["key1"] = std::string(2000, 'A');
+ spdy::SpdyHeadersIR headers_frame(
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ std::move(response_headers));
+ spdy::SpdyFramer response_framer(spdy::SpdyFramer::ENABLE_COMPRESSION);
+ spdy::SpdySerializedFrame spdy_frame =
+ response_framer.SerializeFrame(headers_frame);
+ size_t chunk_size = 1200;
+ unsigned int packet_number = 1;
+ for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
+ size_t len = std::min(chunk_size, spdy_frame.size() - offset);
+ socket_data1.AddRead(
+ ASYNC,
+ server_maker_.MakeDataPacket(
+ packet_number++,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, offset,
+ base::StringPiece(spdy_frame.data() + offset, len)));
+ }
+ // Read an ACK from server which acks all client data.
+ socket_data1.AddRead(SYNCHRONOUS,
+ server_maker_.MakeAckPacket(3, 3, 1, 1, false));
+ socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(4, 2, 1, 1, false));
+ // The PING packet sent for retransmittable on wire.
+ socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakePingPacket(5, false));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ std::string header = ConstructDataHeader(6);
+ socket_data1.AddRead(
+ ASYNC, ConstructServerDataPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
+ 0, header + "hello!"));
+ socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
+ socket_data1.AddWrite(
+ SYNCHRONOUS, client_maker_.MakeRstPacket(
+ 6, false, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED));
+ socket_data1.AddSocketDataToFactory(socket_factory_.get());
+
+ // Create request and QuicHttpStream.
+ QuicStreamRequest request(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, callback_.WaitForResult());
+ std::unique_ptr<HttpStream> stream = CreateStream(&request);
+ EXPECT_TRUE(stream.get());
+
+ // Cause QUIC stream to be created.
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.example.org/");
+ request_info.traffic_annotation =
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
+ net_log_, CompletionOnceCallback()));
+
+ // Ensure that session is alive and active.
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+ // Now notify network is disconnected, cause the migration to complete
+ // immediately.
+ scoped_mock_network_change_notifier_->mock_network_change_notifier()
+ ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
+
+ // Complete migration.
+ task_runner->RunUntilIdle();
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ // Send GET request on stream.
+ HttpResponseInfo response;
+ HttpRequestHeaders request_headers;
+ EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+ callback_.callback()));
+ socket_data1.Resume();
+ // Spin up the message loop to read incoming data from server till the ACK.
+ base::RunLoop().RunUntilIdle();
+
+ // Ack delay time.
+ int delay = task_runner->NextPendingTaskDelay().InMilliseconds();
+ EXPECT_GT(custom_timeout_value, delay);
+ // Fire the ack alarm, since ack has been sent, no ack will be sent.
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ // Fire the ping alarm with retransmittable-on-wire timeout, send PING.
+ delay = custom_timeout_value - delay;
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(delay),
+ task_runner->NextPendingTaskDelay());
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ socket_data1.Resume();
+
+ // Verify that response headers on the migrated socket were delivered to the
+ // stream.
+ EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
+ EXPECT_EQ(200, response.headers->response_code());
+
+ // Resume the old socket data, a read error will be delivered to the old
+ // packet reader. Verify that the session is not affected.
+ socket_data.Resume();
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ stream.reset();
EXPECT_TRUE(socket_data.AllReadDataConsumed());
EXPECT_TRUE(socket_data.AllWriteDataConsumed());
EXPECT_TRUE(socket_data1.AllReadDataConsumed());
EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
}
+// This test verifies that when no migration is enabled, but a custom value for
+// retransmittable-on-wire timeout is specified, the ping alarm is set up to
+// send retransmittable pings with the custom value.
+TEST_P(QuicStreamFactoryTest, CustomRetransmittableOnWireTimeout) {
+ int custom_timeout_value = 200;
+ test_params_.quic_retransmittable_on_wire_timeout_milliseconds =
+ custom_timeout_value;
+ Initialize();
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+ // Using a testing task runner.
+ auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
+ QuicStreamFactoryPeer::SetAlarmFactory(
+ factory_.get(),
+ std::make_unique<QuicChromiumAlarmFactory>(task_runner.get(), &clock_));
+
+ MockQuicData socket_data1;
+ quic::QuicStreamOffset header_stream_offset = 0;
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructGetRequestPacket(
+ 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
+ true, &header_stream_offset));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ // Read two packets so that client will send ACK immedaitely.
+ spdy::SpdyHeaderBlock response_headers =
+ server_maker_.GetResponseHeaders("200 OK");
+ response_headers["key1"] = std::string(2000, 'A');
+ spdy::SpdyHeadersIR headers_frame(
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ std::move(response_headers));
+ spdy::SpdyFramer response_framer(spdy::SpdyFramer::ENABLE_COMPRESSION);
+ spdy::SpdySerializedFrame spdy_frame =
+ response_framer.SerializeFrame(headers_frame);
+ size_t chunk_size = 1200;
+ unsigned int packet_number = 1;
+ for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
+ size_t len = std::min(chunk_size, spdy_frame.size() - offset);
+ socket_data1.AddRead(
+ ASYNC,
+ server_maker_.MakeDataPacket(
+ packet_number++,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, offset,
+ base::StringPiece(spdy_frame.data() + offset, len)));
+ }
+ // Read an ACK from server which acks all client data.
+ socket_data1.AddRead(SYNCHRONOUS,
+ server_maker_.MakeAckPacket(3, 2, 1, 1, false));
+ socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(3, 2, 1, 1, false));
+ // The PING packet sent for retransmittable on wire.
+ socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakePingPacket(4, false));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ std::string header = ConstructDataHeader(6);
+ socket_data1.AddRead(
+ ASYNC, ConstructServerDataPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
+ 0, header + "hello!"));
+ socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
+ socket_data1.AddWrite(
+ SYNCHRONOUS, client_maker_.MakeRstPacket(
+ 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED));
+ socket_data1.AddSocketDataToFactory(socket_factory_.get());
+
+ // Create request and QuicHttpStream.
+ QuicStreamRequest request(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, callback_.WaitForResult());
+ std::unique_ptr<HttpStream> stream = CreateStream(&request);
+ EXPECT_TRUE(stream.get());
+
+ // Cause QUIC stream to be created.
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.example.org/");
+ request_info.traffic_annotation =
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
+ net_log_, CompletionOnceCallback()));
+
+ // Ensure that session is alive and active.
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+ // Complete migration.
+ task_runner->RunUntilIdle();
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ // Send GET request on stream.
+ HttpResponseInfo response;
+ HttpRequestHeaders request_headers;
+ EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+ callback_.callback()));
+ socket_data1.Resume();
+ // Spin up the message loop to read incoming data from server till the ACK.
+ base::RunLoop().RunUntilIdle();
+
+ // Ack delay time.
+ int delay = task_runner->NextPendingTaskDelay().InMilliseconds();
+ EXPECT_GT(custom_timeout_value, delay);
+ // Fire the ack alarm, since ack has been sent, no ack will be sent.
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ // Fire the ping alarm with retransmittable-on-wire timeout, send PING.
+ delay = custom_timeout_value - delay;
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(delay),
+ task_runner->NextPendingTaskDelay());
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ socket_data1.Resume();
+
+ // Verify that response headers on the migrated socket were delivered to the
+ // stream.
+ EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
+ EXPECT_EQ(200, response.headers->response_code());
+
+ // Resume the old socket data, a read error will be delivered to the old
+ // packet reader. Verify that the session is not affected.
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ stream.reset();
+ EXPECT_TRUE(socket_data1.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
+}
+
+// This test verifies that when no migration is enabled, and no custom value
+// for retransmittable-on-wire timeout is specified, the ping alarm will not
+// send any retransmittable pings.
+TEST_P(QuicStreamFactoryTest, NoRetransmittableOnWireTimeout) {
+ Initialize();
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+ // Using a testing task runner.
+ auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
+ QuicStreamFactoryPeer::SetAlarmFactory(
+ factory_.get(),
+ std::make_unique<QuicChromiumAlarmFactory>(task_runner.get(), &clock_));
+
+ MockQuicData socket_data1;
+ quic::QuicStreamOffset header_stream_offset = 0;
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructGetRequestPacket(
+ 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
+ true, &header_stream_offset));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ // Read two packets so that client will send ACK immedaitely.
+ spdy::SpdyHeaderBlock response_headers =
+ server_maker_.GetResponseHeaders("200 OK");
+ response_headers["key1"] = std::string(2000, 'A');
+ spdy::SpdyHeadersIR headers_frame(
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ std::move(response_headers));
+ spdy::SpdyFramer response_framer(spdy::SpdyFramer::ENABLE_COMPRESSION);
+ spdy::SpdySerializedFrame spdy_frame =
+ response_framer.SerializeFrame(headers_frame);
+ size_t chunk_size = 1200;
+ unsigned int packet_number = 1;
+ for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
+ size_t len = std::min(chunk_size, spdy_frame.size() - offset);
+ socket_data1.AddRead(
+ ASYNC,
+ server_maker_.MakeDataPacket(
+ packet_number++,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, offset,
+ base::StringPiece(spdy_frame.data() + offset, len)));
+ }
+ // Read an ACK from server which acks all client data.
+ socket_data1.AddRead(SYNCHRONOUS,
+ server_maker_.MakeAckPacket(3, 2, 1, 1, false));
+ socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(3, 2, 1, 1, false));
+ std::string header = ConstructDataHeader(6);
+ socket_data1.AddRead(
+ ASYNC, ConstructServerDataPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
+ 0, header + "hello!"));
+ socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
+ socket_data1.AddWrite(
+ SYNCHRONOUS, client_maker_.MakeRstPacket(
+ 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED));
+ socket_data1.AddSocketDataToFactory(socket_factory_.get());
+
+ // Create request and QuicHttpStream.
+ QuicStreamRequest request(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, callback_.WaitForResult());
+ std::unique_ptr<HttpStream> stream = CreateStream(&request);
+ EXPECT_TRUE(stream.get());
+
+ // Cause QUIC stream to be created.
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.example.org/");
+ request_info.traffic_annotation =
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
+ net_log_, CompletionOnceCallback()));
+
+ // Ensure that session is alive and active.
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+ // Complete migration.
+ task_runner->RunUntilIdle();
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ // Send GET request on stream.
+ HttpResponseInfo response;
+ HttpRequestHeaders request_headers;
+ EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+ callback_.callback()));
+ socket_data1.Resume();
+ // Spin up the message loop to read incoming data from server till the ACK.
+ base::RunLoop().RunUntilIdle();
+
+ // Ack delay time.
+ int delay = task_runner->NextPendingTaskDelay().InMilliseconds();
+ EXPECT_GT(kDefaultRetransmittableOnWireTimeoutMillisecs, delay);
+ // Fire the ack alarm, since ack has been sent, no ack will be sent.
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ // Verify that the ping alarm is not set with any default value.
+ int wrong_delay = kDefaultRetransmittableOnWireTimeoutMillisecs - delay;
+ delay = task_runner->NextPendingTaskDelay().InMilliseconds();
+ EXPECT_NE(wrong_delay, delay);
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ // Verify that response headers on the migrated socket were delivered to the
+ // stream.
+ EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
+ EXPECT_EQ(200, response.headers->response_code());
+
+ // Resume the old socket data, a read error will be delivered to the old
+ // packet reader. Verify that the session is not affected.
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ stream.reset();
+ EXPECT_TRUE(socket_data1.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
+}
+
+// This test verifies that when only migration on network change is enabled, and
+// a custom value for retransmittable-on-wire is specified, the ping alarm will
+// send retransmittable pings to the peer with custom value.
+TEST_P(QuicStreamFactoryTest,
+ CustomeRetransmittableOnWireTimeoutWithMigrationOnNetworkChangeOnly) {
+ int custom_timeout_value = 200;
+ test_params_.quic_retransmittable_on_wire_timeout_milliseconds =
+ custom_timeout_value;
+ test_params_.quic_migrate_sessions_on_network_change_v2 = true;
+ Initialize();
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+ // Using a testing task runner.
+ auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
+ QuicStreamFactoryPeer::SetAlarmFactory(
+ factory_.get(),
+ std::make_unique<QuicChromiumAlarmFactory>(task_runner.get(), &clock_));
+
+ MockQuicData socket_data1;
+ quic::QuicStreamOffset header_stream_offset = 0;
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructGetRequestPacket(
+ 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
+ true, &header_stream_offset));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ // Read two packets so that client will send ACK immedaitely.
+ spdy::SpdyHeaderBlock response_headers =
+ server_maker_.GetResponseHeaders("200 OK");
+ response_headers["key1"] = std::string(2000, 'A');
+ spdy::SpdyHeadersIR headers_frame(
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ std::move(response_headers));
+ spdy::SpdyFramer response_framer(spdy::SpdyFramer::ENABLE_COMPRESSION);
+ spdy::SpdySerializedFrame spdy_frame =
+ response_framer.SerializeFrame(headers_frame);
+ size_t chunk_size = 1200;
+ unsigned int packet_number = 1;
+ for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
+ size_t len = std::min(chunk_size, spdy_frame.size() - offset);
+ socket_data1.AddRead(
+ ASYNC,
+ server_maker_.MakeDataPacket(
+ packet_number++,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, offset,
+ base::StringPiece(spdy_frame.data() + offset, len)));
+ }
+ // Read an ACK from server which acks all client data.
+ socket_data1.AddRead(SYNCHRONOUS,
+ server_maker_.MakeAckPacket(3, 2, 1, 1, false));
+ socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(3, 2, 1, 1, false));
+ // The PING packet sent for retransmittable on wire.
+ socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakePingPacket(4, false));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ std::string header = ConstructDataHeader(6);
+ socket_data1.AddRead(
+ ASYNC, ConstructServerDataPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
+ 0, header + "hello!"));
+ socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
+ socket_data1.AddWrite(
+ SYNCHRONOUS, client_maker_.MakeRstPacket(
+ 5, false, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED));
+ socket_data1.AddSocketDataToFactory(socket_factory_.get());
+
+ // Create request and QuicHttpStream.
+ QuicStreamRequest request(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, callback_.WaitForResult());
+ std::unique_ptr<HttpStream> stream = CreateStream(&request);
+ EXPECT_TRUE(stream.get());
+
+ // Cause QUIC stream to be created.
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.example.org/");
+ request_info.traffic_annotation =
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
+ net_log_, CompletionOnceCallback()));
+
+ // Ensure that session is alive and active.
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+ // Complete migration.
+ task_runner->RunUntilIdle();
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ // Send GET request on stream.
+ HttpResponseInfo response;
+ HttpRequestHeaders request_headers;
+ EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+ callback_.callback()));
+ socket_data1.Resume();
+ // Spin up the message loop to read incoming data from server till the ACK.
+ base::RunLoop().RunUntilIdle();
+
+ // Ack delay time.
+ int delay = task_runner->NextPendingTaskDelay().InMilliseconds();
+ EXPECT_GT(custom_timeout_value, delay);
+ // Fire the ack alarm, since ack has been sent, no ack will be sent.
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ // Fire the ping alarm with retransmittable-on-wire timeout, send PING.
+ delay = custom_timeout_value - delay;
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(delay),
+ task_runner->NextPendingTaskDelay());
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ socket_data1.Resume();
+
+ // Verify that response headers on the migrated socket were delivered to the
+ // stream.
+ EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
+ EXPECT_EQ(200, response.headers->response_code());
+
+ // Resume the old socket data, a read error will be delivered to the old
+ // packet reader. Verify that the session is not affected.
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ stream.reset();
+ EXPECT_TRUE(socket_data1.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
+}
+
+// This test verifies that when only migration on network change is enabled, and
+// no custom value for retransmittable-on-wire is specified, the ping alarm will
+// NOT send retransmittable pings to the peer with custom value.
+TEST_P(QuicStreamFactoryTest,
+ NoRetransmittableOnWireTimeoutWithMigrationOnNetworkChangeOnly) {
+ test_params_.quic_migrate_sessions_on_network_change_v2 = true;
+ Initialize();
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+ // Using a testing task runner.
+ auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
+ QuicStreamFactoryPeer::SetAlarmFactory(
+ factory_.get(),
+ std::make_unique<QuicChromiumAlarmFactory>(task_runner.get(), &clock_));
+
+ MockQuicData socket_data1;
+ quic::QuicStreamOffset header_stream_offset = 0;
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructInitialSettingsPacket(1, &header_stream_offset));
+ socket_data1.AddWrite(
+ SYNCHRONOUS, ConstructGetRequestPacket(
+ 2, GetNthClientInitiatedBidirectionalStreamId(0), true,
+ true, &header_stream_offset));
+ socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
+ // Read two packets so that client will send ACK immedaitely.
+ spdy::SpdyHeaderBlock response_headers =
+ server_maker_.GetResponseHeaders("200 OK");
+ response_headers["key1"] = std::string(2000, 'A');
+ spdy::SpdyHeadersIR headers_frame(
+ GetNthClientInitiatedBidirectionalStreamId(0),
+ std::move(response_headers));
+ spdy::SpdyFramer response_framer(spdy::SpdyFramer::ENABLE_COMPRESSION);
+ spdy::SpdySerializedFrame spdy_frame =
+ response_framer.SerializeFrame(headers_frame);
+ size_t chunk_size = 1200;
+ unsigned int packet_number = 1;
+ for (size_t offset = 0; offset < spdy_frame.size(); offset += chunk_size) {
+ size_t len = std::min(chunk_size, spdy_frame.size() - offset);
+ socket_data1.AddRead(
+ ASYNC,
+ server_maker_.MakeDataPacket(
+ packet_number++,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version),
+ false, false, offset,
+ base::StringPiece(spdy_frame.data() + offset, len)));
+ }
+ // Read an ACK from server which acks all client data.
+ socket_data1.AddRead(SYNCHRONOUS,
+ server_maker_.MakeAckPacket(3, 2, 1, 1, false));
+ socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(3, 2, 1, 1, false));
+ std::string header = ConstructDataHeader(6);
+ socket_data1.AddRead(
+ ASYNC, ConstructServerDataPacket(
+ 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
+ 0, header + "hello!"));
+ socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
+ socket_data1.AddWrite(
+ SYNCHRONOUS, client_maker_.MakeRstPacket(
+ 4, false, GetNthClientInitiatedBidirectionalStreamId(0),
+ quic::QUIC_STREAM_CANCELLED));
+ socket_data1.AddSocketDataToFactory(socket_factory_.get());
+
+ // Create request and QuicHttpStream.
+ QuicStreamRequest request(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(OK, callback_.WaitForResult());
+ std::unique_ptr<HttpStream> stream = CreateStream(&request);
+ EXPECT_TRUE(stream.get());
+
+ // Cause QUIC stream to be created.
+ HttpRequestInfo request_info;
+ request_info.method = "GET";
+ request_info.url = GURL("https://www.example.org/");
+ request_info.traffic_annotation =
+ MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
+ EXPECT_EQ(OK, stream->InitializeStream(&request_info, true, DEFAULT_PRIORITY,
+ net_log_, CompletionOnceCallback()));
+
+ // Ensure that session is alive and active.
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+
+ // Complete migration.
+ task_runner->RunUntilIdle();
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ // Send GET request on stream.
+ HttpResponseInfo response;
+ HttpRequestHeaders request_headers;
+ EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
+ callback_.callback()));
+ socket_data1.Resume();
+ // Spin up the message loop to read incoming data from server till the ACK.
+ base::RunLoop().RunUntilIdle();
+
+ // Ack delay time.
+ int delay = task_runner->NextPendingTaskDelay().InMilliseconds();
+ EXPECT_GT(kDefaultRetransmittableOnWireTimeoutMillisecs, delay);
+ // Fire the ack alarm, since ack has been sent, no ack will be sent.
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ // Verify ping alarm is not set with default value.
+ int wrong_delay = kDefaultRetransmittableOnWireTimeoutMillisecs - delay;
+ delay = task_runner->NextPendingTaskDelay().InMilliseconds();
+ EXPECT_NE(wrong_delay, delay);
+ clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(delay));
+ task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
+
+ // Verify that response headers on the migrated socket were delivered to the
+ // stream.
+ EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
+ EXPECT_EQ(200, response.headers->response_code());
+
+ // Resume the old socket data, a read error will be delivered to the old
+ // packet reader. Verify that the session is not affected.
+ EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
+ EXPECT_TRUE(HasActiveSession(host_port_pair_));
+ EXPECT_EQ(1u, session->GetNumActiveStreams());
+
+ stream.reset();
+ EXPECT_TRUE(socket_data1.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
+}
+
// This test verifies that after migration on write error is posted, packet
// read error on the old reader will be ignored and will not close the
// connection.
@@ -7217,8 +8129,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7362,8 +8274,8 @@ void QuicStreamFactoryTestBase::
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7455,8 +8367,8 @@ void QuicStreamFactoryTestBase::
->NotifyNetworkMadeDefault(kNewNetworkForTests);
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -7541,8 +8453,8 @@ TEST_P(QuicStreamFactoryTest, DefaultIdleMigrationPeriod) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -7655,8 +8567,8 @@ TEST_P(QuicStreamFactoryTest, CustomIdleMigrationPeriod) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
@@ -7733,8 +8645,8 @@ TEST_P(QuicStreamFactoryTest, ServerMigration) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7885,8 +8797,8 @@ TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv6Fails) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -7943,8 +8855,8 @@ TEST_P(QuicStreamFactoryTest, OnCertDBChanged) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -7966,8 +8878,8 @@ TEST_P(QuicStreamFactoryTest, OnCertDBChanged) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -8084,8 +8996,8 @@ TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
"192.168.0.1", "");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -8135,8 +9047,8 @@ TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -8173,11 +9085,12 @@ TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
DVLOG(1) << "Create 2nd session and timeout with open stream";
TestCompletionCallback callback2;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK,
- request2.Request(
- server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback2.callback()));
+ EXPECT_EQ(OK, request2.Request(server2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2_, net_log_,
+ &net_error_details_,
+ failed_on_default_network_callback_,
+ callback2.callback()));
QuicChromiumClientSession* session2 = GetActiveSession(server2);
EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
session2->connection()->ping_timeout());
@@ -8246,8 +9159,8 @@ TEST_P(QuicStreamFactoryTest, StartCertVerifyJob) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -8293,8 +9206,8 @@ TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
"StartReading");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -8342,8 +9255,8 @@ TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
"StartReading");
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(OK, request.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -8378,8 +9291,8 @@ TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -8399,8 +9312,8 @@ TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
->promised_by_url())[kDefaultUrl] = &promised;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(host_port_pair_, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(host_port_pair_, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -8432,8 +9345,8 @@ TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -8460,8 +9373,8 @@ TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, PRIVACY_MODE_ENABLED,
- DEFAULT_PRIORITY, SocketTag(),
+ host_port_pair_, version_.transport_version,
+ PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -8495,12 +9408,12 @@ TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
socket_data.AddSocketDataToFactory(socket_factory_.get());
QuicStreamRequest request1(factory_.get());
- EXPECT_EQ(
- ERR_IO_PENDING,
- request1.Request(
- destination1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(ERR_IO_PENDING,
+ request1.Request(
+ destination1, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
EXPECT_TRUE(stream1.get());
@@ -8509,8 +9422,8 @@ TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
// Second request returns synchronously because it pools to existing session.
TestCompletionCallback callback2;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(destination2, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(destination2, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -8616,12 +9529,12 @@ TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
AddHangingSocketData();
QuicStreamRequest request(factory_.get());
- EXPECT_EQ(
- ERR_IO_PENDING,
- request.Request(
- destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ destination, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
@@ -8661,12 +9574,12 @@ TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
QuicStreamRequest request1(factory_.get());
- EXPECT_EQ(
- ERR_IO_PENDING,
- request1.Request(
- destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(ERR_IO_PENDING,
+ request1.Request(
+ destination, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
@@ -8676,8 +9589,8 @@ TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
// Second request returns synchronously because it pools to existing session.
TestCompletionCallback callback2;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(OK, request2.Request(destination, version_, privacy_mode_,
- DEFAULT_PRIORITY, SocketTag(),
+ EXPECT_EQ(OK, request2.Request(destination, version_.transport_version,
+ privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url2, net_log_,
&net_error_details_,
failed_on_default_network_callback_,
@@ -8742,8 +9655,8 @@ TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
QuicStreamRequest request1(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request1.Request(
- destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
- SocketTag(),
+ destination, version_.transport_version, PRIVACY_MODE_DISABLED,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(OK, callback_.WaitForResult());
@@ -8755,8 +9668,8 @@ TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- destination, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
- SocketTag(),
+ destination, version_.transport_version, PRIVACY_MODE_ENABLED,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback2.callback()));
EXPECT_EQ(OK, callback2.WaitForResult());
@@ -8827,12 +9740,12 @@ TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data1));
QuicStreamRequest request1(factory_.get());
- EXPECT_EQ(
- ERR_IO_PENDING,
- request1.Request(
- destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback_.callback()));
+ EXPECT_EQ(ERR_IO_PENDING,
+ request1.Request(
+ destination, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
EXPECT_THAT(callback_.WaitForResult(), IsOk());
std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
EXPECT_TRUE(stream1.get());
@@ -8840,12 +9753,12 @@ TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
TestCompletionCallback callback2;
QuicStreamRequest request2(factory_.get());
- EXPECT_EQ(
- ERR_IO_PENDING,
- request2.Request(
- destination, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
- /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
- failed_on_default_network_callback_, callback2.callback()));
+ EXPECT_EQ(ERR_IO_PENDING,
+ request2.Request(
+ destination, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback2.callback()));
EXPECT_THAT(callback2.WaitForResult(), IsOk());
std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
EXPECT_TRUE(stream2.get());
@@ -8953,8 +9866,8 @@ TEST_P(QuicStreamFactoryTest, HostResolverUsesRequestPriority) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ MAXIMUM_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -8981,8 +9894,8 @@ TEST_P(QuicStreamFactoryTest, HostResolverRequestReprioritizedOnSetPriority) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, MAXIMUM_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ MAXIMUM_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -8992,8 +9905,8 @@ TEST_P(QuicStreamFactoryTest, HostResolverRequestReprioritizedOnSetPriority) {
QuicStreamRequest request2(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
@@ -9037,8 +9950,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncSync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9091,8 +10004,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncAsync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9142,8 +10055,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncSync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9180,8 +10093,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncAsync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9214,8 +10127,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailSync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9240,8 +10153,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailAsync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9284,7 +10197,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
MockQuicData quic_data;
quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -9293,17 +10206,15 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
QuicStreamRequest request(factory_.get());
EXPECT_THAT(request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()),
IsOk());
std::unique_ptr<HttpStream> stream = CreateStream(&request);
EXPECT_TRUE(stream.get());
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kNonCachedIPAddress);
+ EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -9331,8 +10242,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionAsync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
TestCompletionCallback host_resolution_callback;
@@ -9350,9 +10261,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionAsync) {
EXPECT_TRUE(stream.get());
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kNonCachedIPAddress);
+ EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -9381,7 +10290,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
MockQuicData quic_data;
quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -9391,8 +10300,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9408,9 +10317,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kCachedIPAddress.ToString());
+ EXPECT_EQ(session->peer_address().host().ToString(),
+ kCachedIPAddress.ToString());
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -9443,7 +10351,7 @@ TEST_P(QuicStreamFactoryTest,
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
MockQuicData quic_data;
quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -9453,8 +10361,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9476,9 +10384,8 @@ TEST_P(QuicStreamFactoryTest,
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kCachedIPAddress.ToString());
+ EXPECT_EQ(session->peer_address().host().ToString(),
+ kCachedIPAddress.ToString());
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -9511,7 +10418,7 @@ TEST_P(QuicStreamFactoryTest,
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
MockQuicData quic_data;
quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -9521,8 +10428,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9540,9 +10447,8 @@ TEST_P(QuicStreamFactoryTest,
EXPECT_TRUE(stream.get());
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kCachedIPAddress.ToString());
+ EXPECT_EQ(session->peer_address().host().ToString(),
+ kCachedIPAddress.ToString());
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -9572,7 +10478,7 @@ TEST_P(QuicStreamFactoryTest,
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
// Socket for the stale connection which will invoke connection closure.
MockQuicData quic_data;
@@ -9593,8 +10499,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9611,9 +10517,7 @@ TEST_P(QuicStreamFactoryTest,
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kNonCachedIPAddress);
+ EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -9647,7 +10551,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
MockQuicData quic_data;
quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -9665,8 +10569,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9685,9 +10589,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
EXPECT_TRUE(stream.get());
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kNonCachedIPAddress);
+ EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -9721,7 +10623,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
MockQuicData quic_data;
quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -9741,8 +10643,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
// Finish dns resolution, but need to wait for stale connection.
@@ -9756,9 +10658,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
EXPECT_TRUE(stream.get());
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kNonCachedIPAddress);
+ EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
EXPECT_TRUE(quic_data.AllReadDataConsumed());
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
@@ -9785,8 +10685,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveError) {
EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
}
@@ -9810,8 +10710,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncError) {
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9842,7 +10742,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
// Socket for the stale connection which is supposed to disconnect.
MockQuicData quic_data;
@@ -9857,8 +10757,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9875,7 +10775,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
}
// With dns race experiment on, dns resolve async, stale used and connection
-// return error, then dns matches
+// return error, then dns matches.
+// This serves as a regression test for crbug.com/956374.
TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
test_params_.quic_race_stale_dns_on_connection = true;
host_resolver_ = std::make_unique<MockCachingHostResolver>();
@@ -9897,7 +10798,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
// Simulate synchronous connect failure.
MockQuicData quic_data;
@@ -9911,8 +10812,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
EXPECT_FALSE(HasLiveSession(host_port_pair_));
@@ -9945,7 +10846,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
// Add failure for the stale connection.
MockQuicData quic_data;
@@ -9960,8 +10861,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -9978,9 +10879,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
- EXPECT_EQ(
- session->peer_address().impl().socket_address().ToStringWithoutPort(),
- kNonCachedIPAddress);
+ EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
EXPECT_TRUE(quic_data2.AllReadDataConsumed());
EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
@@ -10009,7 +10908,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
// Add failure for stale connection.
MockQuicData quic_data;
@@ -10024,8 +10923,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -10063,7 +10962,7 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
// Socket data for stale connection which is supposed to disconnect.
MockQuicData quic_data;
@@ -10078,8 +10977,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -10117,7 +11016,7 @@ TEST_P(QuicStreamFactoryTest,
HostCache* cache = host_resolver_->GetHostCache();
cache->Set(key, entry, base::TimeTicks::Now(), zero);
// Expire the cache
- cache->OnNetworkChange();
+ cache->Invalidate();
MockQuicData quic_data;
quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
@@ -10131,8 +11030,8 @@ TEST_P(QuicStreamFactoryTest,
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -10166,8 +11065,8 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsync) {
QuicStreamRequest request(factory_.get());
EXPECT_EQ(ERR_IO_PENDING,
request.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY,
- SocketTag(),
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback()));
@@ -10189,6 +11088,70 @@ TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsync) {
EXPECT_TRUE(quic_data.AllWriteDataConsumed());
}
+TEST_P(QuicStreamFactoryTest, ConfigInitialRttForHandshake) {
+ int kInitialRtt = 400;
+ test_params_.quic_initial_rtt_for_handshake_milliseconds = kInitialRtt;
+ crypto_client_stream_factory_.set_handshake_mode(
+ MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
+ Initialize();
+ factory_->set_require_confirmation(true);
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+
+ // Using a testing task runner so that we can control time.
+ auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+
+ QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
+ QuicStreamFactoryPeer::SetAlarmFactory(
+ factory_.get(),
+ std::make_unique<QuicChromiumAlarmFactory>(task_runner.get(), &clock_));
+
+ MockQuicData socket_data;
+ socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
+ socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
+ socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(2));
+ client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
+ socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(3, 0));
+ socket_data.AddSocketDataToFactory(socket_factory_.get());
+
+ QuicStreamRequest request(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request.Request(
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, SocketTag(),
+ /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
+ failed_on_default_network_callback_, callback_.callback()));
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_FALSE(HasActiveSession(host_port_pair_));
+ EXPECT_TRUE(HasActiveJob(host_port_pair_, privacy_mode_));
+
+ // The pending task is scheduled for handshake timeout retransmission,
+ // which is 2 * 400ms for v99 and 1.5 * 400ms for others.
+ int handshake_timeout = version_.transport_version == quic::QUIC_VERSION_99
+ ? 2 * kInitialRtt
+ : 1.5 * kInitialRtt;
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(handshake_timeout),
+ task_runner->NextPendingTaskDelay());
+
+ // The alarm factory dependes on |clock_|, so clock is advanced to trigger
+ // retransmission alarm.
+ clock_.AdvanceTime(
+ quic::QuicTime::Delta::FromMilliseconds(handshake_timeout));
+ task_runner->FastForwardBy(
+ base::TimeDelta::FromMilliseconds(handshake_timeout));
+
+ crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent(
+ quic::QuicSession::HANDSHAKE_CONFIRMED);
+
+ EXPECT_THAT(callback_.WaitForResult(), IsOk());
+
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+ EXPECT_EQ(400000u, session->config()->GetInitialRoundTripTimeUsToSend());
+ EXPECT_TRUE(socket_data.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed());
+}
+
// Test that QuicStreamRequests with similar and different tags results in
// reused and unique QUIC streams using appropriately tagged sockets.
TEST_P(QuicStreamFactoryTest, Tag) {
@@ -10220,7 +11183,8 @@ TEST_P(QuicStreamFactoryTest, Tag) {
// Request a stream with |tag1|.
QuicStreamRequest request1(factory_.get());
int rv = request1.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, tag1,
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback());
EXPECT_THAT(callback_.GetResult(rv), IsOk());
@@ -10235,7 +11199,8 @@ TEST_P(QuicStreamFactoryTest, Tag) {
// Request a stream with |tag1| and verify underlying session is reused.
QuicStreamRequest request2(factory_.get());
rv = request2.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, tag1,
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback());
EXPECT_THAT(callback_.GetResult(rv), IsOk());
@@ -10248,7 +11213,8 @@ TEST_P(QuicStreamFactoryTest, Tag) {
// Request a stream with |tag2| and verify a new session is created.
QuicStreamRequest request3(factory_.get());
rv = request3.Request(
- host_port_pair_, version_, privacy_mode_, DEFAULT_PRIORITY, tag2,
+ host_port_pair_, version_.transport_version, privacy_mode_,
+ DEFAULT_PRIORITY, tag2,
/*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
failed_on_default_network_callback_, callback_.callback());
EXPECT_THAT(callback_.GetResult(rv), IsOk());
diff --git a/chromium/net/quic/quic_test_packet_maker.cc b/chromium/net/quic/quic_test_packet_maker.cc
index 4fae4ca4ae6..26dae2b6526 100644
--- a/chromium/net/quic/quic_test_packet_maker.cc
+++ b/chromium/net/quic/quic_test_packet_maker.cc
@@ -28,7 +28,7 @@ quic::QuicAckFrame MakeAckFrame(uint64_t largest_observed) {
} // namespace
QuicTestPacketMaker::QuicTestPacketMaker(
- quic::QuicTransportVersion version,
+ quic::ParsedQuicVersion version,
quic::QuicConnectionId connection_id,
quic::MockClock* clock,
const std::string& host,
@@ -45,7 +45,7 @@ QuicTestPacketMaker::QuicTestPacketMaker(
long_header_type_(quic::INVALID_PACKET_TYPE),
client_headers_include_h2_stream_dependency_(
client_headers_include_h2_stream_dependency &&
- version >= quic::QUIC_VERSION_43) {
+ version.transport_version >= quic::QUIC_VERSION_43) {
DCHECK(!(perspective_ == quic::Perspective::IS_SERVER &&
client_headers_include_h2_stream_dependency_));
}
@@ -70,22 +70,22 @@ QuicTestPacketMaker::MakeConnectivityProbingPacket(uint64_t num,
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
header.length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
- quic::QuicFramer framer(quic::test::SupportedVersions(quic::ParsedQuicVersion(
- quic::PROTOCOL_QUIC_CRYPTO, version_)),
+ quic::QuicFramer framer(quic::test::SupportedVersions(version_),
clock_->Now(), perspective_,
quic::kQuicDefaultConnectionIdLength);
size_t max_plaintext_size =
framer.GetMaxPlaintextSize(quic::kDefaultMaxPacketSize);
char buffer[quic::kDefaultMaxPacketSize];
size_t length;
- if (version_ != quic::QUIC_VERSION_99) {
+ if (version_.transport_version != quic::QUIC_VERSION_99) {
length = framer.BuildConnectivityProbingPacket(
header, buffer, max_plaintext_size, encryption_level_);
} else if (perspective_ == quic::Perspective::IS_CLIENT) {
@@ -125,7 +125,8 @@ std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakePingPacket(
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -149,10 +150,10 @@ QuicTestPacketMaker::MakeDummyCHLOPacket(uint64_t packet_num) {
quic::QuicCryptoFrame crypto_frame;
quic::test::SimpleDataProducer producer;
quic::QuicStreamFrameDataProducer* producer_p = nullptr;
- if (!QuicVersionUsesCryptoFrames(version_)) {
- quic::QuicStreamFrame frame(quic::QuicUtils::GetCryptoStreamId(version_),
- /*fin=*/false, /*offset=*/0,
- data.AsStringPiece());
+ if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
+ quic::QuicStreamFrame frame(
+ quic::QuicUtils::GetCryptoStreamId(version_.transport_version),
+ /*fin=*/false, /*offset=*/0, data.AsStringPiece());
frames.push_back(quic::QuicFrame(frame));
} else {
crypto_frame =
@@ -188,7 +189,8 @@ QuicTestPacketMaker::MakeAckAndPingPacket(uint64_t num,
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -242,7 +244,8 @@ std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstPacket(
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -258,7 +261,8 @@ std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstPacket(
// The STOP_SENDING frame must be outside of the if (version==99) so that it
// stays in scope until the packet is built.
quic::QuicStopSendingFrame stop(1, stream_id, error_code);
- if (include_stop_sending_if_v99 && version_ == quic::QUIC_VERSION_99) {
+ if (include_stop_sending_if_v99 &&
+ version_.transport_version == quic::QUIC_VERSION_99) {
frames.push_back(quic::QuicFrame(&stop));
DVLOG(1) << "Adding frame: " << frames.back();
}
@@ -266,9 +270,11 @@ std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstPacket(
}
std::unique_ptr<quic::QuicReceivedPacket>
-QuicTestPacketMaker::MakeStreamIdBlockedPacket(uint64_t num,
- bool include_version,
- quic::QuicStreamId stream_id) {
+QuicTestPacketMaker::MakeStreamsBlockedPacket(
+ uint64_t num,
+ bool include_version,
+ quic::QuicStreamCount stream_count,
+ bool unidirectional) {
quic::QuicPacketHeader header;
header.destination_connection_id = connection_id_;
header.destination_connection_id_included = HasDestinationConnectionId();
@@ -280,22 +286,24 @@ QuicTestPacketMaker::MakeStreamIdBlockedPacket(uint64_t num,
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
header.length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
- quic::QuicStreamIdBlockedFrame frame(1, stream_id);
+ quic::QuicStreamsBlockedFrame frame(1, stream_count, unidirectional);
DVLOG(1) << "Adding frame: " << quic::QuicFrame(frame);
return MakePacket(header, quic::QuicFrame(frame));
}
std::unique_ptr<quic::QuicReceivedPacket>
-QuicTestPacketMaker::MakeMaxStreamIdPacket(uint64_t num,
- bool include_version,
- quic::QuicStreamId stream_id) {
+QuicTestPacketMaker::MakeMaxStreamsPacket(uint64_t num,
+ bool include_version,
+ quic::QuicStreamCount stream_count,
+ bool unidirectional) {
quic::QuicPacketHeader header;
header.destination_connection_id = connection_id_;
header.destination_connection_id_included = HasDestinationConnectionId();
@@ -307,14 +315,15 @@ QuicTestPacketMaker::MakeMaxStreamIdPacket(uint64_t num,
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
header.length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_2;
}
- quic::QuicMaxStreamIdFrame frame(1, stream_id);
+ quic::QuicMaxStreamsFrame frame(1, stream_count, unidirectional);
DVLOG(1) << "Adding frame: " << quic::QuicFrame(frame);
return MakePacket(header, quic::QuicFrame(frame));
}
@@ -345,7 +354,8 @@ QuicTestPacketMaker::MakeRstAndRequestHeadersPacket(
*offset += spdy_frame.size();
}
quic::QuicStreamFrame headers_frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, header_offset,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ header_offset,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
quic::QuicFrames frames;
@@ -355,7 +365,7 @@ QuicTestPacketMaker::MakeRstAndRequestHeadersPacket(
// The STOP_SENDING frame must be outside of the if (version==99) so that it
// stays in scope until the packet is built.
quic::QuicStopSendingFrame stop(1, rst_stream_id, rst_error_code);
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
frames.push_back(quic::QuicFrame(&stop));
DVLOG(1) << "Adding frame: " << frames.back();
}
@@ -405,7 +415,8 @@ QuicTestPacketMaker::MakeAckAndRstPacket(
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -433,7 +444,8 @@ QuicTestPacketMaker::MakeAckAndRstPacket(
// The STOP_SENDING frame must be outside of the if (version==99) so that it
// stays in scope until the packet is built.
quic::QuicStopSendingFrame stop(1, stream_id, error_code);
- if (version_ == quic::QUIC_VERSION_99 && include_stop_sending_if_v99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99 &&
+ include_stop_sending_if_v99) {
frames.push_back(quic::QuicFrame(&stop));
DVLOG(1) << "Adding frame: " << frames.back();
}
@@ -464,7 +476,8 @@ QuicTestPacketMaker::MakeRstAckAndConnectionClosePacket(
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -480,7 +493,7 @@ QuicTestPacketMaker::MakeRstAckAndConnectionClosePacket(
// stays in scope until the packet is built.
quic::QuicStopSendingFrame stop(
1, stream_id, static_cast<quic::QuicApplicationErrorCode>(error_code));
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
frames.push_back(quic::QuicFrame(&stop));
DVLOG(1) << "Adding frame: " << frames.back();
}
@@ -501,7 +514,7 @@ QuicTestPacketMaker::MakeRstAckAndConnectionClosePacket(
quic::QuicConnectionCloseFrame close;
close.quic_error_code = quic_error;
close.error_details = quic_error_details;
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
}
@@ -532,7 +545,8 @@ QuicTestPacketMaker::MakeAckAndConnectionClosePacket(
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -556,7 +570,7 @@ QuicTestPacketMaker::MakeAckAndConnectionClosePacket(
quic::QuicConnectionCloseFrame close;
close.quic_error_code = quic_error;
close.error_details = quic_error_details;
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
}
@@ -583,7 +597,8 @@ QuicTestPacketMaker::MakeConnectionClosePacket(
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -593,7 +608,7 @@ QuicTestPacketMaker::MakeConnectionClosePacket(
quic::QuicConnectionCloseFrame close;
close.quic_error_code = quic_error;
close.error_details = quic_error_details;
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
close.close_type = quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE;
}
@@ -615,7 +630,8 @@ std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeGoAwayPacket(
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(num);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -682,7 +698,8 @@ std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeAckPacket(
header.packet_number_length = GetPacketNumberLength();
header.packet_number = quic::QuicPacketNumber(packet_number);
- if (quic::QuicVersionHasLongHeaderLengths(version_) && header.version_flag) {
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+ header.version_flag) {
if (long_header_type_ == quic::INITIAL) {
header.retry_token_length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
}
@@ -700,8 +717,7 @@ std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeAckPacket(
ack.packets.AddRange(quic::QuicPacketNumber(first_received),
quic::QuicPacketNumber(largest_received + 1));
}
- quic::QuicFramer framer(quic::test::SupportedVersions(quic::ParsedQuicVersion(
- quic::PROTOCOL_QUIC_CRYPTO, version_)),
+ quic::QuicFramer framer(quic::test::SupportedVersions(version_),
clock_->Now(), perspective_,
quic::kQuicDefaultConnectionIdLength);
quic::QuicFrames frames;
@@ -709,6 +725,17 @@ std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeAckPacket(
frames.push_back(ack_frame);
DVLOG(1) << "Adding frame: " << frames.back();
+ size_t max_plaintext_size =
+ framer.GetMaxPlaintextSize(quic::kDefaultMaxPacketSize);
+ size_t ack_frame_length = framer.GetSerializedFrameLength(
+ ack_frame, max_plaintext_size, /*first_frame*/ true, /*last_frame*/ false,
+ header.packet_number_length);
+ const size_t min_plaintext_size = 7;
+ if (version_.HasHeaderProtection() && ack_frame_length < min_plaintext_size) {
+ size_t padding_length = min_plaintext_size - ack_frame_length;
+ frames.push_back(quic::QuicFrame(quic::QuicPaddingFrame(padding_length)));
+ }
+
std::unique_ptr<quic::QuicPacket> packet(
quic::test::BuildUnsizedDataPacket(&framer, header, frames));
char buffer[quic::kMaxOutgoingPacketSize];
@@ -851,7 +878,8 @@ QuicTestPacketMaker::MakeRequestHeadersAndMultipleDataFramesPacket(
quic::QuicStreamOffset header_offset =
header_stream_offset == nullptr ? 0 : *header_stream_offset;
quic::QuicStreamFrame frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, header_offset,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ header_offset,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
frames.push_back(quic::QuicFrame(frame));
DVLOG(1) << "Adding frame: " << frames.back();
@@ -931,14 +959,14 @@ QuicTestPacketMaker::MakeRequestHeadersPacketAndSaveData(
if (offset != nullptr) {
quic::QuicStreamFrame frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
- quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
*offset += spdy_frame.size();
return MakePacket(header_, quic::QuicFrame(frame));
} else {
quic::QuicStreamFrame frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, 0,
- quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ 0, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
return MakePacket(header_, quic::QuicFrame(frame));
}
@@ -968,7 +996,8 @@ QuicTestPacketMaker::MakeRequestHeadersAndRstPacket(
*header_stream_offset += spdy_frame.size();
}
quic::QuicStreamFrame headers_frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, header_offset,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ header_offset,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
quic::QuicRstStreamFrame rst_frame(1, stream_id, error_code, bytes_written);
@@ -982,7 +1011,7 @@ QuicTestPacketMaker::MakeRequestHeadersAndRstPacket(
// The STOP_SENDING frame must be outside of the if (version==99) so that it
// stays in scope until the packet is built.
quic::QuicStopSendingFrame stop(1, stream_id, error_code);
- if (version_ == quic::QUIC_VERSION_99) {
+ if (version_.transport_version == quic::QUIC_VERSION_99) {
frames.push_back(quic::QuicFrame(&stop));
DVLOG(1) << "Adding frame: " << frames.back();
}
@@ -1053,14 +1082,14 @@ QuicTestPacketMaker::MakePushPromisePacket(
}
if (offset != nullptr) {
quic::QuicStreamFrame frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
- quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
*offset += spdy_frame.size();
return MakePacket(header_, quic::QuicFrame(frame));
} else {
quic::QuicStreamFrame frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, 0,
- quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ 0, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
return MakePacket(header_, quic::QuicFrame(frame));
}
}
@@ -1078,8 +1107,8 @@ QuicTestPacketMaker::MakeForceHolDataPacket(uint64_t packet_number,
spdy_request_framer_.SerializeFrame(spdy_data));
InitializeHeader(packet_number, should_include_version);
quic::QuicStreamFrame quic_frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
- quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
*offset += spdy_frame.size();
return MakePacket(header_, quic::QuicFrame(quic_frame));
}
@@ -1106,14 +1135,14 @@ QuicTestPacketMaker::MakeResponseHeadersPacket(
}
if (offset != nullptr) {
quic::QuicStreamFrame frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
- quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
*offset += spdy_frame.size();
return MakePacket(header_, quic::QuicFrame(frame));
} else {
quic::QuicStreamFrame frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, 0,
- quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ 0, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
return MakePacket(header_, quic::QuicFrame(frame));
}
}
@@ -1197,17 +1226,38 @@ QuicTestPacketMaker::MakeMultipleFramesPacket(
const quic::QuicPacketHeader& header,
const quic::QuicFrames& frames,
quic::QuicStreamFrameDataProducer* data_producer) {
- quic::QuicFramer framer(quic::test::SupportedVersions(quic::ParsedQuicVersion(
- quic::PROTOCOL_QUIC_CRYPTO, version_)),
+ quic::QuicFramer framer(quic::test::SupportedVersions(version_),
clock_->Now(), perspective_,
quic::kQuicDefaultConnectionIdLength);
if (data_producer != nullptr) {
framer.set_data_producer(data_producer);
}
+ quic::QuicFrames frames_copy = frames;
size_t max_plaintext_size =
framer.GetMaxPlaintextSize(quic::kDefaultMaxPacketSize);
+ if (version_.HasHeaderProtection()) {
+ size_t packet_size =
+ quic::GetPacketHeaderSize(version_.transport_version, header);
+ size_t frames_size = 0;
+ for (size_t i = 0; i < frames.size(); ++i) {
+ bool first_frame = i == 0;
+ bool last_frame = i == frames.size() - 1;
+ const size_t frame_size = framer.GetSerializedFrameLength(
+ frames[i], max_plaintext_size - packet_size, first_frame, last_frame,
+ header.packet_number_length);
+ packet_size += frame_size;
+ frames_size += frame_size;
+ }
+ // This should be done by calling QuicPacketCreator::MinPlaintextPacketSize.
+ const size_t min_plaintext_size = 7;
+ if (frames_size < min_plaintext_size) {
+ size_t padding_length = min_plaintext_size - frames_size;
+ frames_copy.push_back(
+ quic::QuicFrame(quic::QuicPaddingFrame(padding_length)));
+ }
+ }
std::unique_ptr<quic::QuicPacket> packet(quic::test::BuildUnsizedDataPacket(
- &framer, header, frames, max_plaintext_size));
+ &framer, header, frames_copy, max_plaintext_size));
char buffer[quic::kMaxOutgoingPacketSize];
size_t encrypted_size =
framer.EncryptPayload(quic::ENCRYPTION_INITIAL, header.packet_number,
@@ -1229,7 +1279,7 @@ void QuicTestPacketMaker::InitializeHeader(uint64_t packet_number,
header_.long_packet_type = long_header_type_;
header_.packet_number_length = GetPacketNumberLength();
header_.packet_number = quic::QuicPacketNumber(packet_number);
- if (quic::QuicVersionHasLongHeaderLengths(version_) &&
+ if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
should_include_version) {
if (long_header_type_ == quic::INITIAL) {
header_.retry_token_length_length =
@@ -1261,13 +1311,13 @@ QuicTestPacketMaker::MakeInitialSettingsPacketAndSaveData(
*stream_data = std::string(spdy_frame.data(), spdy_frame.size());
if (offset != nullptr) {
quic::QuicStreamFrame quic_frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
- quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ *offset, quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
*offset += spdy_frame.size();
return MakePacket(header_, quic::QuicFrame(quic_frame));
}
quic::QuicStreamFrame quic_frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, 0,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false, 0,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
return MakePacket(header_, quic::QuicFrame(quic_frame));
}
@@ -1294,7 +1344,8 @@ QuicTestPacketMaker::MakePriorityPacket(uint64_t packet_number,
*offset += spdy_frame.size();
}
quic::QuicStreamFrame quic_frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, header_offset,
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ header_offset,
quic::QuicStringPiece(spdy_frame.data(), spdy_frame.size()));
DVLOG(1) << "Adding frame: " << quic::QuicFrame(quic_frame);
InitializeHeader(packet_number, should_include_version);
@@ -1341,8 +1392,8 @@ QuicTestPacketMaker::MakeAckAndMultiplePriorityFramesPacket(
spdy::SpdySerializedFrame* spdy_frame = spdy_frames.back().get();
quic::QuicStreamFrame stream_frame(
- quic::QuicUtils::GetHeadersStreamId(version_), false, *offset,
- quic::QuicStringPiece(spdy_frame->data(), spdy_frame->size()));
+ quic::QuicUtils::GetHeadersStreamId(version_.transport_version), false,
+ *offset, quic::QuicStringPiece(spdy_frame->data(), spdy_frame->size()));
*offset += spdy_frame->size();
frames.push_back(quic::QuicFrame(stream_frame));
@@ -1372,7 +1423,7 @@ void QuicTestPacketMaker::SetEncryptionLevel(quic::EncryptionLevel level) {
}
bool QuicTestPacketMaker::ShouldIncludeVersion(bool include_version) const {
- if (version_ > quic::QUIC_VERSION_43) {
+ if (version_.transport_version > quic::QUIC_VERSION_43) {
return encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE;
}
return include_version;
@@ -1380,9 +1431,9 @@ bool QuicTestPacketMaker::ShouldIncludeVersion(bool include_version) const {
quic::QuicPacketNumberLength QuicTestPacketMaker::GetPacketNumberLength()
const {
- if (version_ > quic::QUIC_VERSION_43 &&
+ if (version_.transport_version > quic::QUIC_VERSION_43 &&
encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE &&
- version_ != quic::QUIC_VERSION_99) {
+ version_.transport_version != quic::QUIC_VERSION_99) {
return quic::PACKET_4BYTE_PACKET_NUMBER;
}
return quic::PACKET_1BYTE_PACKET_NUMBER;
@@ -1391,7 +1442,7 @@ quic::QuicPacketNumberLength QuicTestPacketMaker::GetPacketNumberLength()
quic::QuicConnectionIdIncluded QuicTestPacketMaker::HasDestinationConnectionId()
const {
if (perspective_ == quic::Perspective::IS_SERVER &&
- version_ > quic::QUIC_VERSION_43) {
+ version_.transport_version > quic::QUIC_VERSION_43) {
return quic::CONNECTION_ID_ABSENT;
}
return quic::CONNECTION_ID_PRESENT;
@@ -1400,7 +1451,7 @@ quic::QuicConnectionIdIncluded QuicTestPacketMaker::HasDestinationConnectionId()
quic::QuicConnectionIdIncluded QuicTestPacketMaker::HasSourceConnectionId()
const {
if (perspective_ == quic::Perspective::IS_SERVER &&
- version_ > quic::QUIC_VERSION_43 &&
+ version_.transport_version > quic::QUIC_VERSION_43 &&
encryption_level_ < quic::ENCRYPTION_FORWARD_SECURE) {
return quic::CONNECTION_ID_PRESENT;
}
diff --git a/chromium/net/quic/quic_test_packet_maker.h b/chromium/net/quic/quic_test_packet_maker.h
index 216b8b56027..9569b53a1db 100644
--- a/chromium/net/quic/quic_test_packet_maker.h
+++ b/chromium/net/quic/quic_test_packet_maker.h
@@ -40,7 +40,7 @@ class QuicTestPacketMaker {
// stream id set to the |parent_stream_id| param of MakeRequestHeaders...().
// Otherwise, headers are constructed with the exclusive flag set to false and
// the parent stream ID set to 0 (ignoring the |parent_stream_id| param).
- QuicTestPacketMaker(quic::QuicTransportVersion version,
+ QuicTestPacketMaker(quic::ParsedQuicVersion version,
quic::QuicConnectionId connection_id,
quic::MockClock* clock,
const std::string& host,
@@ -64,15 +64,17 @@ class QuicTestPacketMaker {
uint64_t smallest_received,
uint64_t least_unacked);
- std::unique_ptr<quic::QuicReceivedPacket> MakeStreamIdBlockedPacket(
+ std::unique_ptr<quic::QuicReceivedPacket> MakeStreamsBlockedPacket(
uint64_t num,
bool include_version,
- quic::QuicStreamId stream_id);
+ quic::QuicStreamCount stream_count,
+ bool unidirectional);
- std::unique_ptr<quic::QuicReceivedPacket> MakeMaxStreamIdPacket(
+ std::unique_ptr<quic::QuicReceivedPacket> MakeMaxStreamsPacket(
uint64_t num,
bool include_version,
- quic::QuicStreamId stream_id);
+ quic::QuicStreamCount stream_count,
+ bool unidirectional);
std::unique_ptr<quic::QuicReceivedPacket> MakeRstPacket(
uint64_t num,
@@ -408,7 +410,7 @@ class QuicTestPacketMaker {
quic::QuicConnectionIdIncluded HasDestinationConnectionId() const;
quic::QuicConnectionIdIncluded HasSourceConnectionId() const;
- quic::QuicTransportVersion version_;
+ quic::ParsedQuicVersion version_;
quic::QuicConnectionId connection_id_;
quic::MockClock* clock_; // Owned by QuicStreamFactory.
std::string host_;