| OLD | NEW |
| 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 <cstdint> |
| 9 #include <list> | 9 #include <list> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 574 bool force_hol_blocking_; | 574 bool force_hol_blocking_; |
| 575 }; | 575 }; |
| 576 | 576 |
| 577 // Run all end to end tests with all supported versions. | 577 // Run all end to end tests with all supported versions. |
| 578 INSTANTIATE_TEST_CASE_P(EndToEndTests, | 578 INSTANTIATE_TEST_CASE_P(EndToEndTests, |
| 579 EndToEndTest, | 579 EndToEndTest, |
| 580 ::testing::ValuesIn(GetTestParams())); | 580 ::testing::ValuesIn(GetTestParams())); |
| 581 | 581 |
| 582 TEST_P(EndToEndTest, HandshakeSuccessful) { | 582 TEST_P(EndToEndTest, HandshakeSuccessful) { |
| 583 ASSERT_TRUE(Initialize()); | 583 ASSERT_TRUE(Initialize()); |
| 584 client_->client()->WaitForCryptoHandshakeConfirmed(); | 584 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 585 QuicCryptoStream* crypto_stream = | 585 QuicCryptoStream* crypto_stream = |
| 586 QuicSessionPeer::GetCryptoStream(client_->client()->session()); | 586 QuicSessionPeer::GetCryptoStream(client_->client()->session()); |
| 587 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(crypto_stream); | 587 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(crypto_stream); |
| 588 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer, | 588 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer, |
| 589 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); | 589 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); |
| 590 server_thread_->Pause(); | 590 server_thread_->Pause(); |
| 591 QuicDispatcher* dispatcher = | 591 QuicDispatcher* dispatcher = |
| 592 QuicServerPeer::GetDispatcher(server_thread_->server()); | 592 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 593 QuicSession* server_session = dispatcher->session_map().begin()->second.get(); | 593 QuicSession* server_session = dispatcher->session_map().begin()->second.get(); |
| 594 crypto_stream = QuicSessionPeer::GetCryptoStream(server_session); | 594 crypto_stream = QuicSessionPeer::GetCryptoStream(server_session); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 // triggering an error response. | 722 // triggering an error response. |
| 723 client_->SendCustomSynchronousRequest(headers, ""); | 723 client_->SendCustomSynchronousRequest(headers, ""); |
| 724 EXPECT_EQ(QuicSimpleServerStream::kErrorResponseBody, | 724 EXPECT_EQ(QuicSimpleServerStream::kErrorResponseBody, |
| 725 client_->response_body()); | 725 client_->response_body()); |
| 726 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); | 726 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); |
| 727 } | 727 } |
| 728 | 728 |
| 729 TEST_P(EndToEndTest, LargePostNoPacketLoss) { | 729 TEST_P(EndToEndTest, LargePostNoPacketLoss) { |
| 730 ASSERT_TRUE(Initialize()); | 730 ASSERT_TRUE(Initialize()); |
| 731 | 731 |
| 732 client_->client()->WaitForCryptoHandshakeConfirmed(); | 732 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 733 | 733 |
| 734 // 1 MB body. | 734 // 1 MB body. |
| 735 string body(1024 * 1024, 'a'); | 735 string body(1024 * 1024, 'a'); |
| 736 SpdyHeaderBlock headers; | 736 SpdyHeaderBlock headers; |
| 737 headers[":method"] = "POST"; | 737 headers[":method"] = "POST"; |
| 738 headers[":path"] = "/foo"; | 738 headers[":path"] = "/foo"; |
| 739 headers[":scheme"] = "https"; | 739 headers[":scheme"] = "https"; |
| 740 headers[":authority"] = server_hostname_; | 740 headers[":authority"] = server_hostname_; |
| 741 | 741 |
| 742 EXPECT_EQ(kFooResponseBody, | 742 EXPECT_EQ(kFooResponseBody, |
| 743 client_->SendCustomSynchronousRequest(headers, body)); | 743 client_->SendCustomSynchronousRequest(headers, body)); |
| 744 // TODO(ianswett): There should not be packet loss in this test, but on some | 744 // TODO(ianswett): There should not be packet loss in this test, but on some |
| 745 // platforms the receive buffer overflows. | 745 // platforms the receive buffer overflows. |
| 746 VerifyCleanConnection(true); | 746 VerifyCleanConnection(true); |
| 747 } | 747 } |
| 748 | 748 |
| 749 TEST_P(EndToEndTest, LargePostNoPacketLoss1sRTT) { | 749 TEST_P(EndToEndTest, LargePostNoPacketLoss1sRTT) { |
| 750 ASSERT_TRUE(Initialize()); | 750 ASSERT_TRUE(Initialize()); |
| 751 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(1000)); | 751 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(1000)); |
| 752 | 752 |
| 753 client_->client()->WaitForCryptoHandshakeConfirmed(); | 753 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 754 | 754 |
| 755 // 100 KB body. | 755 // 100 KB body. |
| 756 string body(100 * 1024, 'a'); | 756 string body(100 * 1024, 'a'); |
| 757 SpdyHeaderBlock headers; | 757 SpdyHeaderBlock headers; |
| 758 headers[":method"] = "POST"; | 758 headers[":method"] = "POST"; |
| 759 headers[":path"] = "/foo"; | 759 headers[":path"] = "/foo"; |
| 760 headers[":scheme"] = "https"; | 760 headers[":scheme"] = "https"; |
| 761 headers[":authority"] = server_hostname_; | 761 headers[":authority"] = server_hostname_; |
| 762 | 762 |
| 763 EXPECT_EQ(kFooResponseBody, | 763 EXPECT_EQ(kFooResponseBody, |
| 764 client_->SendCustomSynchronousRequest(headers, body)); | 764 client_->SendCustomSynchronousRequest(headers, body)); |
| 765 VerifyCleanConnection(false); | 765 VerifyCleanConnection(false); |
| 766 } | 766 } |
| 767 | 767 |
| 768 TEST_P(EndToEndTest, LargePostWithPacketLoss) { | 768 TEST_P(EndToEndTest, LargePostWithPacketLoss) { |
| 769 if (!BothSidesSupportStatelessRejects()) { | 769 if (!BothSidesSupportStatelessRejects()) { |
| 770 // Connect with lower fake packet loss than we'd like to test. | 770 // Connect with lower fake packet loss than we'd like to test. |
| 771 // Until b/10126687 is fixed, losing handshake packets is pretty | 771 // Until b/10126687 is fixed, losing handshake packets is pretty |
| 772 // brutal. | 772 // brutal. |
| 773 // TODO(jokulik): Until we support redundant SREJ packets, don't | 773 // TODO(jokulik): Until we support redundant SREJ packets, don't |
| 774 // drop handshake packets for stateless rejects. | 774 // drop handshake packets for stateless rejects. |
| 775 SetPacketLossPercentage(5); | 775 SetPacketLossPercentage(5); |
| 776 } | 776 } |
| 777 ASSERT_TRUE(Initialize()); | 777 ASSERT_TRUE(Initialize()); |
| 778 | 778 |
| 779 // Wait for the server SHLO before upping the packet loss. | 779 // Wait for the server SHLO before upping the packet loss. |
| 780 client_->client()->WaitForCryptoHandshakeConfirmed(); | 780 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 781 SetPacketLossPercentage(30); | 781 SetPacketLossPercentage(30); |
| 782 | 782 |
| 783 // 10 KB body. | 783 // 10 KB body. |
| 784 string body(1024 * 10, 'a'); | 784 string body(1024 * 10, 'a'); |
| 785 SpdyHeaderBlock headers; | 785 SpdyHeaderBlock headers; |
| 786 headers[":method"] = "POST"; | 786 headers[":method"] = "POST"; |
| 787 headers[":path"] = "/foo"; | 787 headers[":path"] = "/foo"; |
| 788 headers[":scheme"] = "https"; | 788 headers[":scheme"] = "https"; |
| 789 headers[":authority"] = server_hostname_; | 789 headers[":authority"] = server_hostname_; |
| 790 | 790 |
| 791 EXPECT_EQ(kFooResponseBody, | 791 EXPECT_EQ(kFooResponseBody, |
| 792 client_->SendCustomSynchronousRequest(headers, body)); | 792 client_->SendCustomSynchronousRequest(headers, body)); |
| 793 VerifyCleanConnection(true); | 793 VerifyCleanConnection(true); |
| 794 } | 794 } |
| 795 | 795 |
| 796 TEST_P(EndToEndTest, LargePostWithPacketLossAndBlockedSocket) { | 796 TEST_P(EndToEndTest, LargePostWithPacketLossAndBlockedSocket) { |
| 797 if (!BothSidesSupportStatelessRejects()) { | 797 if (!BothSidesSupportStatelessRejects()) { |
| 798 // Connect with lower fake packet loss than we'd like to test. Until | 798 // Connect with lower fake packet loss than we'd like to test. Until |
| 799 // b/10126687 is fixed, losing handshake packets is pretty brutal. | 799 // b/10126687 is fixed, losing handshake packets is pretty brutal. |
| 800 // TODO(jokulik): Until we support redundant SREJ packets, don't | 800 // TODO(jokulik): Until we support redundant SREJ packets, don't |
| 801 // drop handshake packets for stateless rejects. | 801 // drop handshake packets for stateless rejects. |
| 802 SetPacketLossPercentage(5); | 802 SetPacketLossPercentage(5); |
| 803 } | 803 } |
| 804 ASSERT_TRUE(Initialize()); | 804 ASSERT_TRUE(Initialize()); |
| 805 | 805 |
| 806 // Wait for the server SHLO before upping the packet loss. | 806 // Wait for the server SHLO before upping the packet loss. |
| 807 client_->client()->WaitForCryptoHandshakeConfirmed(); | 807 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 808 SetPacketLossPercentage(10); | 808 SetPacketLossPercentage(10); |
| 809 client_writer_->set_fake_blocked_socket_percentage(10); | 809 client_writer_->set_fake_blocked_socket_percentage(10); |
| 810 | 810 |
| 811 // 10 KB body. | 811 // 10 KB body. |
| 812 string body(1024 * 10, 'a'); | 812 string body(1024 * 10, 'a'); |
| 813 SpdyHeaderBlock headers; | 813 SpdyHeaderBlock headers; |
| 814 headers[":method"] = "POST"; | 814 headers[":method"] = "POST"; |
| 815 headers[":path"] = "/foo"; | 815 headers[":path"] = "/foo"; |
| 816 headers[":scheme"] = "https"; | 816 headers[":scheme"] = "https"; |
| 817 headers[":authority"] = server_hostname_; | 817 headers[":authority"] = server_hostname_; |
| 818 | 818 |
| 819 EXPECT_EQ(kFooResponseBody, | 819 EXPECT_EQ(kFooResponseBody, |
| 820 client_->SendCustomSynchronousRequest(headers, body)); | 820 client_->SendCustomSynchronousRequest(headers, body)); |
| 821 } | 821 } |
| 822 | 822 |
| 823 TEST_P(EndToEndTest, LargePostNoPacketLossWithDelayAndReordering) { | 823 TEST_P(EndToEndTest, LargePostNoPacketLossWithDelayAndReordering) { |
| 824 ASSERT_TRUE(Initialize()); | 824 ASSERT_TRUE(Initialize()); |
| 825 | 825 |
| 826 client_->client()->WaitForCryptoHandshakeConfirmed(); | 826 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 827 // Both of these must be called when the writer is not actively used. | 827 // Both of these must be called when the writer is not actively used. |
| 828 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); | 828 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); |
| 829 SetReorderPercentage(30); | 829 SetReorderPercentage(30); |
| 830 | 830 |
| 831 // 1 MB body. | 831 // 1 MB body. |
| 832 string body(1024 * 1024, 'a'); | 832 string body(1024 * 1024, 'a'); |
| 833 SpdyHeaderBlock headers; | 833 SpdyHeaderBlock headers; |
| 834 headers[":method"] = "POST"; | 834 headers[":method"] = "POST"; |
| 835 headers[":path"] = "/foo"; | 835 headers[":path"] = "/foo"; |
| 836 headers[":scheme"] = "https"; | 836 headers[":scheme"] = "https"; |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1020 | 1020 |
| 1021 TEST_P(EndToEndTest, SetInitialReceivedConnectionOptions) { | 1021 TEST_P(EndToEndTest, SetInitialReceivedConnectionOptions) { |
| 1022 QuicTagVector initial_received_options; | 1022 QuicTagVector initial_received_options; |
| 1023 initial_received_options.push_back(kTBBR); | 1023 initial_received_options.push_back(kTBBR); |
| 1024 initial_received_options.push_back(kIW10); | 1024 initial_received_options.push_back(kIW10); |
| 1025 initial_received_options.push_back(kPRST); | 1025 initial_received_options.push_back(kPRST); |
| 1026 EXPECT_TRUE(server_config_.SetInitialReceivedConnectionOptions( | 1026 EXPECT_TRUE(server_config_.SetInitialReceivedConnectionOptions( |
| 1027 initial_received_options)); | 1027 initial_received_options)); |
| 1028 | 1028 |
| 1029 ASSERT_TRUE(Initialize()); | 1029 ASSERT_TRUE(Initialize()); |
| 1030 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1030 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1031 server_thread_->WaitForCryptoHandshakeConfirmed(); | 1031 server_thread_->WaitForCryptoHandshakeConfirmed(); |
| 1032 | 1032 |
| 1033 EXPECT_FALSE(server_config_.SetInitialReceivedConnectionOptions( | 1033 EXPECT_FALSE(server_config_.SetInitialReceivedConnectionOptions( |
| 1034 initial_received_options)); | 1034 initial_received_options)); |
| 1035 | 1035 |
| 1036 // Verify that server's configuration is correct. | 1036 // Verify that server's configuration is correct. |
| 1037 server_thread_->Pause(); | 1037 server_thread_->Pause(); |
| 1038 EXPECT_TRUE(server_config_.HasReceivedConnectionOptions()); | 1038 EXPECT_TRUE(server_config_.HasReceivedConnectionOptions()); |
| 1039 EXPECT_TRUE( | 1039 EXPECT_TRUE( |
| 1040 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kTBBR)); | 1040 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kTBBR)); |
| 1041 EXPECT_TRUE( | 1041 EXPECT_TRUE( |
| 1042 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kIW10)); | 1042 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kIW10)); |
| 1043 EXPECT_TRUE( | 1043 EXPECT_TRUE( |
| 1044 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kPRST)); | 1044 ContainsQuicTag(server_config_.ReceivedConnectionOptions(), kPRST)); |
| 1045 } | 1045 } |
| 1046 | 1046 |
| 1047 TEST_P(EndToEndTest, LargePostSmallBandwidthLargeBuffer) { | 1047 TEST_P(EndToEndTest, LargePostSmallBandwidthLargeBuffer) { |
| 1048 ASSERT_TRUE(Initialize()); | 1048 ASSERT_TRUE(Initialize()); |
| 1049 SetPacketSendDelay(QuicTime::Delta::FromMicroseconds(1)); | 1049 SetPacketSendDelay(QuicTime::Delta::FromMicroseconds(1)); |
| 1050 // 256KB per second with a 256KB buffer from server to client. Wireless | 1050 // 256KB per second with a 256KB buffer from server to client. Wireless |
| 1051 // clients commonly have larger buffers, but our max CWND is 200. | 1051 // clients commonly have larger buffers, but our max CWND is 200. |
| 1052 server_writer_->set_max_bandwidth_and_buffer_size( | 1052 server_writer_->set_max_bandwidth_and_buffer_size( |
| 1053 QuicBandwidth::FromBytesPerSecond(256 * 1024), 256 * 1024); | 1053 QuicBandwidth::FromBytesPerSecond(256 * 1024), 256 * 1024); |
| 1054 | 1054 |
| 1055 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1055 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1056 | 1056 |
| 1057 // 1 MB body. | 1057 // 1 MB body. |
| 1058 string body(1024 * 1024, 'a'); | 1058 string body(1024 * 1024, 'a'); |
| 1059 SpdyHeaderBlock headers; | 1059 SpdyHeaderBlock headers; |
| 1060 headers[":method"] = "POST"; | 1060 headers[":method"] = "POST"; |
| 1061 headers[":path"] = "/foo"; | 1061 headers[":path"] = "/foo"; |
| 1062 headers[":scheme"] = "https"; | 1062 headers[":scheme"] = "https"; |
| 1063 headers[":authority"] = server_hostname_; | 1063 headers[":authority"] = server_hostname_; |
| 1064 | 1064 |
| 1065 EXPECT_EQ(kFooResponseBody, | 1065 EXPECT_EQ(kFooResponseBody, |
| 1066 client_->SendCustomSynchronousRequest(headers, body)); | 1066 client_->SendCustomSynchronousRequest(headers, body)); |
| 1067 // This connection may drop packets, because the buffer is smaller than the | 1067 // This connection may drop packets, because the buffer is smaller than the |
| 1068 // max CWND. | 1068 // max CWND. |
| 1069 VerifyCleanConnection(true); | 1069 VerifyCleanConnection(true); |
| 1070 } | 1070 } |
| 1071 | 1071 |
| 1072 TEST_P(EndToEndTest, DoNotSetResumeWriteAlarmIfConnectionFlowControlBlocked) { | 1072 TEST_P(EndToEndTest, DoNotSetResumeWriteAlarmIfConnectionFlowControlBlocked) { |
| 1073 // Regression test for b/14677858. | 1073 // Regression test for b/14677858. |
| 1074 // Test that the resume write alarm is not set in QuicConnection::OnCanWrite | 1074 // Test that the resume write alarm is not set in QuicConnection::OnCanWrite |
| 1075 // if currently connection level flow control blocked. If set, this results in | 1075 // if currently connection level flow control blocked. If set, this results in |
| 1076 // an infinite loop in the EpollServer, as the alarm fires and is immediately | 1076 // an infinite loop in the EpollServer, as the alarm fires and is immediately |
| 1077 // rescheduled. | 1077 // rescheduled. |
| 1078 ASSERT_TRUE(Initialize()); | 1078 ASSERT_TRUE(Initialize()); |
| 1079 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1079 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1080 | 1080 |
| 1081 // Ensure both stream and connection level are flow control blocked by setting | 1081 // Ensure both stream and connection level are flow control blocked by setting |
| 1082 // the send window offset to 0. | 1082 // the send window offset to 0. |
| 1083 const uint64_t flow_control_window = | 1083 const uint64_t flow_control_window = |
| 1084 server_config_.GetInitialStreamFlowControlWindowToSend(); | 1084 server_config_.GetInitialStreamFlowControlWindowToSend(); |
| 1085 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); | 1085 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); |
| 1086 QuicSession* session = client_->client()->session(); | 1086 QuicSession* session = client_->client()->session(); |
| 1087 QuicFlowControllerPeer::SetSendWindowOffset(stream->flow_controller(), 0); | 1087 QuicFlowControllerPeer::SetSendWindowOffset(stream->flow_controller(), 0); |
| 1088 QuicFlowControllerPeer::SetSendWindowOffset(session->flow_controller(), 0); | 1088 QuicFlowControllerPeer::SetSendWindowOffset(session->flow_controller(), 0); |
| 1089 EXPECT_TRUE(stream->flow_controller()->IsBlocked()); | 1089 EXPECT_TRUE(stream->flow_controller()->IsBlocked()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1104 // connection is still flow control blocked. | 1104 // connection is still flow control blocked. |
| 1105 session->connection()->OnCanWrite(); | 1105 session->connection()->OnCanWrite(); |
| 1106 | 1106 |
| 1107 QuicAlarm* resume_writes_alarm = | 1107 QuicAlarm* resume_writes_alarm = |
| 1108 QuicConnectionPeer::GetResumeWritesAlarm(session->connection()); | 1108 QuicConnectionPeer::GetResumeWritesAlarm(session->connection()); |
| 1109 EXPECT_FALSE(resume_writes_alarm->IsSet()); | 1109 EXPECT_FALSE(resume_writes_alarm->IsSet()); |
| 1110 } | 1110 } |
| 1111 | 1111 |
| 1112 TEST_P(EndToEndTest, InvalidStream) { | 1112 TEST_P(EndToEndTest, InvalidStream) { |
| 1113 ASSERT_TRUE(Initialize()); | 1113 ASSERT_TRUE(Initialize()); |
| 1114 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1114 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1115 | 1115 |
| 1116 string body(kMaxPacketSize, 'a'); | 1116 string body(kMaxPacketSize, 'a'); |
| 1117 SpdyHeaderBlock headers; | 1117 SpdyHeaderBlock headers; |
| 1118 headers[":method"] = "POST"; | 1118 headers[":method"] = "POST"; |
| 1119 headers[":path"] = "/foo"; | 1119 headers[":path"] = "/foo"; |
| 1120 headers[":scheme"] = "https"; | 1120 headers[":scheme"] = "https"; |
| 1121 headers[":authority"] = server_hostname_; | 1121 headers[":authority"] = server_hostname_; |
| 1122 | 1122 |
| 1123 // Force the client to write with a stream ID belonging to a nonexistent | 1123 // Force the client to write with a stream ID belonging to a nonexistent |
| 1124 // server-side stream. | 1124 // server-side stream. |
| 1125 QuicSessionPeer::SetNextOutgoingStreamId(client_->client()->session(), 2); | 1125 QuicSessionPeer::SetNextOutgoingStreamId(client_->client()->session(), 2); |
| 1126 | 1126 |
| 1127 client_->SendCustomSynchronousRequest(headers, body); | 1127 client_->SendCustomSynchronousRequest(headers, body); |
| 1128 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); | 1128 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); |
| 1129 EXPECT_EQ(QUIC_INVALID_STREAM_ID, client_->connection_error()); | 1129 EXPECT_EQ(QUIC_INVALID_STREAM_ID, client_->connection_error()); |
| 1130 } | 1130 } |
| 1131 | 1131 |
| 1132 // Test that if the the server will close the connection if the client attempts | 1132 // Test that if the the server will close the connection if the client attempts |
| 1133 // to send a request with overly large headers. | 1133 // to send a request with overly large headers. |
| 1134 TEST_P(EndToEndTest, LargeHeaders) { | 1134 TEST_P(EndToEndTest, LargeHeaders) { |
| 1135 ASSERT_TRUE(Initialize()); | 1135 ASSERT_TRUE(Initialize()); |
| 1136 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1136 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1137 | 1137 |
| 1138 string body(kMaxPacketSize, 'a'); | 1138 string body(kMaxPacketSize, 'a'); |
| 1139 SpdyHeaderBlock headers; | 1139 SpdyHeaderBlock headers; |
| 1140 headers[":method"] = "POST"; | 1140 headers[":method"] = "POST"; |
| 1141 headers[":path"] = "/foo"; | 1141 headers[":path"] = "/foo"; |
| 1142 headers[":scheme"] = "https"; | 1142 headers[":scheme"] = "https"; |
| 1143 headers[":authority"] = server_hostname_; | 1143 headers[":authority"] = server_hostname_; |
| 1144 headers["key1"] = string(15 * 1024, 'a'); | 1144 headers["key1"] = string(15 * 1024, 'a'); |
| 1145 headers["key2"] = string(15 * 1024, 'a'); | 1145 headers["key2"] = string(15 * 1024, 'a'); |
| 1146 headers["key3"] = string(15 * 1024, 'a'); | 1146 headers["key3"] = string(15 * 1024, 'a'); |
| 1147 | 1147 |
| 1148 client_->SendCustomSynchronousRequest(headers, body); | 1148 client_->SendCustomSynchronousRequest(headers, body); |
| 1149 if (FLAGS_quic_limit_uncompressed_headers) { | 1149 if (FLAGS_quic_limit_uncompressed_headers) { |
| 1150 EXPECT_EQ(QUIC_HEADERS_TOO_LARGE, client_->stream_error()); | 1150 EXPECT_EQ(QUIC_HEADERS_TOO_LARGE, client_->stream_error()); |
| 1151 } else { | 1151 } else { |
| 1152 EXPECT_EQ(QUIC_STREAM_NO_ERROR, client_->stream_error()); | 1152 EXPECT_EQ(QUIC_STREAM_NO_ERROR, client_->stream_error()); |
| 1153 EXPECT_EQ(kFooResponseBody, client_->response_body()); | 1153 EXPECT_EQ(kFooResponseBody, client_->response_body()); |
| 1154 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); | 1154 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); |
| 1155 } | 1155 } |
| 1156 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error()); | 1156 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error()); |
| 1157 } | 1157 } |
| 1158 | 1158 |
| 1159 TEST_P(EndToEndTest, EarlyResponseWithQuicStreamNoError) { | 1159 TEST_P(EndToEndTest, EarlyResponseWithQuicStreamNoError) { |
| 1160 ASSERT_TRUE(Initialize()); | 1160 ASSERT_TRUE(Initialize()); |
| 1161 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1161 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1162 | 1162 |
| 1163 string large_body(1024 * 1024, 'a'); | 1163 string large_body(1024 * 1024, 'a'); |
| 1164 SpdyHeaderBlock headers; | 1164 SpdyHeaderBlock headers; |
| 1165 headers[":method"] = "POST"; | 1165 headers[":method"] = "POST"; |
| 1166 headers[":path"] = "/foo"; | 1166 headers[":path"] = "/foo"; |
| 1167 headers[":scheme"] = "https"; | 1167 headers[":scheme"] = "https"; |
| 1168 headers[":authority"] = server_hostname_; | 1168 headers[":authority"] = server_hostname_; |
| 1169 // Insert an invalid content_length field in request to trigger an early | 1169 // Insert an invalid content_length field in request to trigger an early |
| 1170 // response from server. | 1170 // response from server. |
| 1171 headers["content-length"] = "-3"; | 1171 headers["content-length"] = "-3"; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1206 Initialize(); | 1206 Initialize(); |
| 1207 while (client_->client()->connected()) { | 1207 while (client_->client()->connected()) { |
| 1208 client_->client()->WaitForEvents(); | 1208 client_->client()->WaitForEvents(); |
| 1209 } | 1209 } |
| 1210 } | 1210 } |
| 1211 | 1211 |
| 1212 TEST_P(EndToEndTest, NegotiateMaxOpenStreams) { | 1212 TEST_P(EndToEndTest, NegotiateMaxOpenStreams) { |
| 1213 // Negotiate 1 max open stream. | 1213 // Negotiate 1 max open stream. |
| 1214 client_config_.SetMaxStreamsPerConnection(1, 1); | 1214 client_config_.SetMaxStreamsPerConnection(1, 1); |
| 1215 ASSERT_TRUE(Initialize()); | 1215 ASSERT_TRUE(Initialize()); |
| 1216 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1216 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1217 | 1217 |
| 1218 if (negotiated_version_ > QUIC_VERSION_34) { | 1218 if (negotiated_version_ > QUIC_VERSION_34) { |
| 1219 // Newer versions use max incoming dynamic streams. | 1219 // Newer versions use max incoming dynamic streams. |
| 1220 return; | 1220 return; |
| 1221 } | 1221 } |
| 1222 | 1222 |
| 1223 // Make the client misbehave after negotiation. | 1223 // Make the client misbehave after negotiation. |
| 1224 const int kServerMaxStreams = kMaxStreamsMinimumIncrement + 1; | 1224 const int kServerMaxStreams = kMaxStreamsMinimumIncrement + 1; |
| 1225 QuicSessionPeer::SetMaxOpenOutgoingStreams(client_->client()->session(), | 1225 QuicSessionPeer::SetMaxOpenOutgoingStreams(client_->client()->session(), |
| 1226 kServerMaxStreams + 1); | 1226 kServerMaxStreams + 1); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1244 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error()); | 1244 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error()); |
| 1245 } | 1245 } |
| 1246 | 1246 |
| 1247 TEST_P(EndToEndTest, MaxIncomingDynamicStreamsLimitRespected) { | 1247 TEST_P(EndToEndTest, MaxIncomingDynamicStreamsLimitRespected) { |
| 1248 // Set a limit on maximum number of incoming dynamic streams. | 1248 // Set a limit on maximum number of incoming dynamic streams. |
| 1249 // Make sure the limit is respected. | 1249 // Make sure the limit is respected. |
| 1250 const uint32_t kServerMaxIncomingDynamicStreams = 1; | 1250 const uint32_t kServerMaxIncomingDynamicStreams = 1; |
| 1251 server_config_.SetMaxIncomingDynamicStreamsToSend( | 1251 server_config_.SetMaxIncomingDynamicStreamsToSend( |
| 1252 kServerMaxIncomingDynamicStreams); | 1252 kServerMaxIncomingDynamicStreams); |
| 1253 ASSERT_TRUE(Initialize()); | 1253 ASSERT_TRUE(Initialize()); |
| 1254 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1254 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1255 | 1255 |
| 1256 if (negotiated_version_ <= QUIC_VERSION_34) { | 1256 if (negotiated_version_ <= QUIC_VERSION_34) { |
| 1257 // Earlier versions negotiated max open streams. | 1257 // Earlier versions negotiated max open streams. |
| 1258 return; | 1258 return; |
| 1259 } | 1259 } |
| 1260 | 1260 |
| 1261 // Make the client misbehave after negotiation. | 1261 // Make the client misbehave after negotiation. |
| 1262 const int kServerMaxStreams = | 1262 const int kServerMaxStreams = |
| 1263 kMaxStreamsMinimumIncrement + kServerMaxIncomingDynamicStreams; | 1263 kMaxStreamsMinimumIncrement + kServerMaxIncomingDynamicStreams; |
| 1264 QuicSessionPeer::SetMaxOpenOutgoingStreams(client_->client()->session(), | 1264 QuicSessionPeer::SetMaxOpenOutgoingStreams(client_->client()->session(), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1285 | 1285 |
| 1286 TEST_P(EndToEndTest, SetIndependentMaxIncomingDynamicStreamsLimits) { | 1286 TEST_P(EndToEndTest, SetIndependentMaxIncomingDynamicStreamsLimits) { |
| 1287 // Each endpoint can set max incoming dynamic streams independently. | 1287 // Each endpoint can set max incoming dynamic streams independently. |
| 1288 const uint32_t kClientMaxIncomingDynamicStreams = 2; | 1288 const uint32_t kClientMaxIncomingDynamicStreams = 2; |
| 1289 const uint32_t kServerMaxIncomingDynamicStreams = 1; | 1289 const uint32_t kServerMaxIncomingDynamicStreams = 1; |
| 1290 client_config_.SetMaxIncomingDynamicStreamsToSend( | 1290 client_config_.SetMaxIncomingDynamicStreamsToSend( |
| 1291 kClientMaxIncomingDynamicStreams); | 1291 kClientMaxIncomingDynamicStreams); |
| 1292 server_config_.SetMaxIncomingDynamicStreamsToSend( | 1292 server_config_.SetMaxIncomingDynamicStreamsToSend( |
| 1293 kServerMaxIncomingDynamicStreams); | 1293 kServerMaxIncomingDynamicStreams); |
| 1294 ASSERT_TRUE(Initialize()); | 1294 ASSERT_TRUE(Initialize()); |
| 1295 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1295 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1296 | 1296 |
| 1297 if (negotiated_version_ <= QUIC_VERSION_34) { | 1297 if (negotiated_version_ <= QUIC_VERSION_34) { |
| 1298 // Earlier versions negotiated max open streams. | 1298 // Earlier versions negotiated max open streams. |
| 1299 return; | 1299 return; |
| 1300 } | 1300 } |
| 1301 | 1301 |
| 1302 // The client has received the server's limit and vice versa. | 1302 // The client has received the server's limit and vice versa. |
| 1303 EXPECT_EQ(kServerMaxIncomingDynamicStreams, | 1303 EXPECT_EQ(kServerMaxIncomingDynamicStreams, |
| 1304 client_->client()->session()->max_open_outgoing_streams()); | 1304 client_->client()->session()->max_open_outgoing_streams()); |
| 1305 server_thread_->Pause(); | 1305 server_thread_->Pause(); |
| 1306 QuicDispatcher* dispatcher = | 1306 QuicDispatcher* dispatcher = |
| 1307 QuicServerPeer::GetDispatcher(server_thread_->server()); | 1307 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 1308 QuicSession* server_session = dispatcher->session_map().begin()->second.get(); | 1308 QuicSession* server_session = dispatcher->session_map().begin()->second.get(); |
| 1309 EXPECT_EQ(kClientMaxIncomingDynamicStreams, | 1309 EXPECT_EQ(kClientMaxIncomingDynamicStreams, |
| 1310 server_session->max_open_outgoing_streams()); | 1310 server_session->max_open_outgoing_streams()); |
| 1311 server_thread_->Resume(); | 1311 server_thread_->Resume(); |
| 1312 } | 1312 } |
| 1313 | 1313 |
| 1314 TEST_P(EndToEndTest, NegotiateCongestionControl) { | 1314 TEST_P(EndToEndTest, NegotiateCongestionControl) { |
| 1315 FLAGS_quic_allow_new_bbr = true; | 1315 FLAGS_quic_allow_new_bbr = true; |
| 1316 // Disable this flag because if connection uses multipath sent packet manager, | 1316 // Disable this flag because if connection uses multipath sent packet manager, |
| 1317 // static_cast here does not work. | 1317 // static_cast here does not work. |
| 1318 FLAGS_quic_enable_multipath = false; | 1318 FLAGS_quic_enable_multipath = false; |
| 1319 ASSERT_TRUE(Initialize()); | 1319 ASSERT_TRUE(Initialize()); |
| 1320 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1320 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1321 | 1321 |
| 1322 CongestionControlType expected_congestion_control_type = kReno; | 1322 CongestionControlType expected_congestion_control_type = kReno; |
| 1323 switch (GetParam().congestion_control_tag) { | 1323 switch (GetParam().congestion_control_tag) { |
| 1324 case kRENO: | 1324 case kRENO: |
| 1325 expected_congestion_control_type = kReno; | 1325 expected_congestion_control_type = kReno; |
| 1326 break; | 1326 break; |
| 1327 case kTBBR: | 1327 case kTBBR: |
| 1328 expected_congestion_control_type = kBBR; | 1328 expected_congestion_control_type = kBBR; |
| 1329 break; | 1329 break; |
| 1330 case kQBIC: | 1330 case kQBIC: |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1344 server_thread_->Resume(); | 1344 server_thread_->Resume(); |
| 1345 } | 1345 } |
| 1346 | 1346 |
| 1347 TEST_P(EndToEndTest, LimitMaxOpenStreams) { | 1347 TEST_P(EndToEndTest, LimitMaxOpenStreams) { |
| 1348 // Server limits the number of max streams to 2. | 1348 // Server limits the number of max streams to 2. |
| 1349 server_config_.SetMaxStreamsPerConnection(2, 2); | 1349 server_config_.SetMaxStreamsPerConnection(2, 2); |
| 1350 // Client tries to negotiate for 10. | 1350 // Client tries to negotiate for 10. |
| 1351 client_config_.SetMaxStreamsPerConnection(10, 5); | 1351 client_config_.SetMaxStreamsPerConnection(10, 5); |
| 1352 | 1352 |
| 1353 ASSERT_TRUE(Initialize()); | 1353 ASSERT_TRUE(Initialize()); |
| 1354 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1354 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1355 if (negotiated_version_ > QUIC_VERSION_34) { | 1355 if (negotiated_version_ > QUIC_VERSION_34) { |
| 1356 // No negotiated max streams beyond version 34. | 1356 // No negotiated max streams beyond version 34. |
| 1357 return; | 1357 return; |
| 1358 } | 1358 } |
| 1359 QuicConfig* client_negotiated_config = client_->client()->session()->config(); | 1359 QuicConfig* client_negotiated_config = client_->client()->session()->config(); |
| 1360 EXPECT_EQ(2u, client_negotiated_config->MaxStreamsPerConnection()); | 1360 EXPECT_EQ(2u, client_negotiated_config->MaxStreamsPerConnection()); |
| 1361 } | 1361 } |
| 1362 | 1362 |
| 1363 TEST_P(EndToEndTest, ClientSuggestsRTT) { | 1363 TEST_P(EndToEndTest, ClientSuggestsRTT) { |
| 1364 // Client suggests initial RTT, verify it is used. | 1364 // Client suggests initial RTT, verify it is used. |
| 1365 const uint32_t kInitialRTT = 20000; | 1365 const uint32_t kInitialRTT = 20000; |
| 1366 client_config_.SetInitialRoundTripTimeUsToSend(kInitialRTT); | 1366 client_config_.SetInitialRoundTripTimeUsToSend(kInitialRTT); |
| 1367 | 1367 |
| 1368 ASSERT_TRUE(Initialize()); | 1368 ASSERT_TRUE(Initialize()); |
| 1369 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1369 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1370 server_thread_->WaitForCryptoHandshakeConfirmed(); | 1370 server_thread_->WaitForCryptoHandshakeConfirmed(); |
| 1371 | 1371 |
| 1372 // Pause the server so we can access the server's internals without races. | 1372 // Pause the server so we can access the server's internals without races. |
| 1373 server_thread_->Pause(); | 1373 server_thread_->Pause(); |
| 1374 QuicDispatcher* dispatcher = | 1374 QuicDispatcher* dispatcher = |
| 1375 QuicServerPeer::GetDispatcher(server_thread_->server()); | 1375 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 1376 ASSERT_EQ(1u, dispatcher->session_map().size()); | 1376 ASSERT_EQ(1u, dispatcher->session_map().size()); |
| 1377 const QuicSentPacketManagerInterface& client_sent_packet_manager = | 1377 const QuicSentPacketManagerInterface& client_sent_packet_manager = |
| 1378 client_->client()->session()->connection()->sent_packet_manager(); | 1378 client_->client()->session()->connection()->sent_packet_manager(); |
| 1379 const QuicSentPacketManagerInterface* server_sent_packet_manager = | 1379 const QuicSentPacketManagerInterface* server_sent_packet_manager = |
| 1380 GetSentPacketManagerFromFirstServerSession(); | 1380 GetSentPacketManagerFromFirstServerSession(); |
| 1381 | 1381 |
| 1382 EXPECT_EQ(kInitialRTT, | 1382 EXPECT_EQ(kInitialRTT, |
| 1383 client_sent_packet_manager.GetRttStats()->initial_rtt_us()); | 1383 client_sent_packet_manager.GetRttStats()->initial_rtt_us()); |
| 1384 EXPECT_EQ(kInitialRTT, | 1384 EXPECT_EQ(kInitialRTT, |
| 1385 server_sent_packet_manager->GetRttStats()->initial_rtt_us()); | 1385 server_sent_packet_manager->GetRttStats()->initial_rtt_us()); |
| 1386 server_thread_->Resume(); | 1386 server_thread_->Resume(); |
| 1387 } | 1387 } |
| 1388 | 1388 |
| 1389 TEST_P(EndToEndTest, MaxInitialRTT) { | 1389 TEST_P(EndToEndTest, MaxInitialRTT) { |
| 1390 // Client tries to suggest twice the server's max initial rtt and the server | 1390 // Client tries to suggest twice the server's max initial rtt and the server |
| 1391 // uses the max. | 1391 // uses the max. |
| 1392 client_config_.SetInitialRoundTripTimeUsToSend(2 * | 1392 client_config_.SetInitialRoundTripTimeUsToSend(2 * |
| 1393 kMaxInitialRoundTripTimeUs); | 1393 kMaxInitialRoundTripTimeUs); |
| 1394 | 1394 |
| 1395 ASSERT_TRUE(Initialize()); | 1395 ASSERT_TRUE(Initialize()); |
| 1396 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1396 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1397 server_thread_->WaitForCryptoHandshakeConfirmed(); | 1397 server_thread_->WaitForCryptoHandshakeConfirmed(); |
| 1398 | 1398 |
| 1399 // Pause the server so we can access the server's internals without races. | 1399 // Pause the server so we can access the server's internals without races. |
| 1400 server_thread_->Pause(); | 1400 server_thread_->Pause(); |
| 1401 QuicDispatcher* dispatcher = | 1401 QuicDispatcher* dispatcher = |
| 1402 QuicServerPeer::GetDispatcher(server_thread_->server()); | 1402 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 1403 ASSERT_EQ(1u, dispatcher->session_map().size()); | 1403 ASSERT_EQ(1u, dispatcher->session_map().size()); |
| 1404 QuicSession* session = dispatcher->session_map().begin()->second.get(); | 1404 QuicSession* session = dispatcher->session_map().begin()->second.get(); |
| 1405 const QuicSentPacketManagerInterface& client_sent_packet_manager = | 1405 const QuicSentPacketManagerInterface& client_sent_packet_manager = |
| 1406 client_->client()->session()->connection()->sent_packet_manager(); | 1406 client_->client()->session()->connection()->sent_packet_manager(); |
| 1407 | 1407 |
| 1408 // Now that acks have been exchanged, the RTT estimate has decreased on the | 1408 // Now that acks have been exchanged, the RTT estimate has decreased on the |
| 1409 // server and is not infinite on the client. | 1409 // server and is not infinite on the client. |
| 1410 EXPECT_FALSE( | 1410 EXPECT_FALSE( |
| 1411 client_sent_packet_manager.GetRttStats()->smoothed_rtt().IsInfinite()); | 1411 client_sent_packet_manager.GetRttStats()->smoothed_rtt().IsInfinite()); |
| 1412 const RttStats& server_rtt_stats = | 1412 const RttStats& server_rtt_stats = |
| 1413 *session->connection()->sent_packet_manager().GetRttStats(); | 1413 *session->connection()->sent_packet_manager().GetRttStats(); |
| 1414 EXPECT_EQ(static_cast<int64_t>(kMaxInitialRoundTripTimeUs), | 1414 EXPECT_EQ(static_cast<int64_t>(kMaxInitialRoundTripTimeUs), |
| 1415 server_rtt_stats.initial_rtt_us()); | 1415 server_rtt_stats.initial_rtt_us()); |
| 1416 EXPECT_GE(static_cast<int64_t>(kMaxInitialRoundTripTimeUs), | 1416 EXPECT_GE(static_cast<int64_t>(kMaxInitialRoundTripTimeUs), |
| 1417 server_rtt_stats.smoothed_rtt().ToMicroseconds()); | 1417 server_rtt_stats.smoothed_rtt().ToMicroseconds()); |
| 1418 server_thread_->Resume(); | 1418 server_thread_->Resume(); |
| 1419 } | 1419 } |
| 1420 | 1420 |
| 1421 TEST_P(EndToEndTest, MinInitialRTT) { | 1421 TEST_P(EndToEndTest, MinInitialRTT) { |
| 1422 // Client tries to suggest 0 and the server uses the default. | 1422 // Client tries to suggest 0 and the server uses the default. |
| 1423 client_config_.SetInitialRoundTripTimeUsToSend(0); | 1423 client_config_.SetInitialRoundTripTimeUsToSend(0); |
| 1424 | 1424 |
| 1425 ASSERT_TRUE(Initialize()); | 1425 ASSERT_TRUE(Initialize()); |
| 1426 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1426 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1427 server_thread_->WaitForCryptoHandshakeConfirmed(); | 1427 server_thread_->WaitForCryptoHandshakeConfirmed(); |
| 1428 | 1428 |
| 1429 // Pause the server so we can access the server's internals without races. | 1429 // Pause the server so we can access the server's internals without races. |
| 1430 server_thread_->Pause(); | 1430 server_thread_->Pause(); |
| 1431 QuicDispatcher* dispatcher = | 1431 QuicDispatcher* dispatcher = |
| 1432 QuicServerPeer::GetDispatcher(server_thread_->server()); | 1432 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 1433 ASSERT_EQ(1u, dispatcher->session_map().size()); | 1433 ASSERT_EQ(1u, dispatcher->session_map().size()); |
| 1434 QuicSession* session = dispatcher->session_map().begin()->second.get(); | 1434 QuicSession* session = dispatcher->session_map().begin()->second.get(); |
| 1435 const QuicSentPacketManagerInterface& client_sent_packet_manager = | 1435 const QuicSentPacketManagerInterface& client_sent_packet_manager = |
| 1436 client_->client()->session()->connection()->sent_packet_manager(); | 1436 client_->client()->session()->connection()->sent_packet_manager(); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1505 // TODO(jokulik): Until we support redundant SREJ packets, don't | 1505 // TODO(jokulik): Until we support redundant SREJ packets, don't |
| 1506 // drop handshake packets for stateless rejects. | 1506 // drop handshake packets for stateless rejects. |
| 1507 SetPacketLossPercentage(1); | 1507 SetPacketLossPercentage(1); |
| 1508 } | 1508 } |
| 1509 ASSERT_TRUE(Initialize()); | 1509 ASSERT_TRUE(Initialize()); |
| 1510 string large_body(10240, 'a'); | 1510 string large_body(10240, 'a'); |
| 1511 int max_streams = 100; | 1511 int max_streams = 100; |
| 1512 | 1512 |
| 1513 AddToCache("/large_response", 200, large_body); | 1513 AddToCache("/large_response", 200, large_body); |
| 1514 | 1514 |
| 1515 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1515 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1516 SetPacketLossPercentage(10); | 1516 SetPacketLossPercentage(10); |
| 1517 | 1517 |
| 1518 for (int i = 0; i < max_streams; ++i) { | 1518 for (int i = 0; i < max_streams; ++i) { |
| 1519 EXPECT_LT(0, client_->SendRequest("/large_response")); | 1519 EXPECT_LT(0, client_->SendRequest("/large_response")); |
| 1520 } | 1520 } |
| 1521 | 1521 |
| 1522 // WaitForEvents waits 50ms and returns true if there are outstanding | 1522 // WaitForEvents waits 50ms and returns true if there are outstanding |
| 1523 // requests. | 1523 // requests. |
| 1524 while (client_->client()->WaitForEvents() == true) { | 1524 while (client_->client()->WaitForEvents() == true) { |
| 1525 } | 1525 } |
| 1526 } | 1526 } |
| 1527 | 1527 |
| 1528 TEST_P(EndToEndTest, StreamCancelErrorTest) { | 1528 TEST_P(EndToEndTest, StreamCancelErrorTest) { |
| 1529 ASSERT_TRUE(Initialize()); | 1529 ASSERT_TRUE(Initialize()); |
| 1530 string small_body(256, 'a'); | 1530 string small_body(256, 'a'); |
| 1531 | 1531 |
| 1532 AddToCache("/small_response", 200, small_body); | 1532 AddToCache("/small_response", 200, small_body); |
| 1533 | 1533 |
| 1534 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1534 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1535 | 1535 |
| 1536 QuicSession* session = client_->client()->session(); | 1536 QuicSession* session = client_->client()->session(); |
| 1537 // Lose the request. | 1537 // Lose the request. |
| 1538 SetPacketLossPercentage(100); | 1538 SetPacketLossPercentage(100); |
| 1539 EXPECT_LT(0, client_->SendRequest("/small_response")); | 1539 EXPECT_LT(0, client_->SendRequest("/small_response")); |
| 1540 client_->client()->WaitForEvents(); | 1540 client_->client()->WaitForEvents(); |
| 1541 // Transmit the cancel, and ensure the connection is torn down properly. | 1541 // Transmit the cancel, and ensure the connection is torn down properly. |
| 1542 SetPacketLossPercentage(0); | 1542 SetPacketLossPercentage(0); |
| 1543 QuicStreamId stream_id = kClientDataStreamId1; | 1543 QuicStreamId stream_id = kClientDataStreamId1; |
| 1544 session->SendRstStream(stream_id, QUIC_STREAM_CANCELLED, 0); | 1544 session->SendRstStream(stream_id, QUIC_STREAM_CANCELLED, 0); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1652 set_client_initial_session_flow_control_receive_window(kClientSessionIFCW); | 1652 set_client_initial_session_flow_control_receive_window(kClientSessionIFCW); |
| 1653 | 1653 |
| 1654 uint32_t kServerStreamIFCW = 32 * 1024; | 1654 uint32_t kServerStreamIFCW = 32 * 1024; |
| 1655 uint32_t kServerSessionIFCW = 48 * 1024; | 1655 uint32_t kServerSessionIFCW = 48 * 1024; |
| 1656 set_server_initial_stream_flow_control_receive_window(kServerStreamIFCW); | 1656 set_server_initial_stream_flow_control_receive_window(kServerStreamIFCW); |
| 1657 set_server_initial_session_flow_control_receive_window(kServerSessionIFCW); | 1657 set_server_initial_session_flow_control_receive_window(kServerSessionIFCW); |
| 1658 | 1658 |
| 1659 ASSERT_TRUE(Initialize()); | 1659 ASSERT_TRUE(Initialize()); |
| 1660 | 1660 |
| 1661 // Values are exchanged during crypto handshake, so wait for that to finish. | 1661 // Values are exchanged during crypto handshake, so wait for that to finish. |
| 1662 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1662 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1663 server_thread_->WaitForCryptoHandshakeConfirmed(); | 1663 server_thread_->WaitForCryptoHandshakeConfirmed(); |
| 1664 | 1664 |
| 1665 // Open a data stream to make sure the stream level flow control is updated. | 1665 // Open a data stream to make sure the stream level flow control is updated. |
| 1666 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); | 1666 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); |
| 1667 stream->WriteOrBufferBody("hello", false, nullptr); | 1667 stream->WriteOrBufferBody("hello", false, nullptr); |
| 1668 | 1668 |
| 1669 // Client should have the right values for server's receive window. | 1669 // Client should have the right values for server's receive window. |
| 1670 EXPECT_EQ(kServerStreamIFCW, | 1670 EXPECT_EQ(kServerStreamIFCW, |
| 1671 client_->client() | 1671 client_->client() |
| 1672 ->session() | 1672 ->session() |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1705 set_client_initial_stream_flow_control_receive_window(kStreamIFCW); | 1705 set_client_initial_stream_flow_control_receive_window(kStreamIFCW); |
| 1706 set_client_initial_session_flow_control_receive_window(kSessionIFCW); | 1706 set_client_initial_session_flow_control_receive_window(kSessionIFCW); |
| 1707 set_server_initial_stream_flow_control_receive_window(kStreamIFCW); | 1707 set_server_initial_stream_flow_control_receive_window(kStreamIFCW); |
| 1708 set_server_initial_session_flow_control_receive_window(kSessionIFCW); | 1708 set_server_initial_session_flow_control_receive_window(kSessionIFCW); |
| 1709 | 1709 |
| 1710 ASSERT_TRUE(Initialize()); | 1710 ASSERT_TRUE(Initialize()); |
| 1711 | 1711 |
| 1712 // Wait for crypto handshake to finish. This should have contributed to the | 1712 // Wait for crypto handshake to finish. This should have contributed to the |
| 1713 // crypto stream flow control window, but not affected the session flow | 1713 // crypto stream flow control window, but not affected the session flow |
| 1714 // control window. | 1714 // control window. |
| 1715 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1715 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1716 server_thread_->WaitForCryptoHandshakeConfirmed(); | 1716 server_thread_->WaitForCryptoHandshakeConfirmed(); |
| 1717 | 1717 |
| 1718 QuicCryptoStream* crypto_stream = | 1718 QuicCryptoStream* crypto_stream = |
| 1719 QuicSessionPeer::GetCryptoStream(client_->client()->session()); | 1719 QuicSessionPeer::GetCryptoStream(client_->client()->session()); |
| 1720 EXPECT_LT( | 1720 EXPECT_LT( |
| 1721 QuicFlowControllerPeer::SendWindowSize(crypto_stream->flow_controller()), | 1721 QuicFlowControllerPeer::SendWindowSize(crypto_stream->flow_controller()), |
| 1722 kStreamIFCW); | 1722 kStreamIFCW); |
| 1723 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::SendWindowSize( | 1723 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::SendWindowSize( |
| 1724 client_->client()->session()->flow_controller())); | 1724 client_->client()->session()->flow_controller())); |
| 1725 | 1725 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1748 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::ReceiveWindowSize( | 1748 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::ReceiveWindowSize( |
| 1749 server_connection_flow_controller)); | 1749 server_connection_flow_controller)); |
| 1750 server_thread_->Resume(); | 1750 server_thread_->Resume(); |
| 1751 } | 1751 } |
| 1752 | 1752 |
| 1753 TEST_P(EndToEndTest, FlowControlsSynced) { | 1753 TEST_P(EndToEndTest, FlowControlsSynced) { |
| 1754 set_smaller_flow_control_receive_window(); | 1754 set_smaller_flow_control_receive_window(); |
| 1755 | 1755 |
| 1756 ASSERT_TRUE(Initialize()); | 1756 ASSERT_TRUE(Initialize()); |
| 1757 | 1757 |
| 1758 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1758 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1759 server_thread_->WaitForCryptoHandshakeConfirmed(); | 1759 server_thread_->WaitForCryptoHandshakeConfirmed(); |
| 1760 | 1760 |
| 1761 server_thread_->Pause(); | 1761 server_thread_->Pause(); |
| 1762 QuicSpdySession* const client_session = client_->client()->session(); | 1762 QuicSpdySession* const client_session = client_->client()->session(); |
| 1763 QuicDispatcher* dispatcher = | 1763 QuicDispatcher* dispatcher = |
| 1764 QuicServerPeer::GetDispatcher(server_thread_->server()); | 1764 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 1765 auto server_session = static_cast<QuicSpdySession*>( | 1765 auto server_session = static_cast<QuicSpdySession*>( |
| 1766 dispatcher->session_map().begin()->second.get()); | 1766 dispatcher->session_map().begin()->second.get()); |
| 1767 | 1767 |
| 1768 ExpectFlowControlsSynced(client_session->flow_controller(), | 1768 ExpectFlowControlsSynced(client_session->flow_controller(), |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1848 // interested in has been ACKed. This tests end-to-end ACK notification, and | 1848 // interested in has been ACKed. This tests end-to-end ACK notification, and |
| 1849 // demonstrates that retransmissions do not break this functionality. | 1849 // demonstrates that retransmissions do not break this functionality. |
| 1850 if (!BothSidesSupportStatelessRejects()) { | 1850 if (!BothSidesSupportStatelessRejects()) { |
| 1851 // TODO(jokulik): Until we support redundant SREJ packets, don't | 1851 // TODO(jokulik): Until we support redundant SREJ packets, don't |
| 1852 // drop handshake packets for stateless rejects. | 1852 // drop handshake packets for stateless rejects. |
| 1853 SetPacketLossPercentage(5); | 1853 SetPacketLossPercentage(5); |
| 1854 } | 1854 } |
| 1855 ASSERT_TRUE(Initialize()); | 1855 ASSERT_TRUE(Initialize()); |
| 1856 | 1856 |
| 1857 // Wait for the server SHLO before upping the packet loss. | 1857 // Wait for the server SHLO before upping the packet loss. |
| 1858 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1858 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1859 SetPacketLossPercentage(30); | 1859 SetPacketLossPercentage(30); |
| 1860 client_writer_->set_fake_blocked_socket_percentage(10); | 1860 client_writer_->set_fake_blocked_socket_percentage(10); |
| 1861 | 1861 |
| 1862 // Create a POST request and send the headers only. | 1862 // Create a POST request and send the headers only. |
| 1863 SpdyHeaderBlock headers; | 1863 SpdyHeaderBlock headers; |
| 1864 headers[":method"] = "POST"; | 1864 headers[":method"] = "POST"; |
| 1865 headers[":path"] = "/foo"; | 1865 headers[":path"] = "/foo"; |
| 1866 headers[":scheme"] = "https"; | 1866 headers[":scheme"] = "https"; |
| 1867 headers[":authority"] = server_hostname_; | 1867 headers[":authority"] = server_hostname_; |
| 1868 | 1868 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1920 EXPECT_EQ("", client_->SendSynchronousRequest("/foo")); | 1920 EXPECT_EQ("", client_->SendSynchronousRequest("/foo")); |
| 1921 EXPECT_TRUE(client_->response_headers()->empty()); | 1921 EXPECT_TRUE(client_->response_headers()->empty()); |
| 1922 EXPECT_EQ(QUIC_PUBLIC_RESET, client_->connection_error()); | 1922 EXPECT_EQ(QUIC_PUBLIC_RESET, client_->connection_error()); |
| 1923 } | 1923 } |
| 1924 | 1924 |
| 1925 // Send a public reset from the server for a different connection ID. | 1925 // Send a public reset from the server for a different connection ID. |
| 1926 // It should be ignored. | 1926 // It should be ignored. |
| 1927 TEST_P(EndToEndTest, ServerSendPublicResetWithDifferentConnectionId) { | 1927 TEST_P(EndToEndTest, ServerSendPublicResetWithDifferentConnectionId) { |
| 1928 ASSERT_TRUE(Initialize()); | 1928 ASSERT_TRUE(Initialize()); |
| 1929 | 1929 |
| 1930 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1930 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1931 | 1931 |
| 1932 // Send the public reset. | 1932 // Send the public reset. |
| 1933 QuicConnectionId incorrect_connection_id = | 1933 QuicConnectionId incorrect_connection_id = |
| 1934 client_->client()->session()->connection()->connection_id() + 1; | 1934 client_->client()->session()->connection()->connection_id() + 1; |
| 1935 QuicPublicResetPacket header; | 1935 QuicPublicResetPacket header; |
| 1936 header.public_header.connection_id = incorrect_connection_id; | 1936 header.public_header.connection_id = incorrect_connection_id; |
| 1937 header.public_header.reset_flag = true; | 1937 header.public_header.reset_flag = true; |
| 1938 header.public_header.version_flag = false; | 1938 header.public_header.version_flag = false; |
| 1939 header.rejected_packet_number = 10101; | 1939 header.rejected_packet_number = 10101; |
| 1940 QuicFramer framer(server_supported_versions_, QuicTime::Zero(), | 1940 QuicFramer framer(server_supported_versions_, QuicTime::Zero(), |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1985 // The connection should be unaffected. | 1985 // The connection should be unaffected. |
| 1986 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); | 1986 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); |
| 1987 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); | 1987 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); |
| 1988 } | 1988 } |
| 1989 | 1989 |
| 1990 // Send a version negotiation packet from the server for a different | 1990 // Send a version negotiation packet from the server for a different |
| 1991 // connection ID. It should be ignored. | 1991 // connection ID. It should be ignored. |
| 1992 TEST_P(EndToEndTest, ServerSendVersionNegotiationWithDifferentConnectionId) { | 1992 TEST_P(EndToEndTest, ServerSendVersionNegotiationWithDifferentConnectionId) { |
| 1993 ASSERT_TRUE(Initialize()); | 1993 ASSERT_TRUE(Initialize()); |
| 1994 | 1994 |
| 1995 client_->client()->WaitForCryptoHandshakeConfirmed(); | 1995 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 1996 | 1996 |
| 1997 // Send the version negotiation packet. | 1997 // Send the version negotiation packet. |
| 1998 QuicConnectionId incorrect_connection_id = | 1998 QuicConnectionId incorrect_connection_id = |
| 1999 client_->client()->session()->connection()->connection_id() + 1; | 1999 client_->client()->session()->connection()->connection_id() + 1; |
| 2000 std::unique_ptr<QuicEncryptedPacket> packet( | 2000 std::unique_ptr<QuicEncryptedPacket> packet( |
| 2001 QuicFramer::BuildVersionNegotiationPacket(incorrect_connection_id, | 2001 QuicFramer::BuildVersionNegotiationPacket(incorrect_connection_id, |
| 2002 server_supported_versions_)); | 2002 server_supported_versions_)); |
| 2003 testing::NiceMock<MockQuicConnectionDebugVisitor> visitor; | 2003 testing::NiceMock<MockQuicConnectionDebugVisitor> visitor; |
| 2004 client_->client()->session()->connection()->set_debug_visitor(&visitor); | 2004 client_->client()->session()->connection()->set_debug_visitor(&visitor); |
| 2005 EXPECT_CALL(visitor, OnIncorrectConnectionId(incorrect_connection_id)) | 2005 EXPECT_CALL(visitor, OnIncorrectConnectionId(incorrect_connection_id)) |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2376 // it. | 2376 // it. |
| 2377 uint32_t response_body_size = | 2377 uint32_t response_body_size = |
| 2378 2 * client_config_.GetInitialStreamFlowControlWindowToSend(); | 2378 2 * client_config_.GetInitialStreamFlowControlWindowToSend(); |
| 2379 string response_body(response_body_size, 'a'); | 2379 string response_body(response_body_size, 'a'); |
| 2380 | 2380 |
| 2381 StreamWithErrorFactory stream_factory(response_body); | 2381 StreamWithErrorFactory stream_factory(response_body); |
| 2382 SetSpdyStreamFactory(&stream_factory); | 2382 SetSpdyStreamFactory(&stream_factory); |
| 2383 | 2383 |
| 2384 ASSERT_TRUE(Initialize()); | 2384 ASSERT_TRUE(Initialize()); |
| 2385 | 2385 |
| 2386 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2386 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2387 | 2387 |
| 2388 // A POST that gets an early error response, after the headers are received | 2388 // A POST that gets an early error response, after the headers are received |
| 2389 // and before the body is received, due to invalid content-length. | 2389 // and before the body is received, due to invalid content-length. |
| 2390 // Set an invalid content-length, so the request will receive an early 500 | 2390 // Set an invalid content-length, so the request will receive an early 500 |
| 2391 // response. | 2391 // response. |
| 2392 SpdyHeaderBlock headers; | 2392 SpdyHeaderBlock headers; |
| 2393 headers[":method"] = "POST"; | 2393 headers[":method"] = "POST"; |
| 2394 headers[":path"] = "/garbage"; | 2394 headers[":path"] = "/garbage"; |
| 2395 headers[":scheme"] = "https"; | 2395 headers[":scheme"] = "https"; |
| 2396 headers[":authority"] = server_hostname_; | 2396 headers[":authority"] = server_hostname_; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2430 | 2430 |
| 2431 TEST_P(EndToEndTest, LargePostEarlyResponse) { | 2431 TEST_P(EndToEndTest, LargePostEarlyResponse) { |
| 2432 const uint32_t kWindowSize = 65536; | 2432 const uint32_t kWindowSize = 65536; |
| 2433 set_client_initial_stream_flow_control_receive_window(kWindowSize); | 2433 set_client_initial_stream_flow_control_receive_window(kWindowSize); |
| 2434 set_client_initial_session_flow_control_receive_window(kWindowSize); | 2434 set_client_initial_session_flow_control_receive_window(kWindowSize); |
| 2435 set_server_initial_stream_flow_control_receive_window(kWindowSize); | 2435 set_server_initial_stream_flow_control_receive_window(kWindowSize); |
| 2436 set_server_initial_session_flow_control_receive_window(kWindowSize); | 2436 set_server_initial_session_flow_control_receive_window(kWindowSize); |
| 2437 | 2437 |
| 2438 ASSERT_TRUE(Initialize()); | 2438 ASSERT_TRUE(Initialize()); |
| 2439 | 2439 |
| 2440 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2440 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2441 | 2441 |
| 2442 // POST to a URL that gets an early error response, after the headers are | 2442 // POST to a URL that gets an early error response, after the headers are |
| 2443 // received and before the body is received. | 2443 // received and before the body is received. |
| 2444 SpdyHeaderBlock headers; | 2444 SpdyHeaderBlock headers; |
| 2445 headers[":method"] = "POST"; | 2445 headers[":method"] = "POST"; |
| 2446 headers[":path"] = "/foo"; | 2446 headers[":path"] = "/foo"; |
| 2447 headers[":scheme"] = "https"; | 2447 headers[":scheme"] = "https"; |
| 2448 headers[":authority"] = server_hostname_; | 2448 headers[":authority"] = server_hostname_; |
| 2449 headers["content-length"] = "-1"; | 2449 headers["content-length"] = "-1"; |
| 2450 | 2450 |
| 2451 // Tell the client to not close the stream if it receives an early response. | 2451 // Tell the client to not close the stream if it receives an early response. |
| 2452 client_->set_allow_bidirectional_data(true); | 2452 client_->set_allow_bidirectional_data(true); |
| 2453 // Send the headers. | 2453 // Send the headers. |
| 2454 client_->SendMessage(headers, "", /*fin=*/false); | 2454 client_->SendMessage(headers, "", /*fin=*/false); |
| 2455 | 2455 |
| 2456 // Receive the response and let the server close writing. | 2456 // Receive the response and let the server close writing. |
| 2457 client_->WaitForInitialResponse(); | 2457 client_->WaitForInitialResponse(); |
| 2458 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); | 2458 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); |
| 2459 | 2459 |
| 2460 // Receive the reset stream from server on early response. | 2460 // Receive the reset stream from server on early response. |
| 2461 QuicStream* stream = | 2461 QuicStream* stream = |
| 2462 client_->client()->session()->GetOrCreateStream(kClientDataStreamId1); | 2462 client_->client()->session()->GetOrCreateStream(kClientDataStreamId1); |
| 2463 // The stream is reset by server's reset stream. | 2463 // The stream is reset by server's reset stream. |
| 2464 EXPECT_EQ(stream, nullptr); | 2464 EXPECT_EQ(stream, nullptr); |
| 2465 } | 2465 } |
| 2466 | 2466 |
| 2467 TEST_P(EndToEndTest, Trailers) { | 2467 TEST_P(EndToEndTest, Trailers) { |
| 2468 // Test sending and receiving HTTP/2 Trailers (trailing HEADERS frames). | 2468 // Test sending and receiving HTTP/2 Trailers (trailing HEADERS frames). |
| 2469 ASSERT_TRUE(Initialize()); | 2469 ASSERT_TRUE(Initialize()); |
| 2470 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2470 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2471 | 2471 |
| 2472 // Set reordering to ensure that Trailers arriving before body is ok. | 2472 // Set reordering to ensure that Trailers arriving before body is ok. |
| 2473 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); | 2473 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); |
| 2474 SetReorderPercentage(30); | 2474 SetReorderPercentage(30); |
| 2475 | 2475 |
| 2476 // Add a response with headers, body, and trailers. | 2476 // Add a response with headers, body, and trailers. |
| 2477 const string kBody = "body content"; | 2477 const string kBody = "body content"; |
| 2478 | 2478 |
| 2479 SpdyHeaderBlock headers; | 2479 SpdyHeaderBlock headers; |
| 2480 headers[":status"] = "200"; | 2480 headers[":status"] = "200"; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2542 } | 2542 } |
| 2543 }; | 2543 }; |
| 2544 | 2544 |
| 2545 // Run all server push end to end tests with all supported versions. | 2545 // Run all server push end to end tests with all supported versions. |
| 2546 INSTANTIATE_TEST_CASE_P(EndToEndTestsServerPush, | 2546 INSTANTIATE_TEST_CASE_P(EndToEndTestsServerPush, |
| 2547 EndToEndTestServerPush, | 2547 EndToEndTestServerPush, |
| 2548 ::testing::ValuesIn(GetTestParams())); | 2548 ::testing::ValuesIn(GetTestParams())); |
| 2549 | 2549 |
| 2550 TEST_P(EndToEndTestServerPush, ServerPush) { | 2550 TEST_P(EndToEndTestServerPush, ServerPush) { |
| 2551 ASSERT_TRUE(Initialize()); | 2551 ASSERT_TRUE(Initialize()); |
| 2552 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2552 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2553 | 2553 |
| 2554 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. | 2554 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. |
| 2555 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); | 2555 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); |
| 2556 SetReorderPercentage(30); | 2556 SetReorderPercentage(30); |
| 2557 | 2557 |
| 2558 // Add a response with headers, body, and push resources. | 2558 // Add a response with headers, body, and push resources. |
| 2559 const string kBody = "body content"; | 2559 const string kBody = "body content"; |
| 2560 size_t kNumResources = 4; | 2560 size_t kNumResources = 4; |
| 2561 string push_urls[] = {"https://example.com/font.woff", | 2561 string push_urls[] = {"https://example.com/font.woff", |
| 2562 "https://example.com/script.js", | 2562 "https://example.com/script.js", |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2589 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer, | 2589 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer, |
| 2590 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); | 2590 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); |
| 2591 } | 2591 } |
| 2592 | 2592 |
| 2593 TEST_P(EndToEndTestServerPush, ServerPushUnderLimit) { | 2593 TEST_P(EndToEndTestServerPush, ServerPushUnderLimit) { |
| 2594 // Tests that sending a request which has 4 push resources will trigger server | 2594 // Tests that sending a request which has 4 push resources will trigger server |
| 2595 // to push those 4 resources and client can handle pushed resources and match | 2595 // to push those 4 resources and client can handle pushed resources and match |
| 2596 // them with requests later. | 2596 // them with requests later. |
| 2597 ASSERT_TRUE(Initialize()); | 2597 ASSERT_TRUE(Initialize()); |
| 2598 | 2598 |
| 2599 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2599 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2600 | 2600 |
| 2601 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. | 2601 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. |
| 2602 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); | 2602 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); |
| 2603 SetReorderPercentage(30); | 2603 SetReorderPercentage(30); |
| 2604 | 2604 |
| 2605 // Add a response with headers, body, and push resources. | 2605 // Add a response with headers, body, and push resources. |
| 2606 const string kBody = "body content"; | 2606 const string kBody = "body content"; |
| 2607 size_t const kNumResources = 4; | 2607 size_t const kNumResources = 4; |
| 2608 string push_urls[] = { | 2608 string push_urls[] = { |
| 2609 "https://example.com/font.woff", "https://example.com/script.js", | 2609 "https://example.com/font.woff", "https://example.com/script.js", |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2636 EXPECT_EQ(1u, client_->num_requests()); | 2636 EXPECT_EQ(1u, client_->num_requests()); |
| 2637 EXPECT_EQ(1u + kNumResources, client_->num_responses()); | 2637 EXPECT_EQ(1u + kNumResources, client_->num_responses()); |
| 2638 } | 2638 } |
| 2639 | 2639 |
| 2640 TEST_P(EndToEndTestServerPush, ServerPushOverLimitNonBlocking) { | 2640 TEST_P(EndToEndTestServerPush, ServerPushOverLimitNonBlocking) { |
| 2641 // Tests that when streams are not blocked by flow control or congestion | 2641 // Tests that when streams are not blocked by flow control or congestion |
| 2642 // control, pushing even more resources than max number of open outgoing | 2642 // control, pushing even more resources than max number of open outgoing |
| 2643 // streams should still work because all response streams get closed | 2643 // streams should still work because all response streams get closed |
| 2644 // immediately after pushing resources. | 2644 // immediately after pushing resources. |
| 2645 ASSERT_TRUE(Initialize()); | 2645 ASSERT_TRUE(Initialize()); |
| 2646 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2646 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2647 | 2647 |
| 2648 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. | 2648 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. |
| 2649 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); | 2649 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); |
| 2650 SetReorderPercentage(30); | 2650 SetReorderPercentage(30); |
| 2651 | 2651 |
| 2652 // Add a response with headers, body, and push resources. | 2652 // Add a response with headers, body, and push resources. |
| 2653 const string kBody = "body content"; | 2653 const string kBody = "body content"; |
| 2654 | 2654 |
| 2655 // One more resource than max number of outgoing stream of this session. | 2655 // One more resource than max number of outgoing stream of this session. |
| 2656 const size_t kNumResources = 1 + kNumMaxStreams; // 11. | 2656 const size_t kNumResources = 1 + kNumMaxStreams; // 11. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2694 size_t kFlowControlWnd = 20 * 1024; // 20KB. | 2694 size_t kFlowControlWnd = 20 * 1024; // 20KB. |
| 2695 // Response body is larger than 1 flow controlblock window. | 2695 // Response body is larger than 1 flow controlblock window. |
| 2696 size_t kBodySize = kFlowControlWnd * 2; | 2696 size_t kBodySize = kFlowControlWnd * 2; |
| 2697 set_client_initial_stream_flow_control_receive_window(kFlowControlWnd); | 2697 set_client_initial_stream_flow_control_receive_window(kFlowControlWnd); |
| 2698 // Make sure conntection level flow control window is large enough not to | 2698 // Make sure conntection level flow control window is large enough not to |
| 2699 // block data being sent out though they will be blocked by stream level one. | 2699 // block data being sent out though they will be blocked by stream level one. |
| 2700 set_client_initial_session_flow_control_receive_window( | 2700 set_client_initial_session_flow_control_receive_window( |
| 2701 kBodySize * kNumMaxStreams + 1024); | 2701 kBodySize * kNumMaxStreams + 1024); |
| 2702 | 2702 |
| 2703 ASSERT_TRUE(Initialize()); | 2703 ASSERT_TRUE(Initialize()); |
| 2704 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2704 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2705 | 2705 |
| 2706 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. | 2706 // Set reordering to ensure that body arriving before PUSH_PROMISE is ok. |
| 2707 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); | 2707 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); |
| 2708 SetReorderPercentage(30); | 2708 SetReorderPercentage(30); |
| 2709 | 2709 |
| 2710 // Add a response with headers, body, and push resources. | 2710 // Add a response with headers, body, and push resources. |
| 2711 const string kBody = "body content"; | 2711 const string kBody = "body content"; |
| 2712 | 2712 |
| 2713 const size_t kNumResources = kNumMaxStreams + 1; | 2713 const size_t kNumResources = kNumMaxStreams + 1; |
| 2714 string push_urls[11]; | 2714 string push_urls[11]; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2807 // This test tests a huge post with introduced packet loss from client to | 2807 // This test tests a huge post with introduced packet loss from client to |
| 2808 // server and body size greater than 4GB, making sure QUIC code does not break | 2808 // server and body size greater than 4GB, making sure QUIC code does not break |
| 2809 // for 32-bit builds. | 2809 // for 32-bit builds. |
| 2810 ServerStreamThatDropsBodyFactory stream_factory; | 2810 ServerStreamThatDropsBodyFactory stream_factory; |
| 2811 SetSpdyStreamFactory(&stream_factory); | 2811 SetSpdyStreamFactory(&stream_factory); |
| 2812 ASSERT_TRUE(Initialize()); | 2812 ASSERT_TRUE(Initialize()); |
| 2813 // Set client's epoll server's time out to 0 to make this test be finished | 2813 // Set client's epoll server's time out to 0 to make this test be finished |
| 2814 // within a short time. | 2814 // within a short time. |
| 2815 client_->epoll_server()->set_timeout_in_us(0); | 2815 client_->epoll_server()->set_timeout_in_us(0); |
| 2816 | 2816 |
| 2817 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2817 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2818 SetPacketLossPercentage(1); | 2818 SetPacketLossPercentage(1); |
| 2819 // To avoid storing the whole request body in memory, use a loop to repeatedly | 2819 // To avoid storing the whole request body in memory, use a loop to repeatedly |
| 2820 // send body size of kSizeBytes until the whole request body size is reached. | 2820 // send body size of kSizeBytes until the whole request body size is reached. |
| 2821 const int kSizeBytes = 128 * 1024; | 2821 const int kSizeBytes = 128 * 1024; |
| 2822 // Request body size is 4G plus one more kSizeBytes. | 2822 // Request body size is 4G plus one more kSizeBytes. |
| 2823 int64_t request_body_size_bytes = pow(2, 32) + kSizeBytes; | 2823 int64_t request_body_size_bytes = pow(2, 32) + kSizeBytes; |
| 2824 ASSERT_LT(INT64_C(4294967296), request_body_size_bytes); | 2824 ASSERT_LT(INT64_C(4294967296), request_body_size_bytes); |
| 2825 string body(kSizeBytes, 'a'); | 2825 string body(kSizeBytes, 'a'); |
| 2826 | 2826 |
| 2827 SpdyHeaderBlock headers; | 2827 SpdyHeaderBlock headers; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2864 client_.reset(client); | 2864 client_.reset(client); |
| 2865 static EpollEvent event(EPOLLOUT, false); | 2865 static EpollEvent event(EPOLLOUT, false); |
| 2866 client_writer_->Initialize( | 2866 client_writer_->Initialize( |
| 2867 QuicConnectionPeer::GetHelper(client_->client()->session()->connection()), | 2867 QuicConnectionPeer::GetHelper(client_->client()->session()->connection()), |
| 2868 QuicConnectionPeer::GetAlarmFactory( | 2868 QuicConnectionPeer::GetAlarmFactory( |
| 2869 client_->client()->session()->connection()), | 2869 client_->client()->session()->connection()), |
| 2870 new ClientDelegate(client_->client())); | 2870 new ClientDelegate(client_->client())); |
| 2871 initialized_ = true; | 2871 initialized_ = true; |
| 2872 ASSERT_TRUE(client_->client()->connected()); | 2872 ASSERT_TRUE(client_->client()->connected()); |
| 2873 | 2873 |
| 2874 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2874 EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed()); |
| 2875 SetPacketLossPercentage(1); | 2875 SetPacketLossPercentage(1); |
| 2876 client_->SendRequest("/huge_response"); | 2876 client_->SendRequest("/huge_response"); |
| 2877 client_->WaitForResponse(); | 2877 client_->WaitForResponse(); |
| 2878 // TODO(fayang): Fix this test to work with stateless rejects. | 2878 // TODO(fayang): Fix this test to work with stateless rejects. |
| 2879 if (!BothSidesSupportStatelessRejects()) { | 2879 if (!BothSidesSupportStatelessRejects()) { |
| 2880 VerifyCleanConnection(true); | 2880 VerifyCleanConnection(true); |
| 2881 } | 2881 } |
| 2882 } | 2882 } |
| 2883 | 2883 |
| 2884 TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) { | 2884 TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2940 client_->WaitForResponse(); | 2940 client_->WaitForResponse(); |
| 2941 EXPECT_EQ(kBarResponseBody, client_->response_body()); | 2941 EXPECT_EQ(kBarResponseBody, client_->response_body()); |
| 2942 QuicConnectionStats client_stats = | 2942 QuicConnectionStats client_stats = |
| 2943 client_->client()->session()->connection()->GetStats(); | 2943 client_->client()->session()->connection()->GetStats(); |
| 2944 EXPECT_EQ(0u, client_stats.packets_lost); | 2944 EXPECT_EQ(0u, client_stats.packets_lost); |
| 2945 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); | 2945 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); |
| 2946 } | 2946 } |
| 2947 } // namespace | 2947 } // namespace |
| 2948 } // namespace test | 2948 } // namespace test |
| 2949 } // namespace net | 2949 } // namespace net |
| OLD | NEW |