1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <cstddef>
6 #include <cstdint>
7 #include <list>
8 #include <memory>
9 #include <ostream>
10 #include <string>
11 #include <utility>
12 #include <vector>
13
14 #include "absl/strings/str_cat.h"
15 #include "absl/strings/string_view.h"
16 #include "absl/time/clock.h"
17 #include "absl/time/time.h"
18 #include "absl/types/span.h"
19 #include "quiche/quic/core/crypto/null_encrypter.h"
20 #include "quiche/quic/core/crypto/quic_client_session_cache.h"
21 #include "quiche/quic/core/frames/quic_blocked_frame.h"
22 #include "quiche/quic/core/http/http_constants.h"
23 #include "quiche/quic/core/http/quic_spdy_client_stream.h"
24 #include "quiche/quic/core/http/web_transport_http3.h"
25 #include "quiche/quic/core/io/quic_default_event_loop.h"
26 #include "quiche/quic/core/io/quic_event_loop.h"
27 #include "quiche/quic/core/quic_connection.h"
28 #include "quiche/quic/core/quic_constants.h"
29 #include "quiche/quic/core/quic_data_writer.h"
30 #include "quiche/quic/core/quic_default_clock.h"
31 #include "quiche/quic/core/quic_error_codes.h"
32 #include "quiche/quic/core/quic_framer.h"
33 #include "quiche/quic/core/quic_packet_creator.h"
34 #include "quiche/quic/core/quic_packet_writer_wrapper.h"
35 #include "quiche/quic/core/quic_packets.h"
36 #include "quiche/quic/core/quic_session.h"
37 #include "quiche/quic/core/quic_types.h"
38 #include "quiche/quic/core/quic_utils.h"
39 #include "quiche/quic/platform/api/quic_expect_bug.h"
40 #include "quiche/quic/platform/api/quic_flags.h"
41 #include "quiche/quic/platform/api/quic_logging.h"
42 #include "quiche/quic/platform/api/quic_socket_address.h"
43 #include "quiche/quic/platform/api/quic_test.h"
44 #include "quiche/quic/platform/api/quic_test_loopback.h"
45 #include "quiche/quic/test_tools/bad_packet_writer.h"
46 #include "quiche/quic/test_tools/crypto_test_utils.h"
47 #include "quiche/quic/test_tools/packet_dropping_test_writer.h"
48 #include "quiche/quic/test_tools/packet_reordering_writer.h"
49 #include "quiche/quic/test_tools/qpack/qpack_encoder_peer.h"
50 #include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
51 #include "quiche/quic/test_tools/quic_client_session_cache_peer.h"
52 #include "quiche/quic/test_tools/quic_config_peer.h"
53 #include "quiche/quic/test_tools/quic_connection_peer.h"
54 #include "quiche/quic/test_tools/quic_dispatcher_peer.h"
55 #include "quiche/quic/test_tools/quic_flow_controller_peer.h"
56 #include "quiche/quic/test_tools/quic_sent_packet_manager_peer.h"
57 #include "quiche/quic/test_tools/quic_server_peer.h"
58 #include "quiche/quic/test_tools/quic_session_peer.h"
59 #include "quiche/quic/test_tools/quic_spdy_session_peer.h"
60 #include "quiche/quic/test_tools/quic_spdy_stream_peer.h"
61 #include "quiche/quic/test_tools/quic_stream_id_manager_peer.h"
62 #include "quiche/quic/test_tools/quic_stream_peer.h"
63 #include "quiche/quic/test_tools/quic_stream_sequencer_peer.h"
64 #include "quiche/quic/test_tools/quic_test_backend.h"
65 #include "quiche/quic/test_tools/quic_test_client.h"
66 #include "quiche/quic/test_tools/quic_test_server.h"
67 #include "quiche/quic/test_tools/quic_test_utils.h"
68 #include "quiche/quic/test_tools/server_thread.h"
69 #include "quiche/quic/test_tools/web_transport_test_tools.h"
70 #include "quiche/quic/tools/quic_backend_response.h"
71 #include "quiche/quic/tools/quic_memory_cache_backend.h"
72 #include "quiche/quic/tools/quic_server.h"
73 #include "quiche/quic/tools/quic_simple_client_stream.h"
74 #include "quiche/quic/tools/quic_simple_server_stream.h"
75 #include "quiche/common/platform/api/quiche_test.h"
76 #include "quiche/common/quiche_stream.h"
77 #include "quiche/common/test_tools/quiche_test_utils.h"
78 #include "quiche/spdy/core/http2_header_block.h"
79
80 using spdy::Http2HeaderBlock;
81 using spdy::kV3LowestPriority;
82 using spdy::SpdyFramer;
83 using spdy::SpdySerializedFrame;
84 using spdy::SpdySettingsIR;
85 using ::testing::_;
86 using ::testing::Assign;
87 using ::testing::Invoke;
88 using ::testing::NiceMock;
89 using ::testing::UnorderedElementsAreArray;
90
91 namespace quic {
92 namespace test {
93 namespace {
94
95 const char kFooResponseBody[] = "Artichoke hearts make me happy.";
96 const char kBarResponseBody[] = "Palm hearts are pretty delicious, also.";
97 const char kTestUserAgentId[] = "quic/core/http/end_to_end_test.cc";
98 const float kSessionToStreamRatio = 1.5;
99 const int kLongConnectionIdLength = 16;
100
101 // Run all tests with the cross products of all versions.
102 struct TestParams {
TestParamsquic::test::__anonb84a445c0111::TestParams103 TestParams(const ParsedQuicVersion& version, QuicTag congestion_control_tag,
104 QuicEventLoopFactory* event_loop,
105 int override_server_connection_id_length)
106 : version(version),
107 congestion_control_tag(congestion_control_tag),
108 event_loop(event_loop),
109 override_server_connection_id_length(
110 override_server_connection_id_length) {}
111
operator <<(std::ostream & os,const TestParams & p)112 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
113 os << "{ version: " << ParsedQuicVersionToString(p.version);
114 os << " congestion_control_tag: "
115 << QuicTagToString(p.congestion_control_tag)
116 << " event loop: " << p.event_loop->GetName()
117 << " connection ID length: " << p.override_server_connection_id_length
118 << " }";
119 return os;
120 }
121
122 ParsedQuicVersion version;
123 QuicTag congestion_control_tag;
124 QuicEventLoopFactory* event_loop;
125 int override_server_connection_id_length;
126 };
127
128 // Used by ::testing::PrintToStringParamName().
PrintToString(const TestParams & p)129 std::string PrintToString(const TestParams& p) {
130 std::string rv = absl::StrCat(
131 ParsedQuicVersionToString(p.version), "_",
132 QuicTagToString(p.congestion_control_tag), "_", p.event_loop->GetName(),
133 "_",
134 std::to_string((p.override_server_connection_id_length == -1)
135 ? static_cast<int>(kQuicDefaultConnectionIdLength)
136 : p.override_server_connection_id_length));
137 return EscapeTestParamName(rv);
138 }
139
140 // Constructs various test permutations.
GetTestParams()141 std::vector<TestParams> GetTestParams() {
142 std::vector<TestParams> params;
143 std::vector<int> connection_id_lengths{-1, kLongConnectionIdLength};
144 for (auto connection_id_length : connection_id_lengths) {
145 for (const QuicTag congestion_control_tag : {kTBBR, kQBIC, kB2ON}) {
146 if (!GetQuicReloadableFlag(quic_allow_client_enabled_bbr_v2) &&
147 congestion_control_tag == kB2ON) {
148 continue;
149 }
150 for (const ParsedQuicVersion& version : CurrentSupportedVersions()) {
151 // TODO(b/232269029): Q050 should be able to handle 0-RTT when the
152 // initial connection ID is > 8 bytes, but it cannot. This is an
153 // invasive fix that has no impact as long as gQUIC clients always use
154 // 8B server connection IDs. If this bug is fixed, we can change
155 // 'UsesTls' to 'AllowsVariableLengthConnectionIds()' below to test
156 // qQUIC as well.
157 if (connection_id_length == -1 || version.UsesTls()) {
158 params.push_back(TestParams(version, congestion_control_tag,
159 GetDefaultEventLoop(),
160 connection_id_length));
161 }
162 } // End of outer version loop.
163 } // End of congestion_control_tag loop.
164 } // End of connection_id_length loop.
165
166 // Only run every event loop implementation for one fixed configuration.
167 for (QuicEventLoopFactory* event_loop : GetAllSupportedEventLoops()) {
168 if (event_loop == GetDefaultEventLoop()) {
169 continue;
170 }
171 params.push_back(
172 TestParams(ParsedQuicVersion::RFCv1(), kTBBR, event_loop, -1));
173 }
174
175 return params;
176 }
177
WriteHeadersOnStream(QuicSpdyStream * stream)178 void WriteHeadersOnStream(QuicSpdyStream* stream) {
179 // Since QuicSpdyStream uses QuicHeaderList::empty() to detect too large
180 // headers, it also fails when receiving empty headers.
181 Http2HeaderBlock headers;
182 headers[":authority"] = "test.example.com:443";
183 headers[":path"] = "/path";
184 headers[":method"] = "GET";
185 headers[":scheme"] = "https";
186 stream->WriteHeaders(std::move(headers), /* fin = */ false, nullptr);
187 }
188
189 class ServerDelegate : public PacketDroppingTestWriter::Delegate {
190 public:
ServerDelegate(QuicDispatcher * dispatcher)191 explicit ServerDelegate(QuicDispatcher* dispatcher)
192 : dispatcher_(dispatcher) {}
193 ~ServerDelegate() override = default;
OnCanWrite()194 void OnCanWrite() override { dispatcher_->OnCanWrite(); }
195
196 private:
197 QuicDispatcher* dispatcher_;
198 };
199
200 class ClientDelegate : public PacketDroppingTestWriter::Delegate {
201 public:
ClientDelegate(QuicDefaultClient * client)202 explicit ClientDelegate(QuicDefaultClient* client) : client_(client) {}
203 ~ClientDelegate() override = default;
OnCanWrite()204 void OnCanWrite() override {
205 client_->default_network_helper()->OnSocketEvent(
206 nullptr, client_->GetLatestFD(), kSocketEventWritable);
207 }
208
209 private:
210 QuicDefaultClient* client_;
211 };
212
213 class EndToEndTest : public QuicTestWithParam<TestParams> {
214 protected:
EndToEndTest()215 EndToEndTest()
216 : initialized_(false),
217 connect_to_server_on_initialize_(true),
218 server_address_(QuicSocketAddress(TestLoopback(), 0)),
219 server_hostname_("test.example.com"),
220 fd_(kQuicInvalidSocketFd),
221 client_writer_(nullptr),
222 server_writer_(nullptr),
223 version_(GetParam().version),
224 client_supported_versions_({version_}),
225 server_supported_versions_(CurrentSupportedVersions()),
226 chlo_multiplier_(0),
227 stream_factory_(nullptr),
228 override_server_connection_id_length_(
229 GetParam().override_server_connection_id_length),
230 expected_server_connection_id_length_(kQuicDefaultConnectionIdLength) {
231 QUIC_LOG(INFO) << "Using Configuration: " << GetParam();
232
233 // Use different flow control windows for client/server.
234 client_config_.SetInitialStreamFlowControlWindowToSend(
235 2 * kInitialStreamFlowControlWindowForTest);
236 client_config_.SetInitialSessionFlowControlWindowToSend(
237 2 * kInitialSessionFlowControlWindowForTest);
238 server_config_.SetInitialStreamFlowControlWindowToSend(
239 3 * kInitialStreamFlowControlWindowForTest);
240 server_config_.SetInitialSessionFlowControlWindowToSend(
241 3 * kInitialSessionFlowControlWindowForTest);
242
243 // The default idle timeouts can be too strict when running on a busy
244 // machine.
245 const QuicTime::Delta timeout = QuicTime::Delta::FromSeconds(30);
246 client_config_.set_max_time_before_crypto_handshake(timeout);
247 client_config_.set_max_idle_time_before_crypto_handshake(timeout);
248 server_config_.set_max_time_before_crypto_handshake(timeout);
249 server_config_.set_max_idle_time_before_crypto_handshake(timeout);
250
251 AddToCache("/foo", 200, kFooResponseBody);
252 AddToCache("/bar", 200, kBarResponseBody);
253 // Enable fixes for bugs found in tests and prod.
254 }
255
CreateClientWithWriter()256 virtual void CreateClientWithWriter() {
257 client_.reset(CreateQuicClient(client_writer_));
258 }
259
CreateQuicClient(QuicPacketWriterWrapper * writer)260 QuicTestClient* CreateQuicClient(QuicPacketWriterWrapper* writer) {
261 QuicTestClient* client = new QuicTestClient(
262 server_address_, server_hostname_, client_config_,
263 client_supported_versions_,
264 crypto_test_utils::ProofVerifierForTesting(),
265 std::make_unique<QuicClientSessionCache>(),
266 GetParam().event_loop->Create(QuicDefaultClock::Get()));
267 client->SetUserAgentID(kTestUserAgentId);
268 client->UseWriter(writer);
269 if (!pre_shared_key_client_.empty()) {
270 client->client()->SetPreSharedKey(pre_shared_key_client_);
271 }
272 if (override_server_connection_id_length_ >= 0) {
273 client->UseConnectionIdLength(override_server_connection_id_length_);
274 }
275 if (override_client_connection_id_length_ >= 0) {
276 client->UseClientConnectionIdLength(
277 override_client_connection_id_length_);
278 }
279 client->client()->set_connection_debug_visitor(connection_debug_visitor_);
280 client->client()->set_enable_web_transport(enable_web_transport_);
281 client->Connect();
282 return client;
283 }
284
set_smaller_flow_control_receive_window()285 void set_smaller_flow_control_receive_window() {
286 const uint32_t kClientIFCW = 64 * 1024;
287 const uint32_t kServerIFCW = 1024 * 1024;
288 set_client_initial_stream_flow_control_receive_window(kClientIFCW);
289 set_client_initial_session_flow_control_receive_window(
290 kSessionToStreamRatio * kClientIFCW);
291 set_server_initial_stream_flow_control_receive_window(kServerIFCW);
292 set_server_initial_session_flow_control_receive_window(
293 kSessionToStreamRatio * kServerIFCW);
294 }
295
set_client_initial_stream_flow_control_receive_window(uint32_t window)296 void set_client_initial_stream_flow_control_receive_window(uint32_t window) {
297 ASSERT_TRUE(client_ == nullptr);
298 QUIC_DLOG(INFO) << "Setting client initial stream flow control window: "
299 << window;
300 client_config_.SetInitialStreamFlowControlWindowToSend(window);
301 }
302
set_client_initial_session_flow_control_receive_window(uint32_t window)303 void set_client_initial_session_flow_control_receive_window(uint32_t window) {
304 ASSERT_TRUE(client_ == nullptr);
305 QUIC_DLOG(INFO) << "Setting client initial session flow control window: "
306 << window;
307 client_config_.SetInitialSessionFlowControlWindowToSend(window);
308 }
309
set_client_initial_max_stream_data_incoming_bidirectional(uint32_t window)310 void set_client_initial_max_stream_data_incoming_bidirectional(
311 uint32_t window) {
312 ASSERT_TRUE(client_ == nullptr);
313 QUIC_DLOG(INFO)
314 << "Setting client initial max stream data incoming bidirectional: "
315 << window;
316 client_config_.SetInitialMaxStreamDataBytesIncomingBidirectionalToSend(
317 window);
318 }
319
set_server_initial_max_stream_data_outgoing_bidirectional(uint32_t window)320 void set_server_initial_max_stream_data_outgoing_bidirectional(
321 uint32_t window) {
322 ASSERT_TRUE(client_ == nullptr);
323 QUIC_DLOG(INFO)
324 << "Setting server initial max stream data outgoing bidirectional: "
325 << window;
326 server_config_.SetInitialMaxStreamDataBytesOutgoingBidirectionalToSend(
327 window);
328 }
329
set_server_initial_stream_flow_control_receive_window(uint32_t window)330 void set_server_initial_stream_flow_control_receive_window(uint32_t window) {
331 ASSERT_TRUE(server_thread_ == nullptr);
332 QUIC_DLOG(INFO) << "Setting server initial stream flow control window: "
333 << window;
334 server_config_.SetInitialStreamFlowControlWindowToSend(window);
335 }
336
set_server_initial_session_flow_control_receive_window(uint32_t window)337 void set_server_initial_session_flow_control_receive_window(uint32_t window) {
338 ASSERT_TRUE(server_thread_ == nullptr);
339 QUIC_DLOG(INFO) << "Setting server initial session flow control window: "
340 << window;
341 server_config_.SetInitialSessionFlowControlWindowToSend(window);
342 }
343
GetSentPacketManagerFromFirstServerSession()344 const QuicSentPacketManager* GetSentPacketManagerFromFirstServerSession() {
345 QuicConnection* server_connection = GetServerConnection();
346 if (server_connection == nullptr) {
347 ADD_FAILURE() << "Missing server connection";
348 return nullptr;
349 }
350 return &server_connection->sent_packet_manager();
351 }
352
GetSentPacketManagerFromClientSession()353 const QuicSentPacketManager* GetSentPacketManagerFromClientSession() {
354 QuicConnection* client_connection = GetClientConnection();
355 if (client_connection == nullptr) {
356 ADD_FAILURE() << "Missing client connection";
357 return nullptr;
358 }
359 return &client_connection->sent_packet_manager();
360 }
361
GetClientSession()362 QuicSpdyClientSession* GetClientSession() {
363 if (!client_) {
364 ADD_FAILURE() << "Missing QuicTestClient";
365 return nullptr;
366 }
367 if (client_->client() == nullptr) {
368 ADD_FAILURE() << "Missing MockableQuicClient";
369 return nullptr;
370 }
371 return client_->client()->client_session();
372 }
373
GetClientConnection()374 QuicConnection* GetClientConnection() {
375 QuicSpdyClientSession* client_session = GetClientSession();
376 if (client_session == nullptr) {
377 ADD_FAILURE() << "Missing client session";
378 return nullptr;
379 }
380 return client_session->connection();
381 }
382
GetServerConnection()383 QuicConnection* GetServerConnection() {
384 QuicSpdySession* server_session = GetServerSession();
385 if (server_session == nullptr) {
386 ADD_FAILURE() << "Missing server session";
387 return nullptr;
388 }
389 return server_session->connection();
390 }
391
GetServerSession()392 QuicSpdySession* GetServerSession() {
393 if (!server_thread_) {
394 ADD_FAILURE() << "Missing server thread";
395 return nullptr;
396 }
397 QuicServer* quic_server = server_thread_->server();
398 if (quic_server == nullptr) {
399 ADD_FAILURE() << "Missing server";
400 return nullptr;
401 }
402 QuicDispatcher* dispatcher = QuicServerPeer::GetDispatcher(quic_server);
403 if (dispatcher == nullptr) {
404 ADD_FAILURE() << "Missing dispatcher";
405 return nullptr;
406 }
407 if (dispatcher->NumSessions() == 0) {
408 ADD_FAILURE() << "Empty dispatcher session map";
409 return nullptr;
410 }
411 EXPECT_EQ(1u, dispatcher->NumSessions());
412 return static_cast<QuicSpdySession*>(
413 QuicDispatcherPeer::GetFirstSessionIfAny(dispatcher));
414 }
415
Initialize()416 bool Initialize() {
417 if (enable_web_transport_) {
418 memory_cache_backend_.set_enable_webtransport(true);
419 }
420
421 QuicTagVector copt;
422 server_config_.SetConnectionOptionsToSend(copt);
423 copt = client_extra_copts_;
424
425 // TODO(nimia): Consider setting the congestion control algorithm for the
426 // client as well according to the test parameter.
427 copt.push_back(GetParam().congestion_control_tag);
428 copt.push_back(k2PTO);
429 if (version_.HasIetfQuicFrames()) {
430 copt.push_back(kILD0);
431 }
432 copt.push_back(kPLE1);
433 if (!GetQuicReloadableFlag(
434 quic_remove_connection_migration_connection_option_v2)) {
435 copt.push_back(kRVCM);
436 }
437 client_config_.SetConnectionOptionsToSend(copt);
438
439 // Start the server first, because CreateQuicClient() attempts
440 // to connect to the server.
441 StartServer();
442
443 if (use_preferred_address_) {
444 SetQuicReloadableFlag(quic_use_received_client_addresses_cache, true);
445 // At this point, the server has an ephemeral port to listen on. Restart
446 // the server with the preferred address.
447 StopServer();
448 // server_address_ now contains the random listening port.
449 server_preferred_address_ =
450 QuicSocketAddress(TestLoopback(2), server_address_.port());
451 if (server_preferred_address_ == server_address_) {
452 ADD_FAILURE() << "Preferred address and server address are the same "
453 << server_address_;
454 return false;
455 }
456 // Send server preferred address and let server listen on Any.
457 if (server_preferred_address_.host().IsIPv4()) {
458 server_listening_address_ =
459 QuicSocketAddress(QuicIpAddress::Any4(), server_address_.port());
460 server_config_.SetIPv4AlternateServerAddressToSend(
461 server_preferred_address_);
462 } else {
463 server_listening_address_ =
464 QuicSocketAddress(QuicIpAddress::Any6(), server_address_.port());
465 server_config_.SetIPv6AlternateServerAddressToSend(
466 server_preferred_address_);
467 }
468 // Server restarts.
469 server_writer_ = new PacketDroppingTestWriter();
470 StartServer();
471
472 client_config_.SetConnectionOptionsToSend(QuicTagVector{kRVCM, kSPAD});
473 }
474
475 if (!connect_to_server_on_initialize_) {
476 initialized_ = true;
477 return true;
478 }
479
480 CreateClientWithWriter();
481 if (!client_) {
482 ADD_FAILURE() << "Missing QuicTestClient";
483 return false;
484 }
485 MockableQuicClient* client = client_->client();
486 if (client == nullptr) {
487 ADD_FAILURE() << "Missing MockableQuicClient";
488 return false;
489 }
490 if (client_writer_ != nullptr) {
491 QuicConnection* client_connection = GetClientConnection();
492 if (client_connection == nullptr) {
493 ADD_FAILURE() << "Missing client connection";
494 return false;
495 }
496 client_writer_->Initialize(
497 QuicConnectionPeer::GetHelper(client_connection),
498 QuicConnectionPeer::GetAlarmFactory(client_connection),
499 std::make_unique<ClientDelegate>(client));
500 }
501 initialized_ = true;
502 return client->connected();
503 }
504
SetUp()505 void SetUp() override {
506 // The ownership of these gets transferred to the QuicPacketWriterWrapper
507 // when Initialize() is executed.
508 client_writer_ = new PacketDroppingTestWriter();
509 server_writer_ = new PacketDroppingTestWriter();
510 }
511
TearDown()512 void TearDown() override {
513 EXPECT_TRUE(initialized_) << "You must call Initialize() in every test "
514 << "case. Otherwise, your test will leak memory.";
515 QuicConnection* client_connection = GetClientConnection();
516 if (client_connection != nullptr) {
517 client_connection->set_debug_visitor(nullptr);
518 } else {
519 ADD_FAILURE() << "Missing client connection";
520 }
521 StopServer(/*will_restart=*/false);
522 if (fd_ != kQuicInvalidSocketFd) {
523 // Every test should follow StopServer(true) with StartServer(), so we
524 // should never get here.
525 QuicUdpSocketApi socket_api;
526 socket_api.Destroy(fd_);
527 fd_ = kQuicInvalidSocketFd;
528 }
529 }
530
StartServer()531 void StartServer() {
532 if (fd_ != kQuicInvalidSocketFd) {
533 // We previously called StopServer to reserve the ephemeral port. Close
534 // the socket so that it's available below.
535 QuicUdpSocketApi socket_api;
536 socket_api.Destroy(fd_);
537 fd_ = kQuicInvalidSocketFd;
538 }
539 auto test_server = std::make_unique<QuicTestServer>(
540 crypto_test_utils::ProofSourceForTesting(), server_config_,
541 server_supported_versions_, &memory_cache_backend_,
542 expected_server_connection_id_length_);
543 test_server->SetEventLoopFactory(GetParam().event_loop);
544 const QuicSocketAddress server_listening_address =
545 server_listening_address_.has_value() ? *server_listening_address_
546 : server_address_;
547 server_thread_ = std::make_unique<ServerThread>(std::move(test_server),
548 server_listening_address);
549 if (chlo_multiplier_ != 0) {
550 server_thread_->server()->SetChloMultiplier(chlo_multiplier_);
551 }
552 if (!pre_shared_key_server_.empty()) {
553 server_thread_->server()->SetPreSharedKey(pre_shared_key_server_);
554 }
555 server_thread_->Initialize();
556 server_address_ =
557 QuicSocketAddress(server_address_.host(), server_thread_->GetPort());
558 QuicDispatcher* dispatcher =
559 QuicServerPeer::GetDispatcher(server_thread_->server());
560 ASSERT_TRUE(dispatcher != nullptr);
561 QuicDispatcherPeer::UseWriter(dispatcher, server_writer_);
562
563 server_writer_->Initialize(QuicDispatcherPeer::GetHelper(dispatcher),
564 QuicDispatcherPeer::GetAlarmFactory(dispatcher),
565 std::make_unique<ServerDelegate>(dispatcher));
566 if (stream_factory_ != nullptr) {
567 static_cast<QuicTestServer*>(server_thread_->server())
568 ->SetSpdyStreamFactory(stream_factory_);
569 }
570
571 server_thread_->Start();
572 }
573
StopServer(bool will_restart=true)574 void StopServer(bool will_restart = true) {
575 if (server_thread_) {
576 server_thread_->Quit();
577 server_thread_->Join();
578 }
579 if (will_restart) {
580 // server_address_ now contains the random listening port. Since many
581 // tests will attempt to re-bind the socket, claim it so that the kernel
582 // doesn't give away the ephemeral port.
583 QuicUdpSocketApi socket_api;
584 fd_ = socket_api.Create(
585 server_address_.host().AddressFamilyToInt(),
586 /*receive_buffer_size =*/kDefaultSocketReceiveBuffer,
587 /*send_buffer_size =*/kDefaultSocketReceiveBuffer);
588 if (fd_ == kQuicInvalidSocketFd) {
589 QUIC_LOG(ERROR) << "CreateSocket() failed: " << strerror(errno);
590 return;
591 }
592 int rc = socket_api.Bind(fd_, server_address_);
593 if (rc < 0) {
594 QUIC_LOG(ERROR) << "Bind failed: " << strerror(errno);
595 return;
596 }
597 }
598 }
599
AddToCache(absl::string_view path,int response_code,absl::string_view body)600 void AddToCache(absl::string_view path, int response_code,
601 absl::string_view body) {
602 memory_cache_backend_.AddSimpleResponse(server_hostname_, path,
603 response_code, body);
604 }
605
SetPacketLossPercentage(int32_t loss)606 void SetPacketLossPercentage(int32_t loss) {
607 client_writer_->set_fake_packet_loss_percentage(loss);
608 server_writer_->set_fake_packet_loss_percentage(loss);
609 }
610
SetPacketSendDelay(QuicTime::Delta delay)611 void SetPacketSendDelay(QuicTime::Delta delay) {
612 client_writer_->set_fake_packet_delay(delay);
613 server_writer_->set_fake_packet_delay(delay);
614 }
615
SetReorderPercentage(int32_t reorder)616 void SetReorderPercentage(int32_t reorder) {
617 client_writer_->set_fake_reorder_percentage(reorder);
618 server_writer_->set_fake_reorder_percentage(reorder);
619 }
620
621 // Verifies that the client and server connections were both free of packets
622 // being discarded, based on connection stats.
623 // Calls server_thread_ Pause() and Resume(), which may only be called once
624 // per test.
VerifyCleanConnection(bool had_packet_loss)625 void VerifyCleanConnection(bool had_packet_loss) {
626 QuicConnection* client_connection = GetClientConnection();
627 if (client_connection == nullptr) {
628 ADD_FAILURE() << "Missing client connection";
629 return;
630 }
631 QuicConnectionStats client_stats = client_connection->GetStats();
632 // TODO(ianswett): Determine why this becomes even more flaky with BBR
633 // enabled. b/62141144
634 if (!had_packet_loss && !GetQuicReloadableFlag(quic_default_to_bbr)) {
635 EXPECT_EQ(0u, client_stats.packets_lost);
636 }
637 EXPECT_EQ(0u, client_stats.packets_discarded);
638 // When client starts with an unsupported version, the version negotiation
639 // packet sent by server for the old connection (respond for the connection
640 // close packet) will be dropped by the client.
641 if (!ServerSendsVersionNegotiation()) {
642 EXPECT_EQ(0u, client_stats.packets_dropped);
643 }
644 if (!version_.UsesTls()) {
645 // Only enforce this for QUIC crypto because accounting of number of
646 // packets received, processed gets complicated with packets coalescing
647 // and key dropping. For example, a received undecryptable coalesced
648 // packet can be processed later and each sub-packet increases
649 // packets_processed.
650 EXPECT_EQ(client_stats.packets_received, client_stats.packets_processed);
651 }
652
653 if (!server_thread_) {
654 ADD_FAILURE() << "Missing server thread";
655 return;
656 }
657 server_thread_->Pause();
658 QuicSpdySession* server_session = GetServerSession();
659 if (server_session != nullptr) {
660 QuicConnection* server_connection = server_session->connection();
661 if (server_connection != nullptr) {
662 QuicConnectionStats server_stats = server_connection->GetStats();
663 if (!had_packet_loss) {
664 EXPECT_EQ(0u, server_stats.packets_lost);
665 }
666 EXPECT_EQ(0u, server_stats.packets_discarded);
667 } else {
668 ADD_FAILURE() << "Missing server connection";
669 }
670 } else {
671 ADD_FAILURE() << "Missing server session";
672 }
673 // TODO(ianswett): Restore the check for packets_dropped equals 0.
674 // The expect for packets received is equal to packets processed fails
675 // due to version negotiation packets.
676 server_thread_->Resume();
677 }
678
679 // Returns true when client starts with an unsupported version, and client
680 // closes connection when version negotiation is received.
ServerSendsVersionNegotiation()681 bool ServerSendsVersionNegotiation() {
682 return client_supported_versions_[0] != version_;
683 }
684
SupportsIetfQuicWithTls(ParsedQuicVersion version)685 bool SupportsIetfQuicWithTls(ParsedQuicVersion version) {
686 return version.HasIetfInvariantHeader() &&
687 version.handshake_protocol == PROTOCOL_TLS1_3;
688 }
689
ExpectFlowControlsSynced(QuicSession * client,QuicSession * server)690 static void ExpectFlowControlsSynced(QuicSession* client,
691 QuicSession* server) {
692 EXPECT_EQ(
693 QuicFlowControllerPeer::SendWindowSize(client->flow_controller()),
694 QuicFlowControllerPeer::ReceiveWindowSize(server->flow_controller()));
695 EXPECT_EQ(
696 QuicFlowControllerPeer::ReceiveWindowSize(client->flow_controller()),
697 QuicFlowControllerPeer::SendWindowSize(server->flow_controller()));
698 }
699
ExpectFlowControlsSynced(QuicStream * client,QuicStream * server)700 static void ExpectFlowControlsSynced(QuicStream* client, QuicStream* server) {
701 EXPECT_EQ(QuicStreamPeer::SendWindowSize(client),
702 QuicStreamPeer::ReceiveWindowSize(server));
703 EXPECT_EQ(QuicStreamPeer::ReceiveWindowSize(client),
704 QuicStreamPeer::SendWindowSize(server));
705 }
706
707 // Must be called before Initialize to have effect.
SetSpdyStreamFactory(QuicTestServer::StreamFactory * factory)708 void SetSpdyStreamFactory(QuicTestServer::StreamFactory* factory) {
709 stream_factory_ = factory;
710 }
711
GetNthClientInitiatedBidirectionalId(int n)712 QuicStreamId GetNthClientInitiatedBidirectionalId(int n) {
713 return GetNthClientInitiatedBidirectionalStreamId(
714 version_.transport_version, n);
715 }
716
GetNthServerInitiatedBidirectionalId(int n)717 QuicStreamId GetNthServerInitiatedBidirectionalId(int n) {
718 return GetNthServerInitiatedBidirectionalStreamId(
719 version_.transport_version, n);
720 }
721
CheckResponseHeaders(QuicTestClient * client,const std::string & expected_status)722 bool CheckResponseHeaders(QuicTestClient* client,
723 const std::string& expected_status) {
724 const spdy::Http2HeaderBlock* response_headers = client->response_headers();
725 auto it = response_headers->find(":status");
726 if (it == response_headers->end()) {
727 ADD_FAILURE() << "Did not find :status header in response";
728 return false;
729 }
730 if (it->second != expected_status) {
731 ADD_FAILURE() << "Got bad :status response: \"" << it->second << "\"";
732 return false;
733 }
734 return true;
735 }
736
CheckResponseHeaders(QuicTestClient * client)737 bool CheckResponseHeaders(QuicTestClient* client) {
738 return CheckResponseHeaders(client, "200");
739 }
740
CheckResponseHeaders(const std::string & expected_status)741 bool CheckResponseHeaders(const std::string& expected_status) {
742 return CheckResponseHeaders(client_.get(), expected_status);
743 }
744
CheckResponseHeaders()745 bool CheckResponseHeaders() { return CheckResponseHeaders(client_.get()); }
746
CheckResponse(QuicTestClient * client,const std::string & received_response,const std::string & expected_response)747 bool CheckResponse(QuicTestClient* client,
748 const std::string& received_response,
749 const std::string& expected_response) {
750 EXPECT_THAT(client_->stream_error(), IsQuicStreamNoError());
751 EXPECT_THAT(client_->connection_error(), IsQuicNoError());
752
753 if (received_response.empty() && !expected_response.empty()) {
754 ADD_FAILURE() << "Failed to get any response for request";
755 return false;
756 }
757 if (received_response != expected_response) {
758 ADD_FAILURE() << "Got wrong response: \"" << received_response << "\"";
759 return false;
760 }
761 return CheckResponseHeaders(client);
762 }
763
SendSynchronousRequestAndCheckResponse(QuicTestClient * client,const std::string & request,const std::string & expected_response)764 bool SendSynchronousRequestAndCheckResponse(
765 QuicTestClient* client, const std::string& request,
766 const std::string& expected_response) {
767 std::string received_response = client->SendSynchronousRequest(request);
768 return CheckResponse(client, received_response, expected_response);
769 }
770
SendSynchronousRequestAndCheckResponse(const std::string & request,const std::string & expected_response)771 bool SendSynchronousRequestAndCheckResponse(
772 const std::string& request, const std::string& expected_response) {
773 return SendSynchronousRequestAndCheckResponse(client_.get(), request,
774 expected_response);
775 }
776
SendSynchronousFooRequestAndCheckResponse(QuicTestClient * client)777 bool SendSynchronousFooRequestAndCheckResponse(QuicTestClient* client) {
778 return SendSynchronousRequestAndCheckResponse(client, "/foo",
779 kFooResponseBody);
780 }
781
SendSynchronousFooRequestAndCheckResponse()782 bool SendSynchronousFooRequestAndCheckResponse() {
783 return SendSynchronousFooRequestAndCheckResponse(client_.get());
784 }
785
SendSynchronousBarRequestAndCheckResponse()786 bool SendSynchronousBarRequestAndCheckResponse() {
787 std::string received_response = client_->SendSynchronousRequest("/bar");
788 return CheckResponse(client_.get(), received_response, kBarResponseBody);
789 }
790
WaitForFooResponseAndCheckIt(QuicTestClient * client)791 bool WaitForFooResponseAndCheckIt(QuicTestClient* client) {
792 client->WaitForResponse();
793 std::string received_response = client->response_body();
794 return CheckResponse(client_.get(), received_response, kFooResponseBody);
795 }
796
WaitForFooResponseAndCheckIt()797 bool WaitForFooResponseAndCheckIt() {
798 return WaitForFooResponseAndCheckIt(client_.get());
799 }
800
CreateWebTransportSession(const std::string & path,bool wait_for_server_response,QuicSpdyStream ** connect_stream_out=nullptr)801 WebTransportHttp3* CreateWebTransportSession(
802 const std::string& path, bool wait_for_server_response,
803 QuicSpdyStream** connect_stream_out = nullptr) {
804 // Wait until we receive the settings from the server indicating
805 // WebTransport support.
806 client_->WaitUntil(
807 2000, [this]() { return GetClientSession()->SupportsWebTransport(); });
808 if (!GetClientSession()->SupportsWebTransport()) {
809 return nullptr;
810 }
811
812 spdy::Http2HeaderBlock headers;
813 headers[":scheme"] = "https";
814 headers[":authority"] = "localhost";
815 headers[":path"] = path;
816 headers[":method"] = "CONNECT";
817 headers[":protocol"] = "webtransport";
818
819 client_->SendMessage(headers, "", /*fin=*/false);
820 QuicSpdyStream* stream = client_->latest_created_stream();
821 if (stream->web_transport() == nullptr) {
822 return nullptr;
823 }
824 WebTransportSessionId id = client_->latest_created_stream()->id();
825 QuicSpdySession* client_session = GetClientSession();
826 if (client_session->GetWebTransportSession(id) == nullptr) {
827 return nullptr;
828 }
829 WebTransportHttp3* session = client_session->GetWebTransportSession(id);
830 if (wait_for_server_response) {
831 client_->WaitUntil(-1,
832 [stream]() { return stream->headers_decompressed(); });
833 EXPECT_TRUE(session->ready());
834 }
835 if (connect_stream_out != nullptr) {
836 *connect_stream_out = stream;
837 }
838 return session;
839 }
840
SetupWebTransportVisitor(WebTransportHttp3 * session)841 NiceMock<MockWebTransportSessionVisitor>& SetupWebTransportVisitor(
842 WebTransportHttp3* session) {
843 auto visitor_owned =
844 std::make_unique<NiceMock<MockWebTransportSessionVisitor>>();
845 NiceMock<MockWebTransportSessionVisitor>& visitor = *visitor_owned;
846 session->SetVisitor(std::move(visitor_owned));
847 return visitor;
848 }
849
ReadDataFromWebTransportStreamUntilFin(WebTransportStream * stream,MockWebTransportStreamVisitor * visitor=nullptr)850 std::string ReadDataFromWebTransportStreamUntilFin(
851 WebTransportStream* stream,
852 MockWebTransportStreamVisitor* visitor = nullptr) {
853 QuicStreamId id = stream->GetStreamId();
854 std::string buffer;
855
856 // Try reading data if immediately available.
857 WebTransportStream::ReadResult result = stream->Read(&buffer);
858 if (result.fin) {
859 return buffer;
860 }
861
862 while (true) {
863 bool can_read = false;
864 if (visitor == nullptr) {
865 auto visitor_owned = std::make_unique<MockWebTransportStreamVisitor>();
866 visitor = visitor_owned.get();
867 stream->SetVisitor(std::move(visitor_owned));
868 }
869 EXPECT_CALL(*visitor, OnCanRead())
870 .WillRepeatedly(Assign(&can_read, true));
871 client_->WaitUntil(5000 /*ms*/, [&can_read]() { return can_read; });
872 if (!can_read) {
873 ADD_FAILURE() << "Waiting for readable data on stream " << id
874 << " timed out";
875 return buffer;
876 }
877 if (GetClientSession()->GetOrCreateSpdyDataStream(id) == nullptr) {
878 ADD_FAILURE() << "Stream " << id
879 << " was deleted while waiting for incoming data";
880 return buffer;
881 }
882
883 result = stream->Read(&buffer);
884 if (result.fin) {
885 return buffer;
886 }
887 if (result.bytes_read == 0) {
888 ADD_FAILURE() << "No progress made while reading from stream "
889 << stream->GetStreamId();
890 return buffer;
891 }
892 }
893 }
894
ReadAllIncomingWebTransportUnidirectionalStreams(WebTransportSession * session)895 void ReadAllIncomingWebTransportUnidirectionalStreams(
896 WebTransportSession* session) {
897 while (true) {
898 WebTransportStream* received_stream =
899 session->AcceptIncomingUnidirectionalStream();
900 if (received_stream == nullptr) {
901 break;
902 }
903 received_webtransport_unidirectional_streams_.push_back(
904 ReadDataFromWebTransportStreamUntilFin(received_stream));
905 }
906 }
907
WaitForNewConnectionIds()908 void WaitForNewConnectionIds() {
909 // Wait until a new server CID is available for another migration.
910 const auto* client_connection = GetClientConnection();
911 while (!QuicConnectionPeer::HasUnusedPeerIssuedConnectionId(
912 client_connection) ||
913 (!client_connection->client_connection_id().IsEmpty() &&
914 !QuicConnectionPeer::HasSelfIssuedConnectionIdToConsume(
915 client_connection))) {
916 client_->client()->WaitForEvents();
917 }
918 }
919
920 quiche::test::ScopedEnvironmentForThreads environment_;
921 bool initialized_;
922 // If true, the Initialize() function will create |client_| and starts to
923 // connect to the server.
924 // Default is true.
925 bool connect_to_server_on_initialize_;
926 QuicSocketAddress server_address_;
927 absl::optional<QuicSocketAddress> server_listening_address_;
928 std::string server_hostname_;
929 QuicTestBackend memory_cache_backend_;
930 std::unique_ptr<ServerThread> server_thread_;
931 // This socket keeps the ephemeral port reserved so that the kernel doesn't
932 // give it away while the server is shut down.
933 QuicUdpSocketFd fd_;
934 std::unique_ptr<QuicTestClient> client_;
935 QuicConnectionDebugVisitor* connection_debug_visitor_ = nullptr;
936 PacketDroppingTestWriter* client_writer_;
937 PacketDroppingTestWriter* server_writer_;
938 QuicConfig client_config_;
939 QuicConfig server_config_;
940 ParsedQuicVersion version_;
941 ParsedQuicVersionVector client_supported_versions_;
942 ParsedQuicVersionVector server_supported_versions_;
943 QuicTagVector client_extra_copts_;
944 size_t chlo_multiplier_;
945 QuicTestServer::StreamFactory* stream_factory_;
946 std::string pre_shared_key_client_;
947 std::string pre_shared_key_server_;
948 int override_server_connection_id_length_;
949 int override_client_connection_id_length_ = -1;
950 uint8_t expected_server_connection_id_length_;
951 bool enable_web_transport_ = false;
952 std::vector<std::string> received_webtransport_unidirectional_streams_;
953 bool use_preferred_address_ = false;
954 QuicSocketAddress server_preferred_address_;
955 };
956
957 // Run all end to end tests with all supported versions.
958 INSTANTIATE_TEST_SUITE_P(EndToEndTests, EndToEndTest,
959 ::testing::ValuesIn(GetTestParams()),
960 ::testing::PrintToStringParamName());
961
TEST_P(EndToEndTest,HandshakeSuccessful)962 TEST_P(EndToEndTest, HandshakeSuccessful) {
963 ASSERT_TRUE(Initialize());
964 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
965 ASSERT_TRUE(server_thread_);
966 server_thread_->WaitForCryptoHandshakeConfirmed();
967 QuicSpdyClientSession* client_session = GetClientSession();
968 ASSERT_TRUE(client_session);
969 QuicCryptoStream* client_crypto_stream =
970 QuicSessionPeer::GetMutableCryptoStream(client_session);
971 ASSERT_TRUE(client_crypto_stream);
972 QuicStreamSequencer* client_sequencer =
973 QuicStreamPeer::sequencer(client_crypto_stream);
974 ASSERT_TRUE(client_sequencer);
975 EXPECT_FALSE(
976 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(client_sequencer));
977
978 // We've had bugs in the past where the connections could end up on the wrong
979 // version. This was never diagnosed but could have been due to in-connection
980 // version negotiation back when that existed. At this point in time, our test
981 // setup ensures that connections here always use |version_|, but we add this
982 // sanity check out of paranoia to catch a regression of this type.
983 QuicConnection* client_connection = GetClientConnection();
984 ASSERT_TRUE(client_connection);
985 EXPECT_EQ(client_connection->version(), version_);
986
987 server_thread_->Pause();
988 QuicSpdySession* server_session = GetServerSession();
989 QuicConnection* server_connection = nullptr;
990 QuicCryptoStream* server_crypto_stream = nullptr;
991 QuicStreamSequencer* server_sequencer = nullptr;
992 if (server_session != nullptr) {
993 server_connection = server_session->connection();
994 server_crypto_stream =
995 QuicSessionPeer::GetMutableCryptoStream(server_session);
996 } else {
997 ADD_FAILURE() << "Missing server session";
998 }
999 if (server_crypto_stream != nullptr) {
1000 server_sequencer = QuicStreamPeer::sequencer(server_crypto_stream);
1001 } else {
1002 ADD_FAILURE() << "Missing server crypto stream";
1003 }
1004 if (server_sequencer != nullptr) {
1005 EXPECT_FALSE(
1006 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(server_sequencer));
1007 } else {
1008 ADD_FAILURE() << "Missing server sequencer";
1009 }
1010 if (server_connection != nullptr) {
1011 EXPECT_EQ(server_connection->version(), version_);
1012 } else {
1013 ADD_FAILURE() << "Missing server connection";
1014 }
1015 server_thread_->Resume();
1016 }
1017
TEST_P(EndToEndTest,ExportKeyingMaterial)1018 TEST_P(EndToEndTest, ExportKeyingMaterial) {
1019 ASSERT_TRUE(Initialize());
1020 if (!version_.UsesTls()) {
1021 return;
1022 }
1023 const char* kExportLabel = "label";
1024 const int kExportLen = 30;
1025 std::string client_keying_material_export, server_keying_material_export;
1026
1027 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
1028 ASSERT_TRUE(server_thread_);
1029 server_thread_->WaitForCryptoHandshakeConfirmed();
1030
1031 server_thread_->Pause();
1032 QuicSpdySession* server_session = GetServerSession();
1033 QuicCryptoStream* server_crypto_stream = nullptr;
1034 if (server_session != nullptr) {
1035 server_crypto_stream =
1036 QuicSessionPeer::GetMutableCryptoStream(server_session);
1037 } else {
1038 ADD_FAILURE() << "Missing server session";
1039 }
1040 if (server_crypto_stream != nullptr) {
1041 ASSERT_TRUE(server_crypto_stream->ExportKeyingMaterial(
1042 kExportLabel, /*context=*/"", kExportLen,
1043 &server_keying_material_export));
1044
1045 } else {
1046 ADD_FAILURE() << "Missing server crypto stream";
1047 }
1048 server_thread_->Resume();
1049
1050 QuicSpdyClientSession* client_session = GetClientSession();
1051 ASSERT_TRUE(client_session);
1052 QuicCryptoStream* client_crypto_stream =
1053 QuicSessionPeer::GetMutableCryptoStream(client_session);
1054 ASSERT_TRUE(client_crypto_stream);
1055 ASSERT_TRUE(client_crypto_stream->ExportKeyingMaterial(
1056 kExportLabel, /*context=*/"", kExportLen,
1057 &client_keying_material_export));
1058 ASSERT_EQ(client_keying_material_export.size(),
1059 static_cast<size_t>(kExportLen));
1060 EXPECT_EQ(client_keying_material_export, server_keying_material_export);
1061 }
1062
TEST_P(EndToEndTest,SimpleRequestResponse)1063 TEST_P(EndToEndTest, SimpleRequestResponse) {
1064 ASSERT_TRUE(Initialize());
1065
1066 SendSynchronousFooRequestAndCheckResponse();
1067 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1068 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1069 if (version_.UsesHttp3()) {
1070 QuicSpdyClientSession* client_session = GetClientSession();
1071 ASSERT_TRUE(client_session);
1072 EXPECT_TRUE(QuicSpdySessionPeer::GetSendControlStream(client_session));
1073 EXPECT_TRUE(QuicSpdySessionPeer::GetReceiveControlStream(client_session));
1074 server_thread_->Pause();
1075 QuicSpdySession* server_session = GetServerSession();
1076 if (server_session != nullptr) {
1077 EXPECT_TRUE(QuicSpdySessionPeer::GetSendControlStream(server_session));
1078 EXPECT_TRUE(QuicSpdySessionPeer::GetReceiveControlStream(server_session));
1079 } else {
1080 ADD_FAILURE() << "Missing server session";
1081 }
1082 server_thread_->Resume();
1083 }
1084 QuicConnectionStats client_stats = GetClientConnection()->GetStats();
1085 EXPECT_TRUE(client_stats.handshake_completion_time.IsInitialized());
1086 }
1087
TEST_P(EndToEndTest,HandshakeConfirmed)1088 TEST_P(EndToEndTest, HandshakeConfirmed) {
1089 ASSERT_TRUE(Initialize());
1090 if (!version_.UsesTls()) {
1091 return;
1092 }
1093 SendSynchronousFooRequestAndCheckResponse();
1094 // Verify handshake state.
1095 QuicSpdyClientSession* client_session = GetClientSession();
1096 ASSERT_TRUE(client_session);
1097 EXPECT_EQ(HANDSHAKE_CONFIRMED, client_session->GetHandshakeState());
1098 server_thread_->Pause();
1099 QuicSpdySession* server_session = GetServerSession();
1100 if (server_session != nullptr) {
1101 EXPECT_EQ(HANDSHAKE_CONFIRMED, server_session->GetHandshakeState());
1102 } else {
1103 ADD_FAILURE() << "Missing server session";
1104 }
1105 server_thread_->Resume();
1106 client_->Disconnect();
1107 }
1108
TEST_P(EndToEndTest,SendAndReceiveCoalescedPackets)1109 TEST_P(EndToEndTest, SendAndReceiveCoalescedPackets) {
1110 ASSERT_TRUE(Initialize());
1111 if (!version_.CanSendCoalescedPackets()) {
1112 return;
1113 }
1114 SendSynchronousFooRequestAndCheckResponse();
1115 // Verify client successfully processes coalesced packets.
1116 QuicConnection* client_connection = GetClientConnection();
1117 ASSERT_TRUE(client_connection);
1118 QuicConnectionStats client_stats = client_connection->GetStats();
1119 EXPECT_LT(0u, client_stats.num_coalesced_packets_received);
1120 EXPECT_EQ(client_stats.num_coalesced_packets_processed,
1121 client_stats.num_coalesced_packets_received);
1122 // TODO(fayang): verify server successfully processes coalesced packets.
1123 }
1124
1125 // Simple transaction, but set a non-default ack delay at the client
1126 // and ensure it gets to the server.
TEST_P(EndToEndTest,SimpleRequestResponseWithAckDelayChange)1127 TEST_P(EndToEndTest, SimpleRequestResponseWithAckDelayChange) {
1128 // Force the ACK delay to be something other than the default.
1129 constexpr uint32_t kClientMaxAckDelay = kDefaultDelayedAckTimeMs + 100u;
1130 client_config_.SetMaxAckDelayToSendMs(kClientMaxAckDelay);
1131 ASSERT_TRUE(Initialize());
1132
1133 SendSynchronousFooRequestAndCheckResponse();
1134 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1135 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1136
1137 server_thread_->Pause();
1138 const QuicSentPacketManager* server_sent_packet_manager =
1139 GetSentPacketManagerFromFirstServerSession();
1140 if (server_sent_packet_manager != nullptr) {
1141 EXPECT_EQ(
1142 kClientMaxAckDelay,
1143 server_sent_packet_manager->peer_max_ack_delay().ToMilliseconds());
1144 } else {
1145 ADD_FAILURE() << "Missing server sent packet manager";
1146 }
1147 server_thread_->Resume();
1148 }
1149
1150 // Simple transaction, but set a non-default ack exponent at the client
1151 // and ensure it gets to the server.
TEST_P(EndToEndTest,SimpleRequestResponseWithAckExponentChange)1152 TEST_P(EndToEndTest, SimpleRequestResponseWithAckExponentChange) {
1153 const uint32_t kClientAckDelayExponent = 19;
1154 EXPECT_NE(kClientAckDelayExponent, kDefaultAckDelayExponent);
1155 // Force the ACK exponent to be something other than the default.
1156 // Note that it is sent only with QUIC+TLS.
1157 client_config_.SetAckDelayExponentToSend(kClientAckDelayExponent);
1158 ASSERT_TRUE(Initialize());
1159
1160 SendSynchronousFooRequestAndCheckResponse();
1161
1162 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1163 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1164 server_thread_->Pause();
1165 QuicConnection* server_connection = GetServerConnection();
1166 if (server_connection != nullptr) {
1167 if (version_.UsesTls()) {
1168 // Should be only sent with QUIC+TLS.
1169 EXPECT_EQ(kClientAckDelayExponent,
1170 server_connection->framer().peer_ack_delay_exponent());
1171 } else {
1172 // No change for QUIC_CRYPTO.
1173 EXPECT_EQ(kDefaultAckDelayExponent,
1174 server_connection->framer().peer_ack_delay_exponent());
1175 }
1176 // No change, regardless of version.
1177 EXPECT_EQ(kDefaultAckDelayExponent,
1178 server_connection->framer().local_ack_delay_exponent());
1179 } else {
1180 ADD_FAILURE() << "Missing server connection";
1181 }
1182 server_thread_->Resume();
1183 }
1184
TEST_P(EndToEndTest,SimpleRequestResponseForcedVersionNegotiation)1185 TEST_P(EndToEndTest, SimpleRequestResponseForcedVersionNegotiation) {
1186 client_supported_versions_.insert(client_supported_versions_.begin(),
1187 QuicVersionReservedForNegotiation());
1188 NiceMock<MockQuicConnectionDebugVisitor> visitor;
1189 connection_debug_visitor_ = &visitor;
1190 EXPECT_CALL(visitor, OnVersionNegotiationPacket(_)).Times(1);
1191 ASSERT_TRUE(Initialize());
1192 ASSERT_TRUE(ServerSendsVersionNegotiation());
1193
1194 SendSynchronousFooRequestAndCheckResponse();
1195
1196 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1197 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1198 }
1199
TEST_P(EndToEndTest,ForcedVersionNegotiation)1200 TEST_P(EndToEndTest, ForcedVersionNegotiation) {
1201 client_supported_versions_.insert(client_supported_versions_.begin(),
1202 QuicVersionReservedForNegotiation());
1203 ASSERT_TRUE(Initialize());
1204 ASSERT_TRUE(ServerSendsVersionNegotiation());
1205
1206 SendSynchronousFooRequestAndCheckResponse();
1207 }
1208
TEST_P(EndToEndTest,SimpleRequestResponseZeroConnectionID)1209 TEST_P(EndToEndTest, SimpleRequestResponseZeroConnectionID) {
1210 if (!version_.AllowsVariableLengthConnectionIds() ||
1211 override_server_connection_id_length_ > -1) {
1212 ASSERT_TRUE(Initialize());
1213 return;
1214 }
1215 override_server_connection_id_length_ = 0;
1216 expected_server_connection_id_length_ = 0;
1217 ASSERT_TRUE(Initialize());
1218
1219 SendSynchronousFooRequestAndCheckResponse();
1220 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1221 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1222 QuicConnection* client_connection = GetClientConnection();
1223 ASSERT_TRUE(client_connection);
1224 EXPECT_EQ(client_connection->connection_id(),
1225 QuicUtils::CreateZeroConnectionId(version_.transport_version));
1226 }
1227
TEST_P(EndToEndTest,ZeroConnectionID)1228 TEST_P(EndToEndTest, ZeroConnectionID) {
1229 if (!version_.AllowsVariableLengthConnectionIds() ||
1230 override_server_connection_id_length_ > -1) {
1231 ASSERT_TRUE(Initialize());
1232 return;
1233 }
1234 override_server_connection_id_length_ = 0;
1235 expected_server_connection_id_length_ = 0;
1236 ASSERT_TRUE(Initialize());
1237
1238 SendSynchronousFooRequestAndCheckResponse();
1239 QuicConnection* client_connection = GetClientConnection();
1240 ASSERT_TRUE(client_connection);
1241 EXPECT_EQ(client_connection->connection_id(),
1242 QuicUtils::CreateZeroConnectionId(version_.transport_version));
1243 }
1244
TEST_P(EndToEndTest,BadConnectionIdLength)1245 TEST_P(EndToEndTest, BadConnectionIdLength) {
1246 if (!version_.AllowsVariableLengthConnectionIds() ||
1247 override_server_connection_id_length_ > -1) {
1248 ASSERT_TRUE(Initialize());
1249 return;
1250 }
1251 override_server_connection_id_length_ = 9;
1252 ASSERT_TRUE(Initialize());
1253 SendSynchronousFooRequestAndCheckResponse();
1254 EXPECT_EQ(kQuicDefaultConnectionIdLength, client_->client()
1255 ->client_session()
1256 ->connection()
1257 ->connection_id()
1258 .length());
1259 }
1260
TEST_P(EndToEndTest,ClientConnectionId)1261 TEST_P(EndToEndTest, ClientConnectionId) {
1262 if (!version_.SupportsClientConnectionIds()) {
1263 ASSERT_TRUE(Initialize());
1264 return;
1265 }
1266 override_client_connection_id_length_ = kQuicDefaultConnectionIdLength;
1267 ASSERT_TRUE(Initialize());
1268 SendSynchronousFooRequestAndCheckResponse();
1269 EXPECT_EQ(override_client_connection_id_length_, client_->client()
1270 ->client_session()
1271 ->connection()
1272 ->client_connection_id()
1273 .length());
1274 }
1275
TEST_P(EndToEndTest,ForcedVersionNegotiationAndClientConnectionId)1276 TEST_P(EndToEndTest, ForcedVersionNegotiationAndClientConnectionId) {
1277 if (!version_.SupportsClientConnectionIds()) {
1278 ASSERT_TRUE(Initialize());
1279 return;
1280 }
1281 client_supported_versions_.insert(client_supported_versions_.begin(),
1282 QuicVersionReservedForNegotiation());
1283 override_client_connection_id_length_ = kQuicDefaultConnectionIdLength;
1284 ASSERT_TRUE(Initialize());
1285 ASSERT_TRUE(ServerSendsVersionNegotiation());
1286 SendSynchronousFooRequestAndCheckResponse();
1287 EXPECT_EQ(override_client_connection_id_length_, client_->client()
1288 ->client_session()
1289 ->connection()
1290 ->client_connection_id()
1291 .length());
1292 }
1293
TEST_P(EndToEndTest,ForcedVersionNegotiationAndBadConnectionIdLength)1294 TEST_P(EndToEndTest, ForcedVersionNegotiationAndBadConnectionIdLength) {
1295 if (!version_.AllowsVariableLengthConnectionIds() ||
1296 override_server_connection_id_length_ > -1) {
1297 ASSERT_TRUE(Initialize());
1298 return;
1299 }
1300 client_supported_versions_.insert(client_supported_versions_.begin(),
1301 QuicVersionReservedForNegotiation());
1302 override_server_connection_id_length_ = 9;
1303 ASSERT_TRUE(Initialize());
1304 ASSERT_TRUE(ServerSendsVersionNegotiation());
1305 SendSynchronousFooRequestAndCheckResponse();
1306 EXPECT_EQ(kQuicDefaultConnectionIdLength, client_->client()
1307 ->client_session()
1308 ->connection()
1309 ->connection_id()
1310 .length());
1311 }
1312
1313 // Forced Version Negotiation with a client connection ID and a long
1314 // connection ID.
TEST_P(EndToEndTest,ForcedVersNegoAndClientCIDAndLongCID)1315 TEST_P(EndToEndTest, ForcedVersNegoAndClientCIDAndLongCID) {
1316 if (!version_.SupportsClientConnectionIds() ||
1317 !version_.AllowsVariableLengthConnectionIds() ||
1318 override_server_connection_id_length_ != kLongConnectionIdLength) {
1319 ASSERT_TRUE(Initialize());
1320 return;
1321 }
1322 client_supported_versions_.insert(client_supported_versions_.begin(),
1323 QuicVersionReservedForNegotiation());
1324 override_client_connection_id_length_ = 18;
1325 ASSERT_TRUE(Initialize());
1326 ASSERT_TRUE(ServerSendsVersionNegotiation());
1327 SendSynchronousFooRequestAndCheckResponse();
1328 EXPECT_EQ(kQuicDefaultConnectionIdLength, client_->client()
1329 ->client_session()
1330 ->connection()
1331 ->connection_id()
1332 .length());
1333 EXPECT_EQ(override_client_connection_id_length_, client_->client()
1334 ->client_session()
1335 ->connection()
1336 ->client_connection_id()
1337 .length());
1338 }
1339
TEST_P(EndToEndTest,MixGoodAndBadConnectionIdLengths)1340 TEST_P(EndToEndTest, MixGoodAndBadConnectionIdLengths) {
1341 if (!version_.AllowsVariableLengthConnectionIds() ||
1342 override_server_connection_id_length_ > -1) {
1343 ASSERT_TRUE(Initialize());
1344 return;
1345 }
1346
1347 // Start client_ which will use a bad connection ID length.
1348 override_server_connection_id_length_ = 9;
1349 ASSERT_TRUE(Initialize());
1350 override_server_connection_id_length_ = -1;
1351
1352 // Start client2 which will use a good connection ID length.
1353 std::unique_ptr<QuicTestClient> client2(CreateQuicClient(nullptr));
1354 Http2HeaderBlock headers;
1355 headers[":method"] = "POST";
1356 headers[":path"] = "/foo";
1357 headers[":scheme"] = "https";
1358 headers[":authority"] = server_hostname_;
1359 headers["content-length"] = "3";
1360 client2->SendMessage(headers, "", /*fin=*/false);
1361 client2->SendData("eep", true);
1362
1363 SendSynchronousFooRequestAndCheckResponse();
1364 EXPECT_EQ(kQuicDefaultConnectionIdLength, client_->client()
1365 ->client_session()
1366 ->connection()
1367 ->connection_id()
1368 .length());
1369
1370 WaitForFooResponseAndCheckIt(client2.get());
1371 EXPECT_EQ(kQuicDefaultConnectionIdLength, client2->client()
1372 ->client_session()
1373 ->connection()
1374 ->connection_id()
1375 .length());
1376 }
1377
TEST_P(EndToEndTest,SimpleRequestResponseWithIetfDraftSupport)1378 TEST_P(EndToEndTest, SimpleRequestResponseWithIetfDraftSupport) {
1379 if (!version_.HasIetfQuicFrames()) {
1380 ASSERT_TRUE(Initialize());
1381 return;
1382 }
1383 QuicVersionInitializeSupportForIetfDraft();
1384 ASSERT_TRUE(Initialize());
1385
1386 SendSynchronousFooRequestAndCheckResponse();
1387 }
1388
TEST_P(EndToEndTest,SimpleRequestResponseWithLargeReject)1389 TEST_P(EndToEndTest, SimpleRequestResponseWithLargeReject) {
1390 chlo_multiplier_ = 1;
1391 ASSERT_TRUE(Initialize());
1392
1393 SendSynchronousFooRequestAndCheckResponse();
1394 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1395 if (version_.UsesTls()) {
1396 // REJ messages are a QUIC crypto feature, so TLS always returns false.
1397 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1398 } else {
1399 EXPECT_TRUE(client_->client()->ReceivedInchoateReject());
1400 }
1401 }
1402
TEST_P(EndToEndTest,SimpleRequestResponsev6)1403 TEST_P(EndToEndTest, SimpleRequestResponsev6) {
1404 server_address_ =
1405 QuicSocketAddress(QuicIpAddress::Loopback6(), server_address_.port());
1406 ASSERT_TRUE(Initialize());
1407
1408 SendSynchronousFooRequestAndCheckResponse();
1409 }
1410
TEST_P(EndToEndTest,ClientDoesNotAllowServerDataOnServerInitiatedBidirectionalStreams)1411 TEST_P(EndToEndTest,
1412 ClientDoesNotAllowServerDataOnServerInitiatedBidirectionalStreams) {
1413 set_client_initial_max_stream_data_incoming_bidirectional(0);
1414 ASSERT_TRUE(Initialize());
1415 SendSynchronousFooRequestAndCheckResponse();
1416 }
1417
TEST_P(EndToEndTest,ServerDoesNotAllowClientDataOnServerInitiatedBidirectionalStreams)1418 TEST_P(EndToEndTest,
1419 ServerDoesNotAllowClientDataOnServerInitiatedBidirectionalStreams) {
1420 set_server_initial_max_stream_data_outgoing_bidirectional(0);
1421 ASSERT_TRUE(Initialize());
1422 SendSynchronousFooRequestAndCheckResponse();
1423 }
1424
TEST_P(EndToEndTest,BothEndpointsDisallowDataOnServerInitiatedBidirectionalStreams)1425 TEST_P(EndToEndTest,
1426 BothEndpointsDisallowDataOnServerInitiatedBidirectionalStreams) {
1427 set_client_initial_max_stream_data_incoming_bidirectional(0);
1428 set_server_initial_max_stream_data_outgoing_bidirectional(0);
1429 ASSERT_TRUE(Initialize());
1430 SendSynchronousFooRequestAndCheckResponse();
1431 }
1432
1433 // Regression test for a bug where we would always fail to decrypt the first
1434 // initial packet. Undecryptable packets can be seen after the handshake
1435 // is complete due to dropping the initial keys at that point, so we only test
1436 // for undecryptable packets before then.
TEST_P(EndToEndTest,NoUndecryptablePacketsBeforeHandshakeComplete)1437 TEST_P(EndToEndTest, NoUndecryptablePacketsBeforeHandshakeComplete) {
1438 ASSERT_TRUE(Initialize());
1439
1440 SendSynchronousFooRequestAndCheckResponse();
1441
1442 QuicConnection* client_connection = GetClientConnection();
1443 ASSERT_TRUE(client_connection);
1444 QuicConnectionStats client_stats = client_connection->GetStats();
1445 EXPECT_EQ(
1446 0u,
1447 client_stats.undecryptable_packets_received_before_handshake_complete);
1448
1449 server_thread_->Pause();
1450 QuicConnection* server_connection = GetServerConnection();
1451 if (server_connection != nullptr) {
1452 QuicConnectionStats server_stats = server_connection->GetStats();
1453 EXPECT_EQ(
1454 0u,
1455 server_stats.undecryptable_packets_received_before_handshake_complete);
1456 } else {
1457 ADD_FAILURE() << "Missing server connection";
1458 }
1459 server_thread_->Resume();
1460 }
1461
TEST_P(EndToEndTest,SeparateFinPacket)1462 TEST_P(EndToEndTest, SeparateFinPacket) {
1463 ASSERT_TRUE(Initialize());
1464
1465 // Send a request in two parts: the request and then an empty packet with FIN.
1466 Http2HeaderBlock headers;
1467 headers[":method"] = "POST";
1468 headers[":path"] = "/foo";
1469 headers[":scheme"] = "https";
1470 headers[":authority"] = server_hostname_;
1471 client_->SendMessage(headers, "", /*fin=*/false);
1472 client_->SendData("", true);
1473 WaitForFooResponseAndCheckIt();
1474
1475 // Now do the same thing but with a content length.
1476 headers["content-length"] = "3";
1477 client_->SendMessage(headers, "", /*fin=*/false);
1478 client_->SendData("foo", true);
1479 WaitForFooResponseAndCheckIt();
1480 }
1481
TEST_P(EndToEndTest,MultipleRequestResponse)1482 TEST_P(EndToEndTest, MultipleRequestResponse) {
1483 ASSERT_TRUE(Initialize());
1484
1485 SendSynchronousFooRequestAndCheckResponse();
1486 SendSynchronousBarRequestAndCheckResponse();
1487 }
1488
TEST_P(EndToEndTest,MultipleRequestResponseZeroConnectionID)1489 TEST_P(EndToEndTest, MultipleRequestResponseZeroConnectionID) {
1490 if (!version_.AllowsVariableLengthConnectionIds() ||
1491 override_server_connection_id_length_ > -1) {
1492 ASSERT_TRUE(Initialize());
1493 return;
1494 }
1495 override_server_connection_id_length_ = 0;
1496 expected_server_connection_id_length_ = 0;
1497 ASSERT_TRUE(Initialize());
1498
1499 SendSynchronousFooRequestAndCheckResponse();
1500 SendSynchronousBarRequestAndCheckResponse();
1501 }
1502
TEST_P(EndToEndTest,MultipleStreams)1503 TEST_P(EndToEndTest, MultipleStreams) {
1504 // Verifies quic_test_client can track responses of all active streams.
1505 ASSERT_TRUE(Initialize());
1506
1507 const int kNumRequests = 10;
1508
1509 Http2HeaderBlock headers;
1510 headers[":method"] = "POST";
1511 headers[":path"] = "/foo";
1512 headers[":scheme"] = "https";
1513 headers[":authority"] = server_hostname_;
1514 headers["content-length"] = "3";
1515
1516 for (int i = 0; i < kNumRequests; ++i) {
1517 client_->SendMessage(headers, "bar", /*fin=*/true);
1518 }
1519
1520 while (kNumRequests > client_->num_responses()) {
1521 client_->ClearPerRequestState();
1522 ASSERT_TRUE(WaitForFooResponseAndCheckIt());
1523 }
1524 }
1525
TEST_P(EndToEndTest,MultipleClients)1526 TEST_P(EndToEndTest, MultipleClients) {
1527 ASSERT_TRUE(Initialize());
1528 std::unique_ptr<QuicTestClient> client2(CreateQuicClient(nullptr));
1529
1530 Http2HeaderBlock headers;
1531 headers[":method"] = "POST";
1532 headers[":path"] = "/foo";
1533 headers[":scheme"] = "https";
1534 headers[":authority"] = server_hostname_;
1535 headers["content-length"] = "3";
1536
1537 client_->SendMessage(headers, "", /*fin=*/false);
1538 client2->SendMessage(headers, "", /*fin=*/false);
1539
1540 client_->SendData("bar", true);
1541 WaitForFooResponseAndCheckIt();
1542
1543 client2->SendData("eep", true);
1544 WaitForFooResponseAndCheckIt(client2.get());
1545 }
1546
TEST_P(EndToEndTest,RequestOverMultiplePackets)1547 TEST_P(EndToEndTest, RequestOverMultiplePackets) {
1548 // Send a large enough request to guarantee fragmentation.
1549 std::string huge_request =
1550 "/some/path?query=" + std::string(kMaxOutgoingPacketSize, '.');
1551 AddToCache(huge_request, 200, kBarResponseBody);
1552
1553 ASSERT_TRUE(Initialize());
1554
1555 SendSynchronousRequestAndCheckResponse(huge_request, kBarResponseBody);
1556 }
1557
TEST_P(EndToEndTest,MultiplePacketsRandomOrder)1558 TEST_P(EndToEndTest, MultiplePacketsRandomOrder) {
1559 // Send a large enough request to guarantee fragmentation.
1560 std::string huge_request =
1561 "/some/path?query=" + std::string(kMaxOutgoingPacketSize, '.');
1562 AddToCache(huge_request, 200, kBarResponseBody);
1563
1564 ASSERT_TRUE(Initialize());
1565 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2));
1566 SetReorderPercentage(50);
1567
1568 SendSynchronousRequestAndCheckResponse(huge_request, kBarResponseBody);
1569 }
1570
TEST_P(EndToEndTest,PostMissingBytes)1571 TEST_P(EndToEndTest, PostMissingBytes) {
1572 ASSERT_TRUE(Initialize());
1573
1574 // Add a content length header with no body.
1575 Http2HeaderBlock headers;
1576 headers[":method"] = "POST";
1577 headers[":path"] = "/foo";
1578 headers[":scheme"] = "https";
1579 headers[":authority"] = server_hostname_;
1580 headers["content-length"] = "3";
1581
1582 // This should be detected as stream fin without complete request,
1583 // triggering an error response.
1584 client_->SendCustomSynchronousRequest(headers, "");
1585 EXPECT_EQ(QuicSimpleServerStream::kErrorResponseBody,
1586 client_->response_body());
1587 CheckResponseHeaders("500");
1588 }
1589
TEST_P(EndToEndTest,LargePostNoPacketLoss)1590 TEST_P(EndToEndTest, LargePostNoPacketLoss) {
1591 ASSERT_TRUE(Initialize());
1592
1593 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
1594
1595 // 1 MB body.
1596 std::string body(1024 * 1024, 'a');
1597 Http2HeaderBlock headers;
1598 headers[":method"] = "POST";
1599 headers[":path"] = "/foo";
1600 headers[":scheme"] = "https";
1601 headers[":authority"] = server_hostname_;
1602
1603 EXPECT_EQ(kFooResponseBody,
1604 client_->SendCustomSynchronousRequest(headers, body));
1605 // TODO(ianswett): There should not be packet loss in this test, but on some
1606 // platforms the receive buffer overflows.
1607 VerifyCleanConnection(true);
1608 }
1609
1610 // Marked as slow since this adds a real-clock one second of delay.
TEST_P(EndToEndTest,QUICHE_SLOW_TEST (LargePostNoPacketLoss1sRTT))1611 TEST_P(EndToEndTest, QUICHE_SLOW_TEST(LargePostNoPacketLoss1sRTT)) {
1612 ASSERT_TRUE(Initialize());
1613 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(1000));
1614
1615 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
1616
1617 // 100 KB body.
1618 std::string body(100 * 1024, 'a');
1619 Http2HeaderBlock headers;
1620 headers[":method"] = "POST";
1621 headers[":path"] = "/foo";
1622 headers[":scheme"] = "https";
1623 headers[":authority"] = server_hostname_;
1624
1625 EXPECT_EQ(kFooResponseBody,
1626 client_->SendCustomSynchronousRequest(headers, body));
1627 VerifyCleanConnection(false);
1628 }
1629
TEST_P(EndToEndTest,LargePostWithPacketLoss)1630 TEST_P(EndToEndTest, LargePostWithPacketLoss) {
1631 // Connect with lower fake packet loss than we'd like to test.
1632 // Until b/10126687 is fixed, losing handshake packets is pretty
1633 // brutal.
1634 // Disable blackhole detection as this test is testing loss recovery.
1635 client_extra_copts_.push_back(kNBHD);
1636 SetPacketLossPercentage(5);
1637 ASSERT_TRUE(Initialize());
1638 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
1639 SetPacketLossPercentage(30);
1640
1641 // 10 KB body.
1642 std::string body(1024 * 10, 'a');
1643 Http2HeaderBlock headers;
1644 headers[":method"] = "POST";
1645 headers[":path"] = "/foo";
1646 headers[":scheme"] = "https";
1647 headers[":authority"] = server_hostname_;
1648
1649 EXPECT_EQ(kFooResponseBody,
1650 client_->SendCustomSynchronousRequest(headers, body));
1651 if (override_server_connection_id_length_ == -1) {
1652 // If the client sends a longer connection ID, we can end up with dropped
1653 // packets. The packets_dropped counter increments whenever a packet arrives
1654 // with a new server connection ID that is not INITIAL, RETRY, or 1-RTT.
1655 // With packet losses, we could easily lose a server INITIAL and have the
1656 // first observed server packet be HANDSHAKE.
1657 VerifyCleanConnection(true);
1658 }
1659 }
1660
1661 // Regression test for b/80090281.
TEST_P(EndToEndTest,LargePostWithPacketLossAndAlwaysBundleWindowUpdates)1662 TEST_P(EndToEndTest, LargePostWithPacketLossAndAlwaysBundleWindowUpdates) {
1663 // Disable blackhole detection as this test is testing loss recovery.
1664 client_extra_copts_.push_back(kNBHD);
1665 ASSERT_TRUE(Initialize());
1666 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
1667 server_thread_->WaitForCryptoHandshakeConfirmed();
1668
1669 // Normally server only bundles a retransmittable frame once every other
1670 // kMaxConsecutiveNonRetransmittablePackets ack-only packets. Setting the max
1671 // to 0 to reliably reproduce b/80090281.
1672 server_thread_->Schedule([this]() {
1673 QuicConnection* server_connection = GetServerConnection();
1674 if (server_connection != nullptr) {
1675 QuicConnectionPeer::
1676 SetMaxConsecutiveNumPacketsWithNoRetransmittableFrames(
1677 server_connection, 0);
1678 } else {
1679 ADD_FAILURE() << "Missing server connection";
1680 }
1681 });
1682
1683 SetPacketLossPercentage(30);
1684
1685 // 10 KB body.
1686 std::string body(1024 * 10, 'a');
1687 Http2HeaderBlock headers;
1688 headers[":method"] = "POST";
1689 headers[":path"] = "/foo";
1690 headers[":scheme"] = "https";
1691 headers[":authority"] = server_hostname_;
1692
1693 EXPECT_EQ(kFooResponseBody,
1694 client_->SendCustomSynchronousRequest(headers, body));
1695 VerifyCleanConnection(true);
1696 }
1697
TEST_P(EndToEndTest,LargePostWithPacketLossAndBlockedSocket)1698 TEST_P(EndToEndTest, LargePostWithPacketLossAndBlockedSocket) {
1699 // Connect with lower fake packet loss than we'd like to test. Until
1700 // b/10126687 is fixed, losing handshake packets is pretty brutal.
1701 // Disable blackhole detection as this test is testing loss recovery.
1702 client_extra_copts_.push_back(kNBHD);
1703 SetPacketLossPercentage(5);
1704 ASSERT_TRUE(Initialize());
1705 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
1706 SetPacketLossPercentage(10);
1707 client_writer_->set_fake_blocked_socket_percentage(10);
1708
1709 // 10 KB body.
1710 std::string body(1024 * 10, 'a');
1711 Http2HeaderBlock headers;
1712 headers[":method"] = "POST";
1713 headers[":path"] = "/foo";
1714 headers[":scheme"] = "https";
1715 headers[":authority"] = server_hostname_;
1716
1717 EXPECT_EQ(kFooResponseBody,
1718 client_->SendCustomSynchronousRequest(headers, body));
1719 }
1720
TEST_P(EndToEndTest,LargePostNoPacketLossWithDelayAndReordering)1721 TEST_P(EndToEndTest, LargePostNoPacketLossWithDelayAndReordering) {
1722 ASSERT_TRUE(Initialize());
1723 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
1724 // Both of these must be called when the writer is not actively used.
1725 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2));
1726 SetReorderPercentage(30);
1727
1728 // 1 MB body.
1729 std::string body(1024 * 1024, 'a');
1730 Http2HeaderBlock headers;
1731 headers[":method"] = "POST";
1732 headers[":path"] = "/foo";
1733 headers[":scheme"] = "https";
1734 headers[":authority"] = server_hostname_;
1735
1736 EXPECT_EQ(kFooResponseBody,
1737 client_->SendCustomSynchronousRequest(headers, body));
1738 }
1739
1740 // TODO(b/214587920): make this test not rely on timeouts.
TEST_P(EndToEndTest,QUICHE_SLOW_TEST (AddressToken))1741 TEST_P(EndToEndTest, QUICHE_SLOW_TEST(AddressToken)) {
1742 client_config_.set_max_time_before_crypto_handshake(
1743 QuicTime::Delta::FromSeconds(3));
1744 client_config_.set_max_idle_time_before_crypto_handshake(
1745 QuicTime::Delta::FromSeconds(1));
1746
1747 client_extra_copts_.push_back(kTRTT);
1748 ASSERT_TRUE(Initialize());
1749 if (!version_.HasIetfQuicFrames()) {
1750 return;
1751 }
1752
1753 SendSynchronousFooRequestAndCheckResponse();
1754 QuicSpdyClientSession* client_session = GetClientSession();
1755 ASSERT_TRUE(client_session);
1756 EXPECT_FALSE(client_session->EarlyDataAccepted());
1757 EXPECT_FALSE(client_session->ReceivedInchoateReject());
1758 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1759 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1760
1761 client_->Disconnect();
1762
1763 // The 0-RTT handshake should succeed.
1764 client_->Connect();
1765 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
1766 ASSERT_TRUE(client_->client()->connected());
1767 SendSynchronousFooRequestAndCheckResponse();
1768
1769 client_session = GetClientSession();
1770 ASSERT_TRUE(client_session);
1771 EXPECT_TRUE(client_session->EarlyDataAccepted());
1772 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
1773
1774 server_thread_->Pause();
1775 QuicSpdySession* server_session = GetServerSession();
1776 QuicConnection* server_connection = GetServerConnection();
1777 if (server_session != nullptr && server_connection != nullptr) {
1778 // Verify address is validated via validating token received in INITIAL
1779 // packet.
1780 EXPECT_FALSE(
1781 server_connection->GetStats().address_validated_via_decrypting_packet);
1782 EXPECT_TRUE(server_connection->GetStats().address_validated_via_token);
1783
1784 // Verify the server received a cached min_rtt from the token and used it as
1785 // the initial rtt.
1786 const CachedNetworkParameters* server_received_network_params =
1787 static_cast<const QuicCryptoServerStreamBase*>(
1788 server_session->GetCryptoStream())
1789 ->PreviousCachedNetworkParams();
1790
1791 ASSERT_NE(server_received_network_params, nullptr);
1792 // QuicSentPacketManager::SetInitialRtt clamps the initial_rtt to between
1793 // [min_initial_rtt, max_initial_rtt].
1794 const QuicTime::Delta min_initial_rtt =
1795 QuicTime::Delta::FromMicroseconds(kMinTrustedInitialRoundTripTimeUs);
1796 const QuicTime::Delta max_initial_rtt =
1797 QuicTime::Delta::FromMicroseconds(kMaxInitialRoundTripTimeUs);
1798 const QuicTime::Delta expected_initial_rtt =
1799 std::max(min_initial_rtt,
1800 std::min(max_initial_rtt,
1801 QuicTime::Delta::FromMilliseconds(
1802 server_received_network_params->min_rtt_ms())));
1803 EXPECT_EQ(
1804 server_connection->sent_packet_manager().GetRttStats()->initial_rtt(),
1805 expected_initial_rtt);
1806 } else {
1807 ADD_FAILURE() << "Missing server connection";
1808 }
1809
1810 server_thread_->Resume();
1811
1812 client_->Disconnect();
1813
1814 // Regression test for b/206087883.
1815 // Mock server crash.
1816 StopServer();
1817
1818 // The handshake fails due to idle timeout.
1819 client_->Connect();
1820 ASSERT_FALSE(client_->client()->WaitForOneRttKeysAvailable());
1821 client_->WaitForWriteToFlush();
1822 client_->WaitForResponse();
1823 ASSERT_FALSE(client_->client()->connected());
1824 EXPECT_THAT(client_->connection_error(), IsError(QUIC_NETWORK_IDLE_TIMEOUT));
1825
1826 // Server restarts.
1827 server_writer_ = new PacketDroppingTestWriter();
1828 StartServer();
1829
1830 // Client re-connect.
1831 client_->Connect();
1832 ASSERT_TRUE(client_->client()->WaitForHandshakeConfirmed());
1833 client_->WaitForWriteToFlush();
1834 client_->WaitForResponse();
1835 ASSERT_TRUE(client_->client()->connected());
1836 client_session = GetClientSession();
1837 ASSERT_TRUE(client_session);
1838 EXPECT_FALSE(client_session->EarlyDataAccepted());
1839 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1840 server_thread_->Pause();
1841 server_session = GetServerSession();
1842 server_connection = GetServerConnection();
1843 // Verify address token is only used once.
1844 if (server_session != nullptr && server_connection != nullptr) {
1845 // Verify address is validated via decrypting packet.
1846 EXPECT_TRUE(
1847 server_connection->GetStats().address_validated_via_decrypting_packet);
1848 EXPECT_FALSE(server_connection->GetStats().address_validated_via_token);
1849 } else {
1850 ADD_FAILURE() << "Missing server connection";
1851 }
1852 server_thread_->Resume();
1853
1854 client_->Disconnect();
1855 }
1856
1857 // Verify that client does not reuse a source address token.
1858 // TODO(b/214587920): make this test not rely on timeouts.
TEST_P(EndToEndTest,QUICHE_SLOW_TEST (AddressTokenNotReusedByClient))1859 TEST_P(EndToEndTest, QUICHE_SLOW_TEST(AddressTokenNotReusedByClient)) {
1860 client_config_.set_max_time_before_crypto_handshake(
1861 QuicTime::Delta::FromSeconds(3));
1862 client_config_.set_max_idle_time_before_crypto_handshake(
1863 QuicTime::Delta::FromSeconds(1));
1864
1865 ASSERT_TRUE(Initialize());
1866 if (!version_.HasIetfQuicFrames()) {
1867 return;
1868 }
1869
1870 QuicCryptoClientConfig* client_crypto_config =
1871 client_->client()->crypto_config();
1872 QuicServerId server_id = client_->client()->server_id();
1873
1874 SendSynchronousFooRequestAndCheckResponse();
1875 EXPECT_FALSE(GetClientSession()->EarlyDataAccepted());
1876
1877 client_->Disconnect();
1878
1879 QuicClientSessionCache* session_cache = static_cast<QuicClientSessionCache*>(
1880 client_crypto_config->mutable_session_cache());
1881 ASSERT_TRUE(
1882 !QuicClientSessionCachePeer::GetToken(session_cache, server_id).empty());
1883
1884 // Pause the server thread again to blackhole packets from client.
1885 server_thread_->Pause();
1886 client_->Connect();
1887 EXPECT_FALSE(client_->client()->WaitForOneRttKeysAvailable());
1888 EXPECT_FALSE(client_->client()->connected());
1889
1890 // Verify address token gets cleared.
1891 ASSERT_TRUE(
1892 QuicClientSessionCachePeer::GetToken(session_cache, server_id).empty());
1893 server_thread_->Resume();
1894 }
1895
TEST_P(EndToEndTest,LargePostZeroRTTFailure)1896 TEST_P(EndToEndTest, LargePostZeroRTTFailure) {
1897 // Send a request and then disconnect. This prepares the client to attempt
1898 // a 0-RTT handshake for the next request.
1899 ASSERT_TRUE(Initialize());
1900
1901 std::string body(20480, 'a');
1902 Http2HeaderBlock headers;
1903 headers[":method"] = "POST";
1904 headers[":path"] = "/foo";
1905 headers[":scheme"] = "https";
1906 headers[":authority"] = server_hostname_;
1907
1908 EXPECT_EQ(kFooResponseBody,
1909 client_->SendCustomSynchronousRequest(headers, body));
1910 QuicSpdyClientSession* client_session = GetClientSession();
1911 ASSERT_TRUE(client_session);
1912 EXPECT_FALSE(client_session->EarlyDataAccepted());
1913 EXPECT_FALSE(client_session->ReceivedInchoateReject());
1914 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1915 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1916
1917 client_->Disconnect();
1918
1919 // The 0-RTT handshake should succeed.
1920 client_->Connect();
1921 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
1922 ASSERT_TRUE(client_->client()->connected());
1923 EXPECT_EQ(kFooResponseBody,
1924 client_->SendCustomSynchronousRequest(headers, body));
1925
1926 client_session = GetClientSession();
1927 ASSERT_TRUE(client_session);
1928 EXPECT_TRUE(client_session->EarlyDataAccepted());
1929 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
1930
1931 client_->Disconnect();
1932
1933 // Restart the server so that the 0-RTT handshake will take 1 RTT.
1934 StopServer();
1935 server_writer_ = new PacketDroppingTestWriter();
1936 StartServer();
1937
1938 client_->Connect();
1939 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
1940 ASSERT_TRUE(client_->client()->connected());
1941 EXPECT_EQ(kFooResponseBody,
1942 client_->SendCustomSynchronousRequest(headers, body));
1943 client_session = GetClientSession();
1944 ASSERT_TRUE(client_session);
1945 EXPECT_FALSE(client_session->EarlyDataAccepted());
1946 EXPECT_FALSE(client_session->ReceivedInchoateReject());
1947 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1948 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1949 VerifyCleanConnection(false);
1950 }
1951
1952 // Regression test for b/168020146.
TEST_P(EndToEndTest,MultipleZeroRtt)1953 TEST_P(EndToEndTest, MultipleZeroRtt) {
1954 ASSERT_TRUE(Initialize());
1955
1956 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
1957 QuicSpdyClientSession* client_session = GetClientSession();
1958 ASSERT_TRUE(client_session);
1959 EXPECT_FALSE(client_session->EarlyDataAccepted());
1960 EXPECT_FALSE(client_session->ReceivedInchoateReject());
1961 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
1962 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
1963
1964 client_->Disconnect();
1965
1966 // The 0-RTT handshake should succeed.
1967 client_->Connect();
1968 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
1969 ASSERT_TRUE(client_->client()->connected());
1970 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
1971
1972 client_session = GetClientSession();
1973 ASSERT_TRUE(client_session);
1974 EXPECT_TRUE(client_session->EarlyDataAccepted());
1975 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
1976
1977 client_->Disconnect();
1978
1979 client_->Connect();
1980 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
1981 ASSERT_TRUE(client_->client()->connected());
1982 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
1983
1984 client_session = GetClientSession();
1985 ASSERT_TRUE(client_session);
1986 EXPECT_TRUE(client_session->EarlyDataAccepted());
1987 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
1988
1989 client_->Disconnect();
1990 }
1991
TEST_P(EndToEndTest,SynchronousRequestZeroRTTFailure)1992 TEST_P(EndToEndTest, SynchronousRequestZeroRTTFailure) {
1993 // Send a request and then disconnect. This prepares the client to attempt
1994 // a 0-RTT handshake for the next request.
1995 ASSERT_TRUE(Initialize());
1996
1997 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
1998 QuicSpdyClientSession* client_session = GetClientSession();
1999 ASSERT_TRUE(client_session);
2000 EXPECT_FALSE(client_session->EarlyDataAccepted());
2001 EXPECT_FALSE(client_session->ReceivedInchoateReject());
2002 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2003 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
2004
2005 client_->Disconnect();
2006
2007 // The 0-RTT handshake should succeed.
2008 client_->Connect();
2009 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2010 ASSERT_TRUE(client_->client()->connected());
2011 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
2012
2013 client_session = GetClientSession();
2014 ASSERT_TRUE(client_session);
2015 EXPECT_TRUE(client_session->EarlyDataAccepted());
2016 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
2017
2018 client_->Disconnect();
2019
2020 // Restart the server so that the 0-RTT handshake will take 1 RTT.
2021 StopServer();
2022 server_writer_ = new PacketDroppingTestWriter();
2023 StartServer();
2024
2025 client_->Connect();
2026 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2027 ASSERT_TRUE(client_->client()->connected());
2028 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
2029
2030 client_session = GetClientSession();
2031 ASSERT_TRUE(client_session);
2032 EXPECT_FALSE(client_session->EarlyDataAccepted());
2033 EXPECT_FALSE(client_session->ReceivedInchoateReject());
2034 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2035 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
2036
2037 VerifyCleanConnection(false);
2038 }
2039
TEST_P(EndToEndTest,LargePostSynchronousRequest)2040 TEST_P(EndToEndTest, LargePostSynchronousRequest) {
2041 // Send a request and then disconnect. This prepares the client to attempt
2042 // a 0-RTT handshake for the next request.
2043 ASSERT_TRUE(Initialize());
2044
2045 std::string body(20480, 'a');
2046 Http2HeaderBlock headers;
2047 headers[":method"] = "POST";
2048 headers[":path"] = "/foo";
2049 headers[":scheme"] = "https";
2050 headers[":authority"] = server_hostname_;
2051
2052 EXPECT_EQ(kFooResponseBody,
2053 client_->SendCustomSynchronousRequest(headers, body));
2054 QuicSpdyClientSession* client_session = GetClientSession();
2055 ASSERT_TRUE(client_session);
2056 EXPECT_FALSE(client_session->EarlyDataAccepted());
2057 EXPECT_FALSE(client_session->ReceivedInchoateReject());
2058 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2059 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
2060
2061 client_->Disconnect();
2062
2063 // The 0-RTT handshake should succeed.
2064 client_->Connect();
2065 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2066 ASSERT_TRUE(client_->client()->connected());
2067 EXPECT_EQ(kFooResponseBody,
2068 client_->SendCustomSynchronousRequest(headers, body));
2069
2070 client_session = GetClientSession();
2071 ASSERT_TRUE(client_session);
2072 EXPECT_TRUE(client_session->EarlyDataAccepted());
2073 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
2074
2075 client_->Disconnect();
2076
2077 // Restart the server so that the 0-RTT handshake will take 1 RTT.
2078 StopServer();
2079 server_writer_ = new PacketDroppingTestWriter();
2080 StartServer();
2081
2082 client_->Connect();
2083 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2084 ASSERT_TRUE(client_->client()->connected());
2085 EXPECT_EQ(kFooResponseBody,
2086 client_->SendCustomSynchronousRequest(headers, body));
2087
2088 client_session = GetClientSession();
2089 ASSERT_TRUE(client_session);
2090 EXPECT_FALSE(client_session->EarlyDataAccepted());
2091 EXPECT_FALSE(client_session->ReceivedInchoateReject());
2092 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2093 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
2094
2095 VerifyCleanConnection(false);
2096 }
2097
TEST_P(EndToEndTest,DisableResumption)2098 TEST_P(EndToEndTest, DisableResumption) {
2099 client_extra_copts_.push_back(kNRES);
2100 ASSERT_TRUE(Initialize());
2101 if (!version_.UsesTls()) {
2102 return;
2103 }
2104 SendSynchronousFooRequestAndCheckResponse();
2105 QuicSpdyClientSession* client_session = GetClientSession();
2106 ASSERT_TRUE(client_session);
2107 EXPECT_EQ(client_session->GetCryptoStream()->EarlyDataReason(),
2108 ssl_early_data_no_session_offered);
2109 client_->Disconnect();
2110
2111 SendSynchronousFooRequestAndCheckResponse();
2112 client_session = GetClientSession();
2113 ASSERT_TRUE(client_session);
2114 if (GetQuicReloadableFlag(quic_enable_disable_resumption)) {
2115 EXPECT_EQ(client_session->GetCryptoStream()->EarlyDataReason(),
2116 ssl_early_data_session_not_resumed);
2117 } else {
2118 EXPECT_EQ(client_session->GetCryptoStream()->EarlyDataReason(),
2119 ssl_early_data_accepted);
2120 }
2121 }
2122
2123 // This is a regression test for b/162595387
TEST_P(EndToEndTest,PostZeroRTTRequestDuringHandshake)2124 TEST_P(EndToEndTest, PostZeroRTTRequestDuringHandshake) {
2125 if (!version_.UsesTls()) {
2126 // This test is TLS specific.
2127 ASSERT_TRUE(Initialize());
2128 return;
2129 }
2130 // Send a request and then disconnect. This prepares the client to attempt
2131 // a 0-RTT handshake for the next request.
2132 NiceMock<MockQuicConnectionDebugVisitor> visitor;
2133 connection_debug_visitor_ = &visitor;
2134 ASSERT_TRUE(Initialize());
2135
2136 SendSynchronousFooRequestAndCheckResponse();
2137 QuicSpdyClientSession* client_session = GetClientSession();
2138 ASSERT_TRUE(client_session);
2139 EXPECT_FALSE(client_session->EarlyDataAccepted());
2140 EXPECT_FALSE(client_session->ReceivedInchoateReject());
2141 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2142 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
2143
2144 client_->Disconnect();
2145
2146 // The 0-RTT handshake should succeed.
2147 ON_CALL(visitor, OnCryptoFrame(_))
2148 .WillByDefault(Invoke([this](const QuicCryptoFrame& frame) {
2149 if (frame.level != ENCRYPTION_HANDSHAKE) {
2150 return;
2151 }
2152 // At this point in the handshake, the client should have derived
2153 // ENCRYPTION_ZERO_RTT keys (thus set encryption_established). It
2154 // should also have set ENCRYPTION_HANDSHAKE keys after receiving
2155 // the server's ENCRYPTION_INITIAL flight.
2156 EXPECT_TRUE(
2157 GetClientSession()->GetCryptoStream()->encryption_established());
2158 EXPECT_TRUE(
2159 GetClientConnection()->framer().HasEncrypterOfEncryptionLevel(
2160 ENCRYPTION_HANDSHAKE));
2161 Http2HeaderBlock headers;
2162 headers[":method"] = "POST";
2163 headers[":path"] = "/foo";
2164 headers[":scheme"] = "https";
2165 headers[":authority"] = server_hostname_;
2166 EXPECT_GT(
2167 client_->SendMessage(headers, "", /*fin*/ true, /*flush*/ false),
2168 0);
2169 }));
2170 client_->Connect();
2171 ASSERT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2172 client_->WaitForWriteToFlush();
2173 client_->WaitForResponse();
2174 ASSERT_TRUE(client_->client()->connected());
2175 EXPECT_EQ(kFooResponseBody, client_->response_body());
2176
2177 client_session = GetClientSession();
2178 ASSERT_TRUE(client_session);
2179 EXPECT_TRUE(client_session->EarlyDataAccepted());
2180 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
2181 }
2182
2183 // Regression test for b/166836136.
TEST_P(EndToEndTest,RetransmissionAfterZeroRTTRejectBeforeOneRtt)2184 TEST_P(EndToEndTest, RetransmissionAfterZeroRTTRejectBeforeOneRtt) {
2185 if (!version_.UsesTls()) {
2186 // This test is TLS specific.
2187 ASSERT_TRUE(Initialize());
2188 return;
2189 }
2190 // Send a request and then disconnect. This prepares the client to attempt
2191 // a 0-RTT handshake for the next request.
2192 NiceMock<MockQuicConnectionDebugVisitor> visitor;
2193 connection_debug_visitor_ = &visitor;
2194 ASSERT_TRUE(Initialize());
2195
2196 SendSynchronousFooRequestAndCheckResponse();
2197 QuicSpdyClientSession* client_session = GetClientSession();
2198 ASSERT_TRUE(client_session);
2199 EXPECT_FALSE(client_session->EarlyDataAccepted());
2200 EXPECT_FALSE(client_session->ReceivedInchoateReject());
2201 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2202 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
2203
2204 client_->Disconnect();
2205
2206 client_->Connect();
2207 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2208 ASSERT_TRUE(client_->client()->connected());
2209 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
2210
2211 client_session = GetClientSession();
2212 ASSERT_TRUE(client_session);
2213 EXPECT_TRUE(client_session->EarlyDataAccepted());
2214 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
2215
2216 client_->Disconnect();
2217
2218 // Restart the server so that the 0-RTT handshake will take 1 RTT.
2219 StopServer();
2220 server_writer_ = new PacketDroppingTestWriter();
2221 StartServer();
2222
2223 ON_CALL(visitor, OnZeroRttRejected(_)).WillByDefault(Invoke([this]() {
2224 EXPECT_FALSE(GetClientSession()->IsEncryptionEstablished());
2225 }));
2226
2227 // The 0-RTT handshake should fail.
2228 client_->Connect();
2229 ASSERT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2230 client_->WaitForWriteToFlush();
2231 client_->WaitForResponse();
2232 ASSERT_TRUE(client_->client()->connected());
2233
2234 client_session = GetClientSession();
2235 ASSERT_TRUE(client_session);
2236 EXPECT_FALSE(client_session->EarlyDataAccepted());
2237 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2238 }
2239
TEST_P(EndToEndTest,RejectWithPacketLoss)2240 TEST_P(EndToEndTest, RejectWithPacketLoss) {
2241 // In this test, we intentionally drop the first packet from the
2242 // server, which corresponds with the initial REJ response from
2243 // the server.
2244 server_writer_->set_fake_drop_first_n_packets(1);
2245 ASSERT_TRUE(Initialize());
2246 }
2247
TEST_P(EndToEndTest,SetInitialReceivedConnectionOptions)2248 TEST_P(EndToEndTest, SetInitialReceivedConnectionOptions) {
2249 QuicTagVector initial_received_options;
2250 initial_received_options.push_back(kTBBR);
2251 initial_received_options.push_back(kIW10);
2252 initial_received_options.push_back(kPRST);
2253 EXPECT_TRUE(server_config_.SetInitialReceivedConnectionOptions(
2254 initial_received_options));
2255
2256 ASSERT_TRUE(Initialize());
2257 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2258 server_thread_->WaitForCryptoHandshakeConfirmed();
2259
2260 EXPECT_FALSE(server_config_.SetInitialReceivedConnectionOptions(
2261 initial_received_options));
2262
2263 // Verify that server's configuration is correct.
2264 server_thread_->Pause();
2265 EXPECT_TRUE(server_config_.HasReceivedConnectionOptions());
2266 EXPECT_TRUE(
2267 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kTBBR));
2268 EXPECT_TRUE(
2269 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kIW10));
2270 EXPECT_TRUE(
2271 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kPRST));
2272 }
2273
TEST_P(EndToEndTest,LargePostSmallBandwidthLargeBuffer)2274 TEST_P(EndToEndTest, LargePostSmallBandwidthLargeBuffer) {
2275 ASSERT_TRUE(Initialize());
2276 SetPacketSendDelay(QuicTime::Delta::FromMicroseconds(1));
2277 // 256KB per second with a 256KB buffer from server to client. Wireless
2278 // clients commonly have larger buffers, but our max CWND is 200.
2279 server_writer_->set_max_bandwidth_and_buffer_size(
2280 QuicBandwidth::FromBytesPerSecond(256 * 1024), 256 * 1024);
2281
2282 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2283
2284 // 1 MB body.
2285 std::string body(1024 * 1024, 'a');
2286 Http2HeaderBlock headers;
2287 headers[":method"] = "POST";
2288 headers[":path"] = "/foo";
2289 headers[":scheme"] = "https";
2290 headers[":authority"] = server_hostname_;
2291
2292 EXPECT_EQ(kFooResponseBody,
2293 client_->SendCustomSynchronousRequest(headers, body));
2294 // This connection may drop packets, because the buffer is smaller than the
2295 // max CWND.
2296 VerifyCleanConnection(true);
2297 }
2298
TEST_P(EndToEndTest,DoNotSetSendAlarmIfConnectionFlowControlBlocked)2299 TEST_P(EndToEndTest, DoNotSetSendAlarmIfConnectionFlowControlBlocked) {
2300 // Regression test for b/14677858.
2301 // Test that the resume write alarm is not set in QuicConnection::OnCanWrite
2302 // if currently connection level flow control blocked. If set, this results in
2303 // an infinite loop in the EventLoop, as the alarm fires and is immediately
2304 // rescheduled.
2305 ASSERT_TRUE(Initialize());
2306 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2307
2308 // Ensure both stream and connection level are flow control blocked by setting
2309 // the send window offset to 0.
2310 const uint64_t flow_control_window =
2311 server_config_.GetInitialStreamFlowControlWindowToSend();
2312 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
2313 QuicSession* session = GetClientSession();
2314 ASSERT_TRUE(session);
2315 QuicStreamPeer::SetSendWindowOffset(stream, 0);
2316 QuicFlowControllerPeer::SetSendWindowOffset(session->flow_controller(), 0);
2317 EXPECT_TRUE(stream->IsFlowControlBlocked());
2318 EXPECT_TRUE(session->flow_controller()->IsBlocked());
2319
2320 // Make sure that the stream has data pending so that it will be marked as
2321 // write blocked when it receives a stream level WINDOW_UPDATE.
2322 stream->WriteOrBufferBody("hello", false);
2323
2324 // The stream now attempts to write, fails because it is still connection
2325 // level flow control blocked, and is added to the write blocked list.
2326 QuicWindowUpdateFrame window_update(kInvalidControlFrameId, stream->id(),
2327 2 * flow_control_window);
2328 stream->OnWindowUpdateFrame(window_update);
2329
2330 // Prior to fixing b/14677858 this call would result in an infinite loop in
2331 // Chromium. As a proxy for detecting this, we now check whether the
2332 // send alarm is set after OnCanWrite. It should not be, as the
2333 // connection is still flow control blocked.
2334 session->connection()->OnCanWrite();
2335
2336 QuicAlarm* send_alarm =
2337 QuicConnectionPeer::GetSendAlarm(session->connection());
2338 EXPECT_FALSE(send_alarm->IsSet());
2339 }
2340
TEST_P(EndToEndTest,InvalidStream)2341 TEST_P(EndToEndTest, InvalidStream) {
2342 ASSERT_TRUE(Initialize());
2343 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2344
2345 std::string body(kMaxOutgoingPacketSize, 'a');
2346 Http2HeaderBlock headers;
2347 headers[":method"] = "POST";
2348 headers[":path"] = "/foo";
2349 headers[":scheme"] = "https";
2350 headers[":authority"] = server_hostname_;
2351
2352 // Force the client to write with a stream ID belonging to a nonexistent
2353 // server-side stream.
2354 QuicSpdySession* session = GetClientSession();
2355 ASSERT_TRUE(session);
2356 QuicSessionPeer::SetNextOutgoingBidirectionalStreamId(
2357 session, GetNthServerInitiatedBidirectionalId(0));
2358
2359 client_->SendCustomSynchronousRequest(headers, body);
2360 EXPECT_THAT(client_->stream_error(),
2361 IsStreamError(QUIC_STREAM_CONNECTION_ERROR));
2362 EXPECT_THAT(client_->connection_error(), IsError(QUIC_INVALID_STREAM_ID));
2363 }
2364
2365 // Test that the server resets the stream if the client sends a request
2366 // with overly large headers.
TEST_P(EndToEndTest,LargeHeaders)2367 TEST_P(EndToEndTest, LargeHeaders) {
2368 ASSERT_TRUE(Initialize());
2369 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2370
2371 std::string body(kMaxOutgoingPacketSize, 'a');
2372 Http2HeaderBlock headers;
2373 headers[":method"] = "POST";
2374 headers[":path"] = "/foo";
2375 headers[":scheme"] = "https";
2376 headers[":authority"] = server_hostname_;
2377 headers["key1"] = std::string(15 * 1024, 'a');
2378 headers["key2"] = std::string(15 * 1024, 'a');
2379 headers["key3"] = std::string(15 * 1024, 'a');
2380
2381 client_->SendCustomSynchronousRequest(headers, body);
2382
2383 if (version_.UsesHttp3()) {
2384 // QuicSpdyStream::OnHeadersTooLarge() resets the stream with
2385 // QUIC_HEADERS_TOO_LARGE. This is sent as H3_EXCESSIVE_LOAD, the closest
2386 // HTTP/3 error code, and translated back to QUIC_STREAM_EXCESSIVE_LOAD on
2387 // the receiving side.
2388 EXPECT_THAT(client_->stream_error(),
2389 IsStreamError(QUIC_STREAM_EXCESSIVE_LOAD));
2390 } else {
2391 EXPECT_THAT(client_->stream_error(), IsStreamError(QUIC_HEADERS_TOO_LARGE));
2392 }
2393 EXPECT_THAT(client_->connection_error(), IsQuicNoError());
2394 }
2395
TEST_P(EndToEndTest,EarlyResponseWithQuicStreamNoError)2396 TEST_P(EndToEndTest, EarlyResponseWithQuicStreamNoError) {
2397 ASSERT_TRUE(Initialize());
2398 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2399
2400 std::string large_body(1024 * 1024, 'a');
2401 Http2HeaderBlock headers;
2402 headers[":method"] = "POST";
2403 headers[":path"] = "/foo";
2404 headers[":scheme"] = "https";
2405 headers[":authority"] = server_hostname_;
2406 // Insert an invalid content_length field in request to trigger an early
2407 // response from server.
2408 headers["content-length"] = "-3";
2409
2410 client_->SendCustomSynchronousRequest(headers, large_body);
2411 EXPECT_EQ("bad", client_->response_body());
2412 CheckResponseHeaders("500");
2413 EXPECT_THAT(client_->stream_error(), IsQuicStreamNoError());
2414 EXPECT_THAT(client_->connection_error(), IsQuicNoError());
2415 }
2416
2417 // TODO(rch): this test seems to cause net_unittests timeouts :|
TEST_P(EndToEndTest,QUIC_TEST_DISABLED_IN_CHROME (MultipleTermination))2418 TEST_P(EndToEndTest, QUIC_TEST_DISABLED_IN_CHROME(MultipleTermination)) {
2419 ASSERT_TRUE(Initialize());
2420
2421 // Set the offset so we won't frame. Otherwise when we pick up termination
2422 // before HTTP framing is complete, we send an error and close the stream,
2423 // and the second write is picked up as writing on a closed stream.
2424 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
2425 ASSERT_TRUE(stream != nullptr);
2426 QuicStreamPeer::SetStreamBytesWritten(3, stream);
2427
2428 client_->SendData("bar", true);
2429 client_->WaitForWriteToFlush();
2430
2431 // By default the stream protects itself from writes after terminte is set.
2432 // Override this to test the server handling buggy clients.
2433 QuicStreamPeer::SetWriteSideClosed(false, client_->GetOrCreateStream());
2434
2435 EXPECT_QUIC_BUG(client_->SendData("eep", true), "Fin already buffered");
2436 }
2437
TEST_P(EndToEndTest,Timeout)2438 TEST_P(EndToEndTest, Timeout) {
2439 client_config_.SetIdleNetworkTimeout(QuicTime::Delta::FromMicroseconds(500));
2440 // Note: we do NOT ASSERT_TRUE: we may time out during initial handshake:
2441 // that's enough to validate timeout in this case.
2442 Initialize();
2443 while (client_->client()->connected()) {
2444 client_->client()->WaitForEvents();
2445 }
2446 }
2447
TEST_P(EndToEndTest,MaxDynamicStreamsLimitRespected)2448 TEST_P(EndToEndTest, MaxDynamicStreamsLimitRespected) {
2449 // Set a limit on maximum number of incoming dynamic streams.
2450 // Make sure the limit is respected by the peer.
2451 const uint32_t kServerMaxDynamicStreams = 1;
2452 server_config_.SetMaxBidirectionalStreamsToSend(kServerMaxDynamicStreams);
2453 ASSERT_TRUE(Initialize());
2454 if (version_.HasIetfQuicFrames()) {
2455 // Do not run this test for /IETF QUIC. This test relies on the fact that
2456 // Google QUIC allows a small number of additional streams beyond the
2457 // negotiated limit, which is not supported in IETF QUIC. Note that the test
2458 // needs to be here, after calling Initialize(), because all tests end up
2459 // calling EndToEndTest::TearDown(), which asserts that Initialize has been
2460 // called and then proceeds to tear things down -- which fails if they are
2461 // not properly set up.
2462 return;
2463 }
2464 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2465
2466 // Make the client misbehave after negotiation.
2467 const int kServerMaxStreams = kMaxStreamsMinimumIncrement + 1;
2468 QuicSpdyClientSession* client_session = GetClientSession();
2469 ASSERT_TRUE(client_session);
2470 QuicSessionPeer::SetMaxOpenOutgoingStreams(client_session,
2471 kServerMaxStreams + 1);
2472
2473 Http2HeaderBlock headers;
2474 headers[":method"] = "POST";
2475 headers[":path"] = "/foo";
2476 headers[":scheme"] = "https";
2477 headers[":authority"] = server_hostname_;
2478 headers["content-length"] = "3";
2479
2480 // The server supports a small number of additional streams beyond the
2481 // negotiated limit. Open enough streams to go beyond that limit.
2482 for (int i = 0; i < kServerMaxStreams + 1; ++i) {
2483 client_->SendMessage(headers, "", /*fin=*/false);
2484 }
2485 client_->WaitForResponse();
2486
2487 EXPECT_TRUE(client_->connected());
2488 EXPECT_THAT(client_->stream_error(), IsStreamError(QUIC_REFUSED_STREAM));
2489 EXPECT_THAT(client_->connection_error(), IsQuicNoError());
2490 }
2491
TEST_P(EndToEndTest,SetIndependentMaxDynamicStreamsLimits)2492 TEST_P(EndToEndTest, SetIndependentMaxDynamicStreamsLimits) {
2493 // Each endpoint can set max dynamic streams independently.
2494 const uint32_t kClientMaxDynamicStreams = 4;
2495 const uint32_t kServerMaxDynamicStreams = 3;
2496 client_config_.SetMaxBidirectionalStreamsToSend(kClientMaxDynamicStreams);
2497 server_config_.SetMaxBidirectionalStreamsToSend(kServerMaxDynamicStreams);
2498 client_config_.SetMaxUnidirectionalStreamsToSend(kClientMaxDynamicStreams);
2499 server_config_.SetMaxUnidirectionalStreamsToSend(kServerMaxDynamicStreams);
2500
2501 ASSERT_TRUE(Initialize());
2502 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2503
2504 // The client has received the server's limit and vice versa.
2505 QuicSpdyClientSession* client_session = GetClientSession();
2506 ASSERT_TRUE(client_session);
2507 // The value returned by max_allowed... includes the Crypto and Header
2508 // stream (created as a part of initialization). The config. values,
2509 // above, are treated as "number of requests/responses" - that is, they do
2510 // not include the static Crypto and Header streams. Reduce the value
2511 // returned by max_allowed... by 2 to remove the static streams from the
2512 // count.
2513 size_t client_max_open_outgoing_bidirectional_streams =
2514 version_.HasIetfQuicFrames()
2515 ? QuicSessionPeer::ietf_streamid_manager(client_session)
2516 ->max_outgoing_bidirectional_streams()
2517 : QuicSessionPeer::GetStreamIdManager(client_session)
2518 ->max_open_outgoing_streams();
2519 size_t client_max_open_outgoing_unidirectional_streams =
2520 version_.HasIetfQuicFrames()
2521 ? QuicSessionPeer::ietf_streamid_manager(client_session)
2522 ->max_outgoing_unidirectional_streams() -
2523 kHttp3StaticUnidirectionalStreamCount
2524 : QuicSessionPeer::GetStreamIdManager(client_session)
2525 ->max_open_outgoing_streams();
2526 EXPECT_EQ(kServerMaxDynamicStreams,
2527 client_max_open_outgoing_bidirectional_streams);
2528 EXPECT_EQ(kServerMaxDynamicStreams,
2529 client_max_open_outgoing_unidirectional_streams);
2530 server_thread_->Pause();
2531 QuicSession* server_session = GetServerSession();
2532 if (server_session != nullptr) {
2533 size_t server_max_open_outgoing_bidirectional_streams =
2534 version_.HasIetfQuicFrames()
2535 ? QuicSessionPeer::ietf_streamid_manager(server_session)
2536 ->max_outgoing_bidirectional_streams()
2537 : QuicSessionPeer::GetStreamIdManager(server_session)
2538 ->max_open_outgoing_streams();
2539 size_t server_max_open_outgoing_unidirectional_streams =
2540 version_.HasIetfQuicFrames()
2541 ? QuicSessionPeer::ietf_streamid_manager(server_session)
2542 ->max_outgoing_unidirectional_streams() -
2543 kHttp3StaticUnidirectionalStreamCount
2544 : QuicSessionPeer::GetStreamIdManager(server_session)
2545 ->max_open_outgoing_streams();
2546 EXPECT_EQ(kClientMaxDynamicStreams,
2547 server_max_open_outgoing_bidirectional_streams);
2548 EXPECT_EQ(kClientMaxDynamicStreams,
2549 server_max_open_outgoing_unidirectional_streams);
2550 } else {
2551 ADD_FAILURE() << "Missing server session";
2552 }
2553 server_thread_->Resume();
2554 }
2555
TEST_P(EndToEndTest,NegotiateCongestionControl)2556 TEST_P(EndToEndTest, NegotiateCongestionControl) {
2557 ASSERT_TRUE(Initialize());
2558
2559 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2560
2561 CongestionControlType expected_congestion_control_type = kRenoBytes;
2562 switch (GetParam().congestion_control_tag) {
2563 case kRENO:
2564 expected_congestion_control_type = kRenoBytes;
2565 break;
2566 case kTBBR:
2567 expected_congestion_control_type = kBBR;
2568 break;
2569 case kQBIC:
2570 expected_congestion_control_type = kCubicBytes;
2571 break;
2572 case kB2ON:
2573 expected_congestion_control_type = kBBRv2;
2574 break;
2575 default:
2576 QUIC_DLOG(FATAL) << "Unexpected congestion control tag";
2577 }
2578
2579 server_thread_->Pause();
2580 const QuicSentPacketManager* server_sent_packet_manager =
2581 GetSentPacketManagerFromFirstServerSession();
2582 if (server_sent_packet_manager != nullptr) {
2583 EXPECT_EQ(
2584 expected_congestion_control_type,
2585 QuicSentPacketManagerPeer::GetSendAlgorithm(*server_sent_packet_manager)
2586 ->GetCongestionControlType());
2587 } else {
2588 ADD_FAILURE() << "Missing server sent packet manager";
2589 }
2590 server_thread_->Resume();
2591 }
2592
TEST_P(EndToEndTest,ClientSuggestsRTT)2593 TEST_P(EndToEndTest, ClientSuggestsRTT) {
2594 // Client suggests initial RTT, verify it is used.
2595 const QuicTime::Delta kInitialRTT = QuicTime::Delta::FromMicroseconds(20000);
2596 client_config_.SetInitialRoundTripTimeUsToSend(kInitialRTT.ToMicroseconds());
2597
2598 ASSERT_TRUE(Initialize());
2599 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2600 ASSERT_TRUE(server_thread_);
2601 server_thread_->WaitForCryptoHandshakeConfirmed();
2602
2603 // Pause the server so we can access the server's internals without races.
2604 server_thread_->Pause();
2605 const QuicSentPacketManager* client_sent_packet_manager =
2606 GetSentPacketManagerFromClientSession();
2607 const QuicSentPacketManager* server_sent_packet_manager =
2608 GetSentPacketManagerFromFirstServerSession();
2609 if (client_sent_packet_manager != nullptr &&
2610 server_sent_packet_manager != nullptr) {
2611 EXPECT_EQ(kInitialRTT,
2612 client_sent_packet_manager->GetRttStats()->initial_rtt());
2613 EXPECT_EQ(kInitialRTT,
2614 server_sent_packet_manager->GetRttStats()->initial_rtt());
2615 } else {
2616 ADD_FAILURE() << "Missing sent packet manager";
2617 }
2618 server_thread_->Resume();
2619 }
2620
TEST_P(EndToEndTest,ClientSuggestsIgnoredRTT)2621 TEST_P(EndToEndTest, ClientSuggestsIgnoredRTT) {
2622 // Client suggests initial RTT, but also specifies NRTT, so it's not used.
2623 const QuicTime::Delta kInitialRTT = QuicTime::Delta::FromMicroseconds(20000);
2624 client_config_.SetInitialRoundTripTimeUsToSend(kInitialRTT.ToMicroseconds());
2625 QuicTagVector options;
2626 options.push_back(kNRTT);
2627 client_config_.SetConnectionOptionsToSend(options);
2628
2629 ASSERT_TRUE(Initialize());
2630 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2631 ASSERT_TRUE(server_thread_);
2632 server_thread_->WaitForCryptoHandshakeConfirmed();
2633
2634 // Pause the server so we can access the server's internals without races.
2635 server_thread_->Pause();
2636 const QuicSentPacketManager* client_sent_packet_manager =
2637 GetSentPacketManagerFromClientSession();
2638 const QuicSentPacketManager* server_sent_packet_manager =
2639 GetSentPacketManagerFromFirstServerSession();
2640 if (client_sent_packet_manager != nullptr &&
2641 server_sent_packet_manager != nullptr) {
2642 EXPECT_EQ(kInitialRTT,
2643 client_sent_packet_manager->GetRttStats()->initial_rtt());
2644 EXPECT_EQ(kInitialRTT,
2645 server_sent_packet_manager->GetRttStats()->initial_rtt());
2646 } else {
2647 ADD_FAILURE() << "Missing sent packet manager";
2648 }
2649 server_thread_->Resume();
2650 }
2651
2652 // Regression test for b/171378845
TEST_P(EndToEndTest,ClientDisablesGQuicZeroRtt)2653 TEST_P(EndToEndTest, ClientDisablesGQuicZeroRtt) {
2654 if (version_.UsesTls()) {
2655 // This feature is gQUIC only.
2656 ASSERT_TRUE(Initialize());
2657 return;
2658 }
2659 QuicTagVector options;
2660 options.push_back(kQNZ2);
2661 client_config_.SetClientConnectionOptions(options);
2662
2663 ASSERT_TRUE(Initialize());
2664
2665 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
2666 QuicSpdyClientSession* client_session = GetClientSession();
2667 ASSERT_TRUE(client_session);
2668 EXPECT_FALSE(client_session->EarlyDataAccepted());
2669 EXPECT_FALSE(client_session->ReceivedInchoateReject());
2670 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2671 EXPECT_FALSE(client_->client()->ReceivedInchoateReject());
2672
2673 client_->Disconnect();
2674
2675 // Make sure that the request succeeds but 0-RTT was not used.
2676 client_->Connect();
2677 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2678 ASSERT_TRUE(client_->client()->connected());
2679 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
2680
2681 client_session = GetClientSession();
2682 ASSERT_TRUE(client_session);
2683 EXPECT_FALSE(client_session->EarlyDataAccepted());
2684 EXPECT_FALSE(client_->client()->EarlyDataAccepted());
2685 }
2686
TEST_P(EndToEndTest,MaxInitialRTT)2687 TEST_P(EndToEndTest, MaxInitialRTT) {
2688 // Client tries to suggest twice the server's max initial rtt and the server
2689 // uses the max.
2690 client_config_.SetInitialRoundTripTimeUsToSend(2 *
2691 kMaxInitialRoundTripTimeUs);
2692
2693 ASSERT_TRUE(Initialize());
2694 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2695 ASSERT_TRUE(server_thread_);
2696 server_thread_->WaitForCryptoHandshakeConfirmed();
2697
2698 // Pause the server so we can access the server's internals without races.
2699 server_thread_->Pause();
2700 const QuicSentPacketManager* client_sent_packet_manager =
2701 GetSentPacketManagerFromClientSession();
2702 const QuicSentPacketManager* server_sent_packet_manager =
2703 GetSentPacketManagerFromFirstServerSession();
2704 if (client_sent_packet_manager != nullptr &&
2705 server_sent_packet_manager != nullptr) {
2706 // Now that acks have been exchanged, the RTT estimate has decreased on the
2707 // server and is not infinite on the client.
2708 EXPECT_FALSE(
2709 client_sent_packet_manager->GetRttStats()->smoothed_rtt().IsInfinite());
2710 const RttStats* server_rtt_stats =
2711 server_sent_packet_manager->GetRttStats();
2712 EXPECT_EQ(static_cast<int64_t>(kMaxInitialRoundTripTimeUs),
2713 server_rtt_stats->initial_rtt().ToMicroseconds());
2714 EXPECT_GE(static_cast<int64_t>(kMaxInitialRoundTripTimeUs),
2715 server_rtt_stats->smoothed_rtt().ToMicroseconds());
2716 } else {
2717 ADD_FAILURE() << "Missing sent packet manager";
2718 }
2719 server_thread_->Resume();
2720 }
2721
TEST_P(EndToEndTest,MinInitialRTT)2722 TEST_P(EndToEndTest, MinInitialRTT) {
2723 // Client tries to suggest 0 and the server uses the default.
2724 client_config_.SetInitialRoundTripTimeUsToSend(0);
2725
2726 ASSERT_TRUE(Initialize());
2727 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2728 server_thread_->WaitForCryptoHandshakeConfirmed();
2729
2730 // Pause the server so we can access the server's internals without races.
2731 server_thread_->Pause();
2732 const QuicSentPacketManager* client_sent_packet_manager =
2733 GetSentPacketManagerFromClientSession();
2734 const QuicSentPacketManager* server_sent_packet_manager =
2735 GetSentPacketManagerFromFirstServerSession();
2736 if (client_sent_packet_manager != nullptr &&
2737 server_sent_packet_manager != nullptr) {
2738 // Now that acks have been exchanged, the RTT estimate has decreased on the
2739 // server and is not infinite on the client.
2740 EXPECT_FALSE(
2741 client_sent_packet_manager->GetRttStats()->smoothed_rtt().IsInfinite());
2742 // Expect the default rtt of 100ms.
2743 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100),
2744 server_sent_packet_manager->GetRttStats()->initial_rtt());
2745 // Ensure the bandwidth is valid.
2746 client_sent_packet_manager->BandwidthEstimate();
2747 server_sent_packet_manager->BandwidthEstimate();
2748 } else {
2749 ADD_FAILURE() << "Missing sent packet manager";
2750 }
2751 server_thread_->Resume();
2752 }
2753
2754 TEST_P(EndToEndTest, 0ByteConnectionId) {
2755 if (version_.HasIetfInvariantHeader()) {
2756 // SetBytesForConnectionIdToSend only applies to Google QUIC encoding.
2757 ASSERT_TRUE(Initialize());
2758 return;
2759 }
2760 client_config_.SetBytesForConnectionIdToSend(0);
2761 ASSERT_TRUE(Initialize());
2762
2763 SendSynchronousFooRequestAndCheckResponse();
2764 QuicConnection* client_connection = GetClientConnection();
2765 ASSERT_TRUE(client_connection);
2766 QuicPacketHeader* header =
2767 QuicConnectionPeer::GetLastHeader(client_connection);
2768 EXPECT_EQ(CONNECTION_ID_ABSENT, header->source_connection_id_included);
2769 }
2770
2771 TEST_P(EndToEndTest, 8ByteConnectionId) {
2772 if (version_.HasIetfInvariantHeader()) {
2773 // SetBytesForConnectionIdToSend only applies to Google QUIC encoding.
2774 ASSERT_TRUE(Initialize());
2775 return;
2776 }
2777 client_config_.SetBytesForConnectionIdToSend(8);
2778 ASSERT_TRUE(Initialize());
2779
2780 SendSynchronousFooRequestAndCheckResponse();
2781 QuicConnection* client_connection = GetClientConnection();
2782 ASSERT_TRUE(client_connection);
2783 QuicPacketHeader* header =
2784 QuicConnectionPeer::GetLastHeader(client_connection);
2785 EXPECT_EQ(CONNECTION_ID_PRESENT, header->destination_connection_id_included);
2786 }
2787
2788 TEST_P(EndToEndTest, 15ByteConnectionId) {
2789 if (version_.HasIetfInvariantHeader()) {
2790 // SetBytesForConnectionIdToSend only applies to Google QUIC encoding.
2791 ASSERT_TRUE(Initialize());
2792 return;
2793 }
2794 client_config_.SetBytesForConnectionIdToSend(15);
2795 ASSERT_TRUE(Initialize());
2796
2797 // Our server is permissive and allows for out of bounds values.
2798 SendSynchronousFooRequestAndCheckResponse();
2799 QuicConnection* client_connection = GetClientConnection();
2800 ASSERT_TRUE(client_connection);
2801 QuicPacketHeader* header =
2802 QuicConnectionPeer::GetLastHeader(client_connection);
2803 EXPECT_EQ(CONNECTION_ID_PRESENT, header->destination_connection_id_included);
2804 }
2805
TEST_P(EndToEndTest,ResetConnection)2806 TEST_P(EndToEndTest, ResetConnection) {
2807 ASSERT_TRUE(Initialize());
2808
2809 SendSynchronousFooRequestAndCheckResponse();
2810 client_->ResetConnection();
2811 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2812 SendSynchronousBarRequestAndCheckResponse();
2813 }
2814
2815 // Regression test for b/180737158.
TEST_P(EndToEndTest,HalfRttResponseBlocksShloRetransmissionWithoutTokenBasedAddressValidation)2816 TEST_P(
2817 EndToEndTest,
2818 HalfRttResponseBlocksShloRetransmissionWithoutTokenBasedAddressValidation) {
2819 // Turn off token based address validation to make the server get constrained
2820 // by amplification factor during handshake.
2821 SetQuicFlag(quic_reject_retry_token_in_initial_packet, true);
2822 ASSERT_TRUE(Initialize());
2823 if (!version_.SupportsAntiAmplificationLimit()) {
2824 return;
2825 }
2826 // Perform a full 1-RTT handshake to get the new session ticket such that the
2827 // next connection will perform a 0-RTT handshake.
2828 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
2829 client_->Disconnect();
2830
2831 server_thread_->Pause();
2832 // Drop the 1st server packet which is the coalesced INITIAL + HANDSHAKE +
2833 // 1RTT.
2834 PacketDroppingTestWriter* writer = new PacketDroppingTestWriter();
2835 writer->set_fake_drop_first_n_packets(1);
2836 QuicDispatcherPeer::UseWriter(
2837 QuicServerPeer::GetDispatcher(server_thread_->server()), writer);
2838 server_thread_->Resume();
2839
2840 // Large response (100KB) for 0-RTT request.
2841 std::string large_body(102400, 'a');
2842 AddToCache("/large_response", 200, large_body);
2843 SendSynchronousRequestAndCheckResponse(client_.get(), "/large_response",
2844 large_body);
2845 }
2846
TEST_P(EndToEndTest,MaxStreamsUberTest)2847 TEST_P(EndToEndTest, MaxStreamsUberTest) {
2848 // Connect with lower fake packet loss than we'd like to test. Until
2849 // b/10126687 is fixed, losing handshake packets is pretty brutal.
2850 SetPacketLossPercentage(1);
2851 ASSERT_TRUE(Initialize());
2852 std::string large_body(10240, 'a');
2853 int max_streams = 100;
2854
2855 AddToCache("/large_response", 200, large_body);
2856
2857 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2858 SetPacketLossPercentage(10);
2859
2860 for (int i = 0; i < max_streams; ++i) {
2861 EXPECT_LT(0, client_->SendRequest("/large_response"));
2862 }
2863
2864 // WaitForEvents waits 50ms and returns true if there are outstanding
2865 // requests.
2866 while (client_->client()->WaitForEvents()) {
2867 ASSERT_TRUE(client_->connected());
2868 }
2869 }
2870
TEST_P(EndToEndTest,StreamCancelErrorTest)2871 TEST_P(EndToEndTest, StreamCancelErrorTest) {
2872 ASSERT_TRUE(Initialize());
2873 std::string small_body(256, 'a');
2874
2875 AddToCache("/small_response", 200, small_body);
2876
2877 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
2878
2879 QuicSession* session = GetClientSession();
2880 ASSERT_TRUE(session);
2881 // Lose the request.
2882 SetPacketLossPercentage(100);
2883 EXPECT_LT(0, client_->SendRequest("/small_response"));
2884 client_->client()->WaitForEvents();
2885 // Transmit the cancel, and ensure the connection is torn down properly.
2886 SetPacketLossPercentage(0);
2887 QuicStreamId stream_id = GetNthClientInitiatedBidirectionalId(0);
2888 QuicConnection* client_connection = GetClientConnection();
2889 ASSERT_TRUE(client_connection);
2890 const QuicPacketCount packets_sent_before =
2891 client_connection->GetStats().packets_sent;
2892 session->ResetStream(stream_id, QUIC_STREAM_CANCELLED);
2893 const QuicPacketCount packets_sent_now =
2894 client_connection->GetStats().packets_sent;
2895
2896 if (version_.UsesHttp3()) {
2897 // Make sure 2 packets were sent, one for QPACK instructions, another for
2898 // RESET_STREAM and STOP_SENDING.
2899 EXPECT_EQ(packets_sent_before + 2, packets_sent_now);
2900 }
2901
2902 // WaitForEvents waits 50ms and returns true if there are outstanding
2903 // requests.
2904 while (client_->client()->WaitForEvents()) {
2905 ASSERT_TRUE(client_->connected());
2906 }
2907 // It should be completely fine to RST a stream before any data has been
2908 // received for that stream.
2909 EXPECT_THAT(client_->connection_error(), IsQuicNoError());
2910 }
2911
TEST_P(EndToEndTest,ConnectionMigrationClientIPChanged)2912 TEST_P(EndToEndTest, ConnectionMigrationClientIPChanged) {
2913 ASSERT_TRUE(Initialize());
2914 if (GetQuicFlag(quic_enforce_strict_amplification_factor)) {
2915 return;
2916 }
2917 SendSynchronousFooRequestAndCheckResponse();
2918
2919 // Store the client IP address which was used to send the first request.
2920 QuicIpAddress old_host =
2921 client_->client()->network_helper()->GetLatestClientAddress().host();
2922
2923 // Migrate socket to the new IP address.
2924 QuicIpAddress new_host = TestLoopback(2);
2925 EXPECT_NE(old_host, new_host);
2926 ASSERT_TRUE(client_->client()->MigrateSocket(new_host));
2927
2928 // Send a request using the new socket.
2929 SendSynchronousBarRequestAndCheckResponse();
2930
2931 if (!version_.HasIetfQuicFrames() ||
2932 !client_->client()->session()->connection()->validate_client_address()) {
2933 return;
2934 }
2935 QuicConnection* client_connection = GetClientConnection();
2936 ASSERT_TRUE(client_connection);
2937 EXPECT_EQ(1u,
2938 client_connection->GetStats().num_connectivity_probing_received);
2939
2940 // Send another request.
2941 SendSynchronousBarRequestAndCheckResponse();
2942 // By the time the 2nd request is completed, the PATH_RESPONSE must have been
2943 // received by the server.
2944 server_thread_->Pause();
2945 QuicConnection* server_connection = GetServerConnection();
2946 if (server_connection != nullptr) {
2947 EXPECT_FALSE(server_connection->HasPendingPathValidation());
2948 EXPECT_EQ(1u, server_connection->GetStats().num_validated_peer_migration);
2949 } else {
2950 ADD_FAILURE() << "Missing server connection";
2951 }
2952 server_thread_->Resume();
2953 }
2954
TEST_P(EndToEndTest,IetfConnectionMigrationClientIPChangedMultipleTimes)2955 TEST_P(EndToEndTest, IetfConnectionMigrationClientIPChangedMultipleTimes) {
2956 ASSERT_TRUE(Initialize());
2957 if (!GetClientConnection()->connection_migration_use_new_cid() ||
2958 GetQuicFlag(quic_enforce_strict_amplification_factor)) {
2959 return;
2960 }
2961 SendSynchronousFooRequestAndCheckResponse();
2962
2963 // Store the client IP address which was used to send the first request.
2964 QuicIpAddress host0 =
2965 client_->client()->network_helper()->GetLatestClientAddress().host();
2966 QuicConnection* client_connection = GetClientConnection();
2967 ASSERT_TRUE(client_connection != nullptr);
2968
2969 // Migrate socket to a new IP address.
2970 QuicIpAddress host1 = TestLoopback(2);
2971 EXPECT_NE(host0, host1);
2972 ASSERT_TRUE(
2973 QuicConnectionPeer::HasUnusedPeerIssuedConnectionId(client_connection));
2974 QuicConnectionId server_cid0 = client_connection->connection_id();
2975 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
2976 client_connection)
2977 .IsEmpty());
2978 EXPECT_TRUE(client_->client()->MigrateSocket(host1));
2979 QuicConnectionId server_cid1 = client_connection->connection_id();
2980 EXPECT_FALSE(server_cid1.IsEmpty());
2981 EXPECT_NE(server_cid0, server_cid1);
2982 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
2983 client_connection)
2984 .IsEmpty());
2985
2986 // Send a request using the new socket.
2987 SendSynchronousBarRequestAndCheckResponse();
2988 EXPECT_EQ(1u,
2989 client_connection->GetStats().num_connectivity_probing_received);
2990
2991 // Send another request and wait for response making sure path response is
2992 // received at server.
2993 SendSynchronousBarRequestAndCheckResponse();
2994
2995 // Migrate socket to a new IP address.
2996 WaitForNewConnectionIds();
2997 EXPECT_EQ(1u, client_connection->GetStats().num_retire_connection_id_sent);
2998 QuicIpAddress host2 = TestLoopback(3);
2999 EXPECT_NE(host0, host2);
3000 EXPECT_NE(host1, host2);
3001 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3002 client_connection)
3003 .IsEmpty());
3004 EXPECT_TRUE(client_->client()->MigrateSocket(host2));
3005 QuicConnectionId server_cid2 = client_connection->connection_id();
3006 EXPECT_FALSE(server_cid2.IsEmpty());
3007 EXPECT_NE(server_cid0, server_cid2);
3008 EXPECT_NE(server_cid1, server_cid2);
3009 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3010 client_connection)
3011 .IsEmpty());
3012
3013 // Send another request using the new socket and wait for response making sure
3014 // path response is received at server.
3015 SendSynchronousBarRequestAndCheckResponse();
3016 EXPECT_EQ(2u,
3017 client_connection->GetStats().num_connectivity_probing_received);
3018
3019 // Migrate socket back to an old IP address.
3020 WaitForNewConnectionIds();
3021 EXPECT_EQ(2u, client_connection->GetStats().num_retire_connection_id_sent);
3022 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3023 client_connection)
3024 .IsEmpty());
3025 EXPECT_TRUE(client_->client()->MigrateSocket(host1));
3026 QuicConnectionId server_cid3 = client_connection->connection_id();
3027 EXPECT_FALSE(server_cid3.IsEmpty());
3028 EXPECT_NE(server_cid0, server_cid3);
3029 EXPECT_NE(server_cid1, server_cid3);
3030 EXPECT_NE(server_cid2, server_cid3);
3031 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3032 client_connection)
3033 .IsEmpty());
3034 const auto* client_packet_creator =
3035 QuicConnectionPeer::GetPacketCreator(client_connection);
3036 EXPECT_TRUE(client_packet_creator->GetClientConnectionId().IsEmpty());
3037 EXPECT_EQ(server_cid3, client_packet_creator->GetServerConnectionId());
3038
3039 // Send another request using the new socket and wait for response making sure
3040 // path response is received at server.
3041 SendSynchronousBarRequestAndCheckResponse();
3042 // Even this is an old path, server has forgotten about it and thus needs to
3043 // validate the path again.
3044 EXPECT_EQ(3u,
3045 client_connection->GetStats().num_connectivity_probing_received);
3046
3047 WaitForNewConnectionIds();
3048 EXPECT_EQ(3u, client_connection->GetStats().num_retire_connection_id_sent);
3049
3050 server_thread_->Pause();
3051 QuicConnection* server_connection = GetServerConnection();
3052 // By the time the 2nd request is completed, the PATH_RESPONSE must have been
3053 // received by the server.
3054 EXPECT_FALSE(server_connection->HasPendingPathValidation());
3055 EXPECT_EQ(3u, server_connection->GetStats().num_validated_peer_migration);
3056 EXPECT_EQ(server_cid3, server_connection->connection_id());
3057 const auto* server_packet_creator =
3058 QuicConnectionPeer::GetPacketCreator(server_connection);
3059 EXPECT_EQ(server_cid3, server_packet_creator->GetServerConnectionId());
3060 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3061 server_connection)
3062 .IsEmpty());
3063 EXPECT_EQ(4u, server_connection->GetStats().num_new_connection_id_sent);
3064 server_thread_->Resume();
3065 }
3066
TEST_P(EndToEndTest,ConnectionMigrationWithNonZeroConnectionIDClientIPChangedMultipleTimes)3067 TEST_P(EndToEndTest,
3068 ConnectionMigrationWithNonZeroConnectionIDClientIPChangedMultipleTimes) {
3069 if (!version_.SupportsClientConnectionIds() ||
3070 GetQuicFlag(quic_enforce_strict_amplification_factor)) {
3071 ASSERT_TRUE(Initialize());
3072 return;
3073 }
3074 override_client_connection_id_length_ = kQuicDefaultConnectionIdLength;
3075 ASSERT_TRUE(Initialize());
3076 if (!GetClientConnection()->connection_migration_use_new_cid()) {
3077 return;
3078 }
3079 SendSynchronousFooRequestAndCheckResponse();
3080
3081 // Store the client IP address which was used to send the first request.
3082 QuicIpAddress host0 =
3083 client_->client()->network_helper()->GetLatestClientAddress().host();
3084 QuicConnection* client_connection = GetClientConnection();
3085 ASSERT_TRUE(client_connection != nullptr);
3086
3087 // Migrate socket to a new IP address.
3088 QuicIpAddress host1 = TestLoopback(2);
3089 EXPECT_NE(host0, host1);
3090 ASSERT_TRUE(
3091 QuicConnectionPeer::HasUnusedPeerIssuedConnectionId(client_connection));
3092 QuicConnectionId server_cid0 = client_connection->connection_id();
3093 QuicConnectionId client_cid0 = client_connection->client_connection_id();
3094 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3095 client_connection)
3096 .IsEmpty());
3097 EXPECT_TRUE(QuicConnectionPeer::GetClientConnectionIdOnAlternativePath(
3098 client_connection)
3099 .IsEmpty());
3100 EXPECT_TRUE(client_->client()->MigrateSocket(host1));
3101 QuicConnectionId server_cid1 = client_connection->connection_id();
3102 QuicConnectionId client_cid1 = client_connection->client_connection_id();
3103 EXPECT_FALSE(server_cid1.IsEmpty());
3104 EXPECT_FALSE(client_cid1.IsEmpty());
3105 EXPECT_NE(server_cid0, server_cid1);
3106 EXPECT_NE(client_cid0, client_cid1);
3107 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3108 client_connection)
3109 .IsEmpty());
3110 EXPECT_TRUE(QuicConnectionPeer::GetClientConnectionIdOnAlternativePath(
3111 client_connection)
3112 .IsEmpty());
3113
3114 // Send another request to ensure that the server will have time to finish the
3115 // reverse path validation and send address token.
3116 SendSynchronousBarRequestAndCheckResponse();
3117 EXPECT_EQ(1u,
3118 client_connection->GetStats().num_connectivity_probing_received);
3119
3120 // Migrate socket to a new IP address.
3121 WaitForNewConnectionIds();
3122 EXPECT_EQ(1u, client_connection->GetStats().num_retire_connection_id_sent);
3123 EXPECT_EQ(2u, client_connection->GetStats().num_new_connection_id_sent);
3124 QuicIpAddress host2 = TestLoopback(3);
3125 EXPECT_NE(host0, host2);
3126 EXPECT_NE(host1, host2);
3127 EXPECT_TRUE(client_->client()->MigrateSocket(host2));
3128 QuicConnectionId server_cid2 = client_connection->connection_id();
3129 QuicConnectionId client_cid2 = client_connection->client_connection_id();
3130 EXPECT_FALSE(server_cid2.IsEmpty());
3131 EXPECT_NE(server_cid0, server_cid2);
3132 EXPECT_NE(server_cid1, server_cid2);
3133 EXPECT_FALSE(client_cid2.IsEmpty());
3134 EXPECT_NE(client_cid0, client_cid2);
3135 EXPECT_NE(client_cid1, client_cid2);
3136 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3137 client_connection)
3138 .IsEmpty());
3139 EXPECT_TRUE(QuicConnectionPeer::GetClientConnectionIdOnAlternativePath(
3140 client_connection)
3141 .IsEmpty());
3142
3143 // Send another request to ensure that the server will have time to finish the
3144 // reverse path validation and send address token.
3145 SendSynchronousBarRequestAndCheckResponse();
3146 EXPECT_EQ(2u,
3147 client_connection->GetStats().num_connectivity_probing_received);
3148
3149 // Migrate socket back to an old IP address.
3150 WaitForNewConnectionIds();
3151 EXPECT_EQ(2u, client_connection->GetStats().num_retire_connection_id_sent);
3152 EXPECT_EQ(3u, client_connection->GetStats().num_new_connection_id_sent);
3153 EXPECT_TRUE(client_->client()->MigrateSocket(host1));
3154 QuicConnectionId server_cid3 = client_connection->connection_id();
3155 QuicConnectionId client_cid3 = client_connection->client_connection_id();
3156 EXPECT_FALSE(server_cid3.IsEmpty());
3157 EXPECT_NE(server_cid0, server_cid3);
3158 EXPECT_NE(server_cid1, server_cid3);
3159 EXPECT_NE(server_cid2, server_cid3);
3160 EXPECT_FALSE(client_cid3.IsEmpty());
3161 EXPECT_NE(client_cid0, client_cid3);
3162 EXPECT_NE(client_cid1, client_cid3);
3163 EXPECT_NE(client_cid2, client_cid3);
3164 const auto* client_packet_creator =
3165 QuicConnectionPeer::GetPacketCreator(client_connection);
3166 EXPECT_EQ(client_cid3, client_packet_creator->GetClientConnectionId());
3167 EXPECT_EQ(server_cid3, client_packet_creator->GetServerConnectionId());
3168 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3169 client_connection)
3170 .IsEmpty());
3171
3172 // Send another request to ensure that the server will have time to finish the
3173 // reverse path validation and send address token.
3174 SendSynchronousBarRequestAndCheckResponse();
3175 // Even this is an old path, server has forgotten about it and thus needs to
3176 // validate the path again.
3177 EXPECT_EQ(3u,
3178 client_connection->GetStats().num_connectivity_probing_received);
3179
3180 WaitForNewConnectionIds();
3181 EXPECT_EQ(3u, client_connection->GetStats().num_retire_connection_id_sent);
3182 EXPECT_EQ(4u, client_connection->GetStats().num_new_connection_id_sent);
3183
3184 server_thread_->Pause();
3185 // By the time the 2nd request is completed, the PATH_RESPONSE must have been
3186 // received by the server.
3187 QuicConnection* server_connection = GetServerConnection();
3188 EXPECT_FALSE(server_connection->HasPendingPathValidation());
3189 EXPECT_EQ(3u, server_connection->GetStats().num_validated_peer_migration);
3190 EXPECT_EQ(server_cid3, server_connection->connection_id());
3191 EXPECT_EQ(client_cid3, server_connection->client_connection_id());
3192 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3193 server_connection)
3194 .IsEmpty());
3195 const auto* server_packet_creator =
3196 QuicConnectionPeer::GetPacketCreator(server_connection);
3197 EXPECT_EQ(client_cid3, server_packet_creator->GetClientConnectionId());
3198 EXPECT_EQ(server_cid3, server_packet_creator->GetServerConnectionId());
3199 EXPECT_EQ(3u, server_connection->GetStats().num_retire_connection_id_sent);
3200 EXPECT_EQ(4u, server_connection->GetStats().num_new_connection_id_sent);
3201 server_thread_->Resume();
3202 }
3203
TEST_P(EndToEndTest,ConnectionMigrationNewTokenForNewIp)3204 TEST_P(EndToEndTest, ConnectionMigrationNewTokenForNewIp) {
3205 ASSERT_TRUE(Initialize());
3206 if (!version_.HasIetfQuicFrames() ||
3207 !client_->client()->session()->connection()->validate_client_address() ||
3208 GetQuicFlag(quic_enforce_strict_amplification_factor)) {
3209 return;
3210 }
3211 SendSynchronousFooRequestAndCheckResponse();
3212
3213 // Store the client IP address which was used to send the first request.
3214 QuicIpAddress old_host =
3215 client_->client()->network_helper()->GetLatestClientAddress().host();
3216
3217 // Migrate socket to the new IP address.
3218 QuicIpAddress new_host = TestLoopback(2);
3219 EXPECT_NE(old_host, new_host);
3220 ASSERT_TRUE(client_->client()->MigrateSocket(new_host));
3221
3222 // Send a request using the new socket.
3223 SendSynchronousBarRequestAndCheckResponse();
3224 QuicConnection* client_connection = GetClientConnection();
3225 ASSERT_TRUE(client_connection);
3226 EXPECT_EQ(1u,
3227 client_connection->GetStats().num_connectivity_probing_received);
3228
3229 // Send another request to ensure that the server will have time to finish the
3230 // reverse path validation and send address token.
3231 SendSynchronousBarRequestAndCheckResponse();
3232
3233 client_->Disconnect();
3234 // The 0-RTT handshake should succeed.
3235 client_->Connect();
3236 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
3237 ASSERT_TRUE(client_->client()->connected());
3238 SendSynchronousFooRequestAndCheckResponse();
3239
3240 EXPECT_TRUE(GetClientSession()->EarlyDataAccepted());
3241 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
3242
3243 server_thread_->Pause();
3244 QuicConnection* server_connection = GetServerConnection();
3245 if (server_connection != nullptr) {
3246 // Verify address is validated via validating token received in INITIAL
3247 // packet.
3248 EXPECT_FALSE(
3249 server_connection->GetStats().address_validated_via_decrypting_packet);
3250 EXPECT_TRUE(server_connection->GetStats().address_validated_via_token);
3251 } else {
3252 ADD_FAILURE() << "Missing server connection";
3253 }
3254 server_thread_->Resume();
3255 client_->Disconnect();
3256 }
3257
3258 // A writer which copies the packet and send the copy with a specified self
3259 // address and then send the same packet with the original self address.
3260 class DuplicatePacketWithSpoofedSelfAddressWriter
3261 : public QuicPacketWriterWrapper {
3262 public:
WritePacket(const char * buffer,size_t buf_len,const QuicIpAddress & self_address,const QuicSocketAddress & peer_address,PerPacketOptions * options)3263 WriteResult WritePacket(const char* buffer, size_t buf_len,
3264 const QuicIpAddress& self_address,
3265 const QuicSocketAddress& peer_address,
3266 PerPacketOptions* options) override {
3267 if (self_address_to_overwrite_.IsInitialized()) {
3268 // Send the same packet on the overwriting address before sending on the
3269 // actual self address.
3270 QuicPacketWriterWrapper::WritePacket(
3271 buffer, buf_len, self_address_to_overwrite_, peer_address, options);
3272 }
3273 return QuicPacketWriterWrapper::WritePacket(buffer, buf_len, self_address,
3274 peer_address, options);
3275 }
3276
set_self_address_to_overwrite(const QuicIpAddress & self_address)3277 void set_self_address_to_overwrite(const QuicIpAddress& self_address) {
3278 self_address_to_overwrite_ = self_address;
3279 }
3280
3281 private:
3282 QuicIpAddress self_address_to_overwrite_;
3283 };
3284
TEST_P(EndToEndTest,ClientAddressSpoofedForSomePeriod)3285 TEST_P(EndToEndTest, ClientAddressSpoofedForSomePeriod) {
3286 ASSERT_TRUE(Initialize());
3287 if (!GetClientConnection()->connection_migration_use_new_cid()) {
3288 return;
3289 }
3290 auto writer = new DuplicatePacketWithSpoofedSelfAddressWriter();
3291 client_.reset(CreateQuicClient(writer));
3292
3293 // Make sure client has unused peer connection ID before migration.
3294 SendSynchronousFooRequestAndCheckResponse();
3295 ASSERT_TRUE(QuicConnectionPeer::HasUnusedPeerIssuedConnectionId(
3296 GetClientConnection()));
3297
3298 QuicIpAddress real_host =
3299 client_->client()->session()->connection()->self_address().host();
3300 ASSERT_TRUE(client_->MigrateSocket(real_host));
3301 SendSynchronousFooRequestAndCheckResponse();
3302 EXPECT_EQ(
3303 0u, GetClientConnection()->GetStats().num_connectivity_probing_received);
3304 EXPECT_EQ(
3305 real_host,
3306 client_->client()->network_helper()->GetLatestClientAddress().host());
3307 client_->WaitForDelayedAcks();
3308
3309 std::string large_body(10240, 'a');
3310 AddToCache("/large_response", 200, large_body);
3311
3312 QuicIpAddress spoofed_host = TestLoopback(2);
3313 writer->set_self_address_to_overwrite(spoofed_host);
3314
3315 client_->SendRequest("/large_response");
3316 QuicConnection* client_connection = GetClientConnection();
3317 QuicPacketCount num_packets_received =
3318 client_connection->GetStats().packets_received;
3319
3320 while (client_->client()->WaitForEvents() && client_->connected()) {
3321 if (client_connection->GetStats().packets_received > num_packets_received) {
3322 // Ideally the client won't receive any packets till the server finds out
3323 // the new client address is not working. But there are 2 corner cases:
3324 // 1) Before the server received the packet from spoofed address, it might
3325 // send packets to the real client address. So the client will immediately
3326 // switch back to use the original address;
3327 // 2) Between the server fails reverse path validation and the client
3328 // receives packets again, the client might sent some packets with the
3329 // spoofed address and triggers another migration.
3330 // In both corner cases, the attempted migration should fail and fall back
3331 // to the working path.
3332 writer->set_self_address_to_overwrite(QuicIpAddress());
3333 }
3334 }
3335 client_->WaitForResponse();
3336 EXPECT_EQ(large_body, client_->response_body());
3337 }
3338
TEST_P(EndToEndTest,AsynchronousConnectionMigrationClientIPChangedMultipleTimes)3339 TEST_P(EndToEndTest,
3340 AsynchronousConnectionMigrationClientIPChangedMultipleTimes) {
3341 ASSERT_TRUE(Initialize());
3342 if (!GetClientConnection()->connection_migration_use_new_cid()) {
3343 return;
3344 }
3345 client_.reset(CreateQuicClient(nullptr));
3346
3347 SendSynchronousFooRequestAndCheckResponse();
3348
3349 // Store the client IP address which was used to send the first request.
3350 QuicIpAddress host0 =
3351 client_->client()->network_helper()->GetLatestClientAddress().host();
3352 QuicConnection* client_connection = GetClientConnection();
3353 QuicConnectionId server_cid0 = client_connection->connection_id();
3354 // Server should have one new connection ID upon handshake completion.
3355 ASSERT_TRUE(
3356 QuicConnectionPeer::HasUnusedPeerIssuedConnectionId(client_connection));
3357
3358 // Migrate socket to new IP address #1.
3359 QuicIpAddress host1 = TestLoopback(2);
3360 EXPECT_NE(host0, host1);
3361 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(host1));
3362 while (client_->client()->HasPendingPathValidation()) {
3363 client_->client()->WaitForEvents();
3364 }
3365 EXPECT_EQ(host1, client_->client()->session()->self_address().host());
3366 EXPECT_EQ(1u,
3367 client_connection->GetStats().num_connectivity_probing_received);
3368 QuicConnectionId server_cid1 = client_connection->connection_id();
3369 EXPECT_NE(server_cid0, server_cid1);
3370 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3371 client_connection)
3372 .IsEmpty());
3373
3374 // Send a request using the new socket.
3375 SendSynchronousBarRequestAndCheckResponse();
3376
3377 // Migrate socket to new IP address #2.
3378 WaitForNewConnectionIds();
3379 QuicIpAddress host2 = TestLoopback(3);
3380 EXPECT_NE(host0, host1);
3381 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(host2));
3382
3383 while (client_->client()->HasPendingPathValidation()) {
3384 client_->client()->WaitForEvents();
3385 }
3386 EXPECT_EQ(host2, client_->client()->session()->self_address().host());
3387 EXPECT_EQ(2u,
3388 client_connection->GetStats().num_connectivity_probing_received);
3389 QuicConnectionId server_cid2 = client_connection->connection_id();
3390 EXPECT_NE(server_cid0, server_cid2);
3391 EXPECT_NE(server_cid1, server_cid2);
3392 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3393 client_connection)
3394 .IsEmpty());
3395
3396 // Send a request using the new socket.
3397 SendSynchronousBarRequestAndCheckResponse();
3398
3399 // Migrate socket back to IP address #1.
3400 WaitForNewConnectionIds();
3401 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(host1));
3402
3403 while (client_->client()->HasPendingPathValidation()) {
3404 client_->client()->WaitForEvents();
3405 }
3406 EXPECT_EQ(host1, client_->client()->session()->self_address().host());
3407 EXPECT_EQ(3u,
3408 client_connection->GetStats().num_connectivity_probing_received);
3409 QuicConnectionId server_cid3 = client_connection->connection_id();
3410 EXPECT_NE(server_cid0, server_cid3);
3411 EXPECT_NE(server_cid1, server_cid3);
3412 EXPECT_NE(server_cid2, server_cid3);
3413 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3414 client_connection)
3415 .IsEmpty());
3416
3417 // Send a request using the new socket.
3418 SendSynchronousBarRequestAndCheckResponse();
3419 server_thread_->Pause();
3420 const QuicConnection* server_connection = GetServerConnection();
3421 EXPECT_EQ(server_connection->connection_id(), server_cid3);
3422 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
3423 server_connection)
3424 .IsEmpty());
3425 server_thread_->Resume();
3426
3427 // There should be 1 new connection ID issued by the server.
3428 WaitForNewConnectionIds();
3429 }
3430
TEST_P(EndToEndTest,AsynchronousConnectionMigrationClientIPChangedWithNonEmptyClientCID)3431 TEST_P(EndToEndTest,
3432 AsynchronousConnectionMigrationClientIPChangedWithNonEmptyClientCID) {
3433 if (!version_.SupportsClientConnectionIds()) {
3434 ASSERT_TRUE(Initialize());
3435 return;
3436 }
3437 override_client_connection_id_length_ = kQuicDefaultConnectionIdLength;
3438 ASSERT_TRUE(Initialize());
3439 if (!GetClientConnection()->connection_migration_use_new_cid()) {
3440 return;
3441 }
3442 client_.reset(CreateQuicClient(nullptr));
3443
3444 SendSynchronousFooRequestAndCheckResponse();
3445
3446 // Store the client IP address which was used to send the first request.
3447 QuicIpAddress old_host =
3448 client_->client()->network_helper()->GetLatestClientAddress().host();
3449 auto* client_connection = GetClientConnection();
3450 QuicConnectionId client_cid0 = client_connection->client_connection_id();
3451 QuicConnectionId server_cid0 = client_connection->connection_id();
3452
3453 // Migrate socket to the new IP address.
3454 QuicIpAddress new_host = TestLoopback(2);
3455 EXPECT_NE(old_host, new_host);
3456 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(new_host));
3457
3458 while (client_->client()->HasPendingPathValidation()) {
3459 client_->client()->WaitForEvents();
3460 }
3461 EXPECT_EQ(new_host, client_->client()->session()->self_address().host());
3462 EXPECT_EQ(1u,
3463 client_connection->GetStats().num_connectivity_probing_received);
3464 QuicConnectionId client_cid1 = client_connection->client_connection_id();
3465 QuicConnectionId server_cid1 = client_connection->connection_id();
3466 const auto* client_packet_creator =
3467 QuicConnectionPeer::GetPacketCreator(client_connection);
3468 EXPECT_EQ(client_cid1, client_packet_creator->GetClientConnectionId());
3469 EXPECT_EQ(server_cid1, client_packet_creator->GetServerConnectionId());
3470 // Send a request using the new socket.
3471 SendSynchronousBarRequestAndCheckResponse();
3472
3473 server_thread_->Pause();
3474 QuicConnection* server_connection = GetServerConnection();
3475 EXPECT_EQ(client_cid1, server_connection->client_connection_id());
3476 EXPECT_EQ(server_cid1, server_connection->connection_id());
3477 const auto* server_packet_creator =
3478 QuicConnectionPeer::GetPacketCreator(server_connection);
3479 EXPECT_EQ(client_cid1, server_packet_creator->GetClientConnectionId());
3480 EXPECT_EQ(server_cid1, server_packet_creator->GetServerConnectionId());
3481 server_thread_->Resume();
3482 }
3483
TEST_P(EndToEndTest,ConnectionMigrationClientPortChanged)3484 TEST_P(EndToEndTest, ConnectionMigrationClientPortChanged) {
3485 // Tests that the client's port can change during an established QUIC
3486 // connection, and that doing so does not result in the connection being
3487 // closed by the server.
3488 ASSERT_TRUE(Initialize());
3489
3490 SendSynchronousFooRequestAndCheckResponse();
3491
3492 // Store the client address which was used to send the first request.
3493 QuicSocketAddress old_address =
3494 client_->client()->network_helper()->GetLatestClientAddress();
3495 int old_fd = client_->client()->GetLatestFD();
3496
3497 // Create a new socket before closing the old one, which will result in a new
3498 // ephemeral port.
3499 client_->client()->network_helper()->CreateUDPSocketAndBind(
3500 client_->client()->server_address(), client_->client()->bind_to_address(),
3501 client_->client()->local_port());
3502
3503 // Stop listening and close the old FD.
3504 client_->client()->default_network_helper()->CleanUpUDPSocket(old_fd);
3505
3506 // The packet writer needs to be updated to use the new FD.
3507 client_->client()->network_helper()->CreateQuicPacketWriter();
3508
3509 // Change the internal state of the client and connection to use the new port,
3510 // this is done because in a real NAT rebinding the client wouldn't see any
3511 // port change, and so expects no change to incoming port.
3512 // This is kind of ugly, but needed as we are simply swapping out the client
3513 // FD rather than any more complex NAT rebinding simulation.
3514 int new_port =
3515 client_->client()->network_helper()->GetLatestClientAddress().port();
3516 client_->client()->default_network_helper()->SetClientPort(new_port);
3517 QuicConnection* client_connection = GetClientConnection();
3518 ASSERT_TRUE(client_connection);
3519 QuicConnectionPeer::SetSelfAddress(
3520 client_connection,
3521 QuicSocketAddress(client_connection->self_address().host(), new_port));
3522
3523 // Send a second request, using the new FD.
3524 SendSynchronousBarRequestAndCheckResponse();
3525
3526 // Verify that the client's ephemeral port is different.
3527 QuicSocketAddress new_address =
3528 client_->client()->network_helper()->GetLatestClientAddress();
3529 EXPECT_EQ(old_address.host(), new_address.host());
3530 EXPECT_NE(old_address.port(), new_address.port());
3531
3532 if (!version_.HasIetfQuicFrames() ||
3533 !GetClientConnection()->validate_client_address()) {
3534 return;
3535 }
3536
3537 server_thread_->Pause();
3538 QuicConnection* server_connection = GetServerConnection();
3539 if (server_connection != nullptr) {
3540 EXPECT_FALSE(server_connection->HasPendingPathValidation());
3541 EXPECT_EQ(1u, server_connection->GetStats().num_validated_peer_migration);
3542 } else {
3543 ADD_FAILURE() << "Missing server connection";
3544 }
3545 server_thread_->Resume();
3546 }
3547
TEST_P(EndToEndTest,NegotiatedInitialCongestionWindow)3548 TEST_P(EndToEndTest, NegotiatedInitialCongestionWindow) {
3549 client_extra_copts_.push_back(kIW03);
3550
3551 ASSERT_TRUE(Initialize());
3552
3553 // Values are exchanged during crypto handshake, so wait for that to finish.
3554 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
3555 server_thread_->WaitForCryptoHandshakeConfirmed();
3556 server_thread_->Pause();
3557 QuicConnection* server_connection = GetServerConnection();
3558 if (server_connection != nullptr) {
3559 QuicPacketCount cwnd =
3560 server_connection->sent_packet_manager().initial_congestion_window();
3561 EXPECT_EQ(3u, cwnd);
3562 } else {
3563 ADD_FAILURE() << "Missing server connection";
3564 }
3565 server_thread_->Resume();
3566 }
3567
TEST_P(EndToEndTest,DifferentFlowControlWindows)3568 TEST_P(EndToEndTest, DifferentFlowControlWindows) {
3569 // Client and server can set different initial flow control receive windows.
3570 // These are sent in CHLO/SHLO. Tests that these values are exchanged properly
3571 // in the crypto handshake.
3572 const uint32_t kClientStreamIFCW = 123456;
3573 const uint32_t kClientSessionIFCW = 234567;
3574 set_client_initial_stream_flow_control_receive_window(kClientStreamIFCW);
3575 set_client_initial_session_flow_control_receive_window(kClientSessionIFCW);
3576
3577 uint32_t kServerStreamIFCW = 32 * 1024;
3578 uint32_t kServerSessionIFCW = 48 * 1024;
3579 set_server_initial_stream_flow_control_receive_window(kServerStreamIFCW);
3580 set_server_initial_session_flow_control_receive_window(kServerSessionIFCW);
3581
3582 ASSERT_TRUE(Initialize());
3583
3584 // Values are exchanged during crypto handshake, so wait for that to finish.
3585 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
3586 server_thread_->WaitForCryptoHandshakeConfirmed();
3587
3588 // Open a data stream to make sure the stream level flow control is updated.
3589 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
3590 WriteHeadersOnStream(stream);
3591 stream->WriteOrBufferBody("hello", false);
3592
3593 if (!version_.UsesTls()) {
3594 // IFWA only exists with QUIC_CRYPTO.
3595 // Client should have the right values for server's receive window.
3596 ASSERT_TRUE(client_->client()
3597 ->client_session()
3598 ->config()
3599 ->HasReceivedInitialStreamFlowControlWindowBytes());
3600 EXPECT_EQ(kServerStreamIFCW,
3601 client_->client()
3602 ->client_session()
3603 ->config()
3604 ->ReceivedInitialStreamFlowControlWindowBytes());
3605 ASSERT_TRUE(client_->client()
3606 ->client_session()
3607 ->config()
3608 ->HasReceivedInitialSessionFlowControlWindowBytes());
3609 EXPECT_EQ(kServerSessionIFCW,
3610 client_->client()
3611 ->client_session()
3612 ->config()
3613 ->ReceivedInitialSessionFlowControlWindowBytes());
3614 }
3615 EXPECT_EQ(kServerStreamIFCW, QuicStreamPeer::SendWindowOffset(stream));
3616 QuicSpdyClientSession* client_session = GetClientSession();
3617 ASSERT_TRUE(client_session);
3618 EXPECT_EQ(kServerSessionIFCW, QuicFlowControllerPeer::SendWindowOffset(
3619 client_session->flow_controller()));
3620
3621 // Server should have the right values for client's receive window.
3622 server_thread_->Pause();
3623 QuicSpdySession* server_session = GetServerSession();
3624 if (server_session == nullptr) {
3625 ADD_FAILURE() << "Missing server session";
3626 server_thread_->Resume();
3627 return;
3628 }
3629 QuicConfig server_config = *server_session->config();
3630 EXPECT_EQ(kClientSessionIFCW, QuicFlowControllerPeer::SendWindowOffset(
3631 server_session->flow_controller()));
3632 server_thread_->Resume();
3633 if (version_.UsesTls()) {
3634 // IFWA only exists with QUIC_CRYPTO.
3635 return;
3636 }
3637 ASSERT_TRUE(server_config.HasReceivedInitialStreamFlowControlWindowBytes());
3638 EXPECT_EQ(kClientStreamIFCW,
3639 server_config.ReceivedInitialStreamFlowControlWindowBytes());
3640 ASSERT_TRUE(server_config.HasReceivedInitialSessionFlowControlWindowBytes());
3641 EXPECT_EQ(kClientSessionIFCW,
3642 server_config.ReceivedInitialSessionFlowControlWindowBytes());
3643 }
3644
3645 // Test negotiation of IFWA connection option.
TEST_P(EndToEndTest,NegotiatedServerInitialFlowControlWindow)3646 TEST_P(EndToEndTest, NegotiatedServerInitialFlowControlWindow) {
3647 const uint32_t kClientStreamIFCW = 123456;
3648 const uint32_t kClientSessionIFCW = 234567;
3649 set_client_initial_stream_flow_control_receive_window(kClientStreamIFCW);
3650 set_client_initial_session_flow_control_receive_window(kClientSessionIFCW);
3651
3652 uint32_t kServerStreamIFCW = 32 * 1024;
3653 uint32_t kServerSessionIFCW = 48 * 1024;
3654 set_server_initial_stream_flow_control_receive_window(kServerStreamIFCW);
3655 set_server_initial_session_flow_control_receive_window(kServerSessionIFCW);
3656
3657 // Bump the window.
3658 const uint32_t kExpectedStreamIFCW = 1024 * 1024;
3659 const uint32_t kExpectedSessionIFCW = 1.5 * 1024 * 1024;
3660 client_extra_copts_.push_back(kIFWA);
3661
3662 ASSERT_TRUE(Initialize());
3663
3664 // Values are exchanged during crypto handshake, so wait for that to finish.
3665 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
3666 server_thread_->WaitForCryptoHandshakeConfirmed();
3667
3668 // Open a data stream to make sure the stream level flow control is updated.
3669 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
3670 WriteHeadersOnStream(stream);
3671 stream->WriteOrBufferBody("hello", false);
3672
3673 QuicSpdyClientSession* client_session = GetClientSession();
3674 ASSERT_TRUE(client_session);
3675
3676 if (!version_.UsesTls()) {
3677 // IFWA only exists with QUIC_CRYPTO.
3678 // Client should have the right values for server's receive window.
3679 ASSERT_TRUE(client_session->config()
3680 ->HasReceivedInitialStreamFlowControlWindowBytes());
3681 EXPECT_EQ(kExpectedStreamIFCW,
3682 client_session->config()
3683 ->ReceivedInitialStreamFlowControlWindowBytes());
3684 ASSERT_TRUE(client_session->config()
3685 ->HasReceivedInitialSessionFlowControlWindowBytes());
3686 EXPECT_EQ(kExpectedSessionIFCW,
3687 client_session->config()
3688 ->ReceivedInitialSessionFlowControlWindowBytes());
3689 }
3690 EXPECT_EQ(kExpectedStreamIFCW, QuicStreamPeer::SendWindowOffset(stream));
3691 EXPECT_EQ(kExpectedSessionIFCW, QuicFlowControllerPeer::SendWindowOffset(
3692 client_session->flow_controller()));
3693 }
3694
TEST_P(EndToEndTest,HeadersAndCryptoStreamsNoConnectionFlowControl)3695 TEST_P(EndToEndTest, HeadersAndCryptoStreamsNoConnectionFlowControl) {
3696 // The special headers and crypto streams should be subject to per-stream flow
3697 // control limits, but should not be subject to connection level flow control
3698 const uint32_t kStreamIFCW = 32 * 1024;
3699 const uint32_t kSessionIFCW = 48 * 1024;
3700 set_client_initial_stream_flow_control_receive_window(kStreamIFCW);
3701 set_client_initial_session_flow_control_receive_window(kSessionIFCW);
3702 set_server_initial_stream_flow_control_receive_window(kStreamIFCW);
3703 set_server_initial_session_flow_control_receive_window(kSessionIFCW);
3704
3705 ASSERT_TRUE(Initialize());
3706
3707 // Wait for crypto handshake to finish. This should have contributed to the
3708 // crypto stream flow control window, but not affected the session flow
3709 // control window.
3710 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
3711 server_thread_->WaitForCryptoHandshakeConfirmed();
3712
3713 QuicSpdyClientSession* client_session = GetClientSession();
3714 ASSERT_TRUE(client_session);
3715 QuicCryptoStream* crypto_stream =
3716 QuicSessionPeer::GetMutableCryptoStream(client_session);
3717 ASSERT_TRUE(crypto_stream);
3718 // In v47 and later, the crypto handshake (sent in CRYPTO frames) is not
3719 // subject to flow control.
3720 if (!version_.UsesCryptoFrames()) {
3721 EXPECT_LT(QuicStreamPeer::SendWindowSize(crypto_stream), kStreamIFCW);
3722 }
3723 // When stream type is enabled, control streams will send settings and
3724 // contribute to flow control windows, so this expectation is no longer valid.
3725 if (!version_.UsesHttp3()) {
3726 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::SendWindowSize(
3727 client_session->flow_controller()));
3728 }
3729
3730 // Send a request with no body, and verify that the connection level window
3731 // has not been affected.
3732 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
3733
3734 // No headers stream in IETF QUIC.
3735 if (version_.UsesHttp3()) {
3736 return;
3737 }
3738
3739 QuicHeadersStream* headers_stream =
3740 QuicSpdySessionPeer::GetHeadersStream(client_session);
3741 ASSERT_TRUE(headers_stream);
3742 EXPECT_LT(QuicStreamPeer::SendWindowSize(headers_stream), kStreamIFCW);
3743 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::SendWindowSize(
3744 client_session->flow_controller()));
3745
3746 // Server should be in a similar state: connection flow control window should
3747 // not have any bytes marked as received.
3748 server_thread_->Pause();
3749 QuicSession* server_session = GetServerSession();
3750 if (server_session != nullptr) {
3751 QuicFlowController* server_connection_flow_controller =
3752 server_session->flow_controller();
3753 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::ReceiveWindowSize(
3754 server_connection_flow_controller));
3755 } else {
3756 ADD_FAILURE() << "Missing server session";
3757 }
3758 server_thread_->Resume();
3759 }
3760
TEST_P(EndToEndTest,FlowControlsSynced)3761 TEST_P(EndToEndTest, FlowControlsSynced) {
3762 set_smaller_flow_control_receive_window();
3763
3764 ASSERT_TRUE(Initialize());
3765
3766 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
3767 server_thread_->WaitForCryptoHandshakeConfirmed();
3768
3769 QuicSpdySession* const client_session = GetClientSession();
3770 ASSERT_TRUE(client_session);
3771
3772 if (version_.UsesHttp3()) {
3773 // Make sure that the client has received the initial SETTINGS frame, which
3774 // is sent in the first packet on the control stream.
3775 while (!QuicSpdySessionPeer::GetReceiveControlStream(client_session)) {
3776 client_->client()->WaitForEvents();
3777 ASSERT_TRUE(client_->connected());
3778 }
3779 }
3780
3781 // Make sure that all data sent by the client has been received by the server
3782 // (and the ack received by the client).
3783 while (client_session->HasUnackedStreamData()) {
3784 client_->client()->WaitForEvents();
3785 ASSERT_TRUE(client_->connected());
3786 }
3787
3788 server_thread_->Pause();
3789
3790 QuicSpdySession* const server_session = GetServerSession();
3791 if (server_session == nullptr) {
3792 ADD_FAILURE() << "Missing server session";
3793 server_thread_->Resume();
3794 return;
3795 }
3796 ExpectFlowControlsSynced(client_session, server_session);
3797
3798 // Check control streams.
3799 if (version_.UsesHttp3()) {
3800 ExpectFlowControlsSynced(
3801 QuicSpdySessionPeer::GetReceiveControlStream(client_session),
3802 QuicSpdySessionPeer::GetSendControlStream(server_session));
3803 ExpectFlowControlsSynced(
3804 QuicSpdySessionPeer::GetSendControlStream(client_session),
3805 QuicSpdySessionPeer::GetReceiveControlStream(server_session));
3806 }
3807
3808 // Check crypto stream.
3809 if (!version_.UsesCryptoFrames()) {
3810 ExpectFlowControlsSynced(
3811 QuicSessionPeer::GetMutableCryptoStream(client_session),
3812 QuicSessionPeer::GetMutableCryptoStream(server_session));
3813 }
3814
3815 // Check headers stream.
3816 if (!version_.UsesHttp3()) {
3817 SpdyFramer spdy_framer(SpdyFramer::ENABLE_COMPRESSION);
3818 SpdySettingsIR settings_frame;
3819 settings_frame.AddSetting(spdy::SETTINGS_MAX_HEADER_LIST_SIZE,
3820 kDefaultMaxUncompressedHeaderSize);
3821 SpdySerializedFrame frame(spdy_framer.SerializeFrame(settings_frame));
3822
3823 QuicHeadersStream* client_header_stream =
3824 QuicSpdySessionPeer::GetHeadersStream(client_session);
3825 QuicHeadersStream* server_header_stream =
3826 QuicSpdySessionPeer::GetHeadersStream(server_session);
3827 // Both client and server are sending this SETTINGS frame, and the send
3828 // window is consumed. But because of timing issue, the server may send or
3829 // not send the frame, and the client may send/ not send / receive / not
3830 // receive the frame.
3831 // TODO(fayang): Rewrite this part because it is hacky.
3832 QuicByteCount win_difference1 =
3833 QuicStreamPeer::ReceiveWindowSize(server_header_stream) -
3834 QuicStreamPeer::SendWindowSize(client_header_stream);
3835 if (win_difference1 != 0) {
3836 EXPECT_EQ(frame.size(), win_difference1);
3837 }
3838
3839 QuicByteCount win_difference2 =
3840 QuicStreamPeer::ReceiveWindowSize(client_header_stream) -
3841 QuicStreamPeer::SendWindowSize(server_header_stream);
3842 if (win_difference2 != 0) {
3843 EXPECT_EQ(frame.size(), win_difference2);
3844 }
3845
3846 // Client *may* have received the SETTINGs frame.
3847 // TODO(fayang): Rewrite this part because it is hacky.
3848 float ratio1 = static_cast<float>(QuicFlowControllerPeer::ReceiveWindowSize(
3849 client_session->flow_controller())) /
3850 QuicStreamPeer::ReceiveWindowSize(
3851 QuicSpdySessionPeer::GetHeadersStream(client_session));
3852 float ratio2 = static_cast<float>(QuicFlowControllerPeer::ReceiveWindowSize(
3853 client_session->flow_controller())) /
3854 (QuicStreamPeer::ReceiveWindowSize(
3855 QuicSpdySessionPeer::GetHeadersStream(client_session)) +
3856 frame.size());
3857 EXPECT_TRUE(ratio1 == kSessionToStreamRatio ||
3858 ratio2 == kSessionToStreamRatio);
3859 }
3860
3861 server_thread_->Resume();
3862 }
3863
TEST_P(EndToEndTest,RequestWithNoBodyWillNeverSendStreamFrameWithFIN)3864 TEST_P(EndToEndTest, RequestWithNoBodyWillNeverSendStreamFrameWithFIN) {
3865 // A stream created on receipt of a simple request with no body will never get
3866 // a stream frame with a FIN. Verify that we don't keep track of the stream in
3867 // the locally closed streams map: it will never be removed if so.
3868 ASSERT_TRUE(Initialize());
3869
3870 // Send a simple headers only request, and receive response.
3871 SendSynchronousFooRequestAndCheckResponse();
3872
3873 // Now verify that the server is not waiting for a final FIN or RST.
3874 server_thread_->Pause();
3875 QuicSession* server_session = GetServerSession();
3876 if (server_session != nullptr) {
3877 EXPECT_EQ(0u, QuicSessionPeer::GetLocallyClosedStreamsHighestOffset(
3878 server_session)
3879 .size());
3880 } else {
3881 ADD_FAILURE() << "Missing server session";
3882 }
3883 server_thread_->Resume();
3884 }
3885
3886 // TestAckListener counts how many bytes are acked during its lifetime.
3887 class TestAckListener : public QuicAckListenerInterface {
3888 public:
TestAckListener()3889 TestAckListener() {}
3890
OnPacketAcked(int acked_bytes,QuicTime::Delta)3891 void OnPacketAcked(int acked_bytes,
3892 QuicTime::Delta /*delta_largest_observed*/) override {
3893 total_bytes_acked_ += acked_bytes;
3894 }
3895
OnPacketRetransmitted(int)3896 void OnPacketRetransmitted(int /*retransmitted_bytes*/) override {}
3897
total_bytes_acked() const3898 int total_bytes_acked() const { return total_bytes_acked_; }
3899
3900 protected:
3901 // Object is ref counted.
~TestAckListener()3902 ~TestAckListener() override {}
3903
3904 private:
3905 int total_bytes_acked_ = 0;
3906 };
3907
3908 class TestResponseListener : public QuicSpdyClientBase::ResponseListener {
3909 public:
OnCompleteResponse(QuicStreamId id,const Http2HeaderBlock & response_headers,absl::string_view response_body)3910 void OnCompleteResponse(QuicStreamId id,
3911 const Http2HeaderBlock& response_headers,
3912 absl::string_view response_body) override {
3913 QUIC_DVLOG(1) << "response for stream " << id << " "
3914 << response_headers.DebugString() << "\n"
3915 << response_body;
3916 }
3917 };
3918
TEST_P(EndToEndTest,AckNotifierWithPacketLossAndBlockedSocket)3919 TEST_P(EndToEndTest, AckNotifierWithPacketLossAndBlockedSocket) {
3920 // Verify that even in the presence of packet loss and occasionally blocked
3921 // socket, an AckNotifierDelegate will get informed that the data it is
3922 // interested in has been ACKed. This tests end-to-end ACK notification, and
3923 // demonstrates that retransmissions do not break this functionality.
3924 // Disable blackhole detection as this test is testing loss recovery.
3925 client_extra_copts_.push_back(kNBHD);
3926 SetPacketLossPercentage(5);
3927 ASSERT_TRUE(Initialize());
3928 // Wait for the server SHLO before upping the packet loss.
3929 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
3930 SetPacketLossPercentage(30);
3931 client_writer_->set_fake_blocked_socket_percentage(10);
3932
3933 // Wait for SETTINGS frame from server that sets QPACK dynamic table capacity
3934 // to make sure request headers will be compressed using the dynamic table.
3935 if (version_.UsesHttp3()) {
3936 while (true) {
3937 // Waits for up to 50 ms.
3938 client_->client()->WaitForEvents();
3939 ASSERT_TRUE(client_->connected());
3940 QuicSpdyClientSession* client_session = GetClientSession();
3941 if (client_session == nullptr) {
3942 ADD_FAILURE() << "Missing client session";
3943 return;
3944 }
3945 QpackEncoder* qpack_encoder = client_session->qpack_encoder();
3946 if (qpack_encoder == nullptr) {
3947 ADD_FAILURE() << "Missing QPACK encoder";
3948 return;
3949 }
3950 QpackEncoderHeaderTable* header_table =
3951 QpackEncoderPeer::header_table(qpack_encoder);
3952 if (header_table == nullptr) {
3953 ADD_FAILURE() << "Missing header table";
3954 return;
3955 }
3956 if (header_table->dynamic_table_capacity() > 0) {
3957 break;
3958 }
3959 }
3960 }
3961
3962 // Create a POST request and send the headers only.
3963 Http2HeaderBlock headers;
3964 headers[":method"] = "POST";
3965 headers[":path"] = "/foo";
3966 headers[":scheme"] = "https";
3967 headers[":authority"] = server_hostname_;
3968
3969 // Here, we have to specify flush=false, otherwise we risk a race condition in
3970 // which the headers are sent and acknowledged before the ack notifier is
3971 // installed.
3972 client_->SendMessage(headers, "", /*fin=*/false, /*flush=*/false);
3973
3974 // Size of headers on the request stream. This is zero if headers are sent on
3975 // the header stream.
3976 size_t header_size = 0;
3977 if (version_.UsesHttp3()) {
3978 // Determine size of headers after QPACK compression.
3979 NoopDecoderStreamErrorDelegate decoder_stream_error_delegate;
3980 NoopQpackStreamSenderDelegate encoder_stream_sender_delegate;
3981 QpackEncoder qpack_encoder(&decoder_stream_error_delegate);
3982 qpack_encoder.set_qpack_stream_sender_delegate(
3983 &encoder_stream_sender_delegate);
3984
3985 qpack_encoder.SetMaximumDynamicTableCapacity(
3986 kDefaultQpackMaxDynamicTableCapacity);
3987 qpack_encoder.SetDynamicTableCapacity(kDefaultQpackMaxDynamicTableCapacity);
3988 qpack_encoder.SetMaximumBlockedStreams(kDefaultMaximumBlockedStreams);
3989
3990 std::string encoded_headers = qpack_encoder.EncodeHeaderList(
3991 /* stream_id = */ 0, headers, nullptr);
3992 header_size = encoded_headers.size();
3993 }
3994
3995 // Test the AckNotifier's ability to track multiple packets by making the
3996 // request body exceed the size of a single packet.
3997 std::string request_string = "a request body bigger than one packet" +
3998 std::string(kMaxOutgoingPacketSize, '.');
3999
4000 const int expected_bytes_acked = header_size + request_string.length();
4001
4002 // The TestAckListener will cause a failure if not notified.
4003 quiche::QuicheReferenceCountedPointer<TestAckListener> ack_listener(
4004 new TestAckListener());
4005
4006 // Send the request, and register the delegate for ACKs.
4007 client_->SendData(request_string, true, ack_listener);
4008 WaitForFooResponseAndCheckIt();
4009
4010 // Send another request to flush out any pending ACKs on the server.
4011 SendSynchronousBarRequestAndCheckResponse();
4012
4013 // Make sure the delegate does get the notification it expects.
4014 int attempts = 0;
4015 constexpr int kMaxAttempts = 20;
4016 while (ack_listener->total_bytes_acked() < expected_bytes_acked) {
4017 // Waits for up to 50 ms.
4018 client_->client()->WaitForEvents();
4019 ASSERT_TRUE(client_->connected());
4020 if (++attempts >= kMaxAttempts) {
4021 break;
4022 }
4023 }
4024 EXPECT_EQ(ack_listener->total_bytes_acked(), expected_bytes_acked)
4025 << " header_size " << header_size << " request length "
4026 << request_string.length();
4027 }
4028
4029 // Send a public reset from the server.
TEST_P(EndToEndTest,ServerSendPublicReset)4030 TEST_P(EndToEndTest, ServerSendPublicReset) {
4031 ASSERT_TRUE(Initialize());
4032
4033 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4034 QuicSpdySession* client_session = GetClientSession();
4035 ASSERT_TRUE(client_session);
4036 QuicConfig* config = client_session->config();
4037 ASSERT_TRUE(config);
4038 EXPECT_TRUE(config->HasReceivedStatelessResetToken());
4039 StatelessResetToken stateless_reset_token =
4040 config->ReceivedStatelessResetToken();
4041
4042 // Send the public reset.
4043 QuicConnection* client_connection = GetClientConnection();
4044 ASSERT_TRUE(client_connection);
4045 QuicConnectionId connection_id = client_connection->connection_id();
4046 QuicPublicResetPacket header;
4047 header.connection_id = connection_id;
4048 QuicFramer framer(server_supported_versions_, QuicTime::Zero(),
4049 Perspective::IS_SERVER, kQuicDefaultConnectionIdLength);
4050 std::unique_ptr<QuicEncryptedPacket> packet;
4051 if (version_.HasIetfInvariantHeader()) {
4052 packet = framer.BuildIetfStatelessResetPacket(
4053 connection_id, /*received_packet_length=*/100, stateless_reset_token);
4054 } else {
4055 packet = framer.BuildPublicResetPacket(header);
4056 }
4057 // We must pause the server's thread in order to call WritePacket without
4058 // race conditions.
4059 server_thread_->Pause();
4060 auto client_address = client_connection->self_address();
4061 server_writer_->WritePacket(packet->data(), packet->length(),
4062 server_address_.host(), client_address, nullptr);
4063 server_thread_->Resume();
4064
4065 // The request should fail.
4066 EXPECT_EQ("", client_->SendSynchronousRequest("/foo"));
4067 EXPECT_TRUE(client_->response_headers()->empty());
4068 EXPECT_THAT(client_->connection_error(), IsError(QUIC_PUBLIC_RESET));
4069 }
4070
4071 // Send a public reset from the server for a different connection ID.
4072 // It should be ignored.
TEST_P(EndToEndTest,ServerSendPublicResetWithDifferentConnectionId)4073 TEST_P(EndToEndTest, ServerSendPublicResetWithDifferentConnectionId) {
4074 ASSERT_TRUE(Initialize());
4075
4076 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4077 QuicSpdySession* client_session = GetClientSession();
4078 ASSERT_TRUE(client_session);
4079 QuicConfig* config = client_session->config();
4080 ASSERT_TRUE(config);
4081 EXPECT_TRUE(config->HasReceivedStatelessResetToken());
4082 StatelessResetToken stateless_reset_token =
4083 config->ReceivedStatelessResetToken();
4084 // Send the public reset.
4085 QuicConnection* client_connection = GetClientConnection();
4086 ASSERT_TRUE(client_connection);
4087 QuicConnectionId incorrect_connection_id = TestConnectionId(
4088 TestConnectionIdToUInt64(client_connection->connection_id()) + 1);
4089 QuicPublicResetPacket header;
4090 header.connection_id = incorrect_connection_id;
4091 QuicFramer framer(server_supported_versions_, QuicTime::Zero(),
4092 Perspective::IS_SERVER, kQuicDefaultConnectionIdLength);
4093 std::unique_ptr<QuicEncryptedPacket> packet;
4094 NiceMock<MockQuicConnectionDebugVisitor> visitor;
4095 client_connection->set_debug_visitor(&visitor);
4096 if (version_.HasIetfInvariantHeader()) {
4097 packet = framer.BuildIetfStatelessResetPacket(
4098 incorrect_connection_id, /*received_packet_length=*/100,
4099 stateless_reset_token);
4100 EXPECT_CALL(visitor, OnIncorrectConnectionId(incorrect_connection_id))
4101 .Times(0);
4102 } else {
4103 packet = framer.BuildPublicResetPacket(header);
4104 EXPECT_CALL(visitor, OnIncorrectConnectionId(incorrect_connection_id))
4105 .Times(1);
4106 }
4107 // We must pause the server's thread in order to call WritePacket without
4108 // race conditions.
4109 server_thread_->Pause();
4110 auto client_address = client_connection->self_address();
4111 server_writer_->WritePacket(packet->data(), packet->length(),
4112 server_address_.host(), client_address, nullptr);
4113 server_thread_->Resume();
4114
4115 if (version_.HasIetfInvariantHeader()) {
4116 // The request should fail. IETF stateless reset does not include connection
4117 // ID.
4118 EXPECT_EQ("", client_->SendSynchronousRequest("/foo"));
4119 EXPECT_TRUE(client_->response_headers()->empty());
4120 EXPECT_THAT(client_->connection_error(), IsError(QUIC_PUBLIC_RESET));
4121 } else {
4122 // The connection should be unaffected.
4123 SendSynchronousFooRequestAndCheckResponse();
4124 }
4125
4126 client_connection->set_debug_visitor(nullptr);
4127 }
4128
TEST_P(EndToEndTest,InduceStatelessResetFromServer)4129 TEST_P(EndToEndTest, InduceStatelessResetFromServer) {
4130 ASSERT_TRUE(Initialize());
4131 if (!version_.HasIetfQuicFrames()) {
4132 return;
4133 }
4134 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
4135 SetPacketLossPercentage(100); // Block PEER_GOING_AWAY message from server.
4136 StopServer(true);
4137 server_writer_ = new PacketDroppingTestWriter();
4138 StartServer();
4139 SetPacketLossPercentage(0);
4140 // The request should generate a public reset.
4141 EXPECT_EQ("", client_->SendSynchronousRequest("/foo"));
4142 EXPECT_TRUE(client_->response_headers()->empty());
4143 EXPECT_THAT(client_->connection_error(), IsError(QUIC_PUBLIC_RESET));
4144 EXPECT_FALSE(client_->connected());
4145 }
4146
4147 // Send a public reset from the client for a different connection ID.
4148 // It should be ignored.
TEST_P(EndToEndTest,ClientSendPublicResetWithDifferentConnectionId)4149 TEST_P(EndToEndTest, ClientSendPublicResetWithDifferentConnectionId) {
4150 ASSERT_TRUE(Initialize());
4151
4152 // Send the public reset.
4153 QuicConnection* client_connection = GetClientConnection();
4154 ASSERT_TRUE(client_connection);
4155 QuicConnectionId incorrect_connection_id = TestConnectionId(
4156 TestConnectionIdToUInt64(client_connection->connection_id()) + 1);
4157 QuicPublicResetPacket header;
4158 header.connection_id = incorrect_connection_id;
4159 QuicFramer framer(server_supported_versions_, QuicTime::Zero(),
4160 Perspective::IS_CLIENT, kQuicDefaultConnectionIdLength);
4161 std::unique_ptr<QuicEncryptedPacket> packet(
4162 framer.BuildPublicResetPacket(header));
4163 client_writer_->WritePacket(
4164 packet->data(), packet->length(),
4165 client_->client()->network_helper()->GetLatestClientAddress().host(),
4166 server_address_, nullptr);
4167
4168 // The connection should be unaffected.
4169 SendSynchronousFooRequestAndCheckResponse();
4170 }
4171
4172 // Send a version negotiation packet from the server for a different
4173 // connection ID. It should be ignored.
TEST_P(EndToEndTest,ServerSendVersionNegotiationWithDifferentConnectionId)4174 TEST_P(EndToEndTest, ServerSendVersionNegotiationWithDifferentConnectionId) {
4175 ASSERT_TRUE(Initialize());
4176
4177 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4178
4179 // Send the version negotiation packet.
4180 QuicConnection* client_connection = GetClientConnection();
4181 ASSERT_TRUE(client_connection);
4182 QuicConnectionId incorrect_connection_id = TestConnectionId(
4183 TestConnectionIdToUInt64(client_connection->connection_id()) + 1);
4184 std::unique_ptr<QuicEncryptedPacket> packet(
4185 QuicFramer::BuildVersionNegotiationPacket(
4186 incorrect_connection_id, EmptyQuicConnectionId(),
4187 version_.HasIetfInvariantHeader(),
4188 version_.HasLengthPrefixedConnectionIds(),
4189 server_supported_versions_));
4190 NiceMock<MockQuicConnectionDebugVisitor> visitor;
4191 client_connection->set_debug_visitor(&visitor);
4192 EXPECT_CALL(visitor, OnIncorrectConnectionId(incorrect_connection_id))
4193 .Times(1);
4194 // We must pause the server's thread in order to call WritePacket without
4195 // race conditions.
4196 server_thread_->Pause();
4197 server_writer_->WritePacket(
4198 packet->data(), packet->length(), server_address_.host(),
4199 client_->client()->network_helper()->GetLatestClientAddress(), nullptr);
4200 server_thread_->Resume();
4201
4202 // The connection should be unaffected.
4203 SendSynchronousFooRequestAndCheckResponse();
4204
4205 client_connection->set_debug_visitor(nullptr);
4206 }
4207
4208 // DowngradePacketWriter is a client writer which will intercept all the client
4209 // writes for |target_version| and reply to them with version negotiation
4210 // packets to attempt a version downgrade attack. Once the client has downgraded
4211 // to a different version, the writer stops intercepting. |server_thread| must
4212 // start off paused, and will be resumed once interception is done.
4213 class DowngradePacketWriter : public PacketDroppingTestWriter {
4214 public:
DowngradePacketWriter(const ParsedQuicVersion & target_version,const ParsedQuicVersionVector & supported_versions,QuicTestClient * client,QuicPacketWriter * server_writer,ServerThread * server_thread)4215 explicit DowngradePacketWriter(
4216 const ParsedQuicVersion& target_version,
4217 const ParsedQuicVersionVector& supported_versions, QuicTestClient* client,
4218 QuicPacketWriter* server_writer, ServerThread* server_thread)
4219 : target_version_(target_version),
4220 supported_versions_(supported_versions),
4221 client_(client),
4222 server_writer_(server_writer),
4223 server_thread_(server_thread) {}
~DowngradePacketWriter()4224 ~DowngradePacketWriter() override {}
4225
WritePacket(const char * buffer,size_t buf_len,const QuicIpAddress & self_address,const QuicSocketAddress & peer_address,quic::PerPacketOptions * options)4226 WriteResult WritePacket(const char* buffer, size_t buf_len,
4227 const QuicIpAddress& self_address,
4228 const QuicSocketAddress& peer_address,
4229 quic::PerPacketOptions* options) override {
4230 if (!intercept_enabled_) {
4231 return PacketDroppingTestWriter::WritePacket(
4232 buffer, buf_len, self_address, peer_address, options);
4233 }
4234 PacketHeaderFormat format;
4235 QuicLongHeaderType long_packet_type;
4236 bool version_present, has_length_prefix;
4237 QuicVersionLabel version_label;
4238 ParsedQuicVersion parsed_version = ParsedQuicVersion::Unsupported();
4239 QuicConnectionId destination_connection_id, source_connection_id;
4240 absl::optional<absl::string_view> retry_token;
4241 std::string detailed_error;
4242 if (QuicFramer::ParsePublicHeaderDispatcher(
4243 QuicEncryptedPacket(buffer, buf_len),
4244 kQuicDefaultConnectionIdLength, &format, &long_packet_type,
4245 &version_present, &has_length_prefix, &version_label,
4246 &parsed_version, &destination_connection_id, &source_connection_id,
4247 &retry_token, &detailed_error) != QUIC_NO_ERROR) {
4248 ADD_FAILURE() << "Failed to parse our own packet: " << detailed_error;
4249 return WriteResult(WRITE_STATUS_ERROR, 0);
4250 }
4251 if (!version_present || parsed_version != target_version_) {
4252 // Client is sending with another version, the attack has succeeded so we
4253 // can stop intercepting.
4254 intercept_enabled_ = false;
4255 server_thread_->Resume();
4256 // Pass the client-sent packet through.
4257 return WritePacket(buffer, buf_len, self_address, peer_address, options);
4258 }
4259 // Send a version negotiation packet.
4260 std::unique_ptr<QuicEncryptedPacket> packet(
4261 QuicFramer::BuildVersionNegotiationPacket(
4262 destination_connection_id, source_connection_id,
4263 parsed_version.HasIetfInvariantHeader(), has_length_prefix,
4264 supported_versions_));
4265 server_writer_->WritePacket(
4266 packet->data(), packet->length(), peer_address.host(),
4267 client_->client()->network_helper()->GetLatestClientAddress(), nullptr);
4268 // Drop the client-sent packet but pretend it was sent.
4269 return WriteResult(WRITE_STATUS_OK, buf_len);
4270 }
4271
4272 private:
4273 bool intercept_enabled_ = true;
4274 ParsedQuicVersion target_version_;
4275 ParsedQuicVersionVector supported_versions_;
4276 QuicTestClient* client_; // Unowned.
4277 QuicPacketWriter* server_writer_; // Unowned.
4278 ServerThread* server_thread_; // Unowned.
4279 };
4280
TEST_P(EndToEndTest,VersionNegotiationDowngradeAttackIsDetected)4281 TEST_P(EndToEndTest, VersionNegotiationDowngradeAttackIsDetected) {
4282 ParsedQuicVersion target_version = server_supported_versions_.back();
4283 if (!version_.UsesTls() || target_version == version_) {
4284 ASSERT_TRUE(Initialize());
4285 return;
4286 }
4287 connect_to_server_on_initialize_ = false;
4288 client_supported_versions_.insert(client_supported_versions_.begin(),
4289 target_version);
4290 ParsedQuicVersionVector downgrade_versions{version_};
4291 ASSERT_TRUE(Initialize());
4292 ASSERT_TRUE(server_thread_);
4293 // Pause the server thread to allow our DowngradePacketWriter to write version
4294 // negotiation packets in a thread-safe manner. It will be resumed by the
4295 // DowngradePacketWriter.
4296 server_thread_->Pause();
4297 client_.reset(new QuicTestClient(server_address_, server_hostname_,
4298 client_config_, client_supported_versions_,
4299 crypto_test_utils::ProofVerifierForTesting(),
4300 std::make_unique<QuicClientSessionCache>()));
4301 delete client_writer_;
4302 client_writer_ = new DowngradePacketWriter(target_version, downgrade_versions,
4303 client_.get(), server_writer_,
4304 server_thread_.get());
4305 client_->UseWriter(client_writer_);
4306 // Have the client attempt to send a request.
4307 client_->Connect();
4308 EXPECT_TRUE(client_->SendSynchronousRequest("/foo").empty());
4309 // Make sure the downgrade is detected and the handshake fails.
4310 EXPECT_THAT(client_->connection_error(), IsError(QUIC_HANDSHAKE_FAILED));
4311 }
4312
4313 // A bad header shouldn't tear down the connection, because the receiver can't
4314 // tell the connection ID.
TEST_P(EndToEndTest,BadPacketHeaderTruncated)4315 TEST_P(EndToEndTest, BadPacketHeaderTruncated) {
4316 ASSERT_TRUE(Initialize());
4317
4318 // Start the connection.
4319 SendSynchronousFooRequestAndCheckResponse();
4320
4321 // Packet with invalid public flags.
4322 char packet[] = {// public flags (8 byte connection_id)
4323 0x3C,
4324 // truncated connection ID
4325 0x11};
4326 client_writer_->WritePacket(
4327 &packet[0], sizeof(packet),
4328 client_->client()->network_helper()->GetLatestClientAddress().host(),
4329 server_address_, nullptr);
4330 EXPECT_TRUE(server_thread_->WaitUntil(
4331 [&] {
4332 return QuicDispatcherPeer::GetAndClearLastError(
4333 QuicServerPeer::GetDispatcher(server_thread_->server())) ==
4334 QUIC_INVALID_PACKET_HEADER;
4335 },
4336 QuicTime::Delta::FromSeconds(5)));
4337
4338 // The connection should not be terminated.
4339 SendSynchronousFooRequestAndCheckResponse();
4340 }
4341
4342 // A bad header shouldn't tear down the connection, because the receiver can't
4343 // tell the connection ID.
TEST_P(EndToEndTest,BadPacketHeaderFlags)4344 TEST_P(EndToEndTest, BadPacketHeaderFlags) {
4345 ASSERT_TRUE(Initialize());
4346
4347 // Start the connection.
4348 SendSynchronousFooRequestAndCheckResponse();
4349
4350 // Packet with invalid public flags.
4351 uint8_t packet[] = {
4352 // invalid public flags
4353 0xFF,
4354 // connection_id
4355 0x10,
4356 0x32,
4357 0x54,
4358 0x76,
4359 0x98,
4360 0xBA,
4361 0xDC,
4362 0xFE,
4363 // packet sequence number
4364 0xBC,
4365 0x9A,
4366 0x78,
4367 0x56,
4368 0x34,
4369 0x12,
4370 // private flags
4371 0x00,
4372 };
4373 client_writer_->WritePacket(
4374 reinterpret_cast<const char*>(packet), sizeof(packet),
4375 client_->client()->network_helper()->GetLatestClientAddress().host(),
4376 server_address_, nullptr);
4377
4378 EXPECT_TRUE(server_thread_->WaitUntil(
4379 [&] {
4380 return QuicDispatcherPeer::GetAndClearLastError(
4381 QuicServerPeer::GetDispatcher(server_thread_->server())) ==
4382 QUIC_INVALID_PACKET_HEADER;
4383 },
4384 QuicTime::Delta::FromSeconds(5)));
4385
4386 // The connection should not be terminated.
4387 SendSynchronousFooRequestAndCheckResponse();
4388 }
4389
4390 // Send a packet from the client with bad encrypted data. The server should not
4391 // tear down the connection.
4392 // Marked as slow since it calls absl::SleepFor().
TEST_P(EndToEndTest,QUICHE_SLOW_TEST (BadEncryptedData))4393 TEST_P(EndToEndTest, QUICHE_SLOW_TEST(BadEncryptedData)) {
4394 ASSERT_TRUE(Initialize());
4395
4396 // Start the connection.
4397 SendSynchronousFooRequestAndCheckResponse();
4398
4399 QuicConnection* client_connection = GetClientConnection();
4400 ASSERT_TRUE(client_connection);
4401 std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
4402 client_connection->connection_id(), EmptyQuicConnectionId(), false, false,
4403 1, "At least 20 characters.", CONNECTION_ID_PRESENT, CONNECTION_ID_ABSENT,
4404 PACKET_4BYTE_PACKET_NUMBER));
4405 // Damage the encrypted data.
4406 std::string damaged_packet(packet->data(), packet->length());
4407 damaged_packet[30] ^= 0x01;
4408 QUIC_DLOG(INFO) << "Sending bad packet.";
4409 client_writer_->WritePacket(
4410 damaged_packet.data(), damaged_packet.length(),
4411 client_->client()->network_helper()->GetLatestClientAddress().host(),
4412 server_address_, nullptr);
4413 // Give the server time to process the packet.
4414 absl::SleepFor(absl::Seconds(1));
4415 // This error is sent to the connection's OnError (which ignores it), so the
4416 // dispatcher doesn't see it.
4417 // Pause the server so we can access the server's internals without races.
4418 server_thread_->Pause();
4419 QuicDispatcher* dispatcher =
4420 QuicServerPeer::GetDispatcher(server_thread_->server());
4421 if (dispatcher != nullptr) {
4422 EXPECT_THAT(QuicDispatcherPeer::GetAndClearLastError(dispatcher),
4423 IsQuicNoError());
4424 } else {
4425 ADD_FAILURE() << "Missing dispatcher";
4426 }
4427 server_thread_->Resume();
4428
4429 // The connection should not be terminated.
4430 SendSynchronousFooRequestAndCheckResponse();
4431 }
4432
TEST_P(EndToEndTest,CanceledStreamDoesNotBecomeZombie)4433 TEST_P(EndToEndTest, CanceledStreamDoesNotBecomeZombie) {
4434 ASSERT_TRUE(Initialize());
4435 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4436 // Lose the request.
4437 SetPacketLossPercentage(100);
4438 Http2HeaderBlock headers;
4439 headers[":method"] = "POST";
4440 headers[":path"] = "/foo";
4441 headers[":scheme"] = "https";
4442 headers[":authority"] = server_hostname_;
4443 client_->SendMessage(headers, "test_body", /*fin=*/false);
4444 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
4445
4446 // Cancel the stream.
4447 stream->Reset(QUIC_STREAM_CANCELLED);
4448 QuicSession* session = GetClientSession();
4449 ASSERT_TRUE(session);
4450 // Verify canceled stream does not become zombie.
4451 EXPECT_EQ(1u, QuicSessionPeer::closed_streams(session).size());
4452 }
4453
4454 // A test stream that gives |response_body_| as an error response body.
4455 class ServerStreamWithErrorResponseBody : public QuicSimpleServerStream {
4456 public:
ServerStreamWithErrorResponseBody(QuicStreamId id,QuicSpdySession * session,QuicSimpleServerBackend * quic_simple_server_backend,std::string response_body)4457 ServerStreamWithErrorResponseBody(
4458 QuicStreamId id, QuicSpdySession* session,
4459 QuicSimpleServerBackend* quic_simple_server_backend,
4460 std::string response_body)
4461 : QuicSimpleServerStream(id, session, BIDIRECTIONAL,
4462 quic_simple_server_backend),
4463 response_body_(std::move(response_body)) {}
4464
4465 ~ServerStreamWithErrorResponseBody() override = default;
4466
4467 protected:
SendErrorResponse()4468 void SendErrorResponse() override {
4469 QUIC_DLOG(INFO) << "Sending error response for stream " << id();
4470 Http2HeaderBlock headers;
4471 headers[":status"] = "500";
4472 headers["content-length"] = absl::StrCat(response_body_.size());
4473 // This method must call CloseReadSide to cause the test case, StopReading
4474 // is not sufficient.
4475 QuicStreamPeer::CloseReadSide(this);
4476 SendHeadersAndBody(std::move(headers), response_body_);
4477 }
4478
4479 std::string response_body_;
4480 };
4481
4482 class StreamWithErrorFactory : public QuicTestServer::StreamFactory {
4483 public:
StreamWithErrorFactory(std::string response_body)4484 explicit StreamWithErrorFactory(std::string response_body)
4485 : response_body_(std::move(response_body)) {}
4486
4487 ~StreamWithErrorFactory() override = default;
4488
CreateStream(QuicStreamId id,QuicSpdySession * session,QuicSimpleServerBackend * quic_simple_server_backend)4489 QuicSimpleServerStream* CreateStream(
4490 QuicStreamId id, QuicSpdySession* session,
4491 QuicSimpleServerBackend* quic_simple_server_backend) override {
4492 return new ServerStreamWithErrorResponseBody(
4493 id, session, quic_simple_server_backend, response_body_);
4494 }
4495
CreateStream(PendingStream *,QuicSpdySession *,QuicSimpleServerBackend *)4496 QuicSimpleServerStream* CreateStream(
4497 PendingStream* /*pending*/, QuicSpdySession* /*session*/,
4498 QuicSimpleServerBackend* /*response_cache*/) override {
4499 return nullptr;
4500 }
4501
4502 private:
4503 std::string response_body_;
4504 };
4505
4506 // A test server stream that drops all received body.
4507 class ServerStreamThatDropsBody : public QuicSimpleServerStream {
4508 public:
ServerStreamThatDropsBody(QuicStreamId id,QuicSpdySession * session,QuicSimpleServerBackend * quic_simple_server_backend)4509 ServerStreamThatDropsBody(QuicStreamId id, QuicSpdySession* session,
4510 QuicSimpleServerBackend* quic_simple_server_backend)
4511 : QuicSimpleServerStream(id, session, BIDIRECTIONAL,
4512 quic_simple_server_backend) {}
4513
4514 ~ServerStreamThatDropsBody() override = default;
4515
4516 protected:
OnBodyAvailable()4517 void OnBodyAvailable() override {
4518 while (HasBytesToRead()) {
4519 struct iovec iov;
4520 if (GetReadableRegions(&iov, 1) == 0) {
4521 // No more data to read.
4522 break;
4523 }
4524 QUIC_DVLOG(1) << "Processed " << iov.iov_len << " bytes for stream "
4525 << id();
4526 MarkConsumed(iov.iov_len);
4527 }
4528
4529 if (!sequencer()->IsClosed()) {
4530 sequencer()->SetUnblocked();
4531 return;
4532 }
4533
4534 // If the sequencer is closed, then all the body, including the fin, has
4535 // been consumed.
4536 OnFinRead();
4537
4538 if (write_side_closed() || fin_buffered()) {
4539 return;
4540 }
4541
4542 SendResponse();
4543 }
4544 };
4545
4546 class ServerStreamThatDropsBodyFactory : public QuicTestServer::StreamFactory {
4547 public:
4548 ServerStreamThatDropsBodyFactory() = default;
4549
4550 ~ServerStreamThatDropsBodyFactory() override = default;
4551
CreateStream(QuicStreamId id,QuicSpdySession * session,QuicSimpleServerBackend * quic_simple_server_backend)4552 QuicSimpleServerStream* CreateStream(
4553 QuicStreamId id, QuicSpdySession* session,
4554 QuicSimpleServerBackend* quic_simple_server_backend) override {
4555 return new ServerStreamThatDropsBody(id, session,
4556 quic_simple_server_backend);
4557 }
4558
CreateStream(PendingStream *,QuicSpdySession *,QuicSimpleServerBackend *)4559 QuicSimpleServerStream* CreateStream(
4560 PendingStream* /*pending*/, QuicSpdySession* /*session*/,
4561 QuicSimpleServerBackend* /*response_cache*/) override {
4562 return nullptr;
4563 }
4564 };
4565
4566 // A test server stream that sends response with body size greater than 4GB.
4567 class ServerStreamThatSendsHugeResponse : public QuicSimpleServerStream {
4568 public:
ServerStreamThatSendsHugeResponse(QuicStreamId id,QuicSpdySession * session,QuicSimpleServerBackend * quic_simple_server_backend,int64_t body_bytes)4569 ServerStreamThatSendsHugeResponse(
4570 QuicStreamId id, QuicSpdySession* session,
4571 QuicSimpleServerBackend* quic_simple_server_backend, int64_t body_bytes)
4572 : QuicSimpleServerStream(id, session, BIDIRECTIONAL,
4573 quic_simple_server_backend),
4574 body_bytes_(body_bytes) {}
4575
4576 ~ServerStreamThatSendsHugeResponse() override = default;
4577
4578 protected:
SendResponse()4579 void SendResponse() override {
4580 QuicBackendResponse response;
4581 std::string body(body_bytes_, 'a');
4582 response.set_body(body);
4583 SendHeadersAndBodyAndTrailers(response.headers().Clone(), response.body(),
4584 response.trailers().Clone());
4585 }
4586
4587 private:
4588 // Use a explicit int64_t rather than size_t to simulate a 64-bit server
4589 // talking to a 32-bit client.
4590 int64_t body_bytes_;
4591 };
4592
4593 class ServerStreamThatSendsHugeResponseFactory
4594 : public QuicTestServer::StreamFactory {
4595 public:
ServerStreamThatSendsHugeResponseFactory(int64_t body_bytes)4596 explicit ServerStreamThatSendsHugeResponseFactory(int64_t body_bytes)
4597 : body_bytes_(body_bytes) {}
4598
4599 ~ServerStreamThatSendsHugeResponseFactory() override = default;
4600
CreateStream(QuicStreamId id,QuicSpdySession * session,QuicSimpleServerBackend * quic_simple_server_backend)4601 QuicSimpleServerStream* CreateStream(
4602 QuicStreamId id, QuicSpdySession* session,
4603 QuicSimpleServerBackend* quic_simple_server_backend) override {
4604 return new ServerStreamThatSendsHugeResponse(
4605 id, session, quic_simple_server_backend, body_bytes_);
4606 }
4607
CreateStream(PendingStream *,QuicSpdySession *,QuicSimpleServerBackend *)4608 QuicSimpleServerStream* CreateStream(
4609 PendingStream* /*pending*/, QuicSpdySession* /*session*/,
4610 QuicSimpleServerBackend* /*response_cache*/) override {
4611 return nullptr;
4612 }
4613
4614 int64_t body_bytes_;
4615 };
4616
4617 class BlockedFrameObserver : public QuicConnectionDebugVisitor {
4618 public:
blocked_frames() const4619 std::vector<QuicBlockedFrame> blocked_frames() const {
4620 return blocked_frames_;
4621 }
4622
OnBlockedFrame(const QuicBlockedFrame & frame)4623 void OnBlockedFrame(const QuicBlockedFrame& frame) override {
4624 blocked_frames_.push_back(frame);
4625 }
4626
4627 private:
4628 std::vector<QuicBlockedFrame> blocked_frames_;
4629 };
4630
TEST_P(EndToEndTest,BlockedFrameIncludesOffset)4631 TEST_P(EndToEndTest, BlockedFrameIncludesOffset) {
4632 if (!version_.HasIetfQuicFrames()) {
4633 // For Google QUIC, the BLOCKED frame offset is ignored.
4634 Initialize();
4635 return;
4636 }
4637
4638 set_smaller_flow_control_receive_window();
4639 ASSERT_TRUE(Initialize());
4640
4641 // Observe the connection for BLOCKED frames.
4642 BlockedFrameObserver observer;
4643 QuicConnection* client_connection = GetClientConnection();
4644 ASSERT_TRUE(client_connection);
4645 client_connection->set_debug_visitor(&observer);
4646
4647 // Set the response body larger than the flow control window so the server
4648 // must receive a window update from the client before it can finish sending
4649 // it (hence, causing the server to send a BLOCKED frame)
4650 uint32_t response_body_size =
4651 client_config_.GetInitialSessionFlowControlWindowToSend() + 10;
4652 std::string response_body(response_body_size, 'a');
4653 AddToCache("/blocked", 200, response_body);
4654 SendSynchronousRequestAndCheckResponse("/blocked", response_body);
4655 client_->Disconnect();
4656
4657 ASSERT_GE(observer.blocked_frames().size(), static_cast<uint64_t>(0));
4658 for (const QuicBlockedFrame& frame : observer.blocked_frames()) {
4659 if (frame.stream_id ==
4660 QuicUtils::GetInvalidStreamId(version_.transport_version)) {
4661 // connection-level BLOCKED frame
4662 ASSERT_EQ(frame.offset,
4663 client_config_.GetInitialSessionFlowControlWindowToSend());
4664 } else {
4665 // stream-level BLOCKED frame
4666 ASSERT_EQ(frame.offset,
4667 client_config_.GetInitialStreamFlowControlWindowToSend());
4668 }
4669 }
4670
4671 client_connection->set_debug_visitor(nullptr);
4672 }
4673
TEST_P(EndToEndTest,EarlyResponseFinRecording)4674 TEST_P(EndToEndTest, EarlyResponseFinRecording) {
4675 set_smaller_flow_control_receive_window();
4676
4677 // Verify that an incoming FIN is recorded in a stream object even if the read
4678 // side has been closed. This prevents an entry from being made in
4679 // locally_close_streams_highest_offset_ (which will never be deleted).
4680 // To set up the test condition, the server must do the following in order:
4681 // start sending the response and call CloseReadSide
4682 // receive the FIN of the request
4683 // send the FIN of the response
4684
4685 // The response body must be larger than the flow control window so the server
4686 // must receive a window update from the client before it can finish sending
4687 // it.
4688 uint32_t response_body_size =
4689 2 * client_config_.GetInitialStreamFlowControlWindowToSend();
4690 std::string response_body(response_body_size, 'a');
4691
4692 StreamWithErrorFactory stream_factory(response_body);
4693 SetSpdyStreamFactory(&stream_factory);
4694
4695 ASSERT_TRUE(Initialize());
4696
4697 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4698
4699 // A POST that gets an early error response, after the headers are received
4700 // and before the body is received, due to invalid content-length.
4701 // Set an invalid content-length, so the request will receive an early 500
4702 // response.
4703 Http2HeaderBlock headers;
4704 headers[":method"] = "POST";
4705 headers[":path"] = "/garbage";
4706 headers[":scheme"] = "https";
4707 headers[":authority"] = server_hostname_;
4708 headers["content-length"] = "-1";
4709
4710 // The body must be large enough that the FIN will be in a different packet
4711 // than the end of the headers, but short enough to not require a flow control
4712 // update. This allows headers processing to trigger the error response
4713 // before the request FIN is processed but receive the request FIN before the
4714 // response is sent completely.
4715 const uint32_t kRequestBodySize = kMaxOutgoingPacketSize + 10;
4716 std::string request_body(kRequestBodySize, 'a');
4717
4718 // Send the request.
4719 client_->SendMessage(headers, request_body);
4720 client_->WaitForResponse();
4721 CheckResponseHeaders("500");
4722
4723 // Pause the server so we can access the server's internals without races.
4724 server_thread_->Pause();
4725
4726 QuicDispatcher* dispatcher =
4727 QuicServerPeer::GetDispatcher(server_thread_->server());
4728 QuicSession* server_session =
4729 QuicDispatcherPeer::GetFirstSessionIfAny(dispatcher);
4730 EXPECT_TRUE(server_session != nullptr);
4731
4732 // The stream is not waiting for the arrival of the peer's final offset.
4733 EXPECT_EQ(
4734 0u, QuicSessionPeer::GetLocallyClosedStreamsHighestOffset(server_session)
4735 .size());
4736
4737 server_thread_->Resume();
4738 }
4739
TEST_P(EndToEndTest,Trailers)4740 TEST_P(EndToEndTest, Trailers) {
4741 // Test sending and receiving HTTP/2 Trailers (trailing HEADERS frames).
4742 ASSERT_TRUE(Initialize());
4743 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4744
4745 // Set reordering to ensure that Trailers arriving before body is ok.
4746 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2));
4747 SetReorderPercentage(30);
4748
4749 // Add a response with headers, body, and trailers.
4750 const std::string kBody = "body content";
4751
4752 Http2HeaderBlock headers;
4753 headers[":status"] = "200";
4754 headers["content-length"] = absl::StrCat(kBody.size());
4755
4756 Http2HeaderBlock trailers;
4757 trailers["some-trailing-header"] = "trailing-header-value";
4758
4759 memory_cache_backend_.AddResponse(server_hostname_, "/trailer_url",
4760 std::move(headers), kBody,
4761 trailers.Clone());
4762
4763 SendSynchronousRequestAndCheckResponse("/trailer_url", kBody);
4764 EXPECT_EQ(trailers, client_->response_trailers());
4765 }
4766
4767 // TODO(fayang): this test seems to cause net_unittests timeouts :|
TEST_P(EndToEndTest,DISABLED_TestHugePostWithPacketLoss)4768 TEST_P(EndToEndTest, DISABLED_TestHugePostWithPacketLoss) {
4769 // This test tests a huge post with introduced packet loss from client to
4770 // server and body size greater than 4GB, making sure QUIC code does not break
4771 // for 32-bit builds.
4772 ServerStreamThatDropsBodyFactory stream_factory;
4773 SetSpdyStreamFactory(&stream_factory);
4774 ASSERT_TRUE(Initialize());
4775
4776 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4777 SetPacketLossPercentage(1);
4778 // To avoid storing the whole request body in memory, use a loop to repeatedly
4779 // send body size of kSizeBytes until the whole request body size is reached.
4780 const int kSizeBytes = 128 * 1024;
4781 // Request body size is 4G plus one more kSizeBytes.
4782 int64_t request_body_size_bytes = pow(2, 32) + kSizeBytes;
4783 ASSERT_LT(INT64_C(4294967296), request_body_size_bytes);
4784 std::string body(kSizeBytes, 'a');
4785
4786 Http2HeaderBlock headers;
4787 headers[":method"] = "POST";
4788 headers[":path"] = "/foo";
4789 headers[":scheme"] = "https";
4790 headers[":authority"] = server_hostname_;
4791 headers["content-length"] = absl::StrCat(request_body_size_bytes);
4792
4793 client_->SendMessage(headers, "", /*fin=*/false);
4794
4795 for (int i = 0; i < request_body_size_bytes / kSizeBytes; ++i) {
4796 bool fin = (i == request_body_size_bytes - 1);
4797 client_->SendData(std::string(body.data(), kSizeBytes), fin);
4798 client_->client()->WaitForEvents();
4799 }
4800 VerifyCleanConnection(true);
4801 }
4802
4803 // TODO(fayang): this test seems to cause net_unittests timeouts :|
TEST_P(EndToEndTest,DISABLED_TestHugeResponseWithPacketLoss)4804 TEST_P(EndToEndTest, DISABLED_TestHugeResponseWithPacketLoss) {
4805 // This test tests a huge response with introduced loss from server to client
4806 // and body size greater than 4GB, making sure QUIC code does not break for
4807 // 32-bit builds.
4808 const int kSizeBytes = 128 * 1024;
4809 int64_t response_body_size_bytes = pow(2, 32) + kSizeBytes;
4810 ASSERT_LT(4294967296, response_body_size_bytes);
4811 ServerStreamThatSendsHugeResponseFactory stream_factory(
4812 response_body_size_bytes);
4813 SetSpdyStreamFactory(&stream_factory);
4814
4815 StartServer();
4816
4817 // Use a quic client that drops received body.
4818 QuicTestClient* client =
4819 new QuicTestClient(server_address_, server_hostname_, client_config_,
4820 client_supported_versions_);
4821 client->client()->set_drop_response_body(true);
4822 client->UseWriter(client_writer_);
4823 client->Connect();
4824 client_.reset(client);
4825 QuicConnection* client_connection = GetClientConnection();
4826 ASSERT_TRUE(client_connection);
4827 client_writer_->Initialize(
4828 QuicConnectionPeer::GetHelper(client_connection),
4829 QuicConnectionPeer::GetAlarmFactory(client_connection),
4830 std::make_unique<ClientDelegate>(client_->client()));
4831 initialized_ = true;
4832 ASSERT_TRUE(client_->client()->connected());
4833
4834 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4835 SetPacketLossPercentage(1);
4836 client_->SendRequest("/huge_response");
4837 client_->WaitForResponse();
4838 VerifyCleanConnection(true);
4839 }
4840
4841 // Regression test for b/111515567
TEST_P(EndToEndTest,AgreeOnStopWaiting)4842 TEST_P(EndToEndTest, AgreeOnStopWaiting) {
4843 ASSERT_TRUE(Initialize());
4844 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4845
4846 QuicConnection* client_connection = GetClientConnection();
4847 ASSERT_TRUE(client_connection);
4848 server_thread_->Pause();
4849 QuicConnection* server_connection = GetServerConnection();
4850 if (server_connection != nullptr) {
4851 // Verify client and server connections agree on the value of
4852 // no_stop_waiting_frames.
4853 EXPECT_EQ(QuicConnectionPeer::GetNoStopWaitingFrames(client_connection),
4854 QuicConnectionPeer::GetNoStopWaitingFrames(server_connection));
4855 } else {
4856 ADD_FAILURE() << "Missing server connection";
4857 }
4858 server_thread_->Resume();
4859 }
4860
4861 // Regression test for b/111515567
TEST_P(EndToEndTest,AgreeOnStopWaitingWithNoStopWaitingOption)4862 TEST_P(EndToEndTest, AgreeOnStopWaitingWithNoStopWaitingOption) {
4863 QuicTagVector options;
4864 options.push_back(kNSTP);
4865 client_config_.SetConnectionOptionsToSend(options);
4866 ASSERT_TRUE(Initialize());
4867 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4868
4869 QuicConnection* client_connection = GetClientConnection();
4870 ASSERT_TRUE(client_connection);
4871 server_thread_->Pause();
4872 QuicConnection* server_connection = GetServerConnection();
4873 if (server_connection != nullptr) {
4874 // Verify client and server connections agree on the value of
4875 // no_stop_waiting_frames.
4876 EXPECT_EQ(QuicConnectionPeer::GetNoStopWaitingFrames(client_connection),
4877 QuicConnectionPeer::GetNoStopWaitingFrames(server_connection));
4878 } else {
4879 ADD_FAILURE() << "Missing server connection";
4880 }
4881 server_thread_->Resume();
4882 }
4883
TEST_P(EndToEndTest,ReleaseHeadersStreamBufferWhenIdle)4884 TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) {
4885 // Tests that when client side has no active request and no waiting
4886 // PUSH_PROMISE, its headers stream's sequencer buffer should be released.
4887 ASSERT_TRUE(Initialize());
4888 client_->SendSynchronousRequest("/foo");
4889 if (version_.UsesHttp3()) {
4890 return;
4891 }
4892 QuicSpdyClientSession* client_session = GetClientSession();
4893 ASSERT_TRUE(client_session);
4894 QuicHeadersStream* headers_stream =
4895 QuicSpdySessionPeer::GetHeadersStream(client_session);
4896 ASSERT_TRUE(headers_stream);
4897 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(headers_stream);
4898 ASSERT_TRUE(sequencer);
4899 EXPECT_FALSE(QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer));
4900 }
4901
4902 // A single large header value causes a different error than the total size of
4903 // headers exceeding a smaller limit, tested at EndToEndTest.LargeHeaders.
TEST_P(EndToEndTest,WayTooLongRequestHeaders)4904 TEST_P(EndToEndTest, WayTooLongRequestHeaders) {
4905 ASSERT_TRUE(Initialize());
4906
4907 Http2HeaderBlock headers;
4908 headers[":method"] = "GET";
4909 headers[":path"] = "/foo";
4910 headers[":scheme"] = "https";
4911 headers[":authority"] = server_hostname_;
4912 headers["key"] = std::string(2 * 1024 * 1024, 'a');
4913
4914 client_->SendMessage(headers, "");
4915 client_->WaitForResponse();
4916 if (version_.UsesHttp3()) {
4917 EXPECT_THAT(client_->connection_error(),
4918 IsError(QUIC_QPACK_DECOMPRESSION_FAILED));
4919 } else {
4920 EXPECT_THAT(client_->connection_error(),
4921 IsError(QUIC_HPACK_VALUE_TOO_LONG));
4922 }
4923 }
4924
4925 class WindowUpdateObserver : public QuicConnectionDebugVisitor {
4926 public:
WindowUpdateObserver()4927 WindowUpdateObserver() : num_window_update_frames_(0), num_ping_frames_(0) {}
4928
num_window_update_frames() const4929 size_t num_window_update_frames() const { return num_window_update_frames_; }
4930
num_ping_frames() const4931 size_t num_ping_frames() const { return num_ping_frames_; }
4932
OnWindowUpdateFrame(const QuicWindowUpdateFrame &,const QuicTime &)4933 void OnWindowUpdateFrame(const QuicWindowUpdateFrame& /*frame*/,
4934 const QuicTime& /*receive_time*/) override {
4935 ++num_window_update_frames_;
4936 }
4937
OnPingFrame(const QuicPingFrame &,const QuicTime::Delta)4938 void OnPingFrame(const QuicPingFrame& /*frame*/,
4939 const QuicTime::Delta /*ping_received_delay*/) override {
4940 ++num_ping_frames_;
4941 }
4942
4943 private:
4944 size_t num_window_update_frames_;
4945 size_t num_ping_frames_;
4946 };
4947
TEST_P(EndToEndTest,WindowUpdateInAck)4948 TEST_P(EndToEndTest, WindowUpdateInAck) {
4949 ASSERT_TRUE(Initialize());
4950 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4951 WindowUpdateObserver observer;
4952 QuicConnection* client_connection = GetClientConnection();
4953 ASSERT_TRUE(client_connection);
4954 client_connection->set_debug_visitor(&observer);
4955 // 100KB body.
4956 std::string body(100 * 1024, 'a');
4957 Http2HeaderBlock headers;
4958 headers[":method"] = "POST";
4959 headers[":path"] = "/foo";
4960 headers[":scheme"] = "https";
4961 headers[":authority"] = server_hostname_;
4962
4963 EXPECT_EQ(kFooResponseBody,
4964 client_->SendCustomSynchronousRequest(headers, body));
4965 client_->Disconnect();
4966 EXPECT_LT(0u, observer.num_window_update_frames());
4967 EXPECT_EQ(0u, observer.num_ping_frames());
4968 client_connection->set_debug_visitor(nullptr);
4969 }
4970
TEST_P(EndToEndTest,SendStatelessResetTokenInShlo)4971 TEST_P(EndToEndTest, SendStatelessResetTokenInShlo) {
4972 ASSERT_TRUE(Initialize());
4973 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
4974 QuicSpdyClientSession* client_session = GetClientSession();
4975 ASSERT_TRUE(client_session);
4976 QuicConfig* config = client_session->config();
4977 ASSERT_TRUE(config);
4978 EXPECT_TRUE(config->HasReceivedStatelessResetToken());
4979 QuicConnection* client_connection = client_session->connection();
4980 ASSERT_TRUE(client_connection);
4981 EXPECT_EQ(QuicUtils::GenerateStatelessResetToken(
4982 client_connection->connection_id()),
4983 config->ReceivedStatelessResetToken());
4984 client_->Disconnect();
4985 }
4986
4987 // Regression test for b/116200989.
TEST_P(EndToEndTest,SendStatelessResetIfServerConnectionClosedLocallyDuringHandshake)4988 TEST_P(EndToEndTest,
4989 SendStatelessResetIfServerConnectionClosedLocallyDuringHandshake) {
4990 connect_to_server_on_initialize_ = false;
4991 ASSERT_TRUE(Initialize());
4992
4993 ASSERT_TRUE(server_thread_);
4994 server_thread_->Pause();
4995 QuicDispatcher* dispatcher =
4996 QuicServerPeer::GetDispatcher(server_thread_->server());
4997 if (dispatcher == nullptr) {
4998 ADD_FAILURE() << "Missing dispatcher";
4999 server_thread_->Resume();
5000 return;
5001 }
5002 if (dispatcher->NumSessions() > 0) {
5003 ADD_FAILURE() << "Dispatcher session map not empty";
5004 server_thread_->Resume();
5005 return;
5006 }
5007 // Note: this writer will only used by the server connection, not the time
5008 // wait list.
5009 QuicDispatcherPeer::UseWriter(
5010 dispatcher,
5011 // This cause the first server-sent packet, a.k.a REJ, to fail.
5012 new BadPacketWriter(/*packet_causing_write_error=*/0, EPERM));
5013 server_thread_->Resume();
5014
5015 client_.reset(CreateQuicClient(client_writer_));
5016 EXPECT_EQ("", client_->SendSynchronousRequest("/foo"));
5017 EXPECT_THAT(client_->connection_error(), IsError(QUIC_HANDSHAKE_FAILED));
5018 }
5019
5020 // Regression test for b/116200989.
TEST_P(EndToEndTest,SendStatelessResetIfServerConnectionClosedLocallyAfterHandshake)5021 TEST_P(EndToEndTest,
5022 SendStatelessResetIfServerConnectionClosedLocallyAfterHandshake) {
5023 // Prevent the connection from expiring in the time wait list.
5024 SetQuicFlag(quic_time_wait_list_seconds, 10000);
5025 connect_to_server_on_initialize_ = false;
5026 ASSERT_TRUE(Initialize());
5027
5028 // big_response_body is 64K, which is about 48 full-sized packets.
5029 const size_t kBigResponseBodySize = 65536;
5030 QuicData big_response_body(new char[kBigResponseBodySize](),
5031 kBigResponseBodySize, /*owns_buffer=*/true);
5032 AddToCache("/big_response", 200, big_response_body.AsStringPiece());
5033
5034 ASSERT_TRUE(server_thread_);
5035 server_thread_->Pause();
5036 QuicDispatcher* dispatcher =
5037 QuicServerPeer::GetDispatcher(server_thread_->server());
5038 if (dispatcher == nullptr) {
5039 ADD_FAILURE() << "Missing dispatcher";
5040 server_thread_->Resume();
5041 return;
5042 }
5043 if (dispatcher->NumSessions() > 0) {
5044 ADD_FAILURE() << "Dispatcher session map not empty";
5045 server_thread_->Resume();
5046 return;
5047 }
5048 QuicDispatcherPeer::UseWriter(
5049 dispatcher,
5050 // This will cause an server write error with EPERM, while sending the
5051 // response for /big_response.
5052 new BadPacketWriter(/*packet_causing_write_error=*/20, EPERM));
5053 server_thread_->Resume();
5054
5055 client_.reset(CreateQuicClient(client_writer_));
5056
5057 // First, a /foo request with small response should succeed.
5058 SendSynchronousFooRequestAndCheckResponse();
5059
5060 // Second, a /big_response request with big response should fail.
5061 EXPECT_LT(client_->SendSynchronousRequest("/big_response").length(),
5062 kBigResponseBodySize);
5063 EXPECT_THAT(client_->connection_error(), IsError(QUIC_PUBLIC_RESET));
5064 }
5065
5066 // Regression test of b/70782529.
TEST_P(EndToEndTest,DoNotCrashOnPacketWriteError)5067 TEST_P(EndToEndTest, DoNotCrashOnPacketWriteError) {
5068 ASSERT_TRUE(Initialize());
5069 BadPacketWriter* bad_writer =
5070 new BadPacketWriter(/*packet_causing_write_error=*/5,
5071 /*error_code=*/90);
5072 std::unique_ptr<QuicTestClient> client(CreateQuicClient(bad_writer));
5073
5074 // 1 MB body.
5075 std::string body(1024 * 1024, 'a');
5076 Http2HeaderBlock headers;
5077 headers[":method"] = "POST";
5078 headers[":path"] = "/foo";
5079 headers[":scheme"] = "https";
5080 headers[":authority"] = server_hostname_;
5081
5082 client->SendCustomSynchronousRequest(headers, body);
5083 }
5084
5085 // Regression test for b/71711996. This test sends a connectivity probing packet
5086 // as its last sent packet, and makes sure the server's ACK of that packet does
5087 // not cause the client to fail.
TEST_P(EndToEndTest,LastPacketSentIsConnectivityProbing)5088 TEST_P(EndToEndTest, LastPacketSentIsConnectivityProbing) {
5089 ASSERT_TRUE(Initialize());
5090
5091 SendSynchronousFooRequestAndCheckResponse();
5092
5093 // Wait for the client's ACK (of the response) to be received by the server.
5094 client_->WaitForDelayedAcks();
5095
5096 // We are sending a connectivity probing packet from an unchanged client
5097 // address, so the server will not respond to us with a connectivity probing
5098 // packet, however the server should send an ack-only packet to us.
5099 client_->SendConnectivityProbing();
5100
5101 // Wait for the server's last ACK to be received by the client.
5102 client_->WaitForDelayedAcks();
5103 }
5104
TEST_P(EndToEndTest,PreSharedKey)5105 TEST_P(EndToEndTest, PreSharedKey) {
5106 client_config_.set_max_time_before_crypto_handshake(
5107 QuicTime::Delta::FromSeconds(5));
5108 client_config_.set_max_idle_time_before_crypto_handshake(
5109 QuicTime::Delta::FromSeconds(5));
5110 pre_shared_key_client_ = "foobar";
5111 pre_shared_key_server_ = "foobar";
5112
5113 if (version_.UsesTls()) {
5114 // TODO(b/154162689) add PSK support to QUIC+TLS.
5115 bool ok = true;
5116 EXPECT_QUIC_BUG(ok = Initialize(),
5117 "QUIC client pre-shared keys not yet supported with TLS");
5118 EXPECT_FALSE(ok);
5119 return;
5120 }
5121
5122 ASSERT_TRUE(Initialize());
5123
5124 SendSynchronousFooRequestAndCheckResponse();
5125 }
5126
5127 // TODO: reenable once we have a way to make this run faster.
TEST_P(EndToEndTest,QUIC_TEST_DISABLED_IN_CHROME (PreSharedKeyMismatch))5128 TEST_P(EndToEndTest, QUIC_TEST_DISABLED_IN_CHROME(PreSharedKeyMismatch)) {
5129 client_config_.set_max_time_before_crypto_handshake(
5130 QuicTime::Delta::FromSeconds(1));
5131 client_config_.set_max_idle_time_before_crypto_handshake(
5132 QuicTime::Delta::FromSeconds(1));
5133 pre_shared_key_client_ = "foo";
5134 pre_shared_key_server_ = "bar";
5135
5136 if (version_.UsesTls()) {
5137 // TODO(b/154162689) add PSK support to QUIC+TLS.
5138 bool ok = true;
5139 EXPECT_QUIC_BUG(ok = Initialize(),
5140 "QUIC client pre-shared keys not yet supported with TLS");
5141 EXPECT_FALSE(ok);
5142 return;
5143 }
5144
5145 // One of two things happens when Initialize() returns:
5146 // 1. Crypto handshake has completed, and it is unsuccessful. Initialize()
5147 // returns false.
5148 // 2. Crypto handshake has not completed, Initialize() returns true. The call
5149 // to WaitForCryptoHandshakeConfirmed() will wait for the handshake and
5150 // return whether it is successful.
5151 ASSERT_FALSE(Initialize() && client_->client()->WaitForOneRttKeysAvailable());
5152 EXPECT_THAT(client_->connection_error(), IsError(QUIC_HANDSHAKE_TIMEOUT));
5153 }
5154
5155 // TODO: reenable once we have a way to make this run faster.
TEST_P(EndToEndTest,QUIC_TEST_DISABLED_IN_CHROME (PreSharedKeyNoClient))5156 TEST_P(EndToEndTest, QUIC_TEST_DISABLED_IN_CHROME(PreSharedKeyNoClient)) {
5157 client_config_.set_max_time_before_crypto_handshake(
5158 QuicTime::Delta::FromSeconds(1));
5159 client_config_.set_max_idle_time_before_crypto_handshake(
5160 QuicTime::Delta::FromSeconds(1));
5161 pre_shared_key_server_ = "foobar";
5162
5163 if (version_.UsesTls()) {
5164 // TODO(b/154162689) add PSK support to QUIC+TLS.
5165 bool ok = true;
5166 EXPECT_QUIC_BUG(ok = Initialize(),
5167 "QUIC server pre-shared keys not yet supported with TLS");
5168 EXPECT_FALSE(ok);
5169 return;
5170 }
5171
5172 ASSERT_FALSE(Initialize() && client_->client()->WaitForOneRttKeysAvailable());
5173 EXPECT_THAT(client_->connection_error(), IsError(QUIC_HANDSHAKE_TIMEOUT));
5174 }
5175
5176 // TODO: reenable once we have a way to make this run faster.
TEST_P(EndToEndTest,QUIC_TEST_DISABLED_IN_CHROME (PreSharedKeyNoServer))5177 TEST_P(EndToEndTest, QUIC_TEST_DISABLED_IN_CHROME(PreSharedKeyNoServer)) {
5178 client_config_.set_max_time_before_crypto_handshake(
5179 QuicTime::Delta::FromSeconds(1));
5180 client_config_.set_max_idle_time_before_crypto_handshake(
5181 QuicTime::Delta::FromSeconds(1));
5182 pre_shared_key_client_ = "foobar";
5183
5184 if (version_.UsesTls()) {
5185 // TODO(b/154162689) add PSK support to QUIC+TLS.
5186 bool ok = true;
5187 EXPECT_QUIC_BUG(ok = Initialize(),
5188 "QUIC client pre-shared keys not yet supported with TLS");
5189 EXPECT_FALSE(ok);
5190 return;
5191 }
5192
5193 ASSERT_FALSE(Initialize() && client_->client()->WaitForOneRttKeysAvailable());
5194 EXPECT_THAT(client_->connection_error(), IsError(QUIC_HANDSHAKE_TIMEOUT));
5195 }
5196
TEST_P(EndToEndTest,RequestAndStreamRstInOnePacket)5197 TEST_P(EndToEndTest, RequestAndStreamRstInOnePacket) {
5198 // Regression test for b/80234898.
5199 ASSERT_TRUE(Initialize());
5200
5201 // INCOMPLETE_RESPONSE will cause the server to not to send the trailer
5202 // (and the FIN) after the response body.
5203 std::string response_body(1305, 'a');
5204 Http2HeaderBlock response_headers;
5205 response_headers[":status"] = absl::StrCat(200);
5206 response_headers["content-length"] = absl::StrCat(response_body.length());
5207 memory_cache_backend_.AddSpecialResponse(
5208 server_hostname_, "/test_url", std::move(response_headers), response_body,
5209 QuicBackendResponse::INCOMPLETE_RESPONSE);
5210
5211 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
5212 client_->WaitForDelayedAcks();
5213
5214 QuicConnection* client_connection = GetClientConnection();
5215 ASSERT_TRUE(client_connection);
5216 const QuicPacketCount packets_sent_before =
5217 client_connection->GetStats().packets_sent;
5218
5219 client_->SendRequestAndRstTogether("/test_url");
5220
5221 // Expect exactly one packet is sent from the block above.
5222 ASSERT_EQ(packets_sent_before + 1,
5223 client_connection->GetStats().packets_sent);
5224
5225 // Wait for the connection to become idle.
5226 client_->WaitForDelayedAcks();
5227
5228 // The real expectation is the test does not crash or timeout.
5229 EXPECT_THAT(client_->connection_error(), IsQuicNoError());
5230 }
5231
TEST_P(EndToEndTest,ResetStreamOnTtlExpires)5232 TEST_P(EndToEndTest, ResetStreamOnTtlExpires) {
5233 ASSERT_TRUE(Initialize());
5234 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
5235 SetPacketLossPercentage(30);
5236
5237 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
5238 // Set a TTL which expires immediately.
5239 stream->MaybeSetTtl(QuicTime::Delta::FromMicroseconds(1));
5240
5241 WriteHeadersOnStream(stream);
5242 // 1 MB body.
5243 std::string body(1024 * 1024, 'a');
5244 stream->WriteOrBufferBody(body, true);
5245 client_->WaitForResponse();
5246 EXPECT_THAT(client_->stream_error(), IsStreamError(QUIC_STREAM_TTL_EXPIRED));
5247 }
5248
TEST_P(EndToEndTest,SendMessages)5249 TEST_P(EndToEndTest, SendMessages) {
5250 if (!version_.SupportsMessageFrames()) {
5251 Initialize();
5252 return;
5253 }
5254 ASSERT_TRUE(Initialize());
5255 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
5256 QuicSession* client_session = GetClientSession();
5257 ASSERT_TRUE(client_session);
5258 QuicConnection* client_connection = client_session->connection();
5259 ASSERT_TRUE(client_connection);
5260
5261 SetPacketLossPercentage(30);
5262 ASSERT_GT(kMaxOutgoingPacketSize,
5263 client_session->GetCurrentLargestMessagePayload());
5264 ASSERT_LT(0, client_session->GetCurrentLargestMessagePayload());
5265
5266 std::string message_string(kMaxOutgoingPacketSize, 'a');
5267 QuicRandom* random =
5268 QuicConnectionPeer::GetHelper(client_connection)->GetRandomGenerator();
5269 {
5270 QuicConnection::ScopedPacketFlusher flusher(client_session->connection());
5271 // Verify the largest message gets successfully sent.
5272 EXPECT_EQ(MessageResult(MESSAGE_STATUS_SUCCESS, 1),
5273 client_session->SendMessage(MemSliceFromString(absl::string_view(
5274 message_string.data(),
5275 client_session->GetCurrentLargestMessagePayload()))));
5276 // Send more messages with size (0, largest_payload] until connection is
5277 // write blocked.
5278 const int kTestMaxNumberOfMessages = 100;
5279 for (size_t i = 2; i <= kTestMaxNumberOfMessages; ++i) {
5280 size_t message_length =
5281 random->RandUint64() %
5282 client_session->GetGuaranteedLargestMessagePayload() +
5283 1;
5284 MessageResult result = client_session->SendMessage(MemSliceFromString(
5285 absl::string_view(message_string.data(), message_length)));
5286 if (result.status == MESSAGE_STATUS_BLOCKED) {
5287 // Connection is write blocked.
5288 break;
5289 }
5290 EXPECT_EQ(MessageResult(MESSAGE_STATUS_SUCCESS, i), result);
5291 }
5292 }
5293
5294 client_->WaitForDelayedAcks();
5295 EXPECT_EQ(MESSAGE_STATUS_TOO_LARGE,
5296 client_session
5297 ->SendMessage(MemSliceFromString(absl::string_view(
5298 message_string.data(),
5299 client_session->GetCurrentLargestMessagePayload() + 1)))
5300 .status);
5301 EXPECT_THAT(client_->connection_error(), IsQuicNoError());
5302 }
5303
5304 class EndToEndPacketReorderingTest : public EndToEndTest {
5305 public:
CreateClientWithWriter()5306 void CreateClientWithWriter() override {
5307 QUIC_LOG(ERROR) << "create client with reorder_writer_";
5308 reorder_writer_ = new PacketReorderingWriter();
5309 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_));
5310 }
5311
SetUp()5312 void SetUp() override {
5313 // Don't initialize client writer in base class.
5314 server_writer_ = new PacketDroppingTestWriter();
5315 }
5316
5317 protected:
5318 PacketReorderingWriter* reorder_writer_;
5319 };
5320
5321 INSTANTIATE_TEST_SUITE_P(EndToEndPacketReorderingTests,
5322 EndToEndPacketReorderingTest,
5323 ::testing::ValuesIn(GetTestParams()),
5324 ::testing::PrintToStringParamName());
5325
TEST_P(EndToEndPacketReorderingTest,ReorderedConnectivityProbing)5326 TEST_P(EndToEndPacketReorderingTest, ReorderedConnectivityProbing) {
5327 ASSERT_TRUE(Initialize());
5328 if (version_.HasIetfQuicFrames()) {
5329 return;
5330 }
5331
5332 // Finish one request to make sure handshake established.
5333 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
5334
5335 // Wait for the connection to become idle, to make sure the packet gets
5336 // delayed is the connectivity probing packet.
5337 client_->WaitForDelayedAcks();
5338
5339 QuicSocketAddress old_addr =
5340 client_->client()->network_helper()->GetLatestClientAddress();
5341
5342 // Migrate socket to the new IP address.
5343 QuicIpAddress new_host = TestLoopback(2);
5344 EXPECT_NE(old_addr.host(), new_host);
5345 ASSERT_TRUE(client_->client()->MigrateSocket(new_host));
5346
5347 // Write a connectivity probing after the next /foo request.
5348 reorder_writer_->SetDelay(1);
5349 client_->SendConnectivityProbing();
5350
5351 ASSERT_TRUE(client_->MigrateSocketWithSpecifiedPort(old_addr.host(),
5352 old_addr.port()));
5353
5354 // The (delayed) connectivity probing will be sent after this request.
5355 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
5356
5357 // Send yet another request after the connectivity probing, when this request
5358 // returns, the probing is guaranteed to have been received by the server, and
5359 // the server's response to probing is guaranteed to have been received by the
5360 // client.
5361 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
5362
5363 server_thread_->Pause();
5364 QuicConnection* server_connection = GetServerConnection();
5365 if (server_connection != nullptr) {
5366 EXPECT_EQ(1u,
5367 server_connection->GetStats().num_connectivity_probing_received);
5368 } else {
5369 ADD_FAILURE() << "Missing server connection";
5370 }
5371 server_thread_->Resume();
5372
5373 // Server definitely responded to the connectivity probing. Sometime it also
5374 // sends a padded ping that is not a connectivity probing, which is recognized
5375 // as connectivity probing because client's self address is ANY.
5376 QuicConnection* client_connection = GetClientConnection();
5377 ASSERT_TRUE(client_connection);
5378 EXPECT_LE(1u,
5379 client_connection->GetStats().num_connectivity_probing_received);
5380 }
5381
5382 // A writer which holds the next packet to be sent till ReleasePacket() is
5383 // called.
5384 class PacketHoldingWriter : public QuicPacketWriterWrapper {
5385 public:
WritePacket(const char * buffer,size_t buf_len,const QuicIpAddress & self_address,const QuicSocketAddress & peer_address,PerPacketOptions * options)5386 WriteResult WritePacket(const char* buffer, size_t buf_len,
5387 const QuicIpAddress& self_address,
5388 const QuicSocketAddress& peer_address,
5389 PerPacketOptions* options) override {
5390 if (!hold_next_packet_) {
5391 return QuicPacketWriterWrapper::WritePacket(buffer, buf_len, self_address,
5392 peer_address, options);
5393 }
5394 QUIC_DLOG(INFO) << "Packet is held by the writer";
5395 packet_content_ = std::string(buffer, buf_len);
5396 self_address_ = self_address;
5397 peer_address_ = peer_address;
5398 options_ = (options == nullptr ? nullptr : options->Clone());
5399 hold_next_packet_ = false;
5400 return WriteResult(WRITE_STATUS_OK, buf_len);
5401 }
5402
HoldNextPacket()5403 void HoldNextPacket() {
5404 QUICHE_DCHECK(packet_content_.empty())
5405 << "There is already one packet on hold.";
5406 hold_next_packet_ = true;
5407 }
5408
ReleasePacket()5409 void ReleasePacket() {
5410 QUIC_DLOG(INFO) << "Release packet";
5411 ASSERT_EQ(WRITE_STATUS_OK,
5412 QuicPacketWriterWrapper::WritePacket(
5413 packet_content_.data(), packet_content_.length(),
5414 self_address_, peer_address_, options_.release())
5415 .status);
5416 packet_content_.clear();
5417 }
5418
5419 private:
5420 bool hold_next_packet_{false};
5421 std::string packet_content_;
5422 QuicIpAddress self_address_;
5423 QuicSocketAddress peer_address_;
5424 std::unique_ptr<PerPacketOptions> options_;
5425 };
5426
TEST_P(EndToEndTest,ClientValidateNewNetwork)5427 TEST_P(EndToEndTest, ClientValidateNewNetwork) {
5428 ASSERT_TRUE(Initialize());
5429 if (!version_.HasIetfQuicFrames() ||
5430 !GetClientConnection()->validate_client_address()) {
5431 return;
5432 }
5433 client_.reset(EndToEndTest::CreateQuicClient(nullptr));
5434 SendSynchronousFooRequestAndCheckResponse();
5435
5436 // Store the client IP address which was used to send the first request.
5437 QuicIpAddress old_host =
5438 client_->client()->network_helper()->GetLatestClientAddress().host();
5439
5440 // Migrate socket to the new IP address.
5441 QuicIpAddress new_host = TestLoopback(2);
5442 EXPECT_NE(old_host, new_host);
5443
5444 client_->client()->ValidateNewNetwork(new_host);
5445 // Send a request using the old socket.
5446 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar"));
5447 // Client should have received a PATH_CHALLENGE.
5448 QuicConnection* client_connection = GetClientConnection();
5449 ASSERT_TRUE(client_connection);
5450 EXPECT_EQ(1u,
5451 client_connection->GetStats().num_connectivity_probing_received);
5452
5453 // Send another request to make sure THE server will receive PATH_RESPONSE.
5454 client_->SendSynchronousRequest("/eep");
5455
5456 server_thread_->Pause();
5457 QuicConnection* server_connection = GetServerConnection();
5458 if (server_connection != nullptr) {
5459 EXPECT_EQ(1u,
5460 server_connection->GetStats().num_connectivity_probing_received);
5461 } else {
5462 ADD_FAILURE() << "Missing server connection";
5463 }
5464 server_thread_->Resume();
5465 }
5466
TEST_P(EndToEndTest,ClientMultiPortConnection)5467 TEST_P(EndToEndTest, ClientMultiPortConnection) {
5468 client_config_.SetClientConnectionOptions(QuicTagVector{kMPQC});
5469 ASSERT_TRUE(Initialize());
5470 if (!GetClientConnection()->connection_migration_use_new_cid()) {
5471 return;
5472 }
5473 client_.reset(EndToEndTest::CreateQuicClient(nullptr));
5474 QuicConnection* client_connection = GetClientConnection();
5475 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
5476 ASSERT_TRUE(stream);
5477 // Increase the probing frequency to speed up this test.
5478 client_connection->SetMultiPortProbingInterval(
5479 QuicTime::Delta::FromMilliseconds(100));
5480 SendSynchronousFooRequestAndCheckResponse();
5481 EXPECT_TRUE(client_->WaitUntil(1000, [&]() {
5482 return 1u == client_connection->GetStats().num_path_response_received;
5483 }));
5484 // Verify that the alternative path keeps sending probes periodically.
5485 EXPECT_TRUE(client_->WaitUntil(1000, [&]() {
5486 return 2u == client_connection->GetStats().num_path_response_received;
5487 }));
5488 server_thread_->Pause();
5489 QuicConnection* server_connection = GetServerConnection();
5490 // Verify that no migration has happened.
5491 if (server_connection != nullptr) {
5492 EXPECT_EQ(0u, server_connection->GetStats()
5493 .num_peer_migration_to_proactively_validated_address);
5494 }
5495 server_thread_->Resume();
5496
5497 // This will cause the next periodic probing to fail.
5498 server_writer_->set_fake_packet_loss_percentage(100);
5499 EXPECT_TRUE(client_->WaitUntil(
5500 1000, [&]() { return client_->client()->HasPendingPathValidation(); }));
5501 // Now wait for path validation to timeout.
5502 EXPECT_TRUE(client_->WaitUntil(
5503 2000, [&]() { return !client_->client()->HasPendingPathValidation(); }));
5504 server_writer_->set_fake_packet_loss_percentage(0);
5505 EXPECT_TRUE(client_->WaitUntil(1000, [&]() {
5506 return 3u == client_connection->GetStats().num_path_response_received;
5507 }));
5508 // Verify that the previous path was retired.
5509 EXPECT_EQ(1u, client_connection->GetStats().num_retire_connection_id_sent);
5510 stream->Reset(QuicRstStreamErrorCode::QUIC_STREAM_NO_ERROR);
5511 }
5512
TEST_P(EndToEndTest,ClientMultiPortMigrationOnPathDegrading)5513 TEST_P(EndToEndTest, ClientMultiPortMigrationOnPathDegrading) {
5514 client_config_.SetClientConnectionOptions(QuicTagVector{kMPQC});
5515 ASSERT_TRUE(Initialize());
5516 if (!GetClientConnection()->connection_migration_use_new_cid()) {
5517 return;
5518 }
5519 client_.reset(EndToEndTest::CreateQuicClient(nullptr));
5520 QuicConnection* client_connection = GetClientConnection();
5521 QuicSpdyClientStream* stream = client_->GetOrCreateStream();
5522 ASSERT_TRUE(stream);
5523 // Increase the probing frequency to speed up this test.
5524 client_connection->SetMultiPortProbingInterval(
5525 QuicTime::Delta::FromMilliseconds(100));
5526 SendSynchronousFooRequestAndCheckResponse();
5527 EXPECT_TRUE(client_->WaitUntil(1000, [&]() {
5528 return 1u == client_connection->GetStats().num_path_response_received;
5529 }));
5530 // Verify that the alternative path keeps sending probes periodically.
5531 EXPECT_TRUE(client_->WaitUntil(1000, [&]() {
5532 return 2u == client_connection->GetStats().num_path_response_received;
5533 }));
5534 server_thread_->Pause();
5535 QuicConnection* server_connection = GetServerConnection();
5536 // Verify that no migration has happened.
5537 if (server_connection != nullptr) {
5538 EXPECT_EQ(0u, server_connection->GetStats()
5539 .num_peer_migration_to_proactively_validated_address);
5540 }
5541 server_thread_->Resume();
5542
5543 auto original_self_addr = client_connection->self_address();
5544 // Trigger client side path degrading
5545 client_connection->OnPathDegradingDetected();
5546 EXPECT_NE(original_self_addr, client_connection->self_address());
5547
5548 // Send another request to trigger connection id retirement.
5549 SendSynchronousFooRequestAndCheckResponse();
5550 EXPECT_EQ(1u, client_connection->GetStats().num_retire_connection_id_sent);
5551 auto new_alt_path = QuicConnectionPeer::GetAlternativePath(client_connection);
5552 EXPECT_NE(client_connection->self_address(), new_alt_path->self_address);
5553
5554 stream->Reset(QuicRstStreamErrorCode::QUIC_STREAM_NO_ERROR);
5555 }
5556
TEST_P(EndToEndTest,SimpleServerPreferredAddressTest)5557 TEST_P(EndToEndTest, SimpleServerPreferredAddressTest) {
5558 use_preferred_address_ = true;
5559 ASSERT_TRUE(Initialize());
5560 if (!GetClientConnection()->connection_migration_use_new_cid()) {
5561 return;
5562 }
5563 client_.reset(CreateQuicClient(nullptr));
5564 QuicConnection* client_connection = GetClientConnection();
5565 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
5566 EXPECT_EQ(server_address_, client_connection->effective_peer_address());
5567 EXPECT_EQ(server_address_, client_connection->peer_address());
5568 EXPECT_TRUE(client_->client()->HasPendingPathValidation());
5569 QuicConnectionId server_cid1 = client_connection->connection_id();
5570
5571 SendSynchronousFooRequestAndCheckResponse();
5572 while (client_->client()->HasPendingPathValidation()) {
5573 client_->client()->WaitForEvents();
5574 }
5575 EXPECT_EQ(server_preferred_address_,
5576 client_connection->effective_peer_address());
5577 EXPECT_EQ(server_preferred_address_, client_connection->peer_address());
5578 EXPECT_NE(server_cid1, client_connection->connection_id());
5579
5580 const auto client_stats = GetClientConnection()->GetStats();
5581 EXPECT_TRUE(client_stats.server_preferred_address_validated);
5582 EXPECT_FALSE(client_stats.failed_to_validate_server_preferred_address);
5583 }
5584
TEST_P(EndToEndTest,OptimizedServerPreferredAddress)5585 TEST_P(EndToEndTest, OptimizedServerPreferredAddress) {
5586 use_preferred_address_ = true;
5587 ASSERT_TRUE(Initialize());
5588 if (!GetClientConnection()->connection_migration_use_new_cid()) {
5589 return;
5590 }
5591 client_config_.SetClientConnectionOptions(QuicTagVector{kSPA2});
5592 client_.reset(CreateQuicClient(nullptr));
5593 QuicConnection* client_connection = GetClientConnection();
5594 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
5595 EXPECT_EQ(server_address_, client_connection->effective_peer_address());
5596 EXPECT_EQ(server_address_, client_connection->peer_address());
5597 EXPECT_TRUE(client_->client()->HasPendingPathValidation());
5598 SendSynchronousFooRequestAndCheckResponse();
5599 while (client_->client()->HasPendingPathValidation()) {
5600 client_->client()->WaitForEvents();
5601 }
5602
5603 const auto client_stats = GetClientConnection()->GetStats();
5604 EXPECT_TRUE(client_stats.server_preferred_address_validated);
5605 EXPECT_FALSE(client_stats.failed_to_validate_server_preferred_address);
5606 }
5607
TEST_P(EndToEndPacketReorderingTest,ReorderedPathChallenge)5608 TEST_P(EndToEndPacketReorderingTest, ReorderedPathChallenge) {
5609 ASSERT_TRUE(Initialize());
5610 if (!version_.HasIetfQuicFrames()) {
5611 return;
5612 }
5613 client_.reset(EndToEndTest::CreateQuicClient(nullptr));
5614
5615 // Finish one request to make sure handshake established.
5616 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
5617
5618 // Wait for the connection to become idle, to make sure the packet gets
5619 // delayed is the connectivity probing packet.
5620 client_->WaitForDelayedAcks();
5621
5622 QuicSocketAddress old_addr =
5623 client_->client()->network_helper()->GetLatestClientAddress();
5624
5625 // Migrate socket to the new IP address.
5626 QuicIpAddress new_host = TestLoopback(2);
5627 EXPECT_NE(old_addr.host(), new_host);
5628
5629 // Setup writer wrapper to hold the probing packet.
5630 auto holding_writer = new PacketHoldingWriter();
5631 client_->UseWriter(holding_writer);
5632 // Write a connectivity probing after the next /foo request.
5633 holding_writer->HoldNextPacket();
5634
5635 // A packet with PATH_CHALLENGE will be held in the writer.
5636 client_->client()->ValidateNewNetwork(new_host);
5637
5638 // Send (on-hold) PATH_CHALLENGE after this request.
5639 client_->SendRequest("/foo");
5640 holding_writer->ReleasePacket();
5641
5642 client_->WaitForResponse();
5643
5644 EXPECT_EQ(kFooResponseBody, client_->response_body());
5645 // Send yet another request after the PATH_CHALLENGE, when this request
5646 // returns, the probing is guaranteed to have been received by the server, and
5647 // the server's response to probing is guaranteed to have been received by the
5648 // client.
5649 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar"));
5650
5651 // Client should have received a PATH_CHALLENGE.
5652 QuicConnection* client_connection = GetClientConnection();
5653 ASSERT_TRUE(client_connection);
5654 EXPECT_EQ(client_connection->validate_client_address() ? 1u : 0,
5655 client_connection->GetStats().num_connectivity_probing_received);
5656
5657 server_thread_->Pause();
5658 QuicConnection* server_connection = GetServerConnection();
5659 if (server_connection != nullptr) {
5660 EXPECT_EQ(1u,
5661 server_connection->GetStats().num_connectivity_probing_received);
5662 } else {
5663 ADD_FAILURE() << "Missing server connection";
5664 }
5665 server_thread_->Resume();
5666 }
5667
TEST_P(EndToEndPacketReorderingTest,PathValidationFailure)5668 TEST_P(EndToEndPacketReorderingTest, PathValidationFailure) {
5669 ASSERT_TRUE(Initialize());
5670 if (!version_.HasIetfQuicFrames()) {
5671 return;
5672 }
5673
5674 client_.reset(CreateQuicClient(nullptr));
5675 // Finish one request to make sure handshake established.
5676 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
5677
5678 // Wait for the connection to become idle, to make sure the packet gets
5679 // delayed is the connectivity probing packet.
5680 client_->WaitForDelayedAcks();
5681
5682 QuicSocketAddress old_addr = client_->client()->session()->self_address();
5683
5684 // Migrate socket to the new IP address.
5685 QuicIpAddress new_host = TestLoopback(2);
5686 EXPECT_NE(old_addr.host(), new_host);
5687
5688 // Drop PATH_RESPONSE packets to timeout the path validation.
5689 server_writer_->set_fake_packet_loss_percentage(100);
5690 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(new_host));
5691 while (client_->client()->HasPendingPathValidation()) {
5692 client_->client()->WaitForEvents();
5693 }
5694 EXPECT_EQ(old_addr, client_->client()->session()->self_address());
5695 server_writer_->set_fake_packet_loss_percentage(0);
5696 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar"));
5697
5698 server_thread_->Pause();
5699 QuicConnection* server_connection = GetServerConnection();
5700 if (server_connection != nullptr) {
5701 EXPECT_EQ(3u,
5702 server_connection->GetStats().num_connectivity_probing_received);
5703 } else {
5704 ADD_FAILURE() << "Missing server connection";
5705 }
5706 server_thread_->Resume();
5707 }
5708
TEST_P(EndToEndPacketReorderingTest,MigrateAgainAfterPathValidationFailure)5709 TEST_P(EndToEndPacketReorderingTest, MigrateAgainAfterPathValidationFailure) {
5710 ASSERT_TRUE(Initialize());
5711 if (!GetClientConnection()->connection_migration_use_new_cid()) {
5712 return;
5713 }
5714
5715 client_.reset(CreateQuicClient(nullptr));
5716 // Finish one request to make sure handshake established.
5717 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
5718
5719 // Wait for the connection to become idle, to make sure the packet gets
5720 // delayed is the connectivity probing packet.
5721 client_->WaitForDelayedAcks();
5722
5723 QuicSocketAddress addr1 = client_->client()->session()->self_address();
5724 QuicConnection* client_connection = GetClientConnection();
5725 QuicConnectionId server_cid1 = client_connection->connection_id();
5726
5727 // Migrate socket to the new IP address.
5728 QuicIpAddress host2 = TestLoopback(2);
5729 EXPECT_NE(addr1.host(), host2);
5730
5731 // Drop PATH_RESPONSE packets to timeout the path validation.
5732 server_writer_->set_fake_packet_loss_percentage(100);
5733 ASSERT_TRUE(
5734 QuicConnectionPeer::HasUnusedPeerIssuedConnectionId(client_connection));
5735
5736 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(host2));
5737
5738 QuicConnectionId server_cid2 =
5739 QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5740 client_connection);
5741 EXPECT_FALSE(server_cid2.IsEmpty());
5742 EXPECT_NE(server_cid2, server_cid1);
5743 // Wait until path validation fails at the client.
5744 while (client_->client()->HasPendingPathValidation()) {
5745 EXPECT_EQ(server_cid2,
5746 QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5747 client_connection));
5748 client_->client()->WaitForEvents();
5749 }
5750 EXPECT_EQ(addr1, client_->client()->session()->self_address());
5751 EXPECT_EQ(server_cid1, GetClientConnection()->connection_id());
5752
5753 server_writer_->set_fake_packet_loss_percentage(0);
5754 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar"));
5755
5756 WaitForNewConnectionIds();
5757 EXPECT_EQ(1u, client_connection->GetStats().num_retire_connection_id_sent);
5758 EXPECT_EQ(0u, client_connection->GetStats().num_new_connection_id_sent);
5759
5760 server_thread_->Pause();
5761 QuicConnection* server_connection = GetServerConnection();
5762 // Server has received 3 path challenges.
5763 EXPECT_EQ(3u,
5764 server_connection->GetStats().num_connectivity_probing_received);
5765 EXPECT_EQ(server_cid1, server_connection->connection_id());
5766 EXPECT_EQ(0u, server_connection->GetStats().num_retire_connection_id_sent);
5767 EXPECT_EQ(2u, server_connection->GetStats().num_new_connection_id_sent);
5768 server_thread_->Resume();
5769
5770 // Migrate socket to a new IP address again.
5771 QuicIpAddress host3 = TestLoopback(3);
5772 EXPECT_NE(addr1.host(), host3);
5773 EXPECT_NE(host2, host3);
5774
5775 WaitForNewConnectionIds();
5776 EXPECT_EQ(1u, client_connection->GetStats().num_retire_connection_id_sent);
5777 EXPECT_EQ(0u, client_connection->GetStats().num_new_connection_id_sent);
5778
5779 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(host3));
5780 QuicConnectionId server_cid3 =
5781 QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5782 client_connection);
5783 EXPECT_FALSE(server_cid3.IsEmpty());
5784 EXPECT_NE(server_cid1, server_cid3);
5785 EXPECT_NE(server_cid2, server_cid3);
5786 while (client_->client()->HasPendingPathValidation()) {
5787 client_->client()->WaitForEvents();
5788 }
5789 EXPECT_EQ(host3, client_->client()->session()->self_address().host());
5790 EXPECT_EQ(server_cid3, GetClientConnection()->connection_id());
5791 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5792 client_connection)
5793 .IsEmpty());
5794 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar"));
5795
5796 // Server should send a new connection ID to client.
5797 WaitForNewConnectionIds();
5798 EXPECT_EQ(2u, client_connection->GetStats().num_retire_connection_id_sent);
5799 EXPECT_EQ(0u, client_connection->GetStats().num_new_connection_id_sent);
5800 }
5801
TEST_P(EndToEndPacketReorderingTest,MigrateAgainAfterPathValidationFailureWithNonZeroClientCid)5802 TEST_P(EndToEndPacketReorderingTest,
5803 MigrateAgainAfterPathValidationFailureWithNonZeroClientCid) {
5804 if (!version_.SupportsClientConnectionIds()) {
5805 ASSERT_TRUE(Initialize());
5806 return;
5807 }
5808 SetQuicReloadableFlag(quic_retire_cid_on_reverse_path_validation_failure,
5809 true);
5810 override_client_connection_id_length_ = kQuicDefaultConnectionIdLength;
5811 ASSERT_TRUE(Initialize());
5812 if (!GetClientConnection()->connection_migration_use_new_cid()) {
5813 return;
5814 }
5815
5816 client_.reset(CreateQuicClient(nullptr));
5817 // Finish one request to make sure handshake established.
5818 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
5819
5820 // Wait for the connection to become idle, to make sure the packet gets
5821 // delayed is the connectivity probing packet.
5822 client_->WaitForDelayedAcks();
5823
5824 QuicSocketAddress addr1 = client_->client()->session()->self_address();
5825 QuicConnection* client_connection = GetClientConnection();
5826 QuicConnectionId server_cid1 = client_connection->connection_id();
5827 QuicConnectionId client_cid1 = client_connection->client_connection_id();
5828
5829 // Migrate socket to the new IP address.
5830 QuicIpAddress host2 = TestLoopback(2);
5831 EXPECT_NE(addr1.host(), host2);
5832
5833 // Drop PATH_RESPONSE packets to timeout the path validation.
5834 server_writer_->set_fake_packet_loss_percentage(100);
5835 ASSERT_TRUE(
5836 QuicConnectionPeer::HasUnusedPeerIssuedConnectionId(client_connection));
5837 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(host2));
5838 QuicConnectionId server_cid2 =
5839 QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5840 client_connection);
5841 EXPECT_FALSE(server_cid2.IsEmpty());
5842 EXPECT_NE(server_cid2, server_cid1);
5843 QuicConnectionId client_cid2 =
5844 QuicConnectionPeer::GetClientConnectionIdOnAlternativePath(
5845 client_connection);
5846 EXPECT_FALSE(client_cid2.IsEmpty());
5847 EXPECT_NE(client_cid2, client_cid1);
5848 while (client_->client()->HasPendingPathValidation()) {
5849 EXPECT_EQ(server_cid2,
5850 QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5851 client_connection));
5852 client_->client()->WaitForEvents();
5853 }
5854 EXPECT_EQ(addr1, client_->client()->session()->self_address());
5855 EXPECT_EQ(server_cid1, GetClientConnection()->connection_id());
5856 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5857 client_connection)
5858 .IsEmpty());
5859 server_writer_->set_fake_packet_loss_percentage(0);
5860 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar"));
5861 WaitForNewConnectionIds();
5862 EXPECT_EQ(1u, client_connection->GetStats().num_retire_connection_id_sent);
5863 EXPECT_EQ(2u, client_connection->GetStats().num_new_connection_id_sent);
5864
5865 server_thread_->Pause();
5866 QuicConnection* server_connection = GetServerConnection();
5867 if (server_connection != nullptr) {
5868 EXPECT_EQ(3u,
5869 server_connection->GetStats().num_connectivity_probing_received);
5870 EXPECT_EQ(server_cid1, server_connection->connection_id());
5871 } else {
5872 ADD_FAILURE() << "Missing server connection";
5873 }
5874 EXPECT_EQ(1u, server_connection->GetStats().num_retire_connection_id_sent);
5875 EXPECT_EQ(2u, server_connection->GetStats().num_new_connection_id_sent);
5876 server_thread_->Resume();
5877
5878 // Migrate socket to a new IP address again.
5879 QuicIpAddress host3 = TestLoopback(3);
5880 EXPECT_NE(addr1.host(), host3);
5881 EXPECT_NE(host2, host3);
5882 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(host3));
5883
5884 QuicConnectionId server_cid3 =
5885 QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5886 client_connection);
5887 EXPECT_FALSE(server_cid3.IsEmpty());
5888 EXPECT_NE(server_cid1, server_cid3);
5889 EXPECT_NE(server_cid2, server_cid3);
5890 QuicConnectionId client_cid3 =
5891 QuicConnectionPeer::GetClientConnectionIdOnAlternativePath(
5892 client_connection);
5893 EXPECT_NE(client_cid1, client_cid3);
5894 EXPECT_NE(client_cid2, client_cid3);
5895 while (client_->client()->HasPendingPathValidation()) {
5896 client_->client()->WaitForEvents();
5897 }
5898 EXPECT_EQ(host3, client_->client()->session()->self_address().host());
5899 EXPECT_EQ(server_cid3, GetClientConnection()->connection_id());
5900 EXPECT_TRUE(QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
5901 client_connection)
5902 .IsEmpty());
5903 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar"));
5904
5905 // Server should send new server connection ID to client and retires old
5906 // client connection ID.
5907 WaitForNewConnectionIds();
5908 EXPECT_EQ(2u, client_connection->GetStats().num_retire_connection_id_sent);
5909 EXPECT_EQ(3u, client_connection->GetStats().num_new_connection_id_sent);
5910 }
5911
TEST_P(EndToEndPacketReorderingTest,Buffer0RttRequest)5912 TEST_P(EndToEndPacketReorderingTest, Buffer0RttRequest) {
5913 ASSERT_TRUE(Initialize());
5914 // Finish one request to make sure handshake established.
5915 client_->SendSynchronousRequest("/foo");
5916 // Disconnect for next 0-rtt request.
5917 client_->Disconnect();
5918
5919 // Client has valid Session Ticket now. Do a 0-RTT request.
5920 // Buffer a CHLO till the request is sent out. HTTP/3 sends two packets: a
5921 // SETTINGS frame and a request.
5922 reorder_writer_->SetDelay(version_.UsesHttp3() ? 2 : 1);
5923 // Only send out a CHLO.
5924 client_->client()->Initialize();
5925
5926 // Send a request before handshake finishes.
5927 Http2HeaderBlock headers;
5928 headers[":method"] = "POST";
5929 headers[":path"] = "/bar";
5930 headers[":scheme"] = "https";
5931 headers[":authority"] = server_hostname_;
5932
5933 client_->SendMessage(headers, "");
5934 client_->WaitForResponse();
5935 EXPECT_EQ(kBarResponseBody, client_->response_body());
5936 QuicConnection* client_connection = GetClientConnection();
5937 ASSERT_TRUE(client_connection);
5938 QuicConnectionStats client_stats = client_connection->GetStats();
5939 EXPECT_EQ(0u, client_stats.packets_lost);
5940 EXPECT_TRUE(client_->client()->EarlyDataAccepted());
5941 }
5942
TEST_P(EndToEndTest,SimpleStopSendingRstStreamTest)5943 TEST_P(EndToEndTest, SimpleStopSendingRstStreamTest) {
5944 ASSERT_TRUE(Initialize());
5945
5946 // Send a request without a fin, to keep the stream open
5947 Http2HeaderBlock headers;
5948 headers[":method"] = "POST";
5949 headers[":path"] = "/foo";
5950 headers[":scheme"] = "https";
5951 headers[":authority"] = server_hostname_;
5952 client_->SendMessage(headers, "", /*fin=*/false);
5953 // Stream should be open
5954 ASSERT_NE(nullptr, client_->latest_created_stream());
5955 EXPECT_FALSE(client_->latest_created_stream()->write_side_closed());
5956 EXPECT_FALSE(
5957 QuicStreamPeer::read_side_closed(client_->latest_created_stream()));
5958
5959 // Send a RST_STREAM+STOP_SENDING on the stream
5960 // Code is not important.
5961 client_->latest_created_stream()->Reset(QUIC_BAD_APPLICATION_PAYLOAD);
5962 client_->WaitForResponse();
5963
5964 // Stream should be gone.
5965 ASSERT_EQ(nullptr, client_->latest_created_stream());
5966 }
5967
5968 class BadShloPacketWriter : public QuicPacketWriterWrapper {
5969 public:
BadShloPacketWriter(ParsedQuicVersion version)5970 BadShloPacketWriter(ParsedQuicVersion version)
5971 : error_returned_(false), version_(version) {}
~BadShloPacketWriter()5972 ~BadShloPacketWriter() override {}
5973
WritePacket(const char * buffer,size_t buf_len,const QuicIpAddress & self_address,const QuicSocketAddress & peer_address,quic::PerPacketOptions * options)5974 WriteResult WritePacket(const char* buffer, size_t buf_len,
5975 const QuicIpAddress& self_address,
5976 const QuicSocketAddress& peer_address,
5977 quic::PerPacketOptions* options) override {
5978 const WriteResult result = QuicPacketWriterWrapper::WritePacket(
5979 buffer, buf_len, self_address, peer_address, options);
5980 const uint8_t type_byte = buffer[0];
5981 if (!error_returned_ && (type_byte & FLAGS_LONG_HEADER) &&
5982 TypeByteIsServerHello(type_byte)) {
5983 QUIC_DVLOG(1) << "Return write error for packet containing ServerHello";
5984 error_returned_ = true;
5985 return WriteResult(WRITE_STATUS_ERROR, *MessageTooBigErrorCode());
5986 }
5987 return result;
5988 }
5989
TypeByteIsServerHello(uint8_t type_byte)5990 bool TypeByteIsServerHello(uint8_t type_byte) {
5991 if (version_.UsesV2PacketTypes()) {
5992 return ((type_byte & 0x30) >> 4) == 3;
5993 }
5994 if (version_.UsesQuicCrypto()) {
5995 // ENCRYPTION_ZERO_RTT packet.
5996 return ((type_byte & 0x30) >> 4) == 1;
5997 }
5998 // ENCRYPTION_HANDSHAKE packet.
5999 return ((type_byte & 0x30) >> 4) == 2;
6000 }
6001
6002 private:
6003 bool error_returned_;
6004 ParsedQuicVersion version_;
6005 };
6006
TEST_P(EndToEndTest,ConnectionCloseBeforeHandshakeComplete)6007 TEST_P(EndToEndTest, ConnectionCloseBeforeHandshakeComplete) {
6008 if (!version_.HasIetfInvariantHeader()) {
6009 // Only runs for IETF QUIC header.
6010 Initialize();
6011 return;
6012 }
6013 // This test ensures ZERO_RTT_PROTECTED connection close could close a client
6014 // which has switched to forward secure.
6015 connect_to_server_on_initialize_ = false;
6016 ASSERT_TRUE(Initialize());
6017 server_thread_->Pause();
6018 QuicDispatcher* dispatcher =
6019 QuicServerPeer::GetDispatcher(server_thread_->server());
6020 if (dispatcher == nullptr) {
6021 ADD_FAILURE() << "Missing dispatcher";
6022 server_thread_->Resume();
6023 return;
6024 }
6025 if (dispatcher->NumSessions() > 0) {
6026 ADD_FAILURE() << "Dispatcher session map not empty";
6027 server_thread_->Resume();
6028 return;
6029 }
6030 // Note: this writer will only used by the server connection, not the time
6031 // wait list.
6032 QuicDispatcherPeer::UseWriter(
6033 dispatcher,
6034 // This causes the first server sent ZERO_RTT_PROTECTED packet (i.e.,
6035 // SHLO) to be sent, but WRITE_ERROR is returned. Such that a
6036 // ZERO_RTT_PROTECTED connection close would be sent to a client with
6037 // encryption level FORWARD_SECURE.
6038 new BadShloPacketWriter(version_));
6039 server_thread_->Resume();
6040
6041 client_.reset(CreateQuicClient(client_writer_));
6042 EXPECT_EQ("", client_->SendSynchronousRequest("/foo"));
6043 // Verify ZERO_RTT_PROTECTED connection close is successfully processed by
6044 // client which switches to FORWARD_SECURE.
6045 EXPECT_THAT(client_->connection_error(), IsError(QUIC_PACKET_WRITE_ERROR));
6046 }
6047
6048 class BadShloPacketWriter2 : public QuicPacketWriterWrapper {
6049 public:
BadShloPacketWriter2(ParsedQuicVersion version)6050 BadShloPacketWriter2(ParsedQuicVersion version)
6051 : error_returned_(false), version_(version) {}
~BadShloPacketWriter2()6052 ~BadShloPacketWriter2() override {}
6053
WritePacket(const char * buffer,size_t buf_len,const QuicIpAddress & self_address,const QuicSocketAddress & peer_address,quic::PerPacketOptions * options)6054 WriteResult WritePacket(const char* buffer, size_t buf_len,
6055 const QuicIpAddress& self_address,
6056 const QuicSocketAddress& peer_address,
6057 quic::PerPacketOptions* options) override {
6058 const uint8_t type_byte = buffer[0];
6059
6060 if (type_byte & FLAGS_LONG_HEADER) {
6061 if (((type_byte & 0x30 >> 4) == (version_.UsesV2PacketTypes() ? 2 : 1)) ||
6062 ((type_byte & 0x7F) == 0x7C)) {
6063 QUIC_DVLOG(1) << "Dropping ZERO_RTT_PACKET packet";
6064 return WriteResult(WRITE_STATUS_OK, buf_len);
6065 }
6066 } else if (!error_returned_) {
6067 QUIC_DVLOG(1) << "Return write error for short header packet";
6068 error_returned_ = true;
6069 return WriteResult(WRITE_STATUS_ERROR, *MessageTooBigErrorCode());
6070 }
6071 return QuicPacketWriterWrapper::WritePacket(buffer, buf_len, self_address,
6072 peer_address, options);
6073 }
6074
6075 private:
6076 bool error_returned_;
6077 ParsedQuicVersion version_;
6078 };
6079
TEST_P(EndToEndTest,ForwardSecureConnectionClose)6080 TEST_P(EndToEndTest, ForwardSecureConnectionClose) {
6081 // This test ensures ZERO_RTT_PROTECTED connection close is sent to a client
6082 // which has ZERO_RTT_PROTECTED encryption level.
6083 connect_to_server_on_initialize_ = !version_.HasIetfInvariantHeader();
6084 ASSERT_TRUE(Initialize());
6085 if (!version_.HasIetfInvariantHeader()) {
6086 // Only runs for IETF QUIC header.
6087 return;
6088 }
6089 server_thread_->Pause();
6090 QuicDispatcher* dispatcher =
6091 QuicServerPeer::GetDispatcher(server_thread_->server());
6092 if (dispatcher == nullptr) {
6093 ADD_FAILURE() << "Missing dispatcher";
6094 server_thread_->Resume();
6095 return;
6096 }
6097 if (dispatcher->NumSessions() > 0) {
6098 ADD_FAILURE() << "Dispatcher session map not empty";
6099 server_thread_->Resume();
6100 return;
6101 }
6102 // Note: this writer will only used by the server connection, not the time
6103 // wait list.
6104 QuicDispatcherPeer::UseWriter(
6105 dispatcher,
6106 // This causes the all server sent ZERO_RTT_PROTECTED packets to be
6107 // dropped, and first short header packet causes write error.
6108 new BadShloPacketWriter2(version_));
6109 server_thread_->Resume();
6110 client_.reset(CreateQuicClient(client_writer_));
6111 EXPECT_EQ("", client_->SendSynchronousRequest("/foo"));
6112 // Verify ZERO_RTT_PROTECTED connection close is successfully processed by
6113 // client.
6114 EXPECT_THAT(client_->connection_error(), IsError(QUIC_PACKET_WRITE_ERROR));
6115 }
6116
6117 // Test that the stream id manager closes the connection if a stream
6118 // in excess of the allowed maximum.
TEST_P(EndToEndTest,TooBigStreamIdClosesConnection)6119 TEST_P(EndToEndTest, TooBigStreamIdClosesConnection) {
6120 // Has to be before version test, see EndToEndTest::TearDown()
6121 ASSERT_TRUE(Initialize());
6122 if (!version_.HasIetfQuicFrames()) {
6123 // Only runs for IETF QUIC.
6124 return;
6125 }
6126 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
6127
6128 std::string body(kMaxOutgoingPacketSize, 'a');
6129 Http2HeaderBlock headers;
6130 headers[":method"] = "POST";
6131 headers[":path"] = "/foo";
6132 headers[":scheme"] = "https";
6133 headers[":authority"] = server_hostname_;
6134
6135 // Force the client to write with a stream ID that exceeds the limit.
6136 QuicSpdySession* client_session = GetClientSession();
6137 ASSERT_TRUE(client_session);
6138 QuicStreamIdManager* stream_id_manager =
6139 QuicSessionPeer::ietf_bidirectional_stream_id_manager(client_session);
6140 ASSERT_TRUE(stream_id_manager);
6141 QuicStreamCount max_number_of_streams =
6142 stream_id_manager->outgoing_max_streams();
6143 QuicSessionPeer::SetNextOutgoingBidirectionalStreamId(
6144 client_session,
6145 GetNthClientInitiatedBidirectionalId(max_number_of_streams + 1));
6146 client_->SendCustomSynchronousRequest(headers, body);
6147 EXPECT_THAT(client_->stream_error(),
6148 IsStreamError(QUIC_STREAM_CONNECTION_ERROR));
6149 EXPECT_THAT(client_session->error(), IsError(QUIC_INVALID_STREAM_ID));
6150 EXPECT_EQ(IETF_QUIC_TRANSPORT_CONNECTION_CLOSE, client_session->close_type());
6151 EXPECT_TRUE(
6152 IS_IETF_STREAM_FRAME(client_session->transport_close_frame_type()));
6153 }
6154
TEST_P(EndToEndTest,CustomTransportParameters)6155 TEST_P(EndToEndTest, CustomTransportParameters) {
6156 if (!version_.UsesTls()) {
6157 // Custom transport parameters are only supported with TLS.
6158 ASSERT_TRUE(Initialize());
6159 return;
6160 }
6161 constexpr auto kCustomParameter =
6162 static_cast<TransportParameters::TransportParameterId>(0xff34);
6163 client_config_.custom_transport_parameters_to_send()[kCustomParameter] =
6164 "test";
6165 NiceMock<MockQuicConnectionDebugVisitor> visitor;
6166 connection_debug_visitor_ = &visitor;
6167 EXPECT_CALL(visitor, OnTransportParametersSent(_))
6168 .WillOnce(Invoke([kCustomParameter](
6169 const TransportParameters& transport_parameters) {
6170 ASSERT_NE(transport_parameters.custom_parameters.find(kCustomParameter),
6171 transport_parameters.custom_parameters.end());
6172 EXPECT_EQ(transport_parameters.custom_parameters.at(kCustomParameter),
6173 "test");
6174 }));
6175 EXPECT_CALL(visitor, OnTransportParametersReceived(_)).Times(1);
6176 ASSERT_TRUE(Initialize());
6177
6178 EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
6179
6180 server_thread_->Pause();
6181 QuicSpdySession* server_session = GetServerSession();
6182 QuicConfig* server_config = nullptr;
6183 if (server_session != nullptr) {
6184 server_config = server_session->config();
6185 } else {
6186 ADD_FAILURE() << "Missing server session";
6187 }
6188 if (server_config != nullptr) {
6189 if (server_config->received_custom_transport_parameters().find(
6190 kCustomParameter) !=
6191 server_config->received_custom_transport_parameters().end()) {
6192 EXPECT_EQ(server_config->received_custom_transport_parameters().at(
6193 kCustomParameter),
6194 "test");
6195 } else {
6196 ADD_FAILURE() << "Did not find custom parameter";
6197 }
6198 } else {
6199 ADD_FAILURE() << "Missing server config";
6200 }
6201 server_thread_->Resume();
6202 }
6203
6204 // Testing packet writer that makes a copy of the first sent packets before
6205 // sending them. Useful for tests that need access to sent packets.
6206 class CopyingPacketWriter : public PacketDroppingTestWriter {
6207 public:
CopyingPacketWriter(int num_packets_to_copy)6208 explicit CopyingPacketWriter(int num_packets_to_copy)
6209 : num_packets_to_copy_(num_packets_to_copy) {}
WritePacket(const char * buffer,size_t buf_len,const QuicIpAddress & self_address,const QuicSocketAddress & peer_address,PerPacketOptions * options)6210 WriteResult WritePacket(const char* buffer, size_t buf_len,
6211 const QuicIpAddress& self_address,
6212 const QuicSocketAddress& peer_address,
6213 PerPacketOptions* options) override {
6214 if (num_packets_to_copy_ > 0) {
6215 num_packets_to_copy_--;
6216 packets_.push_back(
6217 QuicEncryptedPacket(buffer, buf_len, /*owns_buffer=*/false).Clone());
6218 }
6219 return PacketDroppingTestWriter::WritePacket(buffer, buf_len, self_address,
6220 peer_address, options);
6221 }
6222
packets()6223 std::vector<std::unique_ptr<QuicEncryptedPacket>>& packets() {
6224 return packets_;
6225 }
6226
6227 private:
6228 int num_packets_to_copy_;
6229 std::vector<std::unique_ptr<QuicEncryptedPacket>> packets_;
6230 };
6231
TEST_P(EndToEndTest,KeyUpdateInitiatedByClient)6232 TEST_P(EndToEndTest, KeyUpdateInitiatedByClient) {
6233 if (!version_.UsesTls()) {
6234 // Key Update is only supported in TLS handshake.
6235 ASSERT_TRUE(Initialize());
6236 return;
6237 }
6238
6239 ASSERT_TRUE(Initialize());
6240
6241 SendSynchronousFooRequestAndCheckResponse();
6242 QuicConnection* client_connection = GetClientConnection();
6243 ASSERT_TRUE(client_connection);
6244 EXPECT_EQ(0u, client_connection->GetStats().key_update_count);
6245
6246 EXPECT_TRUE(
6247 client_connection->InitiateKeyUpdate(KeyUpdateReason::kLocalForTests));
6248 SendSynchronousFooRequestAndCheckResponse();
6249 EXPECT_EQ(1u, client_connection->GetStats().key_update_count);
6250
6251 SendSynchronousFooRequestAndCheckResponse();
6252 EXPECT_EQ(1u, client_connection->GetStats().key_update_count);
6253
6254 EXPECT_TRUE(
6255 client_connection->InitiateKeyUpdate(KeyUpdateReason::kLocalForTests));
6256 SendSynchronousFooRequestAndCheckResponse();
6257 EXPECT_EQ(2u, client_connection->GetStats().key_update_count);
6258
6259 server_thread_->Pause();
6260 QuicConnection* server_connection = GetServerConnection();
6261 if (server_connection) {
6262 QuicConnectionStats server_stats = server_connection->GetStats();
6263 EXPECT_EQ(2u, server_stats.key_update_count);
6264 } else {
6265 ADD_FAILURE() << "Missing server connection";
6266 }
6267 server_thread_->Resume();
6268 }
6269
TEST_P(EndToEndTest,KeyUpdateInitiatedByServer)6270 TEST_P(EndToEndTest, KeyUpdateInitiatedByServer) {
6271 if (!version_.UsesTls()) {
6272 // Key Update is only supported in TLS handshake.
6273 ASSERT_TRUE(Initialize());
6274 return;
6275 }
6276
6277 ASSERT_TRUE(Initialize());
6278
6279 SendSynchronousFooRequestAndCheckResponse();
6280 QuicConnection* client_connection = GetClientConnection();
6281 ASSERT_TRUE(client_connection);
6282 EXPECT_EQ(0u, client_connection->GetStats().key_update_count);
6283
6284 // Use WaitUntil to ensure the server had executed the key update predicate
6285 // before sending the Foo request, otherwise the test can be flaky if it
6286 // receives the Foo request before executing the key update.
6287 server_thread_->WaitUntil(
6288 [this]() {
6289 QuicConnection* server_connection = GetServerConnection();
6290 if (server_connection != nullptr) {
6291 if (!server_connection->IsKeyUpdateAllowed()) {
6292 // Server may not have received ack from client yet for the current
6293 // key phase, wait a bit and try again.
6294 return false;
6295 }
6296 EXPECT_TRUE(server_connection->InitiateKeyUpdate(
6297 KeyUpdateReason::kLocalForTests));
6298 } else {
6299 ADD_FAILURE() << "Missing server connection";
6300 }
6301 return true;
6302 },
6303 QuicTime::Delta::FromSeconds(5));
6304
6305 SendSynchronousFooRequestAndCheckResponse();
6306 EXPECT_EQ(1u, client_connection->GetStats().key_update_count);
6307
6308 SendSynchronousFooRequestAndCheckResponse();
6309 EXPECT_EQ(1u, client_connection->GetStats().key_update_count);
6310
6311 server_thread_->WaitUntil(
6312 [this]() {
6313 QuicConnection* server_connection = GetServerConnection();
6314 if (server_connection != nullptr) {
6315 if (!server_connection->IsKeyUpdateAllowed()) {
6316 return false;
6317 }
6318 EXPECT_TRUE(server_connection->InitiateKeyUpdate(
6319 KeyUpdateReason::kLocalForTests));
6320 } else {
6321 ADD_FAILURE() << "Missing server connection";
6322 }
6323 return true;
6324 },
6325 QuicTime::Delta::FromSeconds(5));
6326
6327 SendSynchronousFooRequestAndCheckResponse();
6328 EXPECT_EQ(2u, client_connection->GetStats().key_update_count);
6329
6330 server_thread_->Pause();
6331 QuicConnection* server_connection = GetServerConnection();
6332 if (server_connection) {
6333 QuicConnectionStats server_stats = server_connection->GetStats();
6334 EXPECT_EQ(2u, server_stats.key_update_count);
6335 } else {
6336 ADD_FAILURE() << "Missing server connection";
6337 }
6338 server_thread_->Resume();
6339 }
6340
TEST_P(EndToEndTest,KeyUpdateInitiatedByBoth)6341 TEST_P(EndToEndTest, KeyUpdateInitiatedByBoth) {
6342 if (!version_.UsesTls()) {
6343 // Key Update is only supported in TLS handshake.
6344 ASSERT_TRUE(Initialize());
6345 return;
6346 }
6347
6348 ASSERT_TRUE(Initialize());
6349
6350 SendSynchronousFooRequestAndCheckResponse();
6351
6352 // Use WaitUntil to ensure the server had executed the key update predicate
6353 // before the client sends the Foo request, otherwise the Foo request from
6354 // the client could trigger the server key update before the server can
6355 // initiate the key update locally. That would mean the test is no longer
6356 // hitting the intended test state of both sides locally initiating a key
6357 // update before receiving a packet in the new key phase from the other side.
6358 // Additionally the test would fail since InitiateKeyUpdate() would not allow
6359 // to do another key update yet and return false.
6360 server_thread_->WaitUntil(
6361 [this]() {
6362 QuicConnection* server_connection = GetServerConnection();
6363 if (server_connection != nullptr) {
6364 if (!server_connection->IsKeyUpdateAllowed()) {
6365 // Server may not have received ack from client yet for the current
6366 // key phase, wait a bit and try again.
6367 return false;
6368 }
6369 EXPECT_TRUE(server_connection->InitiateKeyUpdate(
6370 KeyUpdateReason::kLocalForTests));
6371 } else {
6372 ADD_FAILURE() << "Missing server connection";
6373 }
6374 return true;
6375 },
6376 QuicTime::Delta::FromSeconds(5));
6377 QuicConnection* client_connection = GetClientConnection();
6378 ASSERT_TRUE(client_connection);
6379 EXPECT_TRUE(
6380 client_connection->InitiateKeyUpdate(KeyUpdateReason::kLocalForTests));
6381
6382 SendSynchronousFooRequestAndCheckResponse();
6383 EXPECT_EQ(1u, client_connection->GetStats().key_update_count);
6384
6385 SendSynchronousFooRequestAndCheckResponse();
6386 EXPECT_EQ(1u, client_connection->GetStats().key_update_count);
6387
6388 server_thread_->WaitUntil(
6389 [this]() {
6390 QuicConnection* server_connection = GetServerConnection();
6391 if (server_connection != nullptr) {
6392 if (!server_connection->IsKeyUpdateAllowed()) {
6393 return false;
6394 }
6395 EXPECT_TRUE(server_connection->InitiateKeyUpdate(
6396 KeyUpdateReason::kLocalForTests));
6397 } else {
6398 ADD_FAILURE() << "Missing server connection";
6399 }
6400 return true;
6401 },
6402 QuicTime::Delta::FromSeconds(5));
6403 EXPECT_TRUE(
6404 client_connection->InitiateKeyUpdate(KeyUpdateReason::kLocalForTests));
6405
6406 SendSynchronousFooRequestAndCheckResponse();
6407 EXPECT_EQ(2u, client_connection->GetStats().key_update_count);
6408
6409 server_thread_->Pause();
6410 QuicConnection* server_connection = GetServerConnection();
6411 if (server_connection) {
6412 QuicConnectionStats server_stats = server_connection->GetStats();
6413 EXPECT_EQ(2u, server_stats.key_update_count);
6414 } else {
6415 ADD_FAILURE() << "Missing server connection";
6416 }
6417 server_thread_->Resume();
6418 }
6419
TEST_P(EndToEndTest,KeyUpdateInitiatedByConfidentialityLimit)6420 TEST_P(EndToEndTest, KeyUpdateInitiatedByConfidentialityLimit) {
6421 SetQuicFlag(quic_key_update_confidentiality_limit, 16U);
6422
6423 if (!version_.UsesTls()) {
6424 // Key Update is only supported in TLS handshake.
6425 ASSERT_TRUE(Initialize());
6426 return;
6427 }
6428
6429 ASSERT_TRUE(Initialize());
6430
6431 QuicConnection* client_connection = GetClientConnection();
6432 ASSERT_TRUE(client_connection);
6433 EXPECT_EQ(0u, client_connection->GetStats().key_update_count);
6434
6435 server_thread_->WaitUntil(
6436 [this]() {
6437 QuicConnection* server_connection = GetServerConnection();
6438 if (server_connection != nullptr) {
6439 EXPECT_EQ(0u, server_connection->GetStats().key_update_count);
6440 } else {
6441 ADD_FAILURE() << "Missing server connection";
6442 }
6443 return true;
6444 },
6445 QuicTime::Delta::FromSeconds(5));
6446
6447 for (uint64_t i = 0; i < GetQuicFlag(quic_key_update_confidentiality_limit);
6448 ++i) {
6449 SendSynchronousFooRequestAndCheckResponse();
6450 }
6451
6452 // Don't know exactly how many packets will be sent in each request/response,
6453 // so just test that at least one key update occurred.
6454 EXPECT_LE(1u, client_connection->GetStats().key_update_count);
6455
6456 server_thread_->Pause();
6457 QuicConnection* server_connection = GetServerConnection();
6458 if (server_connection) {
6459 QuicConnectionStats server_stats = server_connection->GetStats();
6460 EXPECT_LE(1u, server_stats.key_update_count);
6461 } else {
6462 ADD_FAILURE() << "Missing server connection";
6463 }
6464 server_thread_->Resume();
6465 }
6466
TEST_P(EndToEndTest,TlsResumptionEnabledOnTheFly)6467 TEST_P(EndToEndTest, TlsResumptionEnabledOnTheFly) {
6468 SetQuicFlag(quic_disable_server_tls_resumption, true);
6469 ASSERT_TRUE(Initialize());
6470
6471 if (!version_.UsesTls()) {
6472 // This test is TLS specific.
6473 return;
6474 }
6475
6476 // Send the first request. Client should not have a resumption ticket.
6477 SendSynchronousFooRequestAndCheckResponse();
6478 QuicSpdyClientSession* client_session = GetClientSession();
6479 ASSERT_TRUE(client_session);
6480 EXPECT_EQ(client_session->GetCryptoStream()->EarlyDataReason(),
6481 ssl_early_data_no_session_offered);
6482 EXPECT_FALSE(client_session->EarlyDataAccepted());
6483 client_->Disconnect();
6484
6485 SetQuicFlag(quic_disable_server_tls_resumption, false);
6486
6487 // Send the second request. Client should still have no resumption ticket, but
6488 // it will receive one which can be used by the next request.
6489 client_->Connect();
6490 SendSynchronousFooRequestAndCheckResponse();
6491
6492 client_session = GetClientSession();
6493 ASSERT_TRUE(client_session);
6494 EXPECT_EQ(client_session->GetCryptoStream()->EarlyDataReason(),
6495 ssl_early_data_no_session_offered);
6496 EXPECT_FALSE(client_session->EarlyDataAccepted());
6497 client_->Disconnect();
6498
6499 // Send the third request in 0RTT.
6500 client_->Connect();
6501 SendSynchronousFooRequestAndCheckResponse();
6502
6503 client_session = GetClientSession();
6504 ASSERT_TRUE(client_session);
6505 EXPECT_TRUE(client_session->EarlyDataAccepted());
6506 client_->Disconnect();
6507 }
6508
TEST_P(EndToEndTest,TlsResumptionDisabledOnTheFly)6509 TEST_P(EndToEndTest, TlsResumptionDisabledOnTheFly) {
6510 SetQuicFlag(quic_disable_server_tls_resumption, false);
6511 ASSERT_TRUE(Initialize());
6512
6513 if (!version_.UsesTls()) {
6514 // This test is TLS specific.
6515 return;
6516 }
6517
6518 // Send the first request and then disconnect.
6519 SendSynchronousFooRequestAndCheckResponse();
6520 QuicSpdyClientSession* client_session = GetClientSession();
6521 ASSERT_TRUE(client_session);
6522 EXPECT_FALSE(client_session->EarlyDataAccepted());
6523 client_->Disconnect();
6524
6525 // Send the second request in 0RTT.
6526 client_->Connect();
6527 SendSynchronousFooRequestAndCheckResponse();
6528
6529 client_session = GetClientSession();
6530 ASSERT_TRUE(client_session);
6531 EXPECT_TRUE(client_session->EarlyDataAccepted());
6532 client_->Disconnect();
6533
6534 SetQuicFlag(quic_disable_server_tls_resumption, true);
6535
6536 // Send the third request. The client should try resumption but server should
6537 // decline it.
6538 client_->Connect();
6539 SendSynchronousFooRequestAndCheckResponse();
6540
6541 client_session = GetClientSession();
6542 ASSERT_TRUE(client_session);
6543 EXPECT_FALSE(client_session->EarlyDataAccepted());
6544 EXPECT_EQ(client_session->GetCryptoStream()->EarlyDataReason(),
6545 ssl_early_data_session_not_resumed);
6546 client_->Disconnect();
6547
6548 // Keep sending until the client runs out of resumption tickets.
6549 for (int i = 0; i < 10; ++i) {
6550 client_->Connect();
6551 SendSynchronousFooRequestAndCheckResponse();
6552
6553 client_session = GetClientSession();
6554 ASSERT_TRUE(client_session);
6555 EXPECT_FALSE(client_session->EarlyDataAccepted());
6556 const auto early_data_reason =
6557 client_session->GetCryptoStream()->EarlyDataReason();
6558 client_->Disconnect();
6559
6560 if (early_data_reason != ssl_early_data_session_not_resumed) {
6561 EXPECT_EQ(early_data_reason, ssl_early_data_unsupported_for_session);
6562 return;
6563 }
6564 }
6565
6566 ADD_FAILURE() << "Client should not have 10 resumption tickets.";
6567 }
6568
TEST_P(EndToEndTest,WebTransportSessionSetup)6569 TEST_P(EndToEndTest, WebTransportSessionSetup) {
6570 enable_web_transport_ = true;
6571 ASSERT_TRUE(Initialize());
6572
6573 if (!version_.UsesHttp3()) {
6574 return;
6575 }
6576
6577 WebTransportHttp3* web_transport =
6578 CreateWebTransportSession("/echo", /*wait_for_server_response=*/true);
6579 ASSERT_NE(web_transport, nullptr);
6580
6581 server_thread_->Pause();
6582 QuicSpdySession* server_session = GetServerSession();
6583 EXPECT_TRUE(server_session->GetWebTransportSession(web_transport->id()) !=
6584 nullptr);
6585 server_thread_->Resume();
6586 }
6587
TEST_P(EndToEndTest,WebTransportSessionSetupWithEchoWithSuffix)6588 TEST_P(EndToEndTest, WebTransportSessionSetupWithEchoWithSuffix) {
6589 enable_web_transport_ = true;
6590 ASSERT_TRUE(Initialize());
6591
6592 if (!version_.UsesHttp3()) {
6593 return;
6594 }
6595
6596 // "/echoFoo" should be accepted as "echo" with "set-header" query.
6597 WebTransportHttp3* web_transport = CreateWebTransportSession(
6598 "/echoFoo?set-header=bar:baz", /*wait_for_server_response=*/true);
6599 ASSERT_NE(web_transport, nullptr);
6600
6601 server_thread_->Pause();
6602 QuicSpdySession* server_session = GetServerSession();
6603 EXPECT_TRUE(server_session->GetWebTransportSession(web_transport->id()) !=
6604 nullptr);
6605 server_thread_->Resume();
6606 const spdy::Http2HeaderBlock* response_headers = client_->response_headers();
6607 auto it = response_headers->find("bar");
6608 EXPECT_NE(it, response_headers->end());
6609 EXPECT_EQ(it->second, "baz");
6610 }
6611
TEST_P(EndToEndTest,WebTransportSessionWithLoss)6612 TEST_P(EndToEndTest, WebTransportSessionWithLoss) {
6613 enable_web_transport_ = true;
6614 // Enable loss to verify all permutations of receiving SETTINGS and
6615 // request/response data.
6616 SetPacketLossPercentage(30);
6617 ASSERT_TRUE(Initialize());
6618
6619 if (!version_.UsesHttp3()) {
6620 return;
6621 }
6622
6623 WebTransportHttp3* web_transport =
6624 CreateWebTransportSession("/echo", /*wait_for_server_response=*/true);
6625 ASSERT_NE(web_transport, nullptr);
6626
6627 server_thread_->Pause();
6628 QuicSpdySession* server_session = GetServerSession();
6629 EXPECT_TRUE(server_session->GetWebTransportSession(web_transport->id()) !=
6630 nullptr);
6631 server_thread_->Resume();
6632 }
6633
TEST_P(EndToEndTest,WebTransportSessionUnidirectionalStream)6634 TEST_P(EndToEndTest, WebTransportSessionUnidirectionalStream) {
6635 enable_web_transport_ = true;
6636 ASSERT_TRUE(Initialize());
6637
6638 if (!version_.UsesHttp3()) {
6639 return;
6640 }
6641
6642 WebTransportHttp3* session =
6643 CreateWebTransportSession("/echo", /*wait_for_server_response=*/true);
6644 ASSERT_TRUE(session != nullptr);
6645 NiceMock<MockWebTransportSessionVisitor>& visitor =
6646 SetupWebTransportVisitor(session);
6647
6648 WebTransportStream* outgoing_stream =
6649 session->OpenOutgoingUnidirectionalStream();
6650 ASSERT_TRUE(outgoing_stream != nullptr);
6651 EXPECT_EQ(outgoing_stream,
6652 session->GetStreamById(outgoing_stream->GetStreamId()));
6653
6654 auto stream_visitor =
6655 std::make_unique<NiceMock<MockWebTransportStreamVisitor>>();
6656 bool data_acknowledged = false;
6657 EXPECT_CALL(*stream_visitor, OnWriteSideInDataRecvdState())
6658 .WillOnce(Assign(&data_acknowledged, true));
6659 outgoing_stream->SetVisitor(std::move(stream_visitor));
6660
6661 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*outgoing_stream, "test"));
6662 EXPECT_TRUE(outgoing_stream->SendFin());
6663
6664 bool stream_received = false;
6665 EXPECT_CALL(visitor, OnIncomingUnidirectionalStreamAvailable())
6666 .WillOnce(Assign(&stream_received, true));
6667 client_->WaitUntil(2000, [&stream_received]() { return stream_received; });
6668 EXPECT_TRUE(stream_received);
6669 WebTransportStream* received_stream =
6670 session->AcceptIncomingUnidirectionalStream();
6671 ASSERT_TRUE(received_stream != nullptr);
6672 EXPECT_EQ(received_stream,
6673 session->GetStreamById(received_stream->GetStreamId()));
6674 std::string received_data;
6675 WebTransportStream::ReadResult result = received_stream->Read(&received_data);
6676 EXPECT_EQ(received_data, "test");
6677 EXPECT_TRUE(result.fin);
6678
6679 client_->WaitUntil(2000,
6680 [&data_acknowledged]() { return data_acknowledged; });
6681 EXPECT_TRUE(data_acknowledged);
6682 }
6683
TEST_P(EndToEndTest,WebTransportSessionUnidirectionalStreamSentEarly)6684 TEST_P(EndToEndTest, WebTransportSessionUnidirectionalStreamSentEarly) {
6685 enable_web_transport_ = true;
6686 SetPacketLossPercentage(30);
6687 ASSERT_TRUE(Initialize());
6688
6689 if (!version_.UsesHttp3()) {
6690 return;
6691 }
6692
6693 WebTransportHttp3* session =
6694 CreateWebTransportSession("/echo", /*wait_for_server_response=*/false);
6695 ASSERT_TRUE(session != nullptr);
6696 NiceMock<MockWebTransportSessionVisitor>& visitor =
6697 SetupWebTransportVisitor(session);
6698
6699 WebTransportStream* outgoing_stream =
6700 session->OpenOutgoingUnidirectionalStream();
6701 ASSERT_TRUE(outgoing_stream != nullptr);
6702 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*outgoing_stream, "test"));
6703 EXPECT_TRUE(outgoing_stream->SendFin());
6704
6705 bool stream_received = false;
6706 EXPECT_CALL(visitor, OnIncomingUnidirectionalStreamAvailable())
6707 .WillOnce(Assign(&stream_received, true));
6708 client_->WaitUntil(5000, [&stream_received]() { return stream_received; });
6709 EXPECT_TRUE(stream_received);
6710 WebTransportStream* received_stream =
6711 session->AcceptIncomingUnidirectionalStream();
6712 ASSERT_TRUE(received_stream != nullptr);
6713 std::string received_data;
6714 WebTransportStream::ReadResult result = received_stream->Read(&received_data);
6715 EXPECT_EQ(received_data, "test");
6716 EXPECT_TRUE(result.fin);
6717 }
6718
TEST_P(EndToEndTest,WebTransportSessionBidirectionalStream)6719 TEST_P(EndToEndTest, WebTransportSessionBidirectionalStream) {
6720 enable_web_transport_ = true;
6721 ASSERT_TRUE(Initialize());
6722
6723 if (!version_.UsesHttp3()) {
6724 return;
6725 }
6726
6727 WebTransportHttp3* session =
6728 CreateWebTransportSession("/echo", /*wait_for_server_response=*/true);
6729 ASSERT_TRUE(session != nullptr);
6730
6731 WebTransportStream* stream = session->OpenOutgoingBidirectionalStream();
6732 ASSERT_TRUE(stream != nullptr);
6733 EXPECT_EQ(stream, session->GetStreamById(stream->GetStreamId()));
6734
6735 auto stream_visitor_owned =
6736 std::make_unique<NiceMock<MockWebTransportStreamVisitor>>();
6737 MockWebTransportStreamVisitor* stream_visitor = stream_visitor_owned.get();
6738 bool data_acknowledged = false;
6739 EXPECT_CALL(*stream_visitor, OnWriteSideInDataRecvdState())
6740 .WillOnce(Assign(&data_acknowledged, true));
6741 stream->SetVisitor(std::move(stream_visitor_owned));
6742
6743 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "test"));
6744 EXPECT_TRUE(stream->SendFin());
6745
6746 std::string received_data =
6747 ReadDataFromWebTransportStreamUntilFin(stream, stream_visitor);
6748 EXPECT_EQ(received_data, "test");
6749
6750 client_->WaitUntil(2000,
6751 [&data_acknowledged]() { return data_acknowledged; });
6752 EXPECT_TRUE(data_acknowledged);
6753 }
6754
TEST_P(EndToEndTest,WebTransportSessionBidirectionalStreamWithBuffering)6755 TEST_P(EndToEndTest, WebTransportSessionBidirectionalStreamWithBuffering) {
6756 enable_web_transport_ = true;
6757 SetPacketLossPercentage(30);
6758 ASSERT_TRUE(Initialize());
6759
6760 if (!version_.UsesHttp3()) {
6761 return;
6762 }
6763
6764 WebTransportHttp3* session =
6765 CreateWebTransportSession("/echo", /*wait_for_server_response=*/false);
6766 ASSERT_TRUE(session != nullptr);
6767
6768 WebTransportStream* stream = session->OpenOutgoingBidirectionalStream();
6769 ASSERT_TRUE(stream != nullptr);
6770 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "test"));
6771 EXPECT_TRUE(stream->SendFin());
6772
6773 std::string received_data = ReadDataFromWebTransportStreamUntilFin(stream);
6774 EXPECT_EQ(received_data, "test");
6775 }
6776
TEST_P(EndToEndTest,WebTransportSessionServerBidirectionalStream)6777 TEST_P(EndToEndTest, WebTransportSessionServerBidirectionalStream) {
6778 enable_web_transport_ = true;
6779 ASSERT_TRUE(Initialize());
6780
6781 if (!version_.UsesHttp3()) {
6782 return;
6783 }
6784
6785 WebTransportHttp3* session =
6786 CreateWebTransportSession("/echo", /*wait_for_server_response=*/false);
6787 ASSERT_TRUE(session != nullptr);
6788 NiceMock<MockWebTransportSessionVisitor>& visitor =
6789 SetupWebTransportVisitor(session);
6790
6791 bool stream_received = false;
6792 EXPECT_CALL(visitor, OnIncomingBidirectionalStreamAvailable())
6793 .WillOnce(Assign(&stream_received, true));
6794 client_->WaitUntil(5000, [&stream_received]() { return stream_received; });
6795 EXPECT_TRUE(stream_received);
6796
6797 WebTransportStream* stream = session->AcceptIncomingBidirectionalStream();
6798 ASSERT_TRUE(stream != nullptr);
6799 // Test the full Writev() API.
6800 const std::string kLongString = std::string(16 * 1024, 'a');
6801 std::vector<absl::string_view> write_vector = {"foo", "bar", "test",
6802 kLongString};
6803 quiche::StreamWriteOptions options;
6804 options.set_send_fin(true);
6805 QUICHE_EXPECT_OK(stream->Writev(absl::MakeConstSpan(write_vector), options));
6806
6807 std::string received_data = ReadDataFromWebTransportStreamUntilFin(stream);
6808 EXPECT_EQ(received_data, absl::StrCat("foobartest", kLongString));
6809 }
6810
TEST_P(EndToEndTest,WebTransportDatagrams)6811 TEST_P(EndToEndTest, WebTransportDatagrams) {
6812 enable_web_transport_ = true;
6813 ASSERT_TRUE(Initialize());
6814
6815 if (!version_.UsesHttp3()) {
6816 return;
6817 }
6818
6819 WebTransportHttp3* session =
6820 CreateWebTransportSession("/echo", /*wait_for_server_response=*/true);
6821 ASSERT_TRUE(session != nullptr);
6822 NiceMock<MockWebTransportSessionVisitor>& visitor =
6823 SetupWebTransportVisitor(session);
6824
6825 quiche::SimpleBufferAllocator allocator;
6826 for (int i = 0; i < 10; i++) {
6827 session->SendOrQueueDatagram("test");
6828 }
6829
6830 int received = 0;
6831 EXPECT_CALL(visitor, OnDatagramReceived(_)).WillRepeatedly([&received]() {
6832 received++;
6833 });
6834 client_->WaitUntil(5000, [&received]() { return received > 0; });
6835 EXPECT_GT(received, 0);
6836 }
6837
TEST_P(EndToEndTest,WebTransportSessionClose)6838 TEST_P(EndToEndTest, WebTransportSessionClose) {
6839 enable_web_transport_ = true;
6840 ASSERT_TRUE(Initialize());
6841
6842 if (!version_.UsesHttp3()) {
6843 return;
6844 }
6845
6846 WebTransportHttp3* session =
6847 CreateWebTransportSession("/echo", /*wait_for_server_response=*/true);
6848 ASSERT_TRUE(session != nullptr);
6849 NiceMock<MockWebTransportSessionVisitor>& visitor =
6850 SetupWebTransportVisitor(session);
6851
6852 WebTransportStream* stream = session->OpenOutgoingBidirectionalStream();
6853 ASSERT_TRUE(stream != nullptr);
6854 QuicStreamId stream_id = stream->GetStreamId();
6855 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "test"));
6856 // Keep stream open.
6857
6858 bool close_received = false;
6859 EXPECT_CALL(visitor, OnSessionClosed(42, "test error"))
6860 .WillOnce(Assign(&close_received, true));
6861 session->CloseSession(42, "test error");
6862 client_->WaitUntil(2000, [&]() { return close_received; });
6863 EXPECT_TRUE(close_received);
6864
6865 QuicSpdyStream* spdy_stream =
6866 GetClientSession()->GetOrCreateSpdyDataStream(stream_id);
6867 EXPECT_TRUE(spdy_stream == nullptr);
6868 }
6869
TEST_P(EndToEndTest,WebTransportSessionCloseWithoutCapsule)6870 TEST_P(EndToEndTest, WebTransportSessionCloseWithoutCapsule) {
6871 enable_web_transport_ = true;
6872 ASSERT_TRUE(Initialize());
6873
6874 if (!version_.UsesHttp3()) {
6875 return;
6876 }
6877
6878 WebTransportHttp3* session =
6879 CreateWebTransportSession("/echo", /*wait_for_server_response=*/true);
6880 ASSERT_TRUE(session != nullptr);
6881 NiceMock<MockWebTransportSessionVisitor>& visitor =
6882 SetupWebTransportVisitor(session);
6883
6884 WebTransportStream* stream = session->OpenOutgoingBidirectionalStream();
6885 ASSERT_TRUE(stream != nullptr);
6886 QuicStreamId stream_id = stream->GetStreamId();
6887 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "test"));
6888 // Keep stream open.
6889
6890 bool close_received = false;
6891 EXPECT_CALL(visitor, OnSessionClosed(0, ""))
6892 .WillOnce(Assign(&close_received, true));
6893 session->CloseSessionWithFinOnlyForTests();
6894 client_->WaitUntil(2000, [&]() { return close_received; });
6895 EXPECT_TRUE(close_received);
6896
6897 QuicSpdyStream* spdy_stream =
6898 GetClientSession()->GetOrCreateSpdyDataStream(stream_id);
6899 EXPECT_TRUE(spdy_stream == nullptr);
6900 }
6901
TEST_P(EndToEndTest,WebTransportSessionReceiveClose)6902 TEST_P(EndToEndTest, WebTransportSessionReceiveClose) {
6903 enable_web_transport_ = true;
6904 ASSERT_TRUE(Initialize());
6905
6906 if (!version_.UsesHttp3()) {
6907 return;
6908 }
6909
6910 WebTransportHttp3* session = CreateWebTransportSession(
6911 "/session-close", /*wait_for_server_response=*/true);
6912 ASSERT_TRUE(session != nullptr);
6913 NiceMock<MockWebTransportSessionVisitor>& visitor =
6914 SetupWebTransportVisitor(session);
6915
6916 WebTransportStream* stream = session->OpenOutgoingUnidirectionalStream();
6917 ASSERT_TRUE(stream != nullptr);
6918 QuicStreamId stream_id = stream->GetStreamId();
6919 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "42 test error"));
6920 EXPECT_TRUE(stream->SendFin());
6921
6922 // Have some other streams open pending, to ensure they are closed properly.
6923 stream = session->OpenOutgoingUnidirectionalStream();
6924 stream = session->OpenOutgoingBidirectionalStream();
6925
6926 bool close_received = false;
6927 EXPECT_CALL(visitor, OnSessionClosed(42, "test error"))
6928 .WillOnce(Assign(&close_received, true));
6929 client_->WaitUntil(2000, [&]() { return close_received; });
6930 EXPECT_TRUE(close_received);
6931
6932 QuicSpdyStream* spdy_stream =
6933 GetClientSession()->GetOrCreateSpdyDataStream(stream_id);
6934 EXPECT_TRUE(spdy_stream == nullptr);
6935 }
6936
TEST_P(EndToEndTest,WebTransportSessionStreamTermination)6937 TEST_P(EndToEndTest, WebTransportSessionStreamTermination) {
6938 enable_web_transport_ = true;
6939 ASSERT_TRUE(Initialize());
6940
6941 if (!version_.UsesHttp3()) {
6942 return;
6943 }
6944
6945 WebTransportHttp3* session =
6946 CreateWebTransportSession("/resets", /*wait_for_server_response=*/true);
6947 ASSERT_TRUE(session != nullptr);
6948
6949 NiceMock<MockWebTransportSessionVisitor>& visitor =
6950 SetupWebTransportVisitor(session);
6951 EXPECT_CALL(visitor, OnIncomingUnidirectionalStreamAvailable())
6952 .WillRepeatedly([this, session]() {
6953 ReadAllIncomingWebTransportUnidirectionalStreams(session);
6954 });
6955
6956 WebTransportStream* stream = session->OpenOutgoingBidirectionalStream();
6957 QuicStreamId id1 = stream->GetStreamId();
6958 ASSERT_TRUE(stream != nullptr);
6959 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "test"));
6960 stream->ResetWithUserCode(42);
6961
6962 // This read fails if the stream is closed in both directions, since that
6963 // results in stream object being deleted.
6964 std::string received_data = ReadDataFromWebTransportStreamUntilFin(stream);
6965 EXPECT_LE(received_data.size(), 4u);
6966
6967 stream = session->OpenOutgoingBidirectionalStream();
6968 QuicStreamId id2 = stream->GetStreamId();
6969 ASSERT_TRUE(stream != nullptr);
6970 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "test"));
6971 stream->SendStopSending(24);
6972
6973 std::array<std::string, 2> expected_log = {
6974 absl::StrCat("Received reset for stream ", id1, " with error code 42"),
6975 absl::StrCat("Received stop sending for stream ", id2,
6976 " with error code 24"),
6977 };
6978 client_->WaitUntil(2000, [this, &expected_log]() {
6979 return received_webtransport_unidirectional_streams_.size() >=
6980 expected_log.size();
6981 });
6982 EXPECT_THAT(received_webtransport_unidirectional_streams_,
6983 UnorderedElementsAreArray(expected_log));
6984
6985 // Since we closed the read side, cleanly closing the write side should result
6986 // in the stream getting deleted.
6987 ASSERT_TRUE(GetClientSession()->GetOrCreateSpdyDataStream(id2) != nullptr);
6988 EXPECT_TRUE(stream->SendFin());
6989 EXPECT_TRUE(client_->WaitUntil(2000, [this, id2]() {
6990 return GetClientSession()->GetOrCreateSpdyDataStream(id2) == nullptr;
6991 }));
6992 }
6993
6994 // This test currently does not pass; we need support for
6995 // https://datatracker.ietf.org/doc/draft-seemann-quic-reliable-stream-reset/ in
6996 // order to make this work.
TEST_P(EndToEndTest,DISABLED_WebTransportSessionResetReliability)6997 TEST_P(EndToEndTest, DISABLED_WebTransportSessionResetReliability) {
6998 enable_web_transport_ = true;
6999 ASSERT_TRUE(Initialize());
7000
7001 if (!version_.UsesHttp3()) {
7002 return;
7003 }
7004
7005 SetPacketLossPercentage(30);
7006
7007 WebTransportHttp3* session =
7008 CreateWebTransportSession("/resets", /*wait_for_server_response=*/true);
7009 ASSERT_TRUE(session != nullptr);
7010
7011 NiceMock<MockWebTransportSessionVisitor>& visitor =
7012 SetupWebTransportVisitor(session);
7013 EXPECT_CALL(visitor, OnIncomingUnidirectionalStreamAvailable())
7014 .WillRepeatedly([this, session]() {
7015 ReadAllIncomingWebTransportUnidirectionalStreams(session);
7016 });
7017
7018 std::vector<std::string> expected_log;
7019 constexpr int kStreamsToCreate = 10;
7020 for (int i = 0; i < kStreamsToCreate; i++) {
7021 WebTransportStream* stream = session->OpenOutgoingBidirectionalStream();
7022 QuicStreamId id = stream->GetStreamId();
7023 ASSERT_TRUE(stream != nullptr);
7024 stream->ResetWithUserCode(42);
7025
7026 expected_log.push_back(
7027 absl::StrCat("Received reset for stream ", id, " with error code 42"));
7028 }
7029 client_->WaitUntil(2000, [this, &expected_log]() {
7030 return received_webtransport_unidirectional_streams_.size() >=
7031 expected_log.size();
7032 });
7033 EXPECT_THAT(received_webtransport_unidirectional_streams_,
7034 UnorderedElementsAreArray(expected_log));
7035 }
7036
TEST_P(EndToEndTest,WebTransportSession404)7037 TEST_P(EndToEndTest, WebTransportSession404) {
7038 enable_web_transport_ = true;
7039 ASSERT_TRUE(Initialize());
7040
7041 if (!version_.UsesHttp3()) {
7042 return;
7043 }
7044
7045 WebTransportHttp3* session = CreateWebTransportSession(
7046 "/does-not-exist", /*wait_for_server_response=*/false);
7047 ASSERT_TRUE(session != nullptr);
7048 QuicSpdyStream* connect_stream = client_->latest_created_stream();
7049 QuicStreamId connect_stream_id = connect_stream->id();
7050
7051 WebTransportStream* stream = session->OpenOutgoingBidirectionalStream();
7052 ASSERT_TRUE(stream != nullptr);
7053 QUICHE_EXPECT_OK(quiche::WriteIntoStream(*stream, "test"));
7054 EXPECT_TRUE(stream->SendFin());
7055
7056 EXPECT_TRUE(client_->WaitUntil(-1, [this, connect_stream_id]() {
7057 return GetClientSession()->GetOrCreateSpdyDataStream(connect_stream_id) ==
7058 nullptr;
7059 }));
7060 }
7061
TEST_P(EndToEndTest,InvalidExtendedConnect)7062 TEST_P(EndToEndTest, InvalidExtendedConnect) {
7063 SetQuicReloadableFlag(quic_verify_request_headers_2, true);
7064 SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
7065 ASSERT_TRUE(Initialize());
7066
7067 if (!version_.UsesHttp3()) {
7068 return;
7069 }
7070 // Missing :path header.
7071 spdy::Http2HeaderBlock headers;
7072 headers[":scheme"] = "https";
7073 headers[":authority"] = "localhost";
7074 headers[":method"] = "CONNECT";
7075 headers[":protocol"] = "webtransport";
7076
7077 client_->SendMessage(headers, "", /*fin=*/false);
7078 client_->WaitForResponse();
7079 // An early response should be received.
7080 CheckResponseHeaders("400");
7081 }
7082
TEST_P(EndToEndTest,RejectExtendedConnect)7083 TEST_P(EndToEndTest, RejectExtendedConnect) {
7084 SetQuicReloadableFlag(quic_verify_request_headers_2, true);
7085 SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
7086 // Disable extended CONNECT.
7087 memory_cache_backend_.set_enable_extended_connect(false);
7088 ASSERT_TRUE(Initialize());
7089
7090 if (!version_.UsesHttp3()) {
7091 return;
7092 }
7093 // This extended CONNECT should be rejected.
7094 spdy::Http2HeaderBlock headers;
7095 headers[":scheme"] = "https";
7096 headers[":authority"] = "localhost";
7097 headers[":method"] = "CONNECT";
7098 headers[":path"] = "/echo";
7099 headers[":protocol"] = "webtransport";
7100
7101 client_->SendMessage(headers, "", /*fin=*/false);
7102 client_->WaitForResponse();
7103 CheckResponseHeaders("400");
7104
7105 // Vanilla CONNECT should be sent to backend.
7106 spdy::Http2HeaderBlock headers2;
7107 headers2[":authority"] = "localhost";
7108 headers2[":method"] = "CONNECT";
7109
7110 // Backend not configured/implemented to fully handle CONNECT requests, so
7111 // expect it to send a 405.
7112 client_->SendMessage(headers2, "body", /*fin=*/true);
7113 client_->WaitForResponse();
7114 CheckResponseHeaders("405");
7115 }
7116
TEST_P(EndToEndTest,RejectInvalidRequestHeader)7117 TEST_P(EndToEndTest, RejectInvalidRequestHeader) {
7118 SetQuicReloadableFlag(quic_verify_request_headers_2, true);
7119 SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
7120 ASSERT_TRUE(Initialize());
7121
7122 spdy::Http2HeaderBlock headers;
7123 headers[":scheme"] = "https";
7124 headers[":authority"] = "localhost";
7125 headers[":method"] = "GET";
7126 headers[":path"] = "/echo";
7127 // transfer-encoding header is not allowed.
7128 headers["transfer-encoding"] = "chunk";
7129
7130 client_->SendMessage(headers, "", /*fin=*/false);
7131 client_->WaitForResponse();
7132 CheckResponseHeaders("400");
7133 }
7134
TEST_P(EndToEndTest,RejectTransferEncodingResponse)7135 TEST_P(EndToEndTest, RejectTransferEncodingResponse) {
7136 SetQuicReloadableFlag(quic_verify_request_headers_2, true);
7137 SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
7138 ASSERT_TRUE(Initialize());
7139
7140 // Add a response with transfer-encoding headers.
7141 Http2HeaderBlock headers;
7142 headers[":status"] = "200";
7143 headers["transfer-encoding"] = "gzip";
7144
7145 Http2HeaderBlock trailers;
7146 trailers["some-trailing-header"] = "trailing-header-value";
7147
7148 memory_cache_backend_.AddResponse(server_hostname_, "/eep",
7149 std::move(headers), "", trailers.Clone());
7150
7151 std::string received_response = client_->SendSynchronousRequest("/eep");
7152 EXPECT_THAT(client_->stream_error(),
7153 IsStreamError(QUIC_BAD_APPLICATION_PAYLOAD));
7154 }
7155
TEST_P(EndToEndTest,RejectUpperCaseRequest)7156 TEST_P(EndToEndTest, RejectUpperCaseRequest) {
7157 SetQuicReloadableFlag(quic_verify_request_headers_2, true);
7158 SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
7159 ASSERT_TRUE(Initialize());
7160
7161 spdy::Http2HeaderBlock headers;
7162 headers[":scheme"] = "https";
7163 headers[":authority"] = "localhost";
7164 headers[":method"] = "GET";
7165 headers[":path"] = "/echo";
7166 headers["UpperCaseHeader"] = "foo";
7167
7168 client_->SendMessage(headers, "", /*fin=*/false);
7169 client_->WaitForResponse();
7170 CheckResponseHeaders("400");
7171 }
7172
TEST_P(EndToEndTest,RejectRequestWithInvalidToken)7173 TEST_P(EndToEndTest, RejectRequestWithInvalidToken) {
7174 SetQuicReloadableFlag(quic_verify_request_headers_2, true);
7175 SetQuicReloadableFlag(quic_act_upon_invalid_header, true);
7176 ASSERT_TRUE(Initialize());
7177
7178 spdy::Http2HeaderBlock headers;
7179 headers[":scheme"] = "https";
7180 headers[":authority"] = "localhost";
7181 headers[":method"] = "GET";
7182 headers[":path"] = "/echo";
7183 headers["invalid,header"] = "foo";
7184
7185 client_->SendMessage(headers, "", /*fin=*/false);
7186 client_->WaitForResponse();
7187 CheckResponseHeaders("400");
7188 }
7189
TEST_P(EndToEndTest,OriginalConnectionIdClearedFromMap)7190 TEST_P(EndToEndTest, OriginalConnectionIdClearedFromMap) {
7191 connect_to_server_on_initialize_ = false;
7192 ASSERT_TRUE(Initialize());
7193 if (override_client_connection_id_length_ != kLongConnectionIdLength) {
7194 // There might not be an original connection ID.
7195 CreateClientWithWriter();
7196 return;
7197 }
7198
7199 server_thread_->Pause();
7200 QuicDispatcher* dispatcher =
7201 QuicServerPeer::GetDispatcher(server_thread_->server());
7202 EXPECT_EQ(QuicDispatcherPeer::GetFirstSessionIfAny(dispatcher), nullptr);
7203 server_thread_->Resume();
7204
7205 CreateClientWithWriter(); // Also connects.
7206 EXPECT_NE(client_, nullptr);
7207
7208 server_thread_->Pause();
7209 EXPECT_NE(QuicDispatcherPeer::GetFirstSessionIfAny(dispatcher), nullptr);
7210 EXPECT_EQ(dispatcher->NumSessions(), 1);
7211 auto ids = GetServerConnection()->GetActiveServerConnectionIds();
7212 ASSERT_EQ(ids.size(), 2);
7213 for (QuicConnectionId id : ids) {
7214 EXPECT_NE(QuicDispatcherPeer::FindSession(dispatcher, id), nullptr);
7215 }
7216 QuicConnectionId original = ids[1];
7217 server_thread_->Resume();
7218
7219 client_->SendSynchronousRequest("/foo");
7220 client_->Disconnect();
7221
7222 server_thread_->Pause();
7223 EXPECT_EQ(QuicDispatcherPeer::GetFirstSessionIfAny(dispatcher), nullptr);
7224 EXPECT_EQ(QuicDispatcherPeer::FindSession(dispatcher, original), nullptr);
7225 server_thread_->Resume();
7226 }
7227
TEST_P(EndToEndTest,ServerReportsEcn)7228 TEST_P(EndToEndTest, ServerReportsEcn) {
7229 // Client connects using not-ECT.
7230 ASSERT_TRUE(Initialize());
7231 QuicConnection* client_connection = GetClientConnection();
7232 QuicConnectionPeer::DisableEcnCodepointValidation(client_connection);
7233 QuicEcnCounts* ecn = QuicSentPacketManagerPeer::GetPeerEcnCounts(
7234 QuicConnectionPeer::GetSentPacketManager(client_connection),
7235 APPLICATION_DATA);
7236 EXPECT_EQ(ecn->ect0, 0);
7237 EXPECT_EQ(ecn->ect1, 0);
7238 EXPECT_EQ(ecn->ce, 0);
7239 QuicPacketCount ect0 = 0, ect1 = 0;
7240 TestPerPacketOptions options;
7241 client_connection->set_per_packet_options(&options);
7242 for (QuicEcnCodepoint codepoint : {ECN_NOT_ECT, ECN_ECT0, ECN_ECT1, ECN_CE}) {
7243 options.ecn_codepoint = codepoint;
7244 client_->SendSynchronousRequest("/foo");
7245 if (!GetQuicRestartFlag(quic_receive_ecn) ||
7246 !GetQuicRestartFlag(quic_quiche_ecn_sockets) ||
7247 !VersionHasIetfQuicFrames(version_.transport_version) ||
7248 codepoint == ECN_NOT_ECT) {
7249 EXPECT_EQ(ecn->ect0, 0);
7250 EXPECT_EQ(ecn->ect1, 0);
7251 EXPECT_EQ(ecn->ce, 0);
7252 continue;
7253 }
7254 EXPECT_GT(ecn->ect0, 0);
7255 if (codepoint == ECN_CE) {
7256 EXPECT_EQ(ect0, ecn->ect0); // No more ECT(0) arriving
7257 EXPECT_GE(ecn->ect1, ect1); // Late-arriving ECT(1) control packets
7258 EXPECT_GT(ecn->ce, 0);
7259 continue;
7260 }
7261 EXPECT_EQ(ecn->ce, 0);
7262 if (codepoint == ECN_ECT1) {
7263 EXPECT_GE(ecn->ect0, ect0); // Late-arriving ECT(0) control packets
7264 ect0 = ecn->ect0;
7265 ect1 = ecn->ect1;
7266 EXPECT_GT(ect1, 0);
7267 continue;
7268 }
7269 // codepoint == ECN_ECT0
7270 ect0 = ecn->ect0;
7271 EXPECT_EQ(ecn->ect1, 0);
7272 }
7273 client_->Disconnect();
7274 }
7275
TEST_P(EndToEndTest,ClientReportsEcn)7276 TEST_P(EndToEndTest, ClientReportsEcn) {
7277 ASSERT_TRUE(Initialize());
7278 // Wait for handshake to complete, so that we can manipulate the server
7279 // connection without race conditions.
7280 server_thread_->WaitForCryptoHandshakeConfirmed();
7281 QuicConnection* server_connection = GetServerConnection();
7282 QuicConnectionPeer::DisableEcnCodepointValidation(server_connection);
7283 QuicEcnCounts* ecn = QuicSentPacketManagerPeer::GetPeerEcnCounts(
7284 QuicConnectionPeer::GetSentPacketManager(server_connection),
7285 APPLICATION_DATA);
7286 TestPerPacketOptions options;
7287 options.ecn_codepoint = ECN_ECT1;
7288 server_connection->set_per_packet_options(&options);
7289 client_->SendSynchronousRequest("/foo");
7290 // A second request provides a packet for the client ACKs to go with.
7291 client_->SendSynchronousRequest("/foo");
7292 server_thread_->Pause();
7293 EXPECT_EQ(ecn->ect0, 0);
7294 EXPECT_EQ(ecn->ce, 0);
7295 if (!GetQuicRestartFlag(quic_receive_ecn) ||
7296 !GetQuicRestartFlag(quic_quiche_ecn_sockets) ||
7297 !VersionHasIetfQuicFrames(version_.transport_version)) {
7298 EXPECT_EQ(ecn->ect1, 0);
7299 } else {
7300 EXPECT_GT(ecn->ect1, 0);
7301 }
7302 server_connection->set_per_packet_options(nullptr);
7303 server_thread_->Resume();
7304 client_->Disconnect();
7305 }
7306
TEST_P(EndToEndTest,ClientMigrationAfterHalfwayServerMigration)7307 TEST_P(EndToEndTest, ClientMigrationAfterHalfwayServerMigration) {
7308 use_preferred_address_ = true;
7309 ASSERT_TRUE(Initialize());
7310 if (!GetClientConnection()->connection_migration_use_new_cid()) {
7311 return;
7312 }
7313 client_.reset(EndToEndTest::CreateQuicClient(nullptr));
7314 QuicConnection* client_connection = GetClientConnection();
7315 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
7316 EXPECT_EQ(server_address_, client_connection->effective_peer_address());
7317 EXPECT_EQ(server_address_, client_connection->peer_address());
7318 EXPECT_TRUE(client_->client()->HasPendingPathValidation());
7319 QuicConnectionId server_cid1 = client_connection->connection_id();
7320
7321 SendSynchronousFooRequestAndCheckResponse();
7322 EXPECT_TRUE(client_->WaitUntil(
7323 1000, [&]() { return !client_->client()->HasPendingPathValidation(); }));
7324 EXPECT_EQ(server_preferred_address_,
7325 client_connection->effective_peer_address());
7326 EXPECT_EQ(server_preferred_address_, client_connection->peer_address());
7327 EXPECT_NE(server_cid1, client_connection->connection_id());
7328 EXPECT_EQ(0u,
7329 client_connection->GetStats().num_connectivity_probing_received);
7330 const auto client_stats = GetClientConnection()->GetStats();
7331 EXPECT_TRUE(client_stats.server_preferred_address_validated);
7332 EXPECT_FALSE(client_stats.failed_to_validate_server_preferred_address);
7333
7334 WaitForNewConnectionIds();
7335 // Migrate socket to a new IP address.
7336 QuicIpAddress host = TestLoopback(2);
7337 ASSERT_NE(
7338 client_->client()->network_helper()->GetLatestClientAddress().host(),
7339 host);
7340 ASSERT_TRUE(client_->client()->ValidateAndMigrateSocket(host));
7341 EXPECT_TRUE(client_->WaitUntil(
7342 1000, [&]() { return !client_->client()->HasPendingPathValidation(); }));
7343 EXPECT_EQ(host, client_->client()->session()->self_address().host());
7344
7345 SendSynchronousBarRequestAndCheckResponse();
7346
7347 // Wait for the PATH_CHALLENGE.
7348 EXPECT_TRUE(client_->WaitUntil(1000, [&]() {
7349 return client_connection->GetStats().num_connectivity_probing_received >= 1;
7350 }));
7351
7352 // Send another request to ensure that the server will have time to finish the
7353 // reverse path validation and send address token.
7354 SendSynchronousBarRequestAndCheckResponse();
7355 // By the time the above request is completed, the PATH_RESPONSE must have
7356 // been received by the server. Check server stats.
7357 server_thread_->Pause();
7358 QuicConnection* server_connection = GetServerConnection();
7359 EXPECT_FALSE(server_connection->HasPendingPathValidation());
7360 EXPECT_EQ(2u, server_connection->GetStats().num_validated_peer_migration);
7361 EXPECT_EQ(2u, server_connection->GetStats().num_new_connection_id_sent);
7362 server_thread_->Resume();
7363 }
7364
TEST_P(EndToEndTest,MultiPortCreationFollowingServerMigration)7365 TEST_P(EndToEndTest, MultiPortCreationFollowingServerMigration) {
7366 use_preferred_address_ = true;
7367 ASSERT_TRUE(Initialize());
7368 if (!GetClientConnection()->connection_migration_use_new_cid()) {
7369 return;
7370 }
7371
7372 client_config_.SetClientConnectionOptions(QuicTagVector{kMPQC});
7373 client_.reset(EndToEndTest::CreateQuicClient(nullptr));
7374 QuicConnection* client_connection = GetClientConnection();
7375 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
7376 EXPECT_EQ(server_address_, client_connection->effective_peer_address());
7377 EXPECT_EQ(server_address_, client_connection->peer_address());
7378 QuicConnectionId server_cid1 = client_connection->connection_id();
7379 EXPECT_TRUE(client_connection->IsValidatingServerPreferredAddress());
7380
7381 SendSynchronousFooRequestAndCheckResponse();
7382 EXPECT_TRUE(client_->WaitUntil(1000, [&]() {
7383 return !client_connection->IsValidatingServerPreferredAddress();
7384 }));
7385 EXPECT_EQ(server_preferred_address_,
7386 client_connection->effective_peer_address());
7387 EXPECT_EQ(server_preferred_address_, client_connection->peer_address());
7388 const auto client_stats = GetClientConnection()->GetStats();
7389 EXPECT_TRUE(client_stats.server_preferred_address_validated);
7390 EXPECT_FALSE(client_stats.failed_to_validate_server_preferred_address);
7391
7392 QuicConnectionId server_cid2 = client_connection->connection_id();
7393 EXPECT_NE(server_cid1, server_cid2);
7394 EXPECT_TRUE(client_->WaitUntil(1000, [&]() {
7395 return client_connection->GetStats().num_path_response_received == 2;
7396 }));
7397 EXPECT_TRUE(
7398 QuicConnectionPeer::IsAlternativePathValidated(client_connection));
7399 QuicConnectionId server_cid3 =
7400 QuicConnectionPeer::GetServerConnectionIdOnAlternativePath(
7401 client_connection);
7402 EXPECT_NE(server_cid2, server_cid3);
7403 EXPECT_NE(server_cid1, server_cid3);
7404 }
7405
TEST_P(EndToEndTest,DoNotAdvertisePreferredAddressWithoutSPAD)7406 TEST_P(EndToEndTest, DoNotAdvertisePreferredAddressWithoutSPAD) {
7407 if (!version_.HasIetfQuicFrames()) {
7408 ASSERT_TRUE(Initialize());
7409 return;
7410 }
7411 server_config_.SetIPv4AlternateServerAddressToSend(
7412 QuicSocketAddress(QuicIpAddress::Any4(), 12345));
7413 server_config_.SetIPv6AlternateServerAddressToSend(
7414 QuicSocketAddress(QuicIpAddress::Any6(), 12345));
7415 NiceMock<MockQuicConnectionDebugVisitor> visitor;
7416 connection_debug_visitor_ = &visitor;
7417 EXPECT_CALL(visitor, OnTransportParametersReceived(_))
7418 .WillOnce(Invoke([](const TransportParameters& transport_parameters) {
7419 EXPECT_EQ(nullptr, transport_parameters.preferred_address);
7420 }));
7421 ASSERT_TRUE(Initialize());
7422 EXPECT_TRUE(client_->client()->WaitForHandshakeConfirmed());
7423 }
7424
7425 } // namespace
7426 } // namespace test
7427 } // namespace quic
7428