• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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