Support resumption in quic_client_interop_test_bin
gfe-relnote: n/a (quic tools only change)
PiperOrigin-RevId: 279826630
Change-Id: I0f36d9b70c84ab1470b4cc09db267f1f03ae1a8a
diff --git a/quic/qbone/qbone_client.cc b/quic/qbone/qbone_client.cc
index e585d05..95e3aea 100644
--- a/quic/qbone/qbone_client.cc
+++ b/quic/qbone/qbone_client.cc
@@ -40,7 +40,8 @@
new QuicEpollConnectionHelper(epoll_server, QuicAllocator::SIMPLE),
new QuicEpollAlarmFactory(epoll_server),
CreateNetworkHelper(epoll_server, this),
- std::move(proof_verifier)),
+ std::move(proof_verifier),
+ nullptr),
qbone_writer_(qbone_writer),
qbone_handler_(qbone_handler),
session_owner_(session_owner) {
diff --git a/quic/tools/quic_client.cc b/quic/tools/quic_client.cc
index cccb7ba..379cfac 100644
--- a/quic/tools/quic_client.cc
+++ b/quic/tools/quic_client.cc
@@ -70,7 +70,24 @@
QuicConfig(),
epoll_server,
QuicWrapUnique(new QuicClientEpollNetworkHelper(epoll_server, this)),
- std::move(proof_verifier)) {}
+ std::move(proof_verifier),
+ nullptr) {}
+
+QuicClient::QuicClient(QuicSocketAddress server_address,
+ const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ QuicEpollServer* epoll_server,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache)
+ : QuicClient(
+ server_address,
+ server_id,
+ supported_versions,
+ QuicConfig(),
+ epoll_server,
+ QuicWrapUnique(new QuicClientEpollNetworkHelper(epoll_server, this)),
+ std::move(proof_verifier),
+ std::move(session_cache)) {}
QuicClient::QuicClient(
QuicSocketAddress server_address,
@@ -85,7 +102,8 @@
QuicConfig(),
epoll_server,
std::move(network_helper),
- std::move(proof_verifier)) {}
+ std::move(proof_verifier),
+ nullptr) {}
QuicClient::QuicClient(
QuicSocketAddress server_address,
@@ -95,6 +113,24 @@
QuicEpollServer* epoll_server,
std::unique_ptr<QuicClientEpollNetworkHelper> network_helper,
std::unique_ptr<ProofVerifier> proof_verifier)
+ : QuicClient(server_address,
+ server_id,
+ supported_versions,
+ config,
+ epoll_server,
+ std::move(network_helper),
+ std::move(proof_verifier),
+ nullptr) {}
+
+QuicClient::QuicClient(
+ QuicSocketAddress server_address,
+ const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ const QuicConfig& config,
+ QuicEpollServer* epoll_server,
+ std::unique_ptr<QuicClientEpollNetworkHelper> network_helper,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache)
: QuicSpdyClientBase(
server_id,
supported_versions,
@@ -102,7 +138,8 @@
new QuicEpollConnectionHelper(epoll_server, QuicAllocator::SIMPLE),
new QuicEpollAlarmFactory(epoll_server),
std::move(network_helper),
- std::move(proof_verifier)) {
+ std::move(proof_verifier),
+ std::move(session_cache)) {
set_server_address(server_address);
}
diff --git a/quic/tools/quic_client.h b/quic/tools/quic_client.h
index 8e43be8..10c61f3 100644
--- a/quic/tools/quic_client.h
+++ b/quic/tools/quic_client.h
@@ -37,12 +37,18 @@
class QuicClient : public QuicSpdyClientBase {
public:
- // This will create its own QuicClientEpollNetworkHelper.
+ // These will create their own QuicClientEpollNetworkHelper.
QuicClient(QuicSocketAddress server_address,
const QuicServerId& server_id,
const ParsedQuicVersionVector& supported_versions,
QuicEpollServer* epoll_server,
std::unique_ptr<ProofVerifier> proof_verifier);
+ QuicClient(QuicSocketAddress server_address,
+ const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ QuicEpollServer* epoll_server,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache);
// This will take ownership of a passed in network primitive.
QuicClient(QuicSocketAddress server_address,
const QuicServerId& server_id,
@@ -57,6 +63,14 @@
QuicEpollServer* epoll_server,
std::unique_ptr<QuicClientEpollNetworkHelper> network_helper,
std::unique_ptr<ProofVerifier> proof_verifier);
+ QuicClient(QuicSocketAddress server_address,
+ const QuicServerId& server_id,
+ const ParsedQuicVersionVector& supported_versions,
+ const QuicConfig& config,
+ QuicEpollServer* epoll_server,
+ std::unique_ptr<QuicClientEpollNetworkHelper> network_helper,
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache);
QuicClient(const QuicClient&) = delete;
QuicClient& operator=(const QuicClient&) = delete;
diff --git a/quic/tools/quic_client_base.cc b/quic/tools/quic_client_base.cc
index b03f7cc..b6c3375 100644
--- a/quic/tools/quic_client_base.cc
+++ b/quic/tools/quic_client_base.cc
@@ -23,12 +23,13 @@
QuicConnectionHelperInterface* helper,
QuicAlarmFactory* alarm_factory,
std::unique_ptr<NetworkHelper> network_helper,
- std::unique_ptr<ProofVerifier> proof_verifier)
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache)
: server_id_(server_id),
initialized_(false),
local_port_(0),
config_(config),
- crypto_config_(std::move(proof_verifier)),
+ crypto_config_(std::move(proof_verifier), std::move(session_cache)),
helper_(helper),
alarm_factory_(alarm_factory),
supported_versions_(supported_versions),
diff --git a/quic/tools/quic_client_base.h b/quic/tools/quic_client_base.h
index fb15b86..8cb639b 100644
--- a/quic/tools/quic_client_base.h
+++ b/quic/tools/quic_client_base.h
@@ -23,6 +23,7 @@
class ProofVerifier;
class QuicServerId;
+class SessionCache;
// QuicClientBase handles establishing a connection to the passed in
// server id, including ensuring that it supports the passed in versions
@@ -64,7 +65,8 @@
QuicConnectionHelperInterface* helper,
QuicAlarmFactory* alarm_factory,
std::unique_ptr<NetworkHelper> network_helper,
- std::unique_ptr<ProofVerifier> proof_verifier);
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache);
QuicClientBase(const QuicClientBase&) = delete;
QuicClientBase& operator=(const QuicClientBase&) = delete;
diff --git a/quic/tools/quic_client_interop_test_bin.cc b/quic/tools/quic_client_interop_test_bin.cc
index be65979..47d87a5 100644
--- a/quic/tools/quic_client_interop_test_bin.cc
+++ b/quic/tools/quic_client_interop_test_bin.cc
@@ -13,6 +13,8 @@
#include "net/third_party/quiche/src/quic/platform/api/quic_system_event_loop.h"
#include "net/quic/platform/impl/quic_epoll_clock.h"
#include "net/third_party/quiche/src/quic/test_tools/quic_connection_peer.h"
+#include "net/third_party/quiche/src/quic/test_tools/quic_session_peer.h"
+#include "net/third_party/quiche/src/quic/test_tools/simple_session_cache.h"
#include "net/third_party/quiche/src/quic/tools/fake_proof_verifier.h"
#include "net/third_party/quiche/src/quic/tools/quic_client.h"
#include "net/third_party/quiche/src/quic/tools/quic_url.h"
@@ -36,6 +38,8 @@
kStreamData,
// The connection close procedcure completes with a zero error code.
kConnectionClose,
+ // The connection was established using TLS resumption.
+ kResumption,
// A RETRY packet was successfully processed.
kRetry,
@@ -58,12 +62,33 @@
return 'D';
case Feature::kConnectionClose:
return 'C';
- case Feature::kHttp3:
- return '3';
+ case Feature::kResumption:
+ return 'R';
case Feature::kRetry:
return 'S';
case Feature::kRebinding:
return 'B';
+ case Feature::kHttp3:
+ return '3';
+ }
+}
+
+// Attempts a resumption using |client| by disconnecting and reconnecting. If
+// resumption is successful, |features| is modified to add Feature::kResumption
+// to it, otherwise it is left unmodified.
+void AttemptResumption(QuicClient* client, std::set<Feature>* features) {
+ client->Disconnect();
+ if (!client->Initialize()) {
+ QUIC_LOG(ERROR) << "Failed to reinitialize client";
+ return;
+ }
+ if (!client->Connect() || !client->session()->IsCryptoHandshakeConfirmed()) {
+ return;
+ }
+ if (static_cast<QuicCryptoClientStream*>(
+ test::QuicSessionPeer::GetMutableCryptoStream(client->session()))
+ ->IsResumption()) {
+ features->insert(Feature::kResumption);
}
}
@@ -80,10 +105,12 @@
std::set<Feature> features;
auto proof_verifier = std::make_unique<FakeProofVerifier>();
+ auto session_cache = std::make_unique<test::SimpleSessionCache>();
QuicEpollServer epoll_server;
QuicEpollClock epoll_clock(&epoll_server);
auto client = std::make_unique<QuicClient>(
- addr, server_id, versions, &epoll_server, std::move(proof_verifier));
+ addr, server_id, versions, &epoll_server, std::move(proof_verifier),
+ std::move(session_cache));
if (!client->Initialize()) {
QUIC_LOG(ERROR) << "Failed to initialize client";
return features;
@@ -188,6 +215,7 @@
client->epoll_network_helper()->RunEventLoop();
if (epoll_clock.Now() - close_start_time >= close_timeout) {
QUIC_LOG(ERROR) << "Timed out waiting for connection close";
+ AttemptResumption(client.get(), &features);
return features;
}
}
@@ -201,6 +229,7 @@
}
}
+ AttemptResumption(client.get(), &features);
return features;
}
diff --git a/quic/tools/quic_spdy_client_base.cc b/quic/tools/quic_spdy_client_base.cc
index 3cd4cbd..6b4cc8d 100644
--- a/quic/tools/quic_spdy_client_base.cc
+++ b/quic/tools/quic_spdy_client_base.cc
@@ -37,14 +37,16 @@
QuicConnectionHelperInterface* helper,
QuicAlarmFactory* alarm_factory,
std::unique_ptr<NetworkHelper> network_helper,
- std::unique_ptr<ProofVerifier> proof_verifier)
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache)
: QuicClientBase(server_id,
supported_versions,
config,
helper,
alarm_factory,
std::move(network_helper),
- std::move(proof_verifier)),
+ std::move(proof_verifier),
+ std::move(session_cache)),
store_response_(false),
latest_response_code_(-1),
max_allowed_push_id_(0),
diff --git a/quic/tools/quic_spdy_client_base.h b/quic/tools/quic_spdy_client_base.h
index 2a1267f..d953038 100644
--- a/quic/tools/quic_spdy_client_base.h
+++ b/quic/tools/quic_spdy_client_base.h
@@ -23,6 +23,7 @@
class ProofVerifier;
class QuicServerId;
+class SessionCache;
class QuicSpdyClientBase : public QuicClientBase,
public QuicClientPushPromiseIndex::Delegate,
@@ -69,7 +70,8 @@
QuicConnectionHelperInterface* helper,
QuicAlarmFactory* alarm_factory,
std::unique_ptr<NetworkHelper> network_helper,
- std::unique_ptr<ProofVerifier> proof_verifier);
+ std::unique_ptr<ProofVerifier> proof_verifier,
+ std::unique_ptr<SessionCache> session_cache);
QuicSpdyClientBase(const QuicSpdyClientBase&) = delete;
QuicSpdyClientBase& operator=(const QuicSpdyClientBase&) = delete;