Index: net/tools/quic/quic_simple_server_stream_test.cc |
diff --git a/net/tools/quic/quic_simple_server_stream_test.cc b/net/tools/quic/quic_simple_server_stream_test.cc |
index 191f5d229d3e44199c3dba654f3b000aabcf1c80..5161c9f223cc8fdf397343a4cdff4a948e5866fb 100644 |
--- a/net/tools/quic/quic_simple_server_stream_test.cc |
+++ b/net/tools/quic/quic_simple_server_stream_test.cc |
@@ -4,6 +4,8 @@ |
#include "net/tools/quic/quic_simple_server_stream.h" |
+#include <utility> |
+ |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_piece.h" |
#include "net/quic/quic_connection.h" |
@@ -120,9 +122,19 @@ class MockQuicSimpleServerSession : public QuicSimpleServerSession { |
void(QuicStreamId stream_id, SpdyPriority priority)); |
MOCK_METHOD3(OnStreamHeadersComplete, |
void(QuicStreamId stream_id, bool fin, size_t frame_len)); |
- MOCK_METHOD5(WriteHeaders, |
+ // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be |
+ // mocked directly. |
+ size_t WriteHeaders( |
+ QuicStreamId id, |
+ SpdyHeaderBlock headers, |
+ bool fin, |
+ SpdyPriority priority, |
+ QuicAckListenerInterface* ack_notifier_delegate) override { |
+ return WriteHeadersMock(id, headers, fin, priority, ack_notifier_delegate); |
+ } |
+ MOCK_METHOD5(WriteHeadersMock, |
size_t(QuicStreamId id, |
- SpdyHeaderBlock headers, |
+ const SpdyHeaderBlock& headers, |
bool fin, |
SpdyPriority priority, |
QuicAckListenerInterface* ack_notifier_delegate)); |
@@ -131,7 +143,17 @@ class MockQuicSimpleServerSession : public QuicSimpleServerSession { |
QuicRstStreamErrorCode error, |
QuicStreamOffset bytes_written)); |
MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta)); |
- MOCK_METHOD4(PromisePushResources, |
+ // Matchers cannot be used on non-copyable types like SpdyHeaderBlock. |
+ void PromisePushResources( |
+ const string& request_url, |
+ const std::list<QuicInMemoryCache::ServerPushInfo>& resources, |
+ QuicStreamId original_stream_id, |
+ const SpdyHeaderBlock& original_request_headers) override { |
+ original_request_headers_ = original_request_headers.Clone(); |
+ PromisePushResourcesMock(request_url, resources, original_stream_id, |
+ original_request_headers); |
+ } |
+ MOCK_METHOD4(PromisePushResourcesMock, |
void(const string&, |
const std::list<QuicInMemoryCache::ServerPushInfo>&, |
QuicStreamId, |
@@ -139,6 +161,8 @@ class MockQuicSimpleServerSession : public QuicSimpleServerSession { |
using QuicSession::ActivateStream; |
+ SpdyHeaderBlock original_request_headers_; |
+ |
private: |
DISALLOW_COPY_AND_ASSIGN(MockQuicSimpleServerSession); |
}; |
@@ -274,7 +298,7 @@ TEST_P(QuicSimpleServerStreamTest, TestFramingExtraData) { |
string large_body = "hello world!!!!!!"; |
// We'll automatically write out an error (headers + body) |
- EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); |
+ EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.WillOnce(Invoke(MockQuicSession::ConsumeAllData)); |
EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
@@ -305,13 +329,13 @@ TEST_P(QuicSimpleServerStreamTest, SendResponseWithIllegalResponseStatus) { |
response_headers_[":status"] = "200 OK"; |
response_headers_["content-length"] = "5"; |
string body = "Yummm"; |
- QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", |
- response_headers_, body); |
+ QuicInMemoryCache::GetInstance()->AddResponse( |
+ "www.google.com", "/bar", std::move(response_headers_), body); |
stream_->set_fin_received(true); |
InSequence s; |
- EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); |
+ EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(1) |
.WillOnce(Return(QuicConsumedData( |
@@ -336,13 +360,13 @@ TEST_P(QuicSimpleServerStreamTest, SendResponseWithIllegalResponseStatus2) { |
response_headers_[":status"] = "+200"; |
response_headers_["content-length"] = "5"; |
string body = "Yummm"; |
- QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", |
- response_headers_, body); |
+ QuicInMemoryCache::GetInstance()->AddResponse( |
+ "www.google.com", "/bar", std::move(response_headers_), body); |
stream_->set_fin_received(true); |
InSequence s; |
- EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); |
+ EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(1) |
.WillOnce(Return(QuicConsumedData( |
@@ -372,8 +396,8 @@ TEST_P(QuicSimpleServerStreamTest, SendPushResponseWith404Response) { |
response_headers_[":status"] = "404"; |
response_headers_["content-length"] = "8"; |
string body = "NotFound"; |
- QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", |
- response_headers_, body); |
+ QuicInMemoryCache::GetInstance()->AddResponse( |
+ "www.google.com", "/bar", std::move(response_headers_), body); |
InSequence s; |
EXPECT_CALL(session_, |
@@ -394,12 +418,12 @@ TEST_P(QuicSimpleServerStreamTest, SendResponseWithValidHeaders) { |
response_headers_[":status"] = "200"; |
response_headers_["content-length"] = "5"; |
string body = "Yummm"; |
- QuicInMemoryCache::GetInstance()->AddResponse("www.google.com", "/bar", |
- response_headers_, body); |
+ QuicInMemoryCache::GetInstance()->AddResponse( |
+ "www.google.com", "/bar", std::move(response_headers_), body); |
stream_->set_fin_received(true); |
InSequence s; |
- EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); |
+ EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(1) |
.WillOnce(Return(QuicConsumedData(body.length(), true))); |
@@ -418,9 +442,8 @@ TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) { |
string host = "www.google.com"; |
string request_path = "/foo"; |
string body = "Yummm"; |
- SpdyHeaderBlock response_headers; |
string url = host + "/bar"; |
- QuicInMemoryCache::ServerPushInfo push_info(GURL(url), response_headers, |
+ QuicInMemoryCache::ServerPushInfo push_info(GURL(url), SpdyHeaderBlock(), |
kDefaultPriority, "Push body"); |
std::list<QuicInMemoryCache::ServerPushInfo> push_resources; |
push_resources.push_back(push_info); |
@@ -435,21 +458,21 @@ TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) { |
stream_->set_fin_received(true); |
InSequence s; |
- EXPECT_CALL(session_, PromisePushResources(host + request_path, _, |
- ::net::test::kClientDataStreamId1, |
- *request_headers)); |
- EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, false, _, nullptr)); |
+ EXPECT_CALL(session_, |
+ PromisePushResourcesMock(host + request_path, _, |
+ ::net::test::kClientDataStreamId1, _)); |
+ EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(1) |
.WillOnce(Return(QuicConsumedData(body.length(), true))); |
QuicSimpleServerStreamPeer::SendResponse(stream_); |
+ EXPECT_EQ(*request_headers, session_.original_request_headers_); |
} |
TEST_P(QuicSimpleServerStreamTest, PushResponseOnClientInitiatedStream) { |
// Calling PushResponse() on a client initialted stream is never supposed to |
// happen. |
- SpdyHeaderBlock headers; |
- EXPECT_DFATAL(stream_->PushResponse(headers), |
+ EXPECT_DFATAL(stream_->PushResponse(SpdyHeaderBlock()), |
"Client initiated stream" |
" shouldn't be used as promised stream."); |
} |
@@ -477,18 +500,18 @@ TEST_P(QuicSimpleServerStreamTest, PushResponseOnServerInitiatedStream) { |
response_headers_[":status"] = "200"; |
response_headers_["content-length"] = "5"; |
const string kBody = "Hello"; |
- QuicInMemoryCache::GetInstance()->AddResponse(kHost, kPath, response_headers_, |
- kBody); |
+ QuicInMemoryCache::GetInstance()->AddResponse( |
+ kHost, kPath, std::move(response_headers_), kBody); |
// Call PushResponse() should trigger stream to fetch response from cache |
// and send it back. |
EXPECT_CALL(session_, |
- WriteHeaders(kServerInitiatedStreamId, _, false, |
- server_initiated_stream->priority(), nullptr)); |
+ WriteHeadersMock(kServerInitiatedStreamId, _, false, |
+ server_initiated_stream->priority(), nullptr)); |
EXPECT_CALL(session_, WritevData(_, kServerInitiatedStreamId, _, _, _, _)) |
.Times(1) |
.WillOnce(Return(QuicConsumedData(kBody.size(), true))); |
- server_initiated_stream->PushResponse(headers); |
+ server_initiated_stream->PushResponse(std::move(headers)); |
EXPECT_EQ(kPath, QuicSimpleServerStreamPeer::headers( |
server_initiated_stream)[":path"] |
.as_string()); |
@@ -500,13 +523,10 @@ TEST_P(QuicSimpleServerStreamTest, PushResponseOnServerInitiatedStream) { |
TEST_P(QuicSimpleServerStreamTest, TestSendErrorResponse) { |
EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
- response_headers_[":version"] = "HTTP/1.1"; |
- response_headers_[":status"] = "500 Server Error"; |
- response_headers_["content-length"] = "3"; |
stream_->set_fin_received(true); |
InSequence s; |
- EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); |
+ EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(1) |
.WillOnce(Return(QuicConsumedData(3, true))); |
@@ -526,7 +546,7 @@ TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) { |
headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
- EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); |
+ EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(AnyNumber()) |
.WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
@@ -547,7 +567,7 @@ TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) { |
headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
- EXPECT_CALL(session_, WriteHeaders(_, _, _, _, _)); |
+ EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(AnyNumber()) |
.WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
@@ -576,12 +596,8 @@ TEST_P(QuicSimpleServerStreamTest, ValidMultipleContentLength) { |
} |
TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { |
- response_headers_[":version"] = "HTTP/1.1"; |
- response_headers_[":status"] = "500 Server Error"; |
- response_headers_["content-length"] = "3"; |
- |
InSequence s; |
- EXPECT_CALL(session_, WriteHeaders(stream_->id(), _, _, _, _)); |
+ EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
.Times(1) |
.WillOnce(Return(QuicConsumedData(3, true))); |
@@ -598,10 +614,6 @@ TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { |
TEST_P(QuicSimpleServerStreamTest, |
DoNotSendQuicRstStreamNoErrorWithRstReceived) { |
- response_headers_[":version"] = "HTTP/1.1"; |
- response_headers_[":status"] = "500 Server Error"; |
- response_headers_["content-length"] = "3"; |
- |
InSequence s; |
EXPECT_FALSE(stream_->reading_stopped()); |