| Index: net/quic/chromium/quic_chromium_client_stream_test.cc
|
| diff --git a/net/quic/chromium/quic_chromium_client_stream_test.cc b/net/quic/chromium/quic_chromium_client_stream_test.cc
|
| index 4efac81cc9c9d9cd327fb74e3d7f35ed955af7ec..0a3888a3a59bfd8d6dc8acdea222e1a18babaf95 100644
|
| --- a/net/quic/chromium/quic_chromium_client_stream_test.cc
|
| +++ b/net/quic/chromium/quic_chromium_client_stream_test.cc
|
| @@ -206,7 +206,7 @@ class QuicChromiumClientStreamTest
|
| stream_ = new QuicChromiumClientStream(kTestStreamId, &session_,
|
| NetLogWithSource());
|
| session_.ActivateStream(base::WrapUnique(stream_));
|
| - stream_->SetDelegate(&delegate_);
|
| + handle_ = stream_->CreateHandle(&delegate_);
|
| }
|
|
|
| void InitializeHeaders() {
|
| @@ -278,8 +278,10 @@ class QuicChromiumClientStreamTest
|
| }
|
|
|
| QuicCryptoClientConfig crypto_config_;
|
| - testing::StrictMock<MockDelegate> delegate2_;
|
| + std::unique_ptr<QuicChromiumClientStream::Handle> handle_;
|
| testing::StrictMock<MockDelegate> delegate_;
|
| + std::unique_ptr<QuicChromiumClientStream::Handle> handle2_;
|
| + testing::StrictMock<MockDelegate> delegate2_;
|
| MockQuicConnectionHelper helper_;
|
| MockAlarmFactory alarm_factory_;
|
| MockQuicClientSessionBase session_;
|
| @@ -292,6 +294,105 @@ INSTANTIATE_TEST_CASE_P(Version,
|
| QuicChromiumClientStreamTest,
|
| ::testing::ValuesIn(AllSupportedVersions()));
|
|
|
| +TEST_P(QuicChromiumClientStreamTest, Handle) {
|
| + EXPECT_TRUE(handle_->IsOpen());
|
| + EXPECT_EQ(kTestStreamId, handle_->id());
|
| + EXPECT_EQ(QUIC_NO_ERROR, handle_->connection_error());
|
| + EXPECT_EQ(QUIC_STREAM_NO_ERROR, handle_->stream_error());
|
| + EXPECT_TRUE(handle_->IsFirstStream());
|
| + EXPECT_FALSE(handle_->IsDoneReading());
|
| + EXPECT_FALSE(handle_->fin_sent());
|
| + EXPECT_FALSE(handle_->fin_received());
|
| + EXPECT_EQ(0u, handle_->stream_bytes_read());
|
| + EXPECT_EQ(0u, handle_->stream_bytes_written());
|
| + EXPECT_EQ(0u, handle_->NumBytesConsumed());
|
| +
|
| + InitializeHeaders();
|
| + QuicStreamOffset offset = 0;
|
| + ProcessHeadersFull(headers_);
|
| + QuicStreamFrame frame2(kTestStreamId, true, offset, QuicStringPiece());
|
| + EXPECT_CALL(delegate_, OnClose());
|
| + stream_->OnStreamFrame(frame2);
|
| + EXPECT_TRUE(handle_->fin_received());
|
| + handle_->OnFinRead();
|
| +
|
| + const char kData1[] = "hello world";
|
| + const size_t kDataLen = arraysize(kData1);
|
| +
|
| + // All data written.
|
| + EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _))
|
| + .WillOnce(Return(QuicConsumedData(kDataLen, true)));
|
| + TestCompletionCallback callback;
|
| + EXPECT_EQ(OK, handle_->WriteStreamData(QuicStringPiece(kData1, kDataLen),
|
| + true, callback.callback()));
|
| +
|
| + EXPECT_FALSE(handle_->IsOpen());
|
| + EXPECT_EQ(kTestStreamId, handle_->id());
|
| + EXPECT_EQ(QUIC_NO_ERROR, handle_->connection_error());
|
| + EXPECT_EQ(QUIC_STREAM_NO_ERROR, handle_->stream_error());
|
| + EXPECT_TRUE(handle_->IsFirstStream());
|
| + EXPECT_TRUE(handle_->IsDoneReading());
|
| + EXPECT_TRUE(handle_->fin_sent());
|
| + EXPECT_TRUE(handle_->fin_received());
|
| + EXPECT_EQ(0u, handle_->stream_bytes_read());
|
| + EXPECT_EQ(kDataLen, handle_->stream_bytes_written());
|
| + EXPECT_EQ(0u, handle_->NumBytesConsumed());
|
| +
|
| + EXPECT_EQ(ERR_CONNECTION_CLOSED,
|
| + handle_->WriteStreamData(QuicStringPiece(kData1, kDataLen), true,
|
| + callback.callback()));
|
| +
|
| + std::vector<scoped_refptr<IOBuffer>> buffers = {
|
| + scoped_refptr<IOBuffer>(new IOBuffer(10))};
|
| + std::vector<int> lengths = {10};
|
| + EXPECT_EQ(
|
| + ERR_CONNECTION_CLOSED,
|
| + handle_->WritevStreamData(buffers, lengths, true, callback.callback()));
|
| +
|
| + SpdyHeaderBlock headers;
|
| + EXPECT_EQ(0u, handle_->WriteHeaders(std::move(headers), true, nullptr));
|
| +}
|
| +
|
| +TEST_P(QuicChromiumClientStreamTest, HandleAfterConnectionClose) {
|
| + // Verify that the delegate's OnClose is called after closing the connection.
|
| + EXPECT_CALL(delegate_, OnClose());
|
| + EXPECT_CALL(session_,
|
| + SendRstStream(kTestStreamId, QUIC_RST_ACKNOWLEDGEMENT, 0));
|
| + stream_->OnConnectionClosed(QUIC_INVALID_FRAME_DATA,
|
| + ConnectionCloseSource::FROM_PEER);
|
| +
|
| + EXPECT_FALSE(handle_->IsOpen());
|
| + EXPECT_EQ(QUIC_INVALID_FRAME_DATA, handle_->connection_error());
|
| +}
|
| +
|
| +TEST_P(QuicChromiumClientStreamTest, HandleAfterStreamReset) {
|
| + // Verify that the delegate's OnClose is called after the stream is reset,
|
| + // but that the Handle still behaves correctly.
|
| + EXPECT_CALL(delegate_, OnClose());
|
| + QuicRstStreamFrame rst(kTestStreamId, QUIC_STREAM_CANCELLED, 0);
|
| + EXPECT_CALL(session_,
|
| + SendRstStream(kTestStreamId, QUIC_RST_ACKNOWLEDGEMENT, 0));
|
| + stream_->OnStreamReset(rst);
|
| +
|
| + EXPECT_FALSE(handle_->IsOpen());
|
| + EXPECT_EQ(QUIC_STREAM_CANCELLED, handle_->stream_error());
|
| +}
|
| +
|
| +TEST_P(QuicChromiumClientStreamTest, HandleAfterClearDelegate) {
|
| + EXPECT_TRUE(handle_->IsOpen());
|
| + handle_->ClearDelegate();
|
| +
|
| + // Verify that the delegate's OnClose is not called after ClearDelegate.
|
| + EXPECT_CALL(delegate_, OnClose()).Times(0);
|
| + QuicRstStreamFrame rst(kTestStreamId, QUIC_STREAM_CANCELLED, 0);
|
| + EXPECT_CALL(session_,
|
| + SendRstStream(kTestStreamId, QUIC_RST_ACKNOWLEDGEMENT, 0));
|
| + stream_->OnStreamReset(rst);
|
| +
|
| + EXPECT_FALSE(handle_->IsOpen());
|
| + EXPECT_EQ(QUIC_STREAM_CANCELLED, handle_->stream_error());
|
| +}
|
| +
|
| TEST_P(QuicChromiumClientStreamTest, OnFinRead) {
|
| InitializeHeaders();
|
| QuicStreamOffset offset = 0;
|
| @@ -359,10 +460,10 @@ TEST_P(QuicChromiumClientStreamTest, OnDataAvailableWithError) {
|
| }
|
|
|
| TEST_P(QuicChromiumClientStreamTest, OnError) {
|
| - EXPECT_CALL(delegate_, OnError(ERR_INTERNET_DISCONNECTED));
|
| + EXPECT_CALL(delegate_, OnError(ERR_INTERNET_DISCONNECTED)).Times(1);
|
|
|
| stream_->OnError(ERR_INTERNET_DISCONNECTED);
|
| - EXPECT_FALSE(stream_->GetDelegate());
|
| + stream_->OnError(ERR_INTERNET_DISCONNECTED);
|
| }
|
|
|
| TEST_P(QuicChromiumClientStreamTest, OnTrailers) {
|
| @@ -640,7 +741,7 @@ TEST_P(QuicChromiumClientStreamTest, HeadersBeforeDelegate) {
|
| // Now set the delegate and verify that the headers are delivered.
|
| EXPECT_CALL(delegate2_, OnInitialHeadersAvailableMock(
|
| _, header_list.uncompressed_header_bytes()));
|
| - stream2->SetDelegate(&delegate2_);
|
| + handle2_ = stream2->CreateHandle(&delegate2_);
|
| base::RunLoop().RunUntilIdle();
|
| EXPECT_EQ(headers_, delegate2_.headers_);
|
|
|
| @@ -672,7 +773,7 @@ TEST_P(QuicChromiumClientStreamTest, HeadersAndDataBeforeDelegate) {
|
| // not the data, which needs to be read explicitly.
|
| EXPECT_CALL(delegate2_, OnInitialHeadersAvailableMock(
|
| _, header_list.uncompressed_header_bytes()));
|
| - stream2->SetDelegate(&delegate2_);
|
| + handle2_ = stream2->CreateHandle(&delegate2_);
|
| base::RunLoop().RunUntilIdle();
|
| EXPECT_EQ(headers_, delegate2_.headers_);
|
| base::RunLoop().RunUntilIdle();
|
|
|