diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-07-14 17:41:05 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2016-08-04 12:37:36 +0000 |
commit | 399c965b6064c440ddcf4015f5f8e9d131c7a0a6 (patch) | |
tree | 6b06b60ff365abef0e13b3503d593a0df48d20e8 /chromium/net/http/bidirectional_stream_unittest.cc | |
parent | 7366110654eec46f21b6824f302356426f48cd74 (diff) | |
download | qtwebengine-chromium-399c965b6064c440ddcf4015f5f8e9d131c7a0a6.tar.gz |
BASELINE: Update Chromium to 52.0.2743.76 and Ninja to 1.7.1
Change-Id: I382f51b959689505a60f8b707255ecb344f7d8b4
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/net/http/bidirectional_stream_unittest.cc')
-rw-r--r-- | chromium/net/http/bidirectional_stream_unittest.cc | 505 |
1 files changed, 384 insertions, 121 deletions
diff --git a/chromium/net/http/bidirectional_stream_unittest.cc b/chromium/net/http/bidirectional_stream_unittest.cc index 4d6445f4631..8d7a9ed2063 100644 --- a/chromium/net/http/bidirectional_stream_unittest.cc +++ b/chromium/net/http/bidirectional_stream_unittest.cc @@ -4,8 +4,10 @@ #include "net/http/bidirectional_stream.h" +#include <memory> + #include "base/macros.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" @@ -18,6 +20,8 @@ #include "net/http/http_response_headers.h" #include "net/http/http_server_properties.h" #include "net/log/net_log.h" +#include "net/log/test_net_log.h" +#include "net/log/test_net_log_util.h" #include "net/socket/socket_test_util.h" #include "net/spdy/spdy_session.h" #include "net/spdy/spdy_test_util_common.h" @@ -40,11 +44,11 @@ class TestDelegateBase : public BidirectionalStream::Delegate { TestDelegateBase(IOBuffer* read_buf, int read_buf_len) : TestDelegateBase(read_buf, read_buf_len, - make_scoped_ptr(new base::Timer(false, false))) {} + base::WrapUnique(new base::Timer(false, false))) {} TestDelegateBase(IOBuffer* read_buf, int read_buf_len, - scoped_ptr<base::Timer> timer) + std::unique_ptr<base::Timer> timer) : read_buf_(read_buf), read_buf_len_(read_buf_len), timer_(std::move(timer)), @@ -58,7 +62,15 @@ class TestDelegateBase : public BidirectionalStream::Delegate { ~TestDelegateBase() override {} - void OnHeadersSent() override { CHECK(!not_expect_callback_); } + void OnStreamReady(bool request_headers_sent) override { + // Request headers should always be sent in H2's case, because the + // functionality to combine header frame with data frames is not + // implemented. + EXPECT_TRUE(request_headers_sent); + if (callback_.is_null()) + return; + callback_.Run(OK); + } void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { CHECK(!not_expect_callback_); @@ -102,20 +114,40 @@ class TestDelegateBase : public BidirectionalStream::Delegate { loop_->Quit(); } - void Start(scoped_ptr<BidirectionalStreamRequestInfo> request_info, + void Start(std::unique_ptr<BidirectionalStreamRequestInfo> request_info, HttpNetworkSession* session) { stream_.reset(new BidirectionalStream(std::move(request_info), session, - this, std::move(timer_))); + true, this, std::move(timer_))); if (run_until_completion_) loop_->Run(); } - void SendData(IOBuffer* data, int length, bool end_of_stream) { + void Start(std::unique_ptr<BidirectionalStreamRequestInfo> request_info, + HttpNetworkSession* session, + const CompletionCallback& cb) { + callback_ = cb; + stream_.reset(new BidirectionalStream(std::move(request_info), session, + true, this, std::move(timer_))); + if (run_until_completion_) + loop_->Run(); + } + + void SendData(const scoped_refptr<IOBuffer>& data, + int length, + bool end_of_stream) { not_expect_callback_ = true; stream_->SendData(data, length, end_of_stream); not_expect_callback_ = false; } + void SendvData(const std::vector<scoped_refptr<IOBuffer>>& data, + const std::vector<int>& length, + bool end_of_stream) { + not_expect_callback_ = true; + stream_->SendvData(data, length, end_of_stream); + not_expect_callback_ = false; + } + // Starts or continues reading data from |stream_| until no more bytes // can be read synchronously. void StartOrContinueReading() { @@ -174,12 +206,12 @@ class TestDelegateBase : public BidirectionalStream::Delegate { void QuitLoop() { loop_->Quit(); } private: - scoped_ptr<BidirectionalStream> stream_; + std::unique_ptr<BidirectionalStream> stream_; scoped_refptr<IOBuffer> read_buf_; int read_buf_len_; - scoped_ptr<base::Timer> timer_; + std::unique_ptr<base::Timer> timer_; std::string data_received_; - scoped_ptr<base::RunLoop> loop_; + std::unique_ptr<base::RunLoop> loop_; SpdyHeaderBlock response_headers_; SpdyHeaderBlock trailers_; int error_; @@ -191,6 +223,7 @@ class TestDelegateBase : public BidirectionalStream::Delegate { // calling into |stream_|. bool not_expect_callback_; + CompletionCallback callback_; DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); }; @@ -302,6 +335,7 @@ class BidirectionalStreamTest : public testing::TestWithParam<bool> { ssl_data_(SSLSocketDataProvider(ASYNC, OK)) { ssl_data_.SetNextProto(kProtoHTTP2); ssl_data_.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); + net_log_.SetCaptureMode(NetLogCaptureMode::IncludeSocketBytes()); } protected: @@ -323,14 +357,17 @@ class BidirectionalStreamTest : public testing::TestWithParam<bool> { sequenced_data_.reset( new SequencedSocketData(reads, reads_count, writes, writes_count)); session_deps_.socket_factory->AddSocketDataProvider(sequenced_data_.get()); + session_deps_.net_log = net_log_.bound().net_log(); http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); - session_ = CreateSecureSpdySession(http_session_.get(), key, BoundNetLog()); + session_ = + CreateSecureSpdySession(http_session_.get(), key, net_log_.bound()); } + BoundTestNetLog net_log_; SpdyTestUtil spdy_util_; SpdySessionDependencies session_deps_; - scoped_ptr<SequencedSocketData> sequenced_data_; - scoped_ptr<HttpNetworkSession> http_session_; + std::unique_ptr<SequencedSocketData> sequenced_data_; + std::unique_ptr<HttpNetworkSession> http_session_; private: SSLSocketDataProvider ssl_data_; @@ -338,7 +375,7 @@ class BidirectionalStreamTest : public testing::TestWithParam<bool> { }; TEST_F(BidirectionalStreamTest, CreateInsecureStream) { - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("http://www.example.org/"); @@ -346,20 +383,40 @@ TEST_F(BidirectionalStreamTest, CreateInsecureStream) { TestDelegateBase delegate(nullptr, 0); HttpNetworkSession::Params params = SpdySessionDependencies::CreateSessionParams(&session_deps_); - scoped_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); + std::unique_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); delegate.SetRunUntilCompletion(true); delegate.Start(std::move(request_info), session.get()); EXPECT_EQ(ERR_DISALLOWED_URL_SCHEME, delegate.error()); } +// Creates a BidirectionalStream with an insecure scheme. Destroy the stream +// without waiting for the OnFailed task to be executed. +TEST_F(BidirectionalStreamTest, + CreateInsecureStreamAndDestroyStreamRightAfter) { + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( + new BidirectionalStreamRequestInfo); + request_info->method = "GET"; + request_info->url = GURL("http://www.example.org/"); + + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase(nullptr, 0)); + HttpNetworkSession::Params params = + SpdySessionDependencies::CreateSessionParams(&session_deps_); + std::unique_ptr<HttpNetworkSession> session(new HttpNetworkSession(params)); + delegate->Start(std::move(request_info), session.get()); + // Reset stream right before the OnFailed task is executed. + delegate.reset(); + + base::RunLoop().RunUntilIdle(); +} + // Simulates user calling ReadData after END_STREAM has been received in // BidirectionalStreamSpdyImpl. TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); // Empty DATA frame with an END_STREAM flag. - scoped_ptr<SpdySerializedFrame> end_stream( + std::unique_ptr<SpdySerializedFrame> end_stream( spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); MockWrite writes[] = { CreateMockWrite(*req.get(), 0), @@ -367,13 +424,13 @@ TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); - scoped_ptr<SpdySerializedFrame> body_frame( + std::unique_ptr<SpdySerializedFrame> body_frame( spdy_util_.ConstructSpdyBodyFrame(1, false)); // Last body frame has END_STREAM flag set. - scoped_ptr<SpdySerializedFrame> last_body_frame( + std::unique_ptr<SpdySerializedFrame> last_body_frame( spdy_util_.ConstructSpdyBodyFrame(1, true)); MockRead reads[] = { @@ -391,7 +448,7 @@ TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -402,8 +459,8 @@ TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { // Create a MockTimer. Retain a raw pointer since the underlying // BidirectionalStreamImpl owns it. MockTimer* timer = new MockTimer(); - scoped_ptr<TestDelegateBase> delegate(new TestDelegateBase( - read_buffer.get(), kReadBufferSize, make_scoped_ptr(timer))); + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( + read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); delegate->set_do_not_start_read(true); delegate->Start(std::move(request_info), http_session_.get()); @@ -444,27 +501,162 @@ TEST_F(BidirectionalStreamTest, TestReadDataAfterClose) { delegate->GetTotalReceivedBytes()); } +// Tests that the NetLog contains correct entries. +TEST_F(BidirectionalStreamTest, TestNetLogContainEntries) { + BufferedSpdyFramer framer(spdy_util_.spdy_version()); + + std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( + "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); + std::unique_ptr<SpdySerializedFrame> data_frame( + framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_FIN)); + MockWrite writes[] = { + CreateMockWrite(*req, 0), CreateMockWrite(*data_frame, 3), + }; + + std::unique_ptr<SpdySerializedFrame> resp( + spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); + std::unique_ptr<SpdySerializedFrame> response_body_frame1( + spdy_util_.ConstructSpdyBodyFrame(1, false)); + std::unique_ptr<SpdySerializedFrame> response_body_frame2( + spdy_util_.ConstructSpdyBodyFrame(1, false)); + + SpdyHeaderBlock trailers; + trailers["foo"] = "bar"; + std::unique_ptr<SpdySerializedFrame> response_trailers( + spdy_util_.ConstructSpdyResponseHeaders(1, trailers, true)); + + MockRead reads[] = { + CreateMockRead(*resp, 1), + MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause. + CreateMockRead(*response_body_frame1, 4), + MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. + CreateMockRead(*response_body_frame2, 6), + CreateMockRead(*response_trailers, 7), + MockRead(ASYNC, 0, 8), + }; + + HostPortPair host_port_pair("www.example.org", 443); + SpdySessionKey key(host_port_pair, ProxyServer::Direct(), + PRIVACY_MODE_DISABLED); + InitSession(reads, arraysize(reads), writes, arraysize(writes), key); + + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( + new BidirectionalStreamRequestInfo); + request_info->method = "POST"; + request_info->url = GURL("https://www.example.org/"); + request_info->priority = LOWEST; + request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, + base::SizeTToString(kBodyDataSize * 3)); + + scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); + MockTimer* timer = new MockTimer(); + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( + read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); + delegate->set_do_not_start_read(true); + delegate->Start(std::move(request_info), http_session_.get()); + // Send the request and receive response headers. + sequenced_data_->RunUntilPaused(); + EXPECT_FALSE(timer->IsRunning()); + + scoped_refptr<StringIOBuffer> buf( + new StringIOBuffer(std::string(kBodyData, kBodyDataSize))); + // Send a DATA frame. + delegate->SendData(buf, buf->size(), true); + // ReadData returns asynchronously because no data is buffered. + int rv = delegate->ReadData(); + EXPECT_EQ(ERR_IO_PENDING, rv); + // Deliver the first DATA frame. + sequenced_data_->Resume(); + sequenced_data_->RunUntilPaused(); + // |sequenced_data_| is now stopped after delivering first DATA frame but + // before the second DATA frame. + // Fire the timer to allow the first ReadData to complete asynchronously. + timer->Fire(); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1, delegate->on_data_read_count()); + + // Now let |sequenced_data_| run until completion. + sequenced_data_->Resume(); + base::RunLoop().RunUntilIdle(); + // All data has been delivered, and OnClosed() has been invoked. + // Read now, and it should complete synchronously. + rv = delegate->ReadData(); + EXPECT_EQ(kUploadDataSize, rv); + EXPECT_EQ("200", delegate->response_headers().find(":status")->second); + EXPECT_EQ(1, delegate->on_data_read_count()); + EXPECT_EQ(1, delegate->on_data_sent_count()); + EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); + EXPECT_EQ("bar", delegate->trailers().find("foo")->second); + EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), + delegate->GetTotalSentBytes()); + EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), + delegate->GetTotalReceivedBytes()); + + // Destroy the delegate will destroy the stream, so we can get an end event + // for BIDIRECTIONAL_STREAM_ALIVE. + delegate.reset(); + TestNetLogEntry::List entries; + net_log_.GetEntries(&entries); + size_t index = ExpectLogContainsSomewhere( + entries, 0, NetLog::TYPE_BIDIRECTIONAL_STREAM_ALIVE, NetLog::PHASE_BEGIN); + // HTTP_STREAM_REQUEST is nested inside in BIDIRECTIONAL_STREAM_ALIVE. + index = ExpectLogContainsSomewhere( + entries, index, NetLog::TYPE_HTTP_STREAM_REQUEST, NetLog::PHASE_BEGIN); + index = ExpectLogContainsSomewhere( + entries, index, NetLog::TYPE_HTTP_STREAM_REQUEST, NetLog::PHASE_END); + // Headers received should happen after HTTP_STREAM_REQUEST. + index = ExpectLogContainsSomewhere( + entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_RECV_HEADERS, + NetLog::PHASE_NONE); + // Trailers received should happen after headers received. It might happen + // before the reads complete. + ExpectLogContainsSomewhere(entries, index, + NetLog::TYPE_BIDIRECTIONAL_STREAM_RECV_TRAILERS, + NetLog::PHASE_NONE); + // Sent bytes. Sending data is always asynchronous. + index = ExpectLogContainsSomewhere( + entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_SENT, + NetLog::PHASE_NONE); + TestNetLogEntry entry = entries[index]; + EXPECT_EQ(NetLog::SOURCE_BIDIRECTIONAL_STREAM, entry.source.type); + // Received bytes for asynchronous read. + index = ExpectLogContainsSomewhere( + entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_RECEIVED, + NetLog::PHASE_NONE); + entry = entries[index]; + EXPECT_EQ(NetLog::SOURCE_BIDIRECTIONAL_STREAM, entry.source.type); + // Received bytes for synchronous read. + index = ExpectLogContainsSomewhere( + entries, index, NetLog::TYPE_BIDIRECTIONAL_STREAM_BYTES_RECEIVED, + NetLog::PHASE_NONE); + entry = entries[index]; + EXPECT_EQ(NetLog::SOURCE_BIDIRECTIONAL_STREAM, entry.source.type); + ExpectLogContainsSomewhere(entries, index, + NetLog::TYPE_BIDIRECTIONAL_STREAM_ALIVE, + NetLog::PHASE_END); +} + TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { BufferedSpdyFramer framer(spdy_util_.spdy_version()); - scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( + std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); - scoped_ptr<SpdySerializedFrame> data_frame1( + std::unique_ptr<SpdySerializedFrame> data_frame1( framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); - scoped_ptr<SpdySerializedFrame> data_frame2( + std::unique_ptr<SpdySerializedFrame> data_frame2( framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); - scoped_ptr<SpdySerializedFrame> data_frame3( + std::unique_ptr<SpdySerializedFrame> data_frame3( framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_FIN)); MockWrite writes[] = { CreateMockWrite(*req, 0), CreateMockWrite(*data_frame1, 3), CreateMockWrite(*data_frame2, 6), CreateMockWrite(*data_frame3, 9), }; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); - scoped_ptr<SpdySerializedFrame> response_body_frame1( + std::unique_ptr<SpdySerializedFrame> response_body_frame1( spdy_util_.ConstructSpdyBodyFrame(1, false)); - scoped_ptr<SpdySerializedFrame> response_body_frame2( + std::unique_ptr<SpdySerializedFrame> response_body_frame2( spdy_util_.ConstructSpdyBodyFrame(1, true)); MockRead reads[] = { @@ -482,7 +674,7 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "POST"; request_info->url = GURL("https://www.example.org/"); @@ -492,8 +684,8 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); MockTimer* timer = new MockTimer(); - scoped_ptr<TestDelegateBase> delegate(new TestDelegateBase( - read_buffer.get(), kReadBufferSize, make_scoped_ptr(timer))); + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( + read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); delegate->set_do_not_start_read(true); delegate->Start(std::move(request_info), http_session_.get()); // Send the request and receive response headers. @@ -505,7 +697,7 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { new StringIOBuffer(std::string(kBodyData, kBodyDataSize))); // Send a DATA frame. - delegate->SendData(buf.get(), buf->size(), false); + delegate->SendData(buf, buf->size(), false); // ReadData and it should return asynchronously because no data is buffered. int rv = delegate->ReadData(); EXPECT_EQ(ERR_IO_PENDING, rv); @@ -518,7 +710,7 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { EXPECT_EQ(1, delegate->on_data_read_count()); // Send a DATA frame. - delegate->SendData(buf.get(), buf->size(), false); + delegate->SendData(buf, buf->size(), false); // ReadData and it should return asynchronously because no data is buffered. rv = delegate->ReadData(); EXPECT_EQ(ERR_IO_PENDING, rv); @@ -532,7 +724,7 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { EXPECT_EQ(2, delegate->on_data_sent_count()); // Send the last body frame. Client half closes. - delegate->SendData(buf.get(), buf->size(), true); + delegate->SendData(buf, buf->size(), true); sequenced_data_->Resume(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(3, delegate->on_data_sent_count()); @@ -551,21 +743,89 @@ TEST_F(BidirectionalStreamTest, TestInterleaveReadDataAndSendData) { delegate->GetTotalReceivedBytes()); } +TEST_F(BidirectionalStreamTest, TestCoalesceSmallDataBuffers) { + BufferedSpdyFramer framer(spdy_util_.spdy_version()); + + std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( + "https://www.example.org", 1, kBodyDataSize * 1, LOWEST, nullptr, 0)); + std::string body_data = "some really long piece of data"; + std::unique_ptr<SpdySerializedFrame> data_frame1(framer.CreateDataFrame( + 1, body_data.c_str(), body_data.size(), DATA_FLAG_FIN)); + MockWrite writes[] = { + CreateMockWrite(*req, 0), CreateMockWrite(*data_frame1, 1), + }; + + std::unique_ptr<SpdySerializedFrame> resp( + spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); + std::unique_ptr<SpdySerializedFrame> response_body_frame1( + spdy_util_.ConstructSpdyBodyFrame(1, true)); + MockRead reads[] = { + CreateMockRead(*resp, 2), + MockRead(ASYNC, ERR_IO_PENDING, 3), // Force a pause. + CreateMockRead(*response_body_frame1, 4), MockRead(ASYNC, 0, 5), + }; + + HostPortPair host_port_pair("www.example.org", 443); + SpdySessionKey key(host_port_pair, ProxyServer::Direct(), + PRIVACY_MODE_DISABLED); + InitSession(reads, arraysize(reads), writes, arraysize(writes), key); + + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( + new BidirectionalStreamRequestInfo); + request_info->method = "POST"; + request_info->url = GURL("https://www.example.org/"); + request_info->priority = LOWEST; + request_info->extra_headers.SetHeader(net::HttpRequestHeaders::kContentLength, + base::SizeTToString(kBodyDataSize * 1)); + + scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); + MockTimer* timer = new MockTimer(); + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( + read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); + delegate->set_do_not_start_read(true); + TestCompletionCallback callback; + delegate->Start(std::move(request_info), http_session_.get(), + callback.callback()); + // Wait until the stream is ready. + callback.WaitForResult(); + // Send a DATA frame. + scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(body_data.substr(0, 5))); + scoped_refptr<StringIOBuffer> buf2( + new StringIOBuffer(body_data.substr(5, body_data.size() - 5))); + delegate->SendvData({buf, buf2.get()}, {buf->size(), buf2->size()}, true); + sequenced_data_->RunUntilPaused(); // OnHeadersReceived. + // ReadData and it should return asynchronously because no data is buffered. + EXPECT_EQ(ERR_IO_PENDING, delegate->ReadData()); + sequenced_data_->Resume(); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1, delegate->on_data_sent_count()); + EXPECT_EQ(1, delegate->on_data_read_count()); + + EXPECT_EQ("200", delegate->response_headers().find(":status")->second); + EXPECT_EQ(1, delegate->on_data_read_count()); + EXPECT_EQ(1, delegate->on_data_sent_count()); + EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); + EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), + delegate->GetTotalSentBytes()); + EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), + delegate->GetTotalReceivedBytes()); +} + // Tests that BidirectionalStreamSpdyImpl::OnClose will complete any remaining // read even if the read queue is empty. TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); // Empty DATA frame with an END_STREAM flag. - scoped_ptr<SpdySerializedFrame> end_stream( + std::unique_ptr<SpdySerializedFrame> end_stream( spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); - scoped_ptr<SpdySerializedFrame> response_body_frame( + std::unique_ptr<SpdySerializedFrame> response_body_frame( spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); MockRead reads[] = { @@ -579,7 +839,7 @@ TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -588,8 +848,8 @@ TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) { scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); MockTimer* timer = new MockTimer(); - scoped_ptr<TestDelegateBase> delegate(new TestDelegateBase( - read_buffer.get(), kReadBufferSize, make_scoped_ptr(timer))); + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( + read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); delegate->set_do_not_start_read(true); delegate->Start(std::move(request_info), http_session_.get()); // Write request, and deliver response headers. @@ -616,23 +876,23 @@ TEST_F(BidirectionalStreamTest, TestCompleteAsyncRead) { } TEST_F(BidirectionalStreamTest, TestBuffering) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); // Empty DATA frame with an END_STREAM flag. - scoped_ptr<SpdySerializedFrame> end_stream( + std::unique_ptr<SpdySerializedFrame> end_stream( spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); - scoped_ptr<SpdySerializedFrame> body_frame( + std::unique_ptr<SpdySerializedFrame> body_frame( spdy_util_.ConstructSpdyBodyFrame(1, false)); // Last body frame has END_STREAM flag set. - scoped_ptr<SpdySerializedFrame> last_body_frame( + std::unique_ptr<SpdySerializedFrame> last_body_frame( spdy_util_.ConstructSpdyBodyFrame(1, true)); MockRead reads[] = { @@ -649,7 +909,7 @@ TEST_F(BidirectionalStreamTest, TestBuffering) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -658,8 +918,8 @@ TEST_F(BidirectionalStreamTest, TestBuffering) { scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); MockTimer* timer = new MockTimer(); - scoped_ptr<TestDelegateBase> delegate(new TestDelegateBase( - read_buffer.get(), kReadBufferSize, make_scoped_ptr(timer))); + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( + read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); delegate->Start(std::move(request_info), http_session_.get()); // Deliver two DATA frames together. sequenced_data_->RunUntilPaused(); @@ -698,10 +958,10 @@ TEST_F(BidirectionalStreamTest, TestBuffering) { } TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); // Empty DATA frame with an END_STREAM flag. - scoped_ptr<SpdySerializedFrame> end_stream( + std::unique_ptr<SpdySerializedFrame> end_stream( spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); MockWrite writes[] = { @@ -710,22 +970,25 @@ TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) { const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); - scoped_ptr<SpdySerializedFrame> body_frame( + std::unique_ptr<SpdySerializedFrame> body_frame( spdy_util_.ConstructSpdyBodyFrame(1, false)); - SpdyHeaderBlock late_headers; - late_headers["foo"] = "bar"; - scoped_ptr<SpdySerializedFrame> trailers( - spdy_util_.ConstructSpdyResponseHeaders(1, late_headers, true)); + SpdyHeaderBlock trailers; + trailers["foo"] = "bar"; + std::unique_ptr<SpdySerializedFrame> response_trailers( + spdy_util_.ConstructSpdyResponseHeaders(1, trailers, true)); MockRead reads[] = { - CreateMockRead(*resp, 1), CreateMockRead(*body_frame, 2), - CreateMockRead(*body_frame, 3), CreateMockRead(*body_frame, 4), + CreateMockRead(*resp, 1), + CreateMockRead(*body_frame, 2), + CreateMockRead(*body_frame, 3), + CreateMockRead(*body_frame, 4), MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause. - CreateMockRead(*trailers, 6), MockRead(SYNCHRONOUS, 0, 7), + CreateMockRead(*response_trailers, 6), + MockRead(SYNCHRONOUS, 0, 7), }; HostPortPair host_port_pair("www.example.org", 443); @@ -735,10 +998,10 @@ TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) { scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); MockTimer* timer = new MockTimer(); - scoped_ptr<TestDelegateBase> delegate(new TestDelegateBase( - read_buffer.get(), kReadBufferSize, make_scoped_ptr(timer))); + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( + read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -778,11 +1041,11 @@ TEST_F(BidirectionalStreamTest, TestBufferingWithTrailers) { TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { BufferedSpdyFramer framer(spdy_util_.spdy_version()); - scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( + std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); - scoped_ptr<SpdySerializedFrame> data_frame( + std::unique_ptr<SpdySerializedFrame> data_frame( framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); - scoped_ptr<SpdySerializedFrame> rst( + std::unique_ptr<SpdySerializedFrame> rst( spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); MockWrite writes[] = { @@ -790,9 +1053,9 @@ TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { CreateMockWrite(*rst, 5), }; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); - scoped_ptr<SpdySerializedFrame> response_body_frame( + std::unique_ptr<SpdySerializedFrame> response_body_frame( spdy_util_.ConstructSpdyBodyFrame(1, false)); MockRead reads[] = { @@ -807,7 +1070,7 @@ TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "POST"; request_info->url = GURL("https://www.example.org/"); @@ -816,7 +1079,7 @@ TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { base::SizeTToString(kBodyDataSize * 3)); scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); - scoped_ptr<TestDelegateBase> delegate( + std::unique_ptr<TestDelegateBase> delegate( new TestDelegateBase(read_buffer.get(), kReadBufferSize)); delegate->set_do_not_start_read(true); delegate->Start(std::move(request_info), http_session_.get()); @@ -827,7 +1090,7 @@ TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { // Send a DATA frame. scoped_refptr<StringIOBuffer> buf( new StringIOBuffer(std::string(kBodyData, kBodyDataSize))); - delegate->SendData(buf.get(), buf->size(), false); + delegate->SendData(buf, buf->size(), false); sequenced_data_->Resume(); base::RunLoop().RunUntilIdle(); // Cancel the stream. @@ -848,20 +1111,20 @@ TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { BufferedSpdyFramer framer(spdy_util_.spdy_version()); - scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( + std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( "https://www.example.org", 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); - scoped_ptr<SpdySerializedFrame> data_frame( + std::unique_ptr<SpdySerializedFrame> data_frame( framer.CreateDataFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); - scoped_ptr<SpdySerializedFrame> rst( + std::unique_ptr<SpdySerializedFrame> rst( spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); MockWrite writes[] = { CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), }; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); - scoped_ptr<SpdySerializedFrame> response_body_frame( + std::unique_ptr<SpdySerializedFrame> response_body_frame( spdy_util_.ConstructSpdyBodyFrame(1, false)); MockRead reads[] = { @@ -875,7 +1138,7 @@ TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "POST"; request_info->url = GURL("https://www.example.org/"); @@ -884,7 +1147,7 @@ TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { base::SizeTToString(kBodyDataSize * 3)); scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); - scoped_ptr<TestDelegateBase> delegate( + std::unique_ptr<TestDelegateBase> delegate( new TestDelegateBase(read_buffer.get(), kReadBufferSize)); delegate->set_do_not_start_read(true); delegate->Start(std::move(request_info), http_session_.get()); @@ -911,9 +1174,9 @@ TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { // Receiving a header with uppercase ASCII will result in a protocol error, // which should be propagated via Delegate::OnFailed. TEST_F(BidirectionalStreamTest, PropagateProtocolError) { - scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( + std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( "https://www.example.org", 1, kBodyDataSize * 3, LOW, nullptr, 0)); - scoped_ptr<SpdySerializedFrame> rst( + std::unique_ptr<SpdySerializedFrame> rst( spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); MockWrite writes[] = { @@ -921,7 +1184,7 @@ TEST_F(BidirectionalStreamTest, PropagateProtocolError) { }; const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); MockRead reads[] = { @@ -933,7 +1196,7 @@ TEST_F(BidirectionalStreamTest, PropagateProtocolError) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "POST"; request_info->url = GURL("https://www.example.org/"); @@ -941,7 +1204,7 @@ TEST_F(BidirectionalStreamTest, PropagateProtocolError) { base::SizeTToString(kBodyDataSize * 3)); scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); - scoped_ptr<TestDelegateBase> delegate( + std::unique_ptr<TestDelegateBase> delegate( new TestDelegateBase(read_buffer.get(), kReadBufferSize)); delegate->SetRunUntilCompletion(true); delegate->Start(std::move(request_info), http_session_.get()); @@ -965,10 +1228,10 @@ INSTANTIATE_TEST_CASE_P(CancelOrDeleteTests, ::testing::Values(true, false)); TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); - scoped_ptr<SpdySerializedFrame> rst( + std::unique_ptr<SpdySerializedFrame> rst( spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); MockWrite writes[] = { CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), @@ -976,7 +1239,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); MockRead reads[] = { @@ -988,7 +1251,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -996,7 +1259,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { request_info->end_stream_on_headers = true; scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); - scoped_ptr<CancelOrDeleteStreamDelegate> delegate( + std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( new CancelOrDeleteStreamDelegate( read_buffer.get(), kReadBufferSize, CancelOrDeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED, @@ -1021,10 +1284,10 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { } TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); - scoped_ptr<SpdySerializedFrame> rst( + std::unique_ptr<SpdySerializedFrame> rst( spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); MockWrite writes[] = { CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3), @@ -1032,10 +1295,10 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); - scoped_ptr<SpdySerializedFrame> response_body_frame( + std::unique_ptr<SpdySerializedFrame> response_body_frame( spdy_util_.ConstructSpdyBodyFrame(1, false)); MockRead reads[] = { @@ -1048,7 +1311,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -1056,7 +1319,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { request_info->end_stream_on_headers = true; scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); - scoped_ptr<CancelOrDeleteStreamDelegate> delegate( + std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( new CancelOrDeleteStreamDelegate( read_buffer.get(), kReadBufferSize, CancelOrDeleteStreamDelegate::Phase::ON_DATA_READ, GetParam())); @@ -1080,10 +1343,10 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { } TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); - scoped_ptr<SpdySerializedFrame> rst( + std::unique_ptr<SpdySerializedFrame> rst( spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); MockWrite writes[] = { CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), @@ -1091,20 +1354,20 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); - scoped_ptr<SpdySerializedFrame> response_body_frame( + std::unique_ptr<SpdySerializedFrame> response_body_frame( spdy_util_.ConstructSpdyBodyFrame(1, false)); - SpdyHeaderBlock late_headers; - late_headers["foo"] = "bar"; - scoped_ptr<SpdySerializedFrame> trailers( - spdy_util_.ConstructSpdyResponseHeaders(1, late_headers, true)); + SpdyHeaderBlock trailers; + trailers["foo"] = "bar"; + std::unique_ptr<SpdySerializedFrame> response_trailers( + spdy_util_.ConstructSpdyResponseHeaders(1, trailers, true)); MockRead reads[] = { CreateMockRead(*resp, 1), CreateMockRead(*response_body_frame, 2), - CreateMockRead(*trailers, 3), MockRead(ASYNC, 0, 5), + CreateMockRead(*response_trailers, 3), MockRead(ASYNC, 0, 5), }; HostPortPair host_port_pair("www.example.org", 443); @@ -1112,7 +1375,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -1120,7 +1383,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { request_info->end_stream_on_headers = true; scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); - scoped_ptr<CancelOrDeleteStreamDelegate> delegate( + std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( new CancelOrDeleteStreamDelegate( read_buffer.get(), kReadBufferSize, CancelOrDeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED, @@ -1146,10 +1409,10 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { } TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); - scoped_ptr<SpdySerializedFrame> rst( + std::unique_ptr<SpdySerializedFrame> rst( spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); MockWrite writes[] = { @@ -1157,7 +1420,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { }; const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); MockRead reads[] = { @@ -1169,7 +1432,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { PRIVACY_MODE_DISABLED); InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -1177,7 +1440,7 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { request_info->end_stream_on_headers = true; scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); - scoped_ptr<CancelOrDeleteStreamDelegate> delegate( + std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( new CancelOrDeleteStreamDelegate( read_buffer.get(), kReadBufferSize, CancelOrDeleteStreamDelegate::Phase::ON_FAILED, GetParam())); @@ -1200,10 +1463,10 @@ TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { } TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { - scoped_ptr<SpdySerializedFrame> req( + std::unique_ptr<SpdySerializedFrame> req( spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); // Empty DATA frame with an END_STREAM flag. - scoped_ptr<SpdySerializedFrame> end_stream( + std::unique_ptr<SpdySerializedFrame> end_stream( spdy_util_.ConstructSpdyBodyFrame(1, nullptr, 0, true)); MockWrite writes[] = {CreateMockWrite(*req.get(), 0)}; @@ -1213,9 +1476,9 @@ TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { const char* const kExtraResponseHeaders[] = {"alt-svc", alt_svc_header_value.c_str()}; - scoped_ptr<SpdySerializedFrame> resp( + std::unique_ptr<SpdySerializedFrame> resp( spdy_util_.ConstructSpdyGetSynReply(kExtraResponseHeaders, 1, 1)); - scoped_ptr<SpdySerializedFrame> body_frame( + std::unique_ptr<SpdySerializedFrame> body_frame( spdy_util_.ConstructSpdyBodyFrame(1, true)); MockRead reads[] = { @@ -1224,6 +1487,7 @@ TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { }; HostPortPair host_port_pair("www.example.org", 443); + url::SchemeHostPort server("https", "www.example.org", 443); SpdySessionKey key(host_port_pair, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); session_deps_.parse_alternative_services = true; @@ -1232,7 +1496,7 @@ TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { session_deps_.enable_quic = true; InitSession(reads, arraysize(reads), writes, arraysize(writes), key); - scoped_ptr<BidirectionalStreamRequestInfo> request_info( + std::unique_ptr<BidirectionalStreamRequestInfo> request_info( new BidirectionalStreamRequestInfo); request_info->method = "GET"; request_info->url = GURL("https://www.example.org/"); @@ -1241,8 +1505,8 @@ TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); MockTimer* timer = new MockTimer(); - scoped_ptr<TestDelegateBase> delegate(new TestDelegateBase( - read_buffer.get(), kReadBufferSize, make_scoped_ptr(timer))); + std::unique_ptr<TestDelegateBase> delegate(new TestDelegateBase( + read_buffer.get(), kReadBufferSize, base::WrapUnique(timer))); delegate->SetRunUntilCompletion(true); delegate->Start(std::move(request_info), http_session_.get()); @@ -1258,8 +1522,7 @@ TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { delegate->GetTotalReceivedBytes()); AlternativeServiceVector alternative_service_vector = - http_session_->http_server_properties()->GetAlternativeServices( - host_port_pair); + http_session_->http_server_properties()->GetAlternativeServices(server); ASSERT_EQ(1u, alternative_service_vector.size()); EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3), alternative_service_vector[0].protocol); |