| 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 19 matching lines...) Expand all Loading... |
| 30 #include "net/quic/core/quic_server_id.h" | 30 #include "net/quic/core/quic_server_id.h" |
| 31 #include "net/quic/core/quic_session.h" | 31 #include "net/quic/core/quic_session.h" |
| 32 #include "net/quic/core/quic_utils.h" | 32 #include "net/quic/core/quic_utils.h" |
| 33 #include "net/quic/test_tools/crypto_test_utils.h" | 33 #include "net/quic/test_tools/crypto_test_utils.h" |
| 34 #include "net/quic/test_tools/quic_config_peer.h" | 34 #include "net/quic/test_tools/quic_config_peer.h" |
| 35 #include "net/quic/test_tools/quic_connection_peer.h" | 35 #include "net/quic/test_tools/quic_connection_peer.h" |
| 36 #include "net/quic/test_tools/quic_flow_controller_peer.h" | 36 #include "net/quic/test_tools/quic_flow_controller_peer.h" |
| 37 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | 37 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
| 38 #include "net/quic/test_tools/quic_session_peer.h" | 38 #include "net/quic/test_tools/quic_session_peer.h" |
| 39 #include "net/quic/test_tools/quic_spdy_session_peer.h" | 39 #include "net/quic/test_tools/quic_spdy_session_peer.h" |
| 40 #include "net/quic/test_tools/quic_stream_peer.h" |
| 40 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" | 41 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" |
| 41 #include "net/quic/test_tools/quic_test_utils.h" | 42 #include "net/quic/test_tools/quic_test_utils.h" |
| 42 #include "net/quic/test_tools/reliable_quic_stream_peer.h" | |
| 43 #include "net/test/gtest_util.h" | 43 #include "net/test/gtest_util.h" |
| 44 #include "net/tools/epoll_server/epoll_server.h" | 44 #include "net/tools/epoll_server/epoll_server.h" |
| 45 #include "net/tools/quic/quic_epoll_connection_helper.h" | 45 #include "net/tools/quic/quic_epoll_connection_helper.h" |
| 46 #include "net/tools/quic/quic_in_memory_cache.h" | 46 #include "net/tools/quic/quic_in_memory_cache.h" |
| 47 #include "net/tools/quic/quic_packet_writer_wrapper.h" | 47 #include "net/tools/quic/quic_packet_writer_wrapper.h" |
| 48 #include "net/tools/quic/quic_server.h" | 48 #include "net/tools/quic/quic_server.h" |
| 49 #include "net/tools/quic/quic_simple_server_stream.h" | 49 #include "net/tools/quic/quic_simple_server_stream.h" |
| 50 #include "net/tools/quic/quic_socket_utils.h" | 50 #include "net/tools/quic/quic_socket_utils.h" |
| 51 #include "net/tools/quic/quic_spdy_client_stream.h" | 51 #include "net/tools/quic/quic_spdy_client_stream.h" |
| 52 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" | 52 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 589 // Run all end to end tests with all supported versions. | 589 // Run all end to end tests with all supported versions. |
| 590 INSTANTIATE_TEST_CASE_P(EndToEndTests, | 590 INSTANTIATE_TEST_CASE_P(EndToEndTests, |
| 591 EndToEndTest, | 591 EndToEndTest, |
| 592 ::testing::ValuesIn(GetTestParams())); | 592 ::testing::ValuesIn(GetTestParams())); |
| 593 | 593 |
| 594 TEST_P(EndToEndTest, HandshakeSuccessful) { | 594 TEST_P(EndToEndTest, HandshakeSuccessful) { |
| 595 ASSERT_TRUE(Initialize()); | 595 ASSERT_TRUE(Initialize()); |
| 596 client_->client()->WaitForCryptoHandshakeConfirmed(); | 596 client_->client()->WaitForCryptoHandshakeConfirmed(); |
| 597 QuicCryptoStream* crypto_stream = | 597 QuicCryptoStream* crypto_stream = |
| 598 QuicSessionPeer::GetCryptoStream(client_->client()->session()); | 598 QuicSessionPeer::GetCryptoStream(client_->client()->session()); |
| 599 QuicStreamSequencer* sequencer = | 599 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(crypto_stream); |
| 600 ReliableQuicStreamPeer::sequencer(crypto_stream); | |
| 601 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer, | 600 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer, |
| 602 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); | 601 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); |
| 603 server_thread_->Pause(); | 602 server_thread_->Pause(); |
| 604 QuicDispatcher* dispatcher = | 603 QuicDispatcher* dispatcher = |
| 605 QuicServerPeer::GetDispatcher(server_thread_->server()); | 604 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 606 QuicSession* server_session = dispatcher->session_map().begin()->second.get(); | 605 QuicSession* server_session = dispatcher->session_map().begin()->second.get(); |
| 607 crypto_stream = QuicSessionPeer::GetCryptoStream(server_session); | 606 crypto_stream = QuicSessionPeer::GetCryptoStream(server_session); |
| 608 sequencer = ReliableQuicStreamPeer::sequencer(crypto_stream); | 607 sequencer = QuicStreamPeer::sequencer(crypto_stream); |
| 609 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer, | 608 EXPECT_NE(FLAGS_quic_release_crypto_stream_buffer, |
| 610 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); | 609 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); |
| 611 } | 610 } |
| 612 | 611 |
| 613 TEST_P(EndToEndTest, SimpleRequestResponse) { | 612 TEST_P(EndToEndTest, SimpleRequestResponse) { |
| 614 ASSERT_TRUE(Initialize()); | 613 ASSERT_TRUE(Initialize()); |
| 615 | 614 |
| 616 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); | 615 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); |
| 617 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); | 616 EXPECT_EQ("200", client_->response_headers()->find(":status")->second); |
| 618 EXPECT_EQ(2, client_->client()->GetNumSentClientHellos()); | 617 EXPECT_EQ(2, client_->client()->GetNumSentClientHellos()); |
| (...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1230 | 1229 |
| 1231 // TODO(rch): this test seems to cause net_unittests timeouts :| | 1230 // TODO(rch): this test seems to cause net_unittests timeouts :| |
| 1232 TEST_P(EndToEndTest, DISABLED_MultipleTermination) { | 1231 TEST_P(EndToEndTest, DISABLED_MultipleTermination) { |
| 1233 ASSERT_TRUE(Initialize()); | 1232 ASSERT_TRUE(Initialize()); |
| 1234 | 1233 |
| 1235 // Set the offset so we won't frame. Otherwise when we pick up termination | 1234 // Set the offset so we won't frame. Otherwise when we pick up termination |
| 1236 // before HTTP framing is complete, we send an error and close the stream, | 1235 // before HTTP framing is complete, we send an error and close the stream, |
| 1237 // and the second write is picked up as writing on a closed stream. | 1236 // and the second write is picked up as writing on a closed stream. |
| 1238 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); | 1237 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); |
| 1239 ASSERT_TRUE(stream != nullptr); | 1238 ASSERT_TRUE(stream != nullptr); |
| 1240 ReliableQuicStreamPeer::SetStreamBytesWritten(3, stream); | 1239 QuicStreamPeer::SetStreamBytesWritten(3, stream); |
| 1241 | 1240 |
| 1242 client_->SendData("bar", true); | 1241 client_->SendData("bar", true); |
| 1243 client_->WaitForWriteToFlush(); | 1242 client_->WaitForWriteToFlush(); |
| 1244 | 1243 |
| 1245 // By default the stream protects itself from writes after terminte is set. | 1244 // By default the stream protects itself from writes after terminte is set. |
| 1246 // Override this to test the server handling buggy clients. | 1245 // Override this to test the server handling buggy clients. |
| 1247 ReliableQuicStreamPeer::SetWriteSideClosed(false, | 1246 QuicStreamPeer::SetWriteSideClosed(false, client_->GetOrCreateStream()); |
| 1248 client_->GetOrCreateStream()); | |
| 1249 | 1247 |
| 1250 EXPECT_QUIC_BUG(client_->SendData("eep", true), "Fin already buffered"); | 1248 EXPECT_QUIC_BUG(client_->SendData("eep", true), "Fin already buffered"); |
| 1251 } | 1249 } |
| 1252 | 1250 |
| 1253 TEST_P(EndToEndTest, Timeout) { | 1251 TEST_P(EndToEndTest, Timeout) { |
| 1254 client_config_.SetIdleNetworkTimeout(QuicTime::Delta::FromMicroseconds(500), | 1252 client_config_.SetIdleNetworkTimeout(QuicTime::Delta::FromMicroseconds(500), |
| 1255 QuicTime::Delta::FromMicroseconds(500)); | 1253 QuicTime::Delta::FromMicroseconds(500)); |
| 1256 // Note: we do NOT ASSERT_TRUE: we may time out during initial handshake: | 1254 // Note: we do NOT ASSERT_TRUE: we may time out during initial handshake: |
| 1257 // that's enough to validate timeout in this case. | 1255 // that's enough to validate timeout in this case. |
| 1258 Initialize(); | 1256 Initialize(); |
| (...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2196 ~ServerStreamWithErrorResponseBody() override {} | 2194 ~ServerStreamWithErrorResponseBody() override {} |
| 2197 | 2195 |
| 2198 protected: | 2196 protected: |
| 2199 void SendErrorResponse() override { | 2197 void SendErrorResponse() override { |
| 2200 DVLOG(1) << "Sending error response for stream " << id(); | 2198 DVLOG(1) << "Sending error response for stream " << id(); |
| 2201 SpdyHeaderBlock headers; | 2199 SpdyHeaderBlock headers; |
| 2202 headers[":status"] = "500"; | 2200 headers[":status"] = "500"; |
| 2203 headers["content-length"] = base::UintToString(response_body_.size()); | 2201 headers["content-length"] = base::UintToString(response_body_.size()); |
| 2204 // This method must call CloseReadSide to cause the test case, StopReading | 2202 // This method must call CloseReadSide to cause the test case, StopReading |
| 2205 // is not sufficient. | 2203 // is not sufficient. |
| 2206 ReliableQuicStreamPeer::CloseReadSide(this); | 2204 QuicStreamPeer::CloseReadSide(this); |
| 2207 SendHeadersAndBody(std::move(headers), response_body_); | 2205 SendHeadersAndBody(std::move(headers), response_body_); |
| 2208 } | 2206 } |
| 2209 | 2207 |
| 2210 string response_body_; | 2208 string response_body_; |
| 2211 }; | 2209 }; |
| 2212 | 2210 |
| 2213 class StreamWithErrorFactory : public QuicTestServer::StreamFactory { | 2211 class StreamWithErrorFactory : public QuicTestServer::StreamFactory { |
| 2214 public: | 2212 public: |
| 2215 explicit StreamWithErrorFactory(string response_body) | 2213 explicit StreamWithErrorFactory(string response_body) |
| 2216 : response_body_(std::move(response_body)) {} | 2214 : response_body_(std::move(response_body)) {} |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2496 // Tell the client to not close the stream if it receives an early response. | 2494 // Tell the client to not close the stream if it receives an early response. |
| 2497 client_->set_allow_bidirectional_data(true); | 2495 client_->set_allow_bidirectional_data(true); |
| 2498 // Send the headers. | 2496 // Send the headers. |
| 2499 client_->SendMessage(headers, "", /*fin=*/false); | 2497 client_->SendMessage(headers, "", /*fin=*/false); |
| 2500 | 2498 |
| 2501 // Receive the response and let the server close writing. | 2499 // Receive the response and let the server close writing. |
| 2502 client_->WaitForInitialResponse(); | 2500 client_->WaitForInitialResponse(); |
| 2503 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); | 2501 EXPECT_EQ("500", client_->response_headers()->find(":status")->second); |
| 2504 | 2502 |
| 2505 // Receive the reset stream from server on early response. | 2503 // Receive the reset stream from server on early response. |
| 2506 ReliableQuicStream* stream = | 2504 QuicStream* stream = |
| 2507 client_->client()->session()->GetOrCreateStream(kClientDataStreamId1); | 2505 client_->client()->session()->GetOrCreateStream(kClientDataStreamId1); |
| 2508 // The stream is reset by server's reset stream. | 2506 // The stream is reset by server's reset stream. |
| 2509 EXPECT_EQ(stream, nullptr); | 2507 EXPECT_EQ(stream, nullptr); |
| 2510 } | 2508 } |
| 2511 | 2509 |
| 2512 TEST_P(EndToEndTest, Trailers) { | 2510 TEST_P(EndToEndTest, Trailers) { |
| 2513 // Test sending and receiving HTTP/2 Trailers (trailing HEADERS frames). | 2511 // Test sending and receiving HTTP/2 Trailers (trailing HEADERS frames). |
| 2514 ASSERT_TRUE(Initialize()); | 2512 ASSERT_TRUE(Initialize()); |
| 2515 client_->client()->WaitForCryptoHandshakeConfirmed(); | 2513 client_->client()->WaitForCryptoHandshakeConfirmed(); |
| 2516 | 2514 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2613 | 2611 |
| 2614 client_->client()->set_response_listener( | 2612 client_->client()->set_response_listener( |
| 2615 std::unique_ptr<QuicClientBase::ResponseListener>( | 2613 std::unique_ptr<QuicClientBase::ResponseListener>( |
| 2616 new TestResponseListener)); | 2614 new TestResponseListener)); |
| 2617 | 2615 |
| 2618 DVLOG(1) << "send request for /push_example"; | 2616 DVLOG(1) << "send request for /push_example"; |
| 2619 EXPECT_EQ(kBody, client_->SendSynchronousRequest( | 2617 EXPECT_EQ(kBody, client_->SendSynchronousRequest( |
| 2620 "https://example.com/push_example")); | 2618 "https://example.com/push_example")); |
| 2621 QuicHeadersStream* headers_stream = | 2619 QuicHeadersStream* headers_stream = |
| 2622 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); | 2620 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); |
| 2623 QuicStreamSequencer* sequencer = | 2621 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(headers_stream); |
| 2624 ReliableQuicStreamPeer::sequencer(headers_stream); | |
| 2625 // Headers stream's sequencer buffer shouldn't be released because server push | 2622 // Headers stream's sequencer buffer shouldn't be released because server push |
| 2626 // hasn't finished yet. | 2623 // hasn't finished yet. |
| 2627 EXPECT_TRUE(QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); | 2624 EXPECT_TRUE(QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); |
| 2628 | 2625 |
| 2629 for (const string& url : push_urls) { | 2626 for (const string& url : push_urls) { |
| 2630 DVLOG(1) << "send request for pushed stream on url " << url; | 2627 DVLOG(1) << "send request for pushed stream on url " << url; |
| 2631 string expected_body = "This is server push response body for " + url; | 2628 string expected_body = "This is server push response body for " + url; |
| 2632 string response_body = client_->SendSynchronousRequest(url); | 2629 string response_body = client_->SendSynchronousRequest(url); |
| 2633 DVLOG(1) << "response body " << response_body; | 2630 DVLOG(1) << "response body " << response_body; |
| 2634 EXPECT_EQ(expected_body, response_body); | 2631 EXPECT_EQ(expected_body, response_body); |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2929 } | 2926 } |
| 2930 } | 2927 } |
| 2931 | 2928 |
| 2932 TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) { | 2929 TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) { |
| 2933 // Tests that when client side has no active request and no waiting | 2930 // Tests that when client side has no active request and no waiting |
| 2934 // PUSH_PROMISE, its headers stream's sequencer buffer should be released. | 2931 // PUSH_PROMISE, its headers stream's sequencer buffer should be released. |
| 2935 ASSERT_TRUE(Initialize()); | 2932 ASSERT_TRUE(Initialize()); |
| 2936 client_->SendSynchronousRequest("/foo"); | 2933 client_->SendSynchronousRequest("/foo"); |
| 2937 QuicHeadersStream* headers_stream = | 2934 QuicHeadersStream* headers_stream = |
| 2938 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); | 2935 QuicSpdySessionPeer::GetHeadersStream(client_->client()->session()); |
| 2939 QuicStreamSequencer* sequencer = | 2936 QuicStreamSequencer* sequencer = QuicStreamPeer::sequencer(headers_stream); |
| 2940 ReliableQuicStreamPeer::sequencer(headers_stream); | |
| 2941 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer, | 2937 EXPECT_NE(FLAGS_quic_headers_stream_release_sequencer_buffer, |
| 2942 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); | 2938 QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer)); |
| 2943 } | 2939 } |
| 2944 | 2940 |
| 2945 class EndToEndBufferedPacketsTest : public EndToEndTest { | 2941 class EndToEndBufferedPacketsTest : public EndToEndTest { |
| 2946 public: | 2942 public: |
| 2947 void CreateClientWithWriter() override { | 2943 void CreateClientWithWriter() override { |
| 2948 LOG(ERROR) << "create client with reorder_writer_ "; | 2944 LOG(ERROR) << "create client with reorder_writer_ "; |
| 2949 reorder_writer_ = new PacketReorderingWriter(); | 2945 reorder_writer_ = new PacketReorderingWriter(); |
| 2950 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_)); | 2946 client_.reset(EndToEndTest::CreateQuicClient(reorder_writer_)); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2994 client_->WaitForResponse(); | 2990 client_->WaitForResponse(); |
| 2995 EXPECT_EQ(kBarResponseBody, client_->response_body()); | 2991 EXPECT_EQ(kBarResponseBody, client_->response_body()); |
| 2996 QuicConnectionStats client_stats = | 2992 QuicConnectionStats client_stats = |
| 2997 client_->client()->session()->connection()->GetStats(); | 2993 client_->client()->session()->connection()->GetStats(); |
| 2998 EXPECT_EQ(0u, client_stats.packets_lost); | 2994 EXPECT_EQ(0u, client_stats.packets_lost); |
| 2999 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); | 2995 EXPECT_EQ(1, client_->client()->GetNumSentClientHellos()); |
| 3000 } | 2996 } |
| 3001 } // namespace | 2997 } // namespace |
| 3002 } // namespace test | 2998 } // namespace test |
| 3003 } // namespace net | 2999 } // namespace net |
| OLD | NEW |