| Index: net/quic/chromium/quic_chromium_client_session_test.cc
|
| diff --git a/net/quic/chromium/quic_chromium_client_session_test.cc b/net/quic/chromium/quic_chromium_client_session_test.cc
|
| index 2c4c58286f2fd58b22e34112ad7bc2104da6bd2e..ffae007acabad7d72db61bafc0c80285757dfc2c 100644
|
| --- a/net/quic/chromium/quic_chromium_client_session_test.cc
|
| +++ b/net/quic/chromium/quic_chromium_client_session_test.cc
|
| @@ -18,6 +18,7 @@
|
| #include "net/log/test_net_log.h"
|
| #include "net/quic/chromium/crypto/proof_verifier_chromium.h"
|
| #include "net/quic/chromium/mock_crypto_client_stream_factory.h"
|
| +#include "net/quic/chromium/mock_quic_data.h"
|
| #include "net/quic/chromium/quic_chromium_alarm_factory.h"
|
| #include "net/quic/chromium/quic_chromium_client_session_peer.h"
|
| #include "net/quic/chromium/quic_chromium_connection_helper.h"
|
| @@ -103,7 +104,8 @@ class QuicChromiumClientSessionTest
|
| }
|
|
|
| void Initialize() {
|
| - socket_factory_.AddSocketDataProvider(socket_data_.get());
|
| + if (socket_data_)
|
| + socket_factory_.AddSocketDataProvider(socket_data_.get());
|
| std::unique_ptr<DatagramClientSocket> socket =
|
| socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
|
| base::Bind(&base::RandInt),
|
| @@ -193,6 +195,129 @@ TEST_P(QuicChromiumClientSessionTest, CryptoConnect) {
|
| CompleteCryptoHandshake();
|
| }
|
|
|
| +TEST_P(QuicChromiumClientSessionTest, StreamRequest) {
|
| + MockQuicData quic_data;
|
| + quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr));
|
| + quic_data.AddRead(ASYNC, ERR_IO_PENDING);
|
| + quic_data.AddRead(ASYNC, OK); // EOF
|
| + quic_data.AddSocketDataToFactory(&socket_factory_);
|
| +
|
| + Initialize();
|
| + CompleteCryptoHandshake();
|
| +
|
| + // Request a stream and verify that a stream was created.
|
| + std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request =
|
| + session_->CreateStreamRequest();
|
| + TestCompletionCallback callback;
|
| + ASSERT_EQ(OK, stream_request->StartRequest(callback.callback()));
|
| + EXPECT_TRUE(stream_request->ReleaseStream() != nullptr);
|
| +
|
| + quic_data.Resume();
|
| + EXPECT_TRUE(quic_data.AllReadDataConsumed());
|
| + EXPECT_TRUE(quic_data.AllWriteDataConsumed());
|
| +}
|
| +
|
| +TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) {
|
| + MockQuicData quic_data;
|
| + quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr));
|
| + quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1,
|
| + QUIC_STREAM_CANCELLED));
|
| + quic_data.AddRead(ASYNC, ERR_IO_PENDING);
|
| + quic_data.AddRead(ASYNC, OK); // EOF
|
| + quic_data.AddSocketDataToFactory(&socket_factory_);
|
| +
|
| + Initialize();
|
| + CompleteCryptoHandshake();
|
| +
|
| + // Request a stream and cancel it without releasing the stream.
|
| + std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request =
|
| + session_->CreateStreamRequest();
|
| + TestCompletionCallback callback;
|
| + ASSERT_EQ(OK, stream_request->StartRequest(callback.callback()));
|
| + stream_request.reset();
|
| +
|
| + quic_data.Resume();
|
| + EXPECT_TRUE(quic_data.AllReadDataConsumed());
|
| + EXPECT_TRUE(quic_data.AllWriteDataConsumed());
|
| +}
|
| +
|
| +TEST_P(QuicChromiumClientSessionTest, AsyncStreamRequest) {
|
| + MockQuicData quic_data;
|
| + quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr));
|
| + quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1,
|
| + QUIC_RST_ACKNOWLEDGEMENT));
|
| + quic_data.AddRead(ASYNC, ERR_IO_PENDING);
|
| + quic_data.AddRead(ASYNC, OK); // EOF
|
| + quic_data.AddSocketDataToFactory(&socket_factory_);
|
| +
|
| + Initialize();
|
| + CompleteCryptoHandshake();
|
| +
|
| + // Open the maximum number of streams so that a subsequent request
|
| + // can not proceed immediately.
|
| + const size_t kMaxOpenStreams = session_->max_open_outgoing_streams();
|
| + for (size_t i = 0; i < kMaxOpenStreams; i++) {
|
| + session_->CreateOutgoingDynamicStream(kDefaultPriority);
|
| + }
|
| + EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams());
|
| +
|
| + // Request a stream and verify that it's pending.
|
| + std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request =
|
| + session_->CreateStreamRequest();
|
| + TestCompletionCallback callback;
|
| + ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback()));
|
| +
|
| + // Close a stream and ensure the stream request completes.
|
| + QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0);
|
| + session_->OnRstStream(rst);
|
| + ASSERT_TRUE(callback.have_result());
|
| + EXPECT_THAT(callback.WaitForResult(), IsOk());
|
| + EXPECT_TRUE(stream_request->ReleaseStream() != nullptr);
|
| +
|
| + quic_data.Resume();
|
| + EXPECT_TRUE(quic_data.AllReadDataConsumed());
|
| + EXPECT_TRUE(quic_data.AllWriteDataConsumed());
|
| +}
|
| +
|
| +TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) {
|
| + MockQuicData quic_data;
|
| + quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr));
|
| + quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1,
|
| + QUIC_RST_ACKNOWLEDGEMENT));
|
| + quic_data.AddRead(ASYNC, ERR_IO_PENDING);
|
| + quic_data.AddRead(ASYNC, OK); // EOF
|
| + quic_data.AddSocketDataToFactory(&socket_factory_);
|
| +
|
| + Initialize();
|
| + CompleteCryptoHandshake();
|
| +
|
| + // Open the maximum number of streams so that a subsequent request
|
| + // can not proceed immediately.
|
| + const size_t kMaxOpenStreams = session_->max_open_outgoing_streams();
|
| + for (size_t i = 0; i < kMaxOpenStreams; i++) {
|
| + session_->CreateOutgoingDynamicStream(kDefaultPriority);
|
| + }
|
| + EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams());
|
| +
|
| + // Request a stream and verify that it's pending.
|
| + std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request =
|
| + session_->CreateStreamRequest();
|
| + TestCompletionCallback callback;
|
| + ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback()));
|
| +
|
| + // Cancel the pending stream request.
|
| + stream_request.reset();
|
| +
|
| + // Close a stream and ensure that no new stream is created.
|
| + QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0);
|
| + session_->OnRstStream(rst);
|
| + EXPECT_EQ(kMaxOpenStreams - 1, session_->GetNumOpenOutgoingStreams());
|
| +
|
| + quic_data.Resume();
|
| + EXPECT_TRUE(quic_data.AllReadDataConsumed());
|
| + EXPECT_TRUE(quic_data.AllWriteDataConsumed());
|
| +}
|
| +
|
| TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) {
|
| MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
|
| std::unique_ptr<QuicEncryptedPacket> settings_packet(
|
| @@ -544,12 +669,10 @@ TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) {
|
| streams.push_back(stream);
|
| }
|
|
|
| - QuicChromiumClientStream* stream;
|
| - QuicChromiumClientSession::StreamRequest stream_request;
|
| + std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request =
|
| + session_->CreateStreamRequest();
|
| TestCompletionCallback callback;
|
| - ASSERT_EQ(ERR_IO_PENDING,
|
| - stream_request.StartRequest(session_->GetWeakPtr(), &stream,
|
| - callback.callback()));
|
| + ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback()));
|
|
|
| // Close a stream and ensure I can now open a new one.
|
| QuicStreamId stream_id = streams[0]->id();
|
| @@ -558,7 +681,7 @@ TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) {
|
| session_->OnRstStream(rst1);
|
| ASSERT_TRUE(callback.have_result());
|
| EXPECT_THAT(callback.WaitForResult(), IsOk());
|
| - EXPECT_TRUE(stream != nullptr);
|
| + EXPECT_TRUE(stream_request->ReleaseStream() != nullptr);
|
| }
|
|
|
| TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) {
|
|
|