| 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 9d8b6e359419d5568aebf0370ecff04b2c702527..7c4f6db908c3435c0dfc6f11537e9efeaf9b1777 100644
|
| --- a/net/tools/quic/quic_simple_server_stream_test.cc
|
| +++ b/net/tools/quic/quic_simple_server_stream_test.cc
|
| @@ -11,15 +11,18 @@
|
| #include "net/quic/quic_protocol.h"
|
| #include "net/quic/quic_utils.h"
|
| #include "net/quic/spdy_utils.h"
|
| +#include "net/quic/test_tools/crypto_test_utils.h"
|
| #include "net/quic/test_tools/quic_test_utils.h"
|
| #include "net/quic/test_tools/reliable_quic_stream_peer.h"
|
| #include "net/test/gtest_util.h"
|
| #include "net/tools/epoll_server/epoll_server.h"
|
| #include "net/tools/quic/quic_in_memory_cache.h"
|
| +#include "net/tools/quic/quic_simple_server_session.h"
|
| #include "net/tools/quic/spdy_balsa_utils.h"
|
| #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| +#include "url/gurl.h"
|
|
|
| using base::StringPiece;
|
| using net::test::MockConnection;
|
| @@ -48,6 +51,8 @@ class QuicSimpleServerStreamPeer : public QuicSimpleServerStream {
|
| QuicSimpleServerStreamPeer(QuicStreamId stream_id, QuicSpdySession* session)
|
| : QuicSimpleServerStream(stream_id, session) {}
|
|
|
| + ~QuicSimpleServerStreamPeer() override{};
|
| +
|
| using QuicSimpleServerStream::SendResponse;
|
| using QuicSimpleServerStream::SendErrorResponse;
|
|
|
| @@ -74,6 +79,62 @@ class QuicSimpleServerStreamPeer : public QuicSimpleServerStream {
|
| }
|
| };
|
|
|
| +class MockQuicSimpleServerSession : public QuicSimpleServerSession {
|
| + public:
|
| + const size_t kMaxStreamsForTest = 100;
|
| +
|
| + explicit MockQuicSimpleServerSession(QuicConnection* connection,
|
| + MockQuicServerSessionVisitor* owner,
|
| + QuicCryptoServerConfig* crypto_config)
|
| + : QuicSimpleServerSession(::net::test::DefaultQuicConfig(),
|
| + connection,
|
| + owner,
|
| + crypto_config) {
|
| + set_max_open_streams(kMaxStreamsForTest);
|
| + ON_CALL(*this, WritevData(_, _, _, _, _, _))
|
| + .WillByDefault(testing::Return(QuicConsumedData(0, false)));
|
| + }
|
| +
|
| + ~MockQuicSimpleServerSession() override {}
|
| +
|
| + MOCK_METHOD2(OnConnectionClosed, void(QuicErrorCode error, bool from_peer));
|
| + MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id));
|
| + MOCK_METHOD6(WritevData,
|
| + QuicConsumedData(QuicStreamId id,
|
| + QuicIOVector data,
|
| + QuicStreamOffset offset,
|
| + bool fin,
|
| + FecProtection fec_protection,
|
| + QuicAckListenerInterface*));
|
| + MOCK_METHOD2(OnStreamHeaders,
|
| + void(QuicStreamId stream_id, StringPiece headers_data));
|
| + MOCK_METHOD2(OnStreamHeadersPriority,
|
| + void(QuicStreamId stream_id, SpdyPriority priority));
|
| + MOCK_METHOD3(OnStreamHeadersComplete,
|
| + void(QuicStreamId stream_id, bool fin, size_t frame_len));
|
| + MOCK_METHOD5(WriteHeaders,
|
| + size_t(QuicStreamId id,
|
| + const SpdyHeaderBlock& headers,
|
| + bool fin,
|
| + SpdyPriority priority,
|
| + QuicAckListenerInterface* ack_notifier_delegate));
|
| + MOCK_METHOD3(SendRstStream,
|
| + void(QuicStreamId stream_id,
|
| + QuicRstStreamErrorCode error,
|
| + QuicStreamOffset bytes_written));
|
| + MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta));
|
| + MOCK_METHOD4(PromisePushResources,
|
| + void(const string&,
|
| + const list<QuicInMemoryCache::ServerPushInfo>&,
|
| + QuicStreamId,
|
| + const SpdyHeaderBlock&));
|
| +
|
| + using QuicSession::ActivateStream;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(MockQuicSimpleServerSession);
|
| +};
|
| +
|
| namespace {
|
|
|
| class QuicSimpleServerStreamTest
|
| @@ -84,7 +145,12 @@ class QuicSimpleServerStreamTest
|
| new StrictMock<MockConnection>(&helper_,
|
| Perspective::IS_SERVER,
|
| SupportedVersions(GetParam()))),
|
| - session_(connection_),
|
| + session_owner_(new StrictMock<MockQuicServerSessionVisitor>()),
|
| + crypto_config_(new QuicCryptoServerConfig(
|
| + QuicCryptoServerConfig::TESTING,
|
| + QuicRandom::GetInstance(),
|
| + ::net::test::CryptoTestUtils::ProofSourceForTesting())),
|
| + session_(connection_, session_owner_, crypto_config_.get()),
|
| body_("hello world") {
|
| SpdyHeaderBlock request_headers;
|
| request_headers[":host"] = "";
|
| @@ -126,7 +192,9 @@ class QuicSimpleServerStreamTest
|
| SpdyHeaderBlock response_headers_;
|
| MockConnectionHelper helper_;
|
| StrictMock<MockConnection>* connection_;
|
| - StrictMock<MockQuicSpdySession> session_;
|
| + StrictMock<MockQuicServerSessionVisitor>* session_owner_;
|
| + std::unique_ptr<QuicCryptoServerConfig> crypto_config_;
|
| + StrictMock<MockQuicSimpleServerSession> session_;
|
| QuicSimpleServerStreamPeer* stream_; // Owned by session_.
|
| string headers_string_;
|
| string body_;
|
| @@ -293,6 +361,42 @@ TEST_P(QuicSimpleServerStreamTest, SendResponseWithValidHeaders) {
|
| EXPECT_TRUE(stream_->write_side_closed());
|
| }
|
|
|
| +TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) {
|
| + // Tests that if a reponse has push resources to be send, SendResponse() will
|
| + // call PromisePushResources() to handle these resources.
|
| +
|
| + // Add a request and response with valid headers into cache.
|
| + 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, kDefaultPriority, "Push body");
|
| + list<QuicInMemoryCache::ServerPushInfo> push_resources;
|
| + push_resources.push_back(push_info);
|
| + QuicInMemoryCache::GetInstance()->AddSimpleResponseWithServerPushResources(
|
| + host, request_path, 200, body, push_resources);
|
| +
|
| + SpdyHeaderBlock* request_headers = stream_->mutable_headers();
|
| + (*request_headers)[":path"] = request_path;
|
| + (*request_headers)[":authority"] = host;
|
| + (*request_headers)[":version"] = "HTTP/1.1";
|
| + (*request_headers)[":method"] = "GET";
|
| +
|
| + 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_, WritevData(_, _, _, _, _, _))
|
| + .Times(1)
|
| + .WillOnce(Return(QuicConsumedData(body.length(), true)));
|
| + QuicSimpleServerStreamPeer::SendResponse(stream_);
|
| +}
|
| +
|
| TEST_P(QuicSimpleServerStreamTest, PushResponseOnClientInitiatedStream) {
|
| // Calling PushResponse() on a client initialted stream is never supposed to
|
| // happen.
|
|
|