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

Side by Side Diff: net/tools/quic/end_to_end_test.cc

Issue 2477743002: Various cleanups to QUIC end to end test to sync up with the internal version. (Closed)
Patch Set: Rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <sys/epoll.h> 6 #include <sys/epoll.h>
7 7
8 #include <cstdint>
8 #include <list> 9 #include <list>
9 #include <memory> 10 #include <memory>
10 #include <string> 11 #include <string>
11 #include <utility> 12 #include <utility>
12 #include <vector> 13 #include <vector>
13 14
14 #include "base/memory/ptr_util.h" 15 #include "base/memory/ptr_util.h"
15 #include "base/memory/singleton.h" 16 #include "base/memory/singleton.h"
16 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
17 #include "base/synchronization/waitable_event.h" 18 #include "base/synchronization/waitable_event.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 #include "net/tools/quic/test_tools/quic_server_peer.h" 57 #include "net/tools/quic/test_tools/quic_server_peer.h"
57 #include "net/tools/quic/test_tools/quic_test_client.h" 58 #include "net/tools/quic/test_tools/quic_test_client.h"
58 #include "net/tools/quic/test_tools/quic_test_server.h" 59 #include "net/tools/quic/test_tools/quic_test_server.h"
59 #include "net/tools/quic/test_tools/server_thread.h" 60 #include "net/tools/quic/test_tools/server_thread.h"
60 #include "testing/gtest/include/gtest/gtest.h" 61 #include "testing/gtest/include/gtest/gtest.h"
61 62
62 using base::IntToString; 63 using base::IntToString;
63 using base::StringPiece; 64 using base::StringPiece;
64 using base::WaitableEvent; 65 using base::WaitableEvent;
65 using net::EpollServer; 66 using net::EpollServer;
66 using net::test::ConstructEncryptedPacket;
67 using net::test::CryptoTestUtils;
68 using net::test::GenerateBody;
69 using net::test::Loopback4;
70 using net::test::MockQuicConnectionDebugVisitor;
71 using net::test::QuicConnectionPeer;
72 using net::test::QuicFlowControllerPeer;
73 using net::test::QuicSentPacketManagerPeer;
74 using net::test::QuicSessionPeer;
75 using net::test::QuicSpdySessionPeer;
76 using net::test::ReliableQuicStreamPeer;
77 using net::test::kClientDataStreamId1;
78 using net::test::kInitialSessionFlowControlWindowForTest;
79 using net::test::kInitialStreamFlowControlWindowForTest;
80 using net::test::PacketDroppingTestWriter;
81 using net::test::QuicDispatcherPeer;
82 using net::test::QuicServerPeer;
83 using std::ostream; 67 using std::ostream;
84 using std::string; 68 using std::string;
85 using std::vector; 69 using std::vector;
86 70
87 namespace net { 71 namespace net {
88 namespace test { 72 namespace test {
89 namespace { 73 namespace {
90 74
91 const char kFooResponseBody[] = "Artichoke hearts make me happy."; 75 const char kFooResponseBody[] = "Artichoke hearts make me happy.";
92 const char kBarResponseBody[] = "Palm hearts are pretty delicious, also."; 76 const char kBarResponseBody[] = "Palm hearts are pretty delicious, also.";
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 bool use_cheap_stateless_reject; 130 bool use_cheap_stateless_reject;
147 bool buffer_packet_till_chlo; 131 bool buffer_packet_till_chlo;
148 }; 132 };
149 133
150 // Constructs various test permutations. 134 // Constructs various test permutations.
151 std::vector<TestParams> GetTestParams() { 135 std::vector<TestParams> GetTestParams() {
152 // Divide the versions into buckets in which the intra-frame format 136 // Divide the versions into buckets in which the intra-frame format
153 // is compatible. When clients encounter QUIC version negotiation 137 // is compatible. When clients encounter QUIC version negotiation
154 // they simply retransmit all packets using the new version's 138 // they simply retransmit all packets using the new version's
155 // QUIC framing. However, they are unable to change the intra-frame 139 // QUIC framing. However, they are unable to change the intra-frame
156 // layout (for example to change HTTP2 headers to SPDY/3). So 140 // layout (for example to change HTTP/2 headers to SPDY/3). So
157 // these tests need to ensure that clients are never attempting 141 // these tests need to ensure that clients are never attempting
158 // to do 0-RTT across incompatible versions. Chromium only supports 142 // to do 0-RTT across incompatible versions. Chromium only supports
159 // a single version at a time anyway. :) 143 // a single version at a time anyway. :)
160 QuicVersionVector all_supported_versions = AllSupportedVersions(); 144 QuicVersionVector all_supported_versions = AllSupportedVersions();
161 QuicVersionVector version_buckets[3]; 145 QuicVersionVector version_buckets[3];
162 146
163 for (const QuicVersion version : all_supported_versions) { 147 for (const QuicVersion version : all_supported_versions) {
164 if (version <= QUIC_VERSION_32) { 148 if (version <= QUIC_VERSION_32) {
165 // Versions: 31-32 149 // Versions: 31-32
166 // v31 adds a hash of the CHLO into the proof signature. 150 // v31 adds a hash of the CHLO into the proof signature.
(...skipping 10 matching lines...) Expand all
177 } 161 }
178 } 162 }
179 163
180 // This must be kept in sync with the number of nested for-loops below as it 164 // This must be kept in sync with the number of nested for-loops below as it
181 // is used to prune the number of tests that are run. 165 // is used to prune the number of tests that are run.
182 const int kMaxEnabledOptions = 6; 166 const int kMaxEnabledOptions = 6;
183 int max_enabled_options = 0; 167 int max_enabled_options = 0;
184 std::vector<TestParams> params; 168 std::vector<TestParams> params;
185 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) { 169 for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) {
186 for (bool client_supports_stateless_rejects : {true, false}) { 170 for (bool client_supports_stateless_rejects : {true, false}) {
187 for (const QuicTag congestion_control_tag : {kRENO, kQBIC}) { 171 for (const QuicTag congestion_control_tag : {kRENO, kTBBR, kQBIC}) {
188 for (bool disable_hpack_dynamic_table : {false}) { 172 for (bool disable_hpack_dynamic_table : {false}) {
189 for (bool force_hol_blocking : {true, false}) { 173 for (bool force_hol_blocking : {true, false}) {
190 for (bool use_cheap_stateless_reject : {true, false}) { 174 for (bool use_cheap_stateless_reject : {true, false}) {
191 for (bool buffer_packet_till_chlo : {true, false}) { 175 for (bool buffer_packet_till_chlo : {true, false}) {
192 if (!buffer_packet_till_chlo && use_cheap_stateless_reject) { 176 if (!buffer_packet_till_chlo && use_cheap_stateless_reject) {
193 // Doing stateless reject while not buffering packet 177 // Doing stateless reject while not buffering packet
194 // before CHLO is not allowed. 178 // before CHLO is not allowed.
195 break; 179 break;
196 } 180 }
197 int enabled_options = 0; 181 int enabled_options = 0;
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 client_config_.SetConnectionOptionsToSend(copt); 422 client_config_.SetConnectionOptionsToSend(copt);
439 423
440 // Start the server first, because CreateQuicClient() attempts 424 // Start the server first, because CreateQuicClient() attempts
441 // to connect to the server. 425 // to connect to the server.
442 StartServer(); 426 StartServer();
443 427
444 CreateClientWithWriter(); 428 CreateClientWithWriter();
445 static EpollEvent event(EPOLLOUT, false); 429 static EpollEvent event(EPOLLOUT, false);
446 if (client_writer_ != nullptr) { 430 if (client_writer_ != nullptr) {
447 client_writer_->Initialize( 431 client_writer_->Initialize(
448 reinterpret_cast<QuicEpollConnectionHelper*>( 432 QuicConnectionPeer::GetHelper(
449 QuicConnectionPeer::GetHelper( 433 client_->client()->session()->connection()),
450 client_->client()->session()->connection())),
451 QuicConnectionPeer::GetAlarmFactory( 434 QuicConnectionPeer::GetAlarmFactory(
452 client_->client()->session()->connection()), 435 client_->client()->session()->connection()),
453 new ClientDelegate(client_->client())); 436 new ClientDelegate(client_->client()));
454 } 437 }
455 initialized_ = true; 438 initialized_ = true;
456 return client_->client()->connected(); 439 return client_->client()->connected();
457 } 440 }
458 441
459 void SetUp() override { 442 void SetUp() override {
460 // The ownership of these gets transferred to the QuicPacketWriterWrapper 443 // The ownership of these gets transferred to the QuicPacketWriterWrapper
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 } 763 }
781 764
782 TEST_P(EndToEndTest, LargePostNoPacketLoss) { 765 TEST_P(EndToEndTest, LargePostNoPacketLoss) {
783 ASSERT_TRUE(Initialize()); 766 ASSERT_TRUE(Initialize());
784 767
785 client_->client()->WaitForCryptoHandshakeConfirmed(); 768 client_->client()->WaitForCryptoHandshakeConfirmed();
786 769
787 // 1 MB body. 770 // 1 MB body.
788 string body; 771 string body;
789 GenerateBody(&body, 1024 * 1024); 772 GenerateBody(&body, 1024 * 1024);
790
791 SpdyHeaderBlock headers; 773 SpdyHeaderBlock headers;
792 headers[":method"] = "POST"; 774 headers[":method"] = "POST";
793 headers[":path"] = "/foo"; 775 headers[":path"] = "/foo";
794 headers[":scheme"] = "https"; 776 headers[":scheme"] = "https";
795 headers[":authority"] = server_hostname_; 777 headers[":authority"] = server_hostname_;
796 778
797 EXPECT_EQ(kFooResponseBody, 779 EXPECT_EQ(kFooResponseBody,
798 client_->SendCustomSynchronousRequest(headers, body)); 780 client_->SendCustomSynchronousRequest(headers, body));
799 // TODO(ianswett): There should not be packet loss in this test, but on some 781 // TODO(ianswett): There should not be packet loss in this test, but on some
800 // platforms the receive buffer overflows. 782 // platforms the receive buffer overflows.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 } 814 }
833 ASSERT_TRUE(Initialize()); 815 ASSERT_TRUE(Initialize());
834 816
835 // Wait for the server SHLO before upping the packet loss. 817 // Wait for the server SHLO before upping the packet loss.
836 client_->client()->WaitForCryptoHandshakeConfirmed(); 818 client_->client()->WaitForCryptoHandshakeConfirmed();
837 SetPacketLossPercentage(30); 819 SetPacketLossPercentage(30);
838 820
839 // 10 KB body. 821 // 10 KB body.
840 string body; 822 string body;
841 GenerateBody(&body, 1024 * 10); 823 GenerateBody(&body, 1024 * 10);
842 test::GenerateBody(&body, 1024 * 10);
843 SpdyHeaderBlock headers; 824 SpdyHeaderBlock headers;
844 headers[":method"] = "POST"; 825 headers[":method"] = "POST";
845 headers[":path"] = "/foo"; 826 headers[":path"] = "/foo";
846 headers[":scheme"] = "https"; 827 headers[":scheme"] = "https";
847 headers[":authority"] = server_hostname_; 828 headers[":authority"] = server_hostname_;
848 829
849 EXPECT_EQ(kFooResponseBody, 830 EXPECT_EQ(kFooResponseBody,
850 client_->SendCustomSynchronousRequest(headers, body)); 831 client_->SendCustomSynchronousRequest(headers, body));
851 VerifyCleanConnection(true); 832 VerifyCleanConnection(true);
852 } 833 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 const int expected_num_hellos_latest_session = 907 const int expected_num_hellos_latest_session =
927 BothSidesSupportStatelessRejects() ? 1 : 2; 908 BothSidesSupportStatelessRejects() ? 1 : 2;
928 EXPECT_EQ(expected_num_hellos_latest_session, 909 EXPECT_EQ(expected_num_hellos_latest_session,
929 client_->client()->session()->GetNumSentClientHellos()); 910 client_->client()->session()->GetNumSentClientHellos());
930 EXPECT_EQ(2, client_->client()->GetNumSentClientHellos()); 911 EXPECT_EQ(2, client_->client()->GetNumSentClientHellos());
931 912
932 client_->Disconnect(); 913 client_->Disconnect();
933 914
934 // The 0-RTT handshake should succeed. 915 // The 0-RTT handshake should succeed.
935 client_->Connect(); 916 client_->Connect();
936 client_->WaitForResponseForMs(-1); 917 client_->WaitForInitialResponse();
937 ASSERT_TRUE(client_->client()->connected()); 918 ASSERT_TRUE(client_->client()->connected());
938 EXPECT_EQ(kFooResponseBody, 919 EXPECT_EQ(kFooResponseBody,
939 client_->SendCustomSynchronousRequest(headers, body)); 920 client_->SendCustomSynchronousRequest(headers, body));
940 921
941 if (negotiated_version_ <= QUIC_VERSION_32) { 922 if (negotiated_version_ <= QUIC_VERSION_32) {
942 EXPECT_EQ(expected_num_hellos_latest_session, 923 EXPECT_EQ(expected_num_hellos_latest_session,
943 client_->client()->session()->GetNumSentClientHellos()); 924 client_->client()->session()->GetNumSentClientHellos());
944 EXPECT_EQ(2, client_->client()->GetNumSentClientHellos()); 925 EXPECT_EQ(2, client_->client()->GetNumSentClientHellos());
945 } else { 926 } else {
946 EXPECT_EQ(1, client_->client()->session()->GetNumSentClientHellos()); 927 EXPECT_EQ(1, client_->client()->session()->GetNumSentClientHellos());
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 QuicConnectionPeer::GetResumeWritesAlarm(session->connection()); 1179 QuicConnectionPeer::GetResumeWritesAlarm(session->connection());
1199 EXPECT_FALSE(resume_writes_alarm->IsSet()); 1180 EXPECT_FALSE(resume_writes_alarm->IsSet());
1200 } 1181 }
1201 1182
1202 TEST_P(EndToEndTest, InvalidStream) { 1183 TEST_P(EndToEndTest, InvalidStream) {
1203 ASSERT_TRUE(Initialize()); 1184 ASSERT_TRUE(Initialize());
1204 client_->client()->WaitForCryptoHandshakeConfirmed(); 1185 client_->client()->WaitForCryptoHandshakeConfirmed();
1205 1186
1206 string body; 1187 string body;
1207 GenerateBody(&body, kMaxPacketSize); 1188 GenerateBody(&body, kMaxPacketSize);
1208
1209 SpdyHeaderBlock headers; 1189 SpdyHeaderBlock headers;
1210 headers[":method"] = "POST"; 1190 headers[":method"] = "POST";
1211 headers[":path"] = "/foo"; 1191 headers[":path"] = "/foo";
1212 headers[":scheme"] = "https"; 1192 headers[":scheme"] = "https";
1213 headers[":authority"] = server_hostname_; 1193 headers[":authority"] = server_hostname_;
1194
1214 // Force the client to write with a stream ID belonging to a nonexistent 1195 // Force the client to write with a stream ID belonging to a nonexistent
1215 // server-side stream. 1196 // server-side stream.
1216 QuicSessionPeer::SetNextOutgoingStreamId(client_->client()->session(), 2); 1197 QuicSessionPeer::SetNextOutgoingStreamId(client_->client()->session(), 2);
1217 1198
1218 client_->SendCustomSynchronousRequest(headers, body); 1199 client_->SendCustomSynchronousRequest(headers, body);
1219 // EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error());
1220 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); 1200 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error());
1221 EXPECT_EQ(QUIC_INVALID_STREAM_ID, client_->connection_error()); 1201 EXPECT_EQ(QUIC_INVALID_STREAM_ID, client_->connection_error());
1222 } 1202 }
1223 1203
1224 // Test that if the the server will close the connection if the client attempts 1204 // Test that if the the server will close the connection if the client attempts
1225 // to send a request with overly large headers. 1205 // to send a request with overly large headers.
1226 TEST_P(EndToEndTest, LargeHeaders) { 1206 TEST_P(EndToEndTest, LargeHeaders) {
1227 ASSERT_TRUE(Initialize()); 1207 ASSERT_TRUE(Initialize());
1228 client_->client()->WaitForCryptoHandshakeConfirmed(); 1208 client_->client()->WaitForCryptoHandshakeConfirmed();
1229 1209
1230 string body; 1210 string body;
1231 test::GenerateBody(&body, kMaxPacketSize); 1211 GenerateBody(&body, kMaxPacketSize);
1232
1233 SpdyHeaderBlock headers; 1212 SpdyHeaderBlock headers;
1234 headers[":method"] = "POST"; 1213 headers[":method"] = "POST";
1235 headers[":path"] = "/foo"; 1214 headers[":path"] = "/foo";
1236 headers[":scheme"] = "https"; 1215 headers[":scheme"] = "https";
1237 headers[":authority"] = server_hostname_; 1216 headers[":authority"] = server_hostname_;
1238 headers["key1"] = string(15 * 1024, 'a'); 1217 headers["key1"] = string(15 * 1024, 'a');
1239 headers["key2"] = string(15 * 1024, 'a'); 1218 headers["key2"] = string(15 * 1024, 'a');
1240 headers["key3"] = string(15 * 1024, 'a'); 1219 headers["key3"] = string(15 * 1024, 'a');
1241 1220
1242 client_->SendCustomSynchronousRequest(headers, body); 1221 client_->SendCustomSynchronousRequest(headers, body);
1243 if (FLAGS_quic_limit_uncompressed_headers) { 1222 if (FLAGS_quic_limit_uncompressed_headers) {
1244 EXPECT_EQ(QUIC_HEADERS_TOO_LARGE, client_->stream_error()); 1223 EXPECT_EQ(QUIC_HEADERS_TOO_LARGE, client_->stream_error());
1245 } else { 1224 } else {
1246 EXPECT_EQ(QUIC_STREAM_NO_ERROR, client_->stream_error()); 1225 EXPECT_EQ(QUIC_STREAM_NO_ERROR, client_->stream_error());
1247 EXPECT_EQ(kFooResponseBody, client_->response_body()); 1226 EXPECT_EQ(kFooResponseBody, client_->response_body());
1248 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); 1227 EXPECT_EQ("200", client_->response_headers()->find(":status")->second);
1249 } 1228 }
1250 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error()); 1229 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error());
1251 } 1230 }
1252 1231
1253 TEST_P(EndToEndTest, EarlyResponseWithQuicStreamNoError) { 1232 TEST_P(EndToEndTest, EarlyResponseWithQuicStreamNoError) {
1254 ASSERT_TRUE(Initialize()); 1233 ASSERT_TRUE(Initialize());
1255 client_->client()->WaitForCryptoHandshakeConfirmed(); 1234 client_->client()->WaitForCryptoHandshakeConfirmed();
1256 1235
1257 string large_body; 1236 string large_body;
1258 GenerateBody(&large_body, 1024 * 1024); 1237 GenerateBody(&large_body, 1024 * 1024);
1259
1260 SpdyHeaderBlock headers; 1238 SpdyHeaderBlock headers;
1261 headers[":method"] = "POST"; 1239 headers[":method"] = "POST";
1262 headers[":path"] = "/foo"; 1240 headers[":path"] = "/foo";
1263 headers[":scheme"] = "https"; 1241 headers[":scheme"] = "https";
1264 headers[":authority"] = server_hostname_; 1242 headers[":authority"] = server_hostname_;
1265
1266 // Insert an invalid content_length field in request to trigger an early 1243 // Insert an invalid content_length field in request to trigger an early
1267 // response from server. 1244 // response from server.
1268 headers["content-length"] = "-3"; 1245 headers["content-length"] = "-3";
1269 1246
1270 client_->SendCustomSynchronousRequest(headers, large_body); 1247 client_->SendCustomSynchronousRequest(headers, large_body);
1271 EXPECT_EQ("bad", client_->response_body()); 1248 EXPECT_EQ("bad", client_->response_body());
1272 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); 1249 EXPECT_EQ("500", client_->response_headers()->find(":status")->second);
1273 EXPECT_EQ(QUIC_STREAM_NO_ERROR, client_->stream_error()); 1250 EXPECT_EQ(QUIC_STREAM_NO_ERROR, client_->stream_error());
1274 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error()); 1251 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error());
1275 } 1252 }
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 1558 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
1582 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); 1559 EXPECT_EQ("200", client_->response_headers()->find(":status")->second);
1583 QuicPacketHeader* header = QuicConnectionPeer::GetLastHeader( 1560 QuicPacketHeader* header = QuicConnectionPeer::GetLastHeader(
1584 client_->client()->session()->connection()); 1561 client_->client()->session()->connection());
1585 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, 1562 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID,
1586 header->public_header.connection_id_length); 1563 header->public_header.connection_id_length);
1587 } 1564 }
1588 1565
1589 TEST_P(EndToEndTest, ResetConnection) { 1566 TEST_P(EndToEndTest, ResetConnection) {
1590 ASSERT_TRUE(Initialize()); 1567 ASSERT_TRUE(Initialize());
1591 client_->client()->WaitForCryptoHandshakeConfirmed();
1592 1568
1593 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 1569 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo"));
1594 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); 1570 EXPECT_EQ("200", client_->response_headers()->find(":status")->second);
1595 client_->ResetConnection(); 1571 client_->ResetConnection();
1596 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar")); 1572 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar"));
1597 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); 1573 EXPECT_EQ("200", client_->response_headers()->find(":status")->second);
1598 } 1574 }
1599 1575
1600 TEST_P(EndToEndTest, MaxStreamsUberTest) { 1576 TEST_P(EndToEndTest, MaxStreamsUberTest) {
1601 if (!BothSidesSupportStatelessRejects()) { 1577 if (!BothSidesSupportStatelessRejects()) {
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1980 1956
1981 // Send the request, and register the delegate for ACKs. 1957 // Send the request, and register the delegate for ACKs.
1982 client_->SendData(request_string, true, delegate.get()); 1958 client_->SendData(request_string, true, delegate.get());
1983 client_->WaitForResponse(); 1959 client_->WaitForResponse();
1984 EXPECT_EQ(kFooResponseBody, client_->response_body()); 1960 EXPECT_EQ(kFooResponseBody, client_->response_body());
1985 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); 1961 EXPECT_EQ("200", client_->response_headers()->find(":status")->second);
1986 1962
1987 // Send another request to flush out any pending ACKs on the server. 1963 // Send another request to flush out any pending ACKs on the server.
1988 client_->SendSynchronousRequest("/bar"); 1964 client_->SendSynchronousRequest("/bar");
1989 1965
1990 // Pause the server to avoid races.
1991 server_thread_->Pause();
Jana 2016/11/03 17:51:40 Assuming that this doesn't cause races now?
Ryan Hamilton 2016/11/03 17:57:29 Right. To be safe, I took the chrome code and atte
1992 // Make sure the delegate does get the notification it expects. 1966 // Make sure the delegate does get the notification it expects.
1993 while (!delegate->has_been_notified()) { 1967 while (!delegate->has_been_notified()) {
1994 // Waits for up to 50 ms. 1968 // Waits for up to 50 ms.
1995 client_->client()->WaitForEvents(); 1969 client_->client()->WaitForEvents();
1996 } 1970 }
1997 server_thread_->Resume();
1998 } 1971 }
1999 1972
2000 // Send a public reset from the server. 1973 // Send a public reset from the server.
2001 TEST_P(EndToEndTest, ServerSendPublicReset) { 1974 TEST_P(EndToEndTest, ServerSendPublicReset) {
2002 ASSERT_TRUE(Initialize()); 1975 ASSERT_TRUE(Initialize());
2003 1976
2004 // Send the public reset. 1977 // Send the public reset.
2005 QuicConnectionId connection_id = 1978 QuicConnectionId connection_id =
2006 client_->client()->session()->connection()->connection_id(); 1979 client_->client()->session()->connection()->connection_id();
2007 QuicPublicResetPacket header; 1980 QuicPublicResetPacket header;
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
2332 QuicSpdySession* session, 2305 QuicSpdySession* session,
2333 int64_t body_bytes) 2306 int64_t body_bytes)
2334 : QuicSimpleServerStream(id, session), body_bytes_(body_bytes) {} 2307 : QuicSimpleServerStream(id, session), body_bytes_(body_bytes) {}
2335 2308
2336 ~ServerStreamThatSendsHugeResponse() override {} 2309 ~ServerStreamThatSendsHugeResponse() override {}
2337 2310
2338 protected: 2311 protected:
2339 void SendResponse() override { 2312 void SendResponse() override {
2340 QuicInMemoryCache::Response response; 2313 QuicInMemoryCache::Response response;
2341 string body; 2314 string body;
2342 test::GenerateBody(&body, body_bytes_); 2315 GenerateBody(&body, body_bytes_);
2343 response.set_body(body); 2316 response.set_body(body);
2344 SendHeadersAndBodyAndTrailers(response.headers().Clone(), response.body(), 2317 SendHeadersAndBodyAndTrailers(response.headers().Clone(), response.body(),
2345 response.trailers().Clone()); 2318 response.trailers().Clone());
2346 } 2319 }
2347 2320
2348 private: 2321 private:
2349 // Use a explicit int64 rather than size_t to simulate a 64-bit server talking 2322 // Use a explicit int64_t rather than size_t to simulate a 64-bit server
2350 // to a 32-bit client. 2323 // talking to a 32-bit client.
2351 int64_t body_bytes_; 2324 int64_t body_bytes_;
2352 }; 2325 };
2353 2326
2354 class ServerStreamThatSendsHugeResponseFactory 2327 class ServerStreamThatSendsHugeResponseFactory
2355 : public QuicTestServer::StreamFactory { 2328 : public QuicTestServer::StreamFactory {
2356 public: 2329 public:
2357 explicit ServerStreamThatSendsHugeResponseFactory(int64_t body_bytes) 2330 explicit ServerStreamThatSendsHugeResponseFactory(int64_t body_bytes)
2358 : body_bytes_(body_bytes) {} 2331 : body_bytes_(body_bytes) {}
2359 2332
2360 ~ServerStreamThatSendsHugeResponseFactory() override{}; 2333 ~ServerStreamThatSendsHugeResponseFactory() override{};
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
2474 2447
2475 StreamWithErrorFactory stream_factory(response_body); 2448 StreamWithErrorFactory stream_factory(response_body);
2476 SetSpdyStreamFactory(&stream_factory); 2449 SetSpdyStreamFactory(&stream_factory);
2477 2450
2478 ASSERT_TRUE(Initialize()); 2451 ASSERT_TRUE(Initialize());
2479 2452
2480 client_->client()->WaitForCryptoHandshakeConfirmed(); 2453 client_->client()->WaitForCryptoHandshakeConfirmed();
2481 2454
2482 // A POST that gets an early error response, after the headers are received 2455 // A POST that gets an early error response, after the headers are received
2483 // and before the body is received, due to invalid content-length. 2456 // and before the body is received, due to invalid content-length.
2457 // Set an invalid content-length, so the request will receive an early 500
2458 // response.
2484 SpdyHeaderBlock headers; 2459 SpdyHeaderBlock headers;
2485 headers[":method"] = "POST"; 2460 headers[":method"] = "POST";
2486 headers[":path"] = "/garbage"; 2461 headers[":path"] = "/garbage";
2487 headers[":scheme"] = "https"; 2462 headers[":scheme"] = "https";
2488 headers[":authority"] = server_hostname_; 2463 headers[":authority"] = server_hostname_;
2464 headers["content-length"] = "-1";
2489 2465
2490 // The body must be large enough that the FIN will be in a different packet 2466 // The body must be large enough that the FIN will be in a different packet
2491 // than the end of the headers, but short enough to not require a flow control 2467 // than the end of the headers, but short enough to not require a flow control
2492 // update. This allows headers processing to trigger the error response 2468 // update. This allows headers processing to trigger the error response
2493 // before the request FIN is processed but receive the request FIN before the 2469 // before the request FIN is processed but receive the request FIN before the
2494 // response is sent completely. 2470 // response is sent completely.
2495 const uint32_t kRequestBodySize = kMaxPacketSize + 10; 2471 const uint32_t kRequestBodySize = kMaxPacketSize + 10;
2496 string request_body; 2472 string request_body;
2497 GenerateBody(&request_body, kRequestBodySize); 2473 GenerateBody(&request_body, kRequestBodySize);
2498 // Set an invalid content-length, so the request will receive an early 500
2499 // response. Must be done after AddBody, which also sets content-length.
2500 headers["content-length"] = "-1";
2501 2474
2502 // Send the request. 2475 // Send the request.
2503 client_->SendMessage(headers, request_body); 2476 client_->SendMessage(headers, request_body);
2504 client_->WaitForResponse(); 2477 client_->WaitForResponse();
2505 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); 2478 EXPECT_EQ("500", client_->response_headers()->find(":status")->second);
2506 2479
2507 // Pause the server so we can access the server's internals without races. 2480 // Pause the server so we can access the server's internals without races.
2508 server_thread_->Pause(); 2481 server_thread_->Pause();
2509 2482
2510 QuicDispatcher* dispatcher = 2483 QuicDispatcher* dispatcher =
(...skipping 20 matching lines...) Expand all
2531 set_server_initial_session_flow_control_receive_window(kWindowSize); 2504 set_server_initial_session_flow_control_receive_window(kWindowSize);
2532 2505
2533 ASSERT_TRUE(Initialize()); 2506 ASSERT_TRUE(Initialize());
2534 2507
2535 client_->client()->WaitForCryptoHandshakeConfirmed(); 2508 client_->client()->WaitForCryptoHandshakeConfirmed();
2536 2509
2537 // POST to a URL that gets an early error response, after the headers are 2510 // POST to a URL that gets an early error response, after the headers are
2538 // received and before the body is received. 2511 // received and before the body is received.
2539 SpdyHeaderBlock headers; 2512 SpdyHeaderBlock headers;
2540 headers[":method"] = "POST"; 2513 headers[":method"] = "POST";
2541 headers[":path"] = "/garbage"; 2514 headers[":path"] = "/foo";
2542 headers[":scheme"] = "https"; 2515 headers[":scheme"] = "https";
2543 headers[":authority"] = server_hostname_; 2516 headers[":authority"] = server_hostname_;
2544
2545 // Invalid content-length so the request will receive an early 500 response.
Jana 2016/11/03 17:51:40 nit: move this comment to the comment block above
Ryan Hamilton 2016/11/03 17:57:28 meh. the comment above headers already talks about
2546 headers["content-length"] = "-1"; 2517 headers["content-length"] = "-1";
2547 2518
2548 // Tell the client to not close the stream if it receives an early response. 2519 // Tell the client to not close the stream if it receives an early response.
2549 client_->set_allow_bidirectional_data(true); 2520 client_->set_allow_bidirectional_data(true);
2550 // Send the headers. 2521 // Send the headers.
2551 client_->SendMessage(headers, "", false); 2522 client_->SendMessage(headers, "", /*fin=*/false);
2523
2552 // Receive the response and let the server close writing. 2524 // Receive the response and let the server close writing.
2553 client_->WaitForInitialResponse(); 2525 client_->WaitForInitialResponse();
2554 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); 2526 EXPECT_EQ("500", client_->response_headers()->find(":status")->second);
2555 2527
2556 // Receive the reset stream from server on early response. 2528 // Receive the reset stream from server on early response.
2557 ReliableQuicStream* stream = 2529 ReliableQuicStream* stream =
2558 client_->client()->session()->GetOrCreateStream(kClientDataStreamId1); 2530 client_->client()->session()->GetOrCreateStream(kClientDataStreamId1);
2559 // The stream is reset by server's reset stream. 2531 // The stream is reset by server's reset stream.
2560 EXPECT_EQ(stream, nullptr); 2532 EXPECT_EQ(stream, nullptr);
2561 } 2533 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2610 string path, 2582 string path,
2611 string response_body, 2583 string response_body,
2612 string* push_urls, 2584 string* push_urls,
2613 const size_t num_resources, 2585 const size_t num_resources,
2614 const size_t resource_size) { 2586 const size_t resource_size) {
2615 bool use_large_response = resource_size != 0; 2587 bool use_large_response = resource_size != 0;
2616 string large_resource; 2588 string large_resource;
2617 if (use_large_response) { 2589 if (use_large_response) {
2618 // Generate a response common body larger than flow control window for 2590 // Generate a response common body larger than flow control window for
2619 // push response. 2591 // push response.
2620 test::GenerateBody(&large_resource, resource_size); 2592 GenerateBody(&large_resource, resource_size);
2621 } 2593 }
2622 std::list<QuicInMemoryCache::ServerPushInfo> push_resources; 2594 std::list<QuicInMemoryCache::ServerPushInfo> push_resources;
2623 for (size_t i = 0; i < num_resources; ++i) { 2595 for (size_t i = 0; i < num_resources; ++i) {
2624 string url = push_urls[i]; 2596 string url = push_urls[i];
2625 GURL resource_url(url); 2597 GURL resource_url(url);
2626 string body = use_large_response 2598 string body = use_large_response
2627 ? large_resource 2599 ? large_resource
2628 : "This is server push response body for " + url; 2600 : "This is server push response body for " + url;
2629 SpdyHeaderBlock response_headers; 2601 SpdyHeaderBlock response_headers;
2630 response_headers[":version"] = "HTTP/1.1"; 2602 response_headers[":version"] = "HTTP/1.1";
(...skipping 17 matching lines...) Expand all
2648 ASSERT_TRUE(Initialize()); 2620 ASSERT_TRUE(Initialize());
2649 client_->client()->WaitForCryptoHandshakeConfirmed(); 2621 client_->client()->WaitForCryptoHandshakeConfirmed();
2650 2622
2651 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. 2623 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok.
2652 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); 2624 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2));
2653 SetReorderPercentage(30); 2625 SetReorderPercentage(30);
2654 2626
2655 // Add a response with headers, body, and push resources. 2627 // Add a response with headers, body, and push resources.
2656 const string kBody = "body content"; 2628 const string kBody = "body content";
2657 size_t kNumResources = 4; 2629 size_t kNumResources = 4;
2658 string push_urls[] = { 2630 string push_urls[] = {"https://example.com/font.woff",
2659 "https://google.com/font.woff", "https://google.com/script.js", 2631 "https://example.com/script.js",
2660 "https://fonts.google.com/font.woff", "https://google.com/logo-hires.jpg", 2632 "https://fonts.example.com/font.woff",
2661 }; 2633 "https://example.com/logo-hires.jpg"};
2662 AddRequestAndResponseWithServerPush("example.com", "/push_example", kBody, 2634 AddRequestAndResponseWithServerPush("example.com", "/push_example", kBody,
2663 push_urls, kNumResources, 0); 2635 push_urls, kNumResources, 0);
2664 2636
2665 client_->client()->set_response_listener( 2637 client_->client()->set_response_listener(
2666 std::unique_ptr<QuicClientBase::ResponseListener>( 2638 std::unique_ptr<QuicClientBase::ResponseListener>(
2667 new TestResponseListener)); 2639 new TestResponseListener));
2668 2640
2669 DVLOG(1) << "send request for /push_example"; 2641 DVLOG(1) << "send request for /push_example";
2670 EXPECT_EQ(kBody, client_->SendSynchronousRequest( 2642 EXPECT_EQ(kBody, client_->SendSynchronousRequest(
2671 "https://example.com/push_example")); 2643 "https://example.com/push_example"));
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2747 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. 2719 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok.
2748 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); 2720 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2));
2749 SetReorderPercentage(30); 2721 SetReorderPercentage(30);
2750 2722
2751 // Add a response with headers, body, and push resources. 2723 // Add a response with headers, body, and push resources.
2752 const string kBody = "body content"; 2724 const string kBody = "body content";
2753 2725
2754 // One more resource than max number of outgoing stream of this session. 2726 // One more resource than max number of outgoing stream of this session.
2755 const size_t kNumResources = 1 + kNumMaxStreams; // 11. 2727 const size_t kNumResources = 1 + kNumMaxStreams; // 11.
2756 string push_urls[11]; 2728 string push_urls[11];
2757 for (uint32_t i = 0; i < kNumResources; ++i) { 2729 for (size_t i = 0; i < kNumResources; ++i) {
2758 push_urls[i] = "https://example.com/push_resources" + base::UintToString(i); 2730 push_urls[i] = "https://example.com/push_resources" + base::UintToString(i);
2759 } 2731 }
2760 AddRequestAndResponseWithServerPush("example.com", "/push_example", kBody, 2732 AddRequestAndResponseWithServerPush("example.com", "/push_example", kBody,
2761 push_urls, kNumResources, 0); 2733 push_urls, kNumResources, 0);
2762 client_->client()->set_response_listener( 2734 client_->client()->set_response_listener(
2763 std::unique_ptr<QuicClientBase::ResponseListener>( 2735 std::unique_ptr<QuicClientBase::ResponseListener>(
2764 new TestResponseListener)); 2736 new TestResponseListener));
2765 2737
2766 // Send the first request: this will trigger the server to send all the push 2738 // Send the first request: this will trigger the server to send all the push
2767 // resources associated with this request, and these will be cached by the 2739 // resources associated with this request, and these will be cached by the
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2804 2776
2805 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. 2777 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok.
2806 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); 2778 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2));
2807 SetReorderPercentage(30); 2779 SetReorderPercentage(30);
2808 2780
2809 // Add a response with headers, body, and push resources. 2781 // Add a response with headers, body, and push resources.
2810 const string kBody = "body content"; 2782 const string kBody = "body content";
2811 2783
2812 const size_t kNumResources = kNumMaxStreams + 1; 2784 const size_t kNumResources = kNumMaxStreams + 1;
2813 string push_urls[11]; 2785 string push_urls[11];
2814 for (uint32_t i = 0; i < kNumResources; ++i) { 2786 for (size_t i = 0; i < kNumResources; ++i) {
2815 push_urls[i] = "http://example.com/push_resources" + base::UintToString(i); 2787 push_urls[i] = "http://example.com/push_resources" + base::UintToString(i);
2816 } 2788 }
2817 AddRequestAndResponseWithServerPush("example.com", "/push_example", kBody, 2789 AddRequestAndResponseWithServerPush("example.com", "/push_example", kBody,
2818 push_urls, kNumResources, kBodySize); 2790 push_urls, kNumResources, kBodySize);
2819 2791
2820 client_->client()->set_response_listener( 2792 client_->client()->set_response_listener(
2821 std::unique_ptr<QuicClientBase::ResponseListener>( 2793 std::unique_ptr<QuicClientBase::ResponseListener>(
2822 new TestResponseListener)); 2794 new TestResponseListener));
2823 2795
2824 client_->SendRequest("https://example.com/push_example"); 2796 client_->SendRequest("https://example.com/push_example");
(...skipping 21 matching lines...) Expand all
2846 2818
2847 // "Send" request for a promised resources will not really send out it because 2819 // "Send" request for a promised resources will not really send out it because
2848 // its response is being pushed(but blocked). And the following ack and 2820 // its response is being pushed(but blocked). And the following ack and
2849 // flow control behavior of SendSynchronousRequests() 2821 // flow control behavior of SendSynchronousRequests()
2850 // will unblock the stream to finish receiving response. 2822 // will unblock the stream to finish receiving response.
2851 client_->SendSynchronousRequest(push_urls[0]); 2823 client_->SendSynchronousRequest(push_urls[0]);
2852 EXPECT_EQ(1u, client_->num_requests()); 2824 EXPECT_EQ(1u, client_->num_requests());
2853 EXPECT_EQ(2u, client_->num_responses()); 2825 EXPECT_EQ(2u, client_->num_responses());
2854 2826
2855 // Do same thing for the rest 10 resources. 2827 // Do same thing for the rest 10 resources.
2856 for (uint32_t i = 1; i < kNumResources; ++i) { 2828 for (size_t i = 1; i < kNumResources; ++i) {
2857 client_->SendSynchronousRequest(push_urls[i]); 2829 client_->SendSynchronousRequest(push_urls[i]);
2858 } 2830 }
2859 2831
2860 // Because of server push, client gets all pushed resources without actually 2832 // Because of server push, client gets all pushed resources without actually
2861 // sending requests for them. 2833 // sending requests for them.
2862 EXPECT_EQ(1u, client_->num_requests()); 2834 EXPECT_EQ(1u, client_->num_requests());
2863 // Including response to original request, 12 responses in total were 2835 // Including response to original request, 12 responses in total were
2864 // recieved. 2836 // recieved.
2865 EXPECT_EQ(12u, client_->num_responses()); 2837 EXPECT_EQ(12u, client_->num_responses());
2866 } 2838 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2911 ASSERT_TRUE(Initialize()); 2883 ASSERT_TRUE(Initialize());
2912 // Set client's epoll server's time out to 0 to make this test be finished 2884 // Set client's epoll server's time out to 0 to make this test be finished
2913 // within a short time. 2885 // within a short time.
2914 client_->epoll_server()->set_timeout_in_us(0); 2886 client_->epoll_server()->set_timeout_in_us(0);
2915 2887
2916 client_->client()->WaitForCryptoHandshakeConfirmed(); 2888 client_->client()->WaitForCryptoHandshakeConfirmed();
2917 SetPacketLossPercentage(1); 2889 SetPacketLossPercentage(1);
2918 // To avoid storing the whole request body in memory, use a loop to repeatedly 2890 // To avoid storing the whole request body in memory, use a loop to repeatedly
2919 // send body size of kSizeBytes until the whole request body size is reached. 2891 // send body size of kSizeBytes until the whole request body size is reached.
2920 const int kSizeBytes = 128 * 1024; 2892 const int kSizeBytes = 128 * 1024;
2893 // Request body size is 4G plus one more kSizeBytes.
2894 int64_t request_body_size_bytes = pow(2, 32) + kSizeBytes;
2895 ASSERT_LT(INT64_C(4294967296), request_body_size_bytes);
2896 string body;
2897 GenerateBody(&body, kSizeBytes);
2898
2921 SpdyHeaderBlock headers; 2899 SpdyHeaderBlock headers;
2922 headers[":method"] = "POST"; 2900 headers[":method"] = "POST";
2923 headers[":path"] = "/foo"; 2901 headers[":path"] = "/foo";
2924 headers[":scheme"] = "https"; 2902 headers[":scheme"] = "https";
2925 headers[":authority"] = server_hostname_; 2903 headers[":authority"] = server_hostname_;
2926
2927 // Request body size is 4G plus one more kSizeBytes.
2928 int64_t request_body_size_bytes = pow(2, 32) + kSizeBytes;
2929 ASSERT_LT(INT64_C(4294967296), request_body_size_bytes);
2930 headers["content-length"] = IntToString(request_body_size_bytes); 2904 headers["content-length"] = IntToString(request_body_size_bytes);
2931 string body;
2932 test::GenerateBody(&body, kSizeBytes);
2933 2905
2934 client_->SendMessage(headers, "", /*fin=*/false); 2906 client_->SendMessage(headers, "", /*fin=*/false);
2907
2935 for (int i = 0; i < request_body_size_bytes / kSizeBytes; ++i) { 2908 for (int i = 0; i < request_body_size_bytes / kSizeBytes; ++i) {
2936 bool fin = (i == request_body_size_bytes - 1); 2909 bool fin = (i == request_body_size_bytes - 1);
2937 client_->SendData(string(body.data(), kSizeBytes), fin); 2910 client_->SendData(string(body.data(), kSizeBytes), fin);
2938 client_->client()->WaitForEvents(); 2911 client_->client()->WaitForEvents();
2939 } 2912 }
2940 VerifyCleanConnection(true); 2913 VerifyCleanConnection(true);
2941 } 2914 }
2942 2915
2943 // TODO(fayang): this test seems to cause net_unittests timeouts :| 2916 // TODO(fayang): this test seems to cause net_unittests timeouts :|
2944 TEST_P(EndToEndTest, DISABLED_TestHugeResponseWithPacketLoss) { 2917 TEST_P(EndToEndTest, DISABLED_TestHugeResponseWithPacketLoss) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
3031 // Disconnect for next 0-rtt request. 3004 // Disconnect for next 0-rtt request.
3032 client_->Disconnect(); 3005 client_->Disconnect();
3033 3006
3034 // Client get valid STK now. Do a 0-rtt request. 3007 // Client get valid STK now. Do a 0-rtt request.
3035 // Buffer a CHLO till another packets sent out. 3008 // Buffer a CHLO till another packets sent out.
3036 reorder_writer_->SetDelay(1); 3009 reorder_writer_->SetDelay(1);
3037 // Only send out a CHLO. 3010 // Only send out a CHLO.
3038 client_->client()->Initialize(); 3011 client_->client()->Initialize();
3039 client_->client()->StartConnect(); 3012 client_->client()->StartConnect();
3040 ASSERT_TRUE(client_->client()->connected()); 3013 ASSERT_TRUE(client_->client()->connected());
3014
3041 // Send a request before handshake finishes. 3015 // Send a request before handshake finishes.
3042 SpdyHeaderBlock headers; 3016 SpdyHeaderBlock headers;
3043 headers[":method"] = "POST"; 3017 headers[":method"] = "POST";
3044 headers[":path"] = "/bar"; 3018 headers[":path"] = "/bar";
3045 headers[":scheme"] = "https"; 3019 headers[":scheme"] = "https";
3046 headers[":authority"] = server_hostname_; 3020 headers[":authority"] = server_hostname_;
3047 3021
3048 client_->SendMessage(headers, ""); 3022 client_->SendMessage(headers, "");
3049 client_->WaitForResponse(); 3023 client_->WaitForResponse();
3050 EXPECT_EQ(kBarResponseBody, client_->response_body()); 3024 EXPECT_EQ(kBarResponseBody, client_->response_body());
3051 QuicConnectionStats client_stats = 3025 QuicConnectionStats client_stats =
3052 client_->client()->session()->connection()->GetStats(); 3026 client_->client()->session()->connection()->GetStats();
3053 EXPECT_EQ(0u, client_stats.packets_lost); 3027 EXPECT_EQ(0u, client_stats.packets_lost);
3054 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); 3028 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos());
3055 } 3029 }
3056 } // namespace 3030 } // namespace
3057 } // namespace test 3031 } // namespace test
3058 } // namespace net 3032 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698