| Index: net/spdy/spdy_network_transaction_unittest.cc
|
| ===================================================================
|
| --- net/spdy/spdy_network_transaction_unittest.cc (revision 57015)
|
| +++ net/spdy/spdy_network_transaction_unittest.cc (working copy)
|
| @@ -10,6 +10,7 @@
|
| #include "net/http/http_transaction_unittest.h"
|
| #include "net/spdy/spdy_http_stream.h"
|
| #include "net/spdy/spdy_session.h"
|
| +#include "net/spdy/spdy_session_pool.h"
|
| #include "net/spdy/spdy_test_util.h"
|
| #include "net/url_request/url_request_unittest.h"
|
| #include "testing/platform_test.h"
|
| @@ -82,6 +83,18 @@
|
| }
|
| }
|
|
|
| + ~NormalSpdyTransactionHelper() {
|
| + // Any test which doesn't close the socket by sending it an EOF will
|
| + // have a valid session left open, which leaks the entire session pool.
|
| + // This is just fine - in fact, some of our tests intentionally do this
|
| + // so that we can check consistency of the SpdySessionPool as the test
|
| + // finishes. If we had put an EOF on the socket, the SpdySession would
|
| + // have closed and we wouldn't be able to check the consistency.
|
| +
|
| + // Forcefully close existing sessions here.
|
| + session()->spdy_session_pool()->CloseAllSessions();
|
| + }
|
| +
|
| void SetDeterministic() {
|
| session_ = SpdySessionDependencies::SpdyCreateSessionDeterministic(
|
| session_deps_.get());
|
| @@ -247,12 +260,15 @@
|
| HttpNetworkTransaction* trans() { return trans_.get(); }
|
| void ResetTrans() { trans_.reset(); }
|
| TransactionHelperResult& output() { return output_; }
|
| - HttpRequestInfo& request() { return request_; }
|
| - scoped_refptr<HttpNetworkSession>& session() { return session_; }
|
| + const HttpRequestInfo& request() const { return request_; }
|
| + const scoped_refptr<HttpNetworkSession>& session() const {
|
| + return session_;
|
| + }
|
| scoped_ptr<SpdySessionDependencies>& session_deps() {
|
| return session_deps_;
|
| }
|
| - int port() { return port_; }
|
| + int port() const { return port_; }
|
| + SpdyNetworkTransactionTestTypes test_type() const { return test_type_; }
|
|
|
| private:
|
| typedef std::vector<StaticSocketDataProvider*> DataVector;
|
| @@ -307,28 +323,54 @@
|
| return google_post_request_;
|
| }
|
|
|
| - class RunServerPushTestCallback : public CallbackRunner< Tuple1<int> > {
|
| - public:
|
| - RunServerPushTestCallback(scoped_refptr<net::IOBufferWithSize> buffer,
|
| - std::string& result, bool& need_read_callback)
|
| - : buffer_(buffer), result_(result),
|
| - need_read_callback_(need_read_callback) {}
|
| + // Read the result of a particular transaction, knowing that we've got
|
| + // multiple transactions in the read pipeline; so as we read, we may have
|
| + // to skip over data destined for other transactions while we consume
|
| + // the data for |trans|.
|
| + int ReadResult(HttpNetworkTransaction* trans,
|
| + OrderedSocketData* data,
|
| + std::string* result) {
|
| + const int kSize = 3000;
|
|
|
| - virtual void RunWithParams(const Tuple1<int>& params) {
|
| - // Indicates some type of error.
|
| - if(params.a <= 0)
|
| - return;
|
| -
|
| - std::string temp(buffer_->data(), params.a);
|
| - result_.append(temp);
|
| - need_read_callback_ = true;
|
| + int bytes_read = 0;
|
| + scoped_refptr<net::IOBufferWithSize> buf = new net::IOBufferWithSize(kSize);
|
| + TestCompletionCallback callback;
|
| + while (true) {
|
| + int rv = trans->Read(buf, kSize, &callback);
|
| + if (rv == ERR_IO_PENDING) {
|
| + // Multiple transactions may be in the data set. Keep pulling off
|
| + // reads until we complete our callback.
|
| + while (!callback.have_result()) {
|
| + data->CompleteRead();
|
| + MessageLoop::current()->RunAllPending();
|
| + }
|
| + rv = callback.WaitForResult();
|
| + } else if (rv <= 0) {
|
| + break;
|
| + }
|
| + result->append(buf->data(), rv);
|
| + bytes_read += rv;
|
| }
|
| + return bytes_read;
|
| + }
|
|
|
| - private:
|
| - scoped_refptr<net::IOBufferWithSize> buffer_;
|
| - std::string& result_;
|
| - bool need_read_callback_;
|
| - };
|
| + void VerifyStreamsClosed(const NormalSpdyTransactionHelper& helper) {
|
| + // This lengthy block is reaching into the pool to dig out the active
|
| + // session. Once we have the session, we verify that the streams are
|
| + // all closed and not leaked at this point.
|
| + const GURL& url = helper.request().url;
|
| + int port = helper.test_type() == SPDYNPN ? 443 : 80;
|
| + HostPortPair host_port_pair(url.host(), port);
|
| + HostPortProxyPair pair(host_port_pair, "DIRECT");
|
| + BoundNetLog log;
|
| + const scoped_refptr<HttpNetworkSession>& session = helper.session();
|
| + scoped_refptr<SpdySessionPool> pool(session->spdy_session_pool());
|
| + EXPECT_TRUE(pool->HasSession(pair));
|
| + scoped_refptr<SpdySession> spdy_session(pool->Get(pair, session, log));
|
| + ASSERT_TRUE(spdy_session.get() != NULL);
|
| + EXPECT_EQ(0u, spdy_session->num_active_streams());
|
| + EXPECT_EQ(0u, spdy_session->num_unclaimed_pushed_streams());
|
| + }
|
|
|
| void RunServerPushTest(MockWrite writes[], int writes_length,
|
| MockRead reads[], int reads_length,
|
| @@ -353,8 +395,6 @@
|
| rv = callback.WaitForResult();
|
|
|
| // Request the pushed path.
|
| - const int kSize = 3000;
|
| - scoped_refptr<net::IOBufferWithSize> buf = new net::IOBufferWithSize(kSize);
|
| scoped_ptr<HttpNetworkTransaction> trans2(
|
| new HttpNetworkTransaction(helper.session()));
|
| rv = trans2->Start(&CreateGetPushRequest(), &callback, BoundNetLog());
|
| @@ -363,37 +403,30 @@
|
|
|
| // The data for the pushed path may be coming in more than 1 packet. Compile
|
| // the results into a single string.
|
| +
|
| + // Read the server push body.
|
| + std::string result2;
|
| + ReadResult(trans2.get(), data, &result2);
|
| + // Read the response body.
|
| std::string result;
|
| - bool need_read_callback = true;
|
| - RunServerPushTestCallback callback2(buf, result, need_read_callback);
|
| - while(!data->at_read_eof())
|
| - {
|
| - if(need_read_callback) {
|
| - while((rv = trans2->Read(buf, kSize, &callback2)) > 0) {
|
| - std::string result1(buf->data(),rv);
|
| - result.append(result1);
|
| - }
|
| - need_read_callback = false;
|
| - }
|
| - else
|
| - data->CompleteRead();
|
| - MessageLoop::current()->RunAllPending();
|
| - }
|
| + ReadResult(trans, data, &result);
|
|
|
| // Verify that we consumed all test data.
|
| EXPECT_TRUE(data->at_read_eof());
|
| EXPECT_TRUE(data->at_write_eof());
|
|
|
| // Verify that the received push data is same as the expected push data.
|
| - EXPECT_EQ(result.compare(expected),0) << "Received data: "
|
| - << result
|
| - << "||||| Expected data: "
|
| - << expected;
|
| + EXPECT_EQ(result2.compare(expected), 0) << "Received data: "
|
| + << result2
|
| + << "||||| Expected data: "
|
| + << expected;
|
|
|
| // Verify the SYN_REPLY.
|
| // Copy the response info, because trans goes away.
|
| *response = *trans->GetResponseInfo();
|
| *response2 = *trans2->GetResponseInfo();
|
| +
|
| + VerifyStreamsClosed(helper);
|
| }
|
|
|
| private:
|
| @@ -1766,7 +1799,7 @@
|
| : public CallbackRunner< Tuple1<int> > {
|
| public:
|
| explicit StartTransactionCallback(
|
| - scoped_refptr<HttpNetworkSession>& session,
|
| + const scoped_refptr<HttpNetworkSession>& session,
|
| NormalSpdyTransactionHelper& helper)
|
| : session_(session), helper_(helper) {}
|
|
|
| @@ -1785,7 +1818,7 @@
|
| }
|
|
|
| private:
|
| - scoped_refptr<HttpNetworkSession>& session_;
|
| + const scoped_refptr<HttpNetworkSession>& session_;
|
| NormalSpdyTransactionHelper& helper_;
|
| };
|
|
|
| @@ -2156,29 +2189,33 @@
|
| TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) {
|
| static const unsigned char kPushBodyFrame[] = {
|
| 0x00, 0x00, 0x00, 0x02, // header, ID
|
| - 0x01, 0x00, 0x00, 0x05, // FIN, length
|
| - 'h', 'e', 'l', 'l', 'o', // "hello"
|
| + 0x01, 0x00, 0x00, 0x06, // FIN, length
|
| + 'p', 'u', 's', 'h', 'e', 'd' // "pushed"
|
| };
|
| -
|
| - scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_body(ConstructSpdyBodyFrame(1, true));
|
| MockWrite writes[] = {
|
| - CreateMockWrite(*req, 1),
|
| + CreateMockWrite(*stream1_syn, 1),
|
| };
|
|
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| - scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
|
| MockRead reads[] = {
|
| - CreateMockRead(*resp, 2),
|
| - CreateMockRead(*rep, 3),
|
| + CreateMockRead(*stream1_reply, 2),
|
| + CreateMockRead(*stream2_syn, 3),
|
| + CreateMockRead(*stream1_body, 4, false),
|
| MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame),
|
| - arraysize(kPushBodyFrame), 4),
|
| - MockRead(true, ERR_IO_PENDING, 5), // Force a pause
|
| - MockRead(true, 0, 0, 6) // EOF
|
| + arraysize(kPushBodyFrame), 5),
|
| + MockRead(true, ERR_IO_PENDING, 6), // Force a pause
|
| };
|
|
|
| HttpResponseInfo response;
|
| HttpResponseInfo response2;
|
| - std::string expected_push_result("hello");
|
| + std::string expected_push_result("pushed");
|
| RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads),
|
| &response, &response2, expected_push_result);
|
|
|
| @@ -2191,27 +2228,88 @@
|
| EXPECT_EQ("HTTP/1.1 200 OK", response2.headers->GetStatusLine());
|
| }
|
|
|
| +TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) {
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_body(ConstructSpdyBodyFrame(1, true));
|
| + MockWrite writes[] = {
|
| + CreateMockWrite(*stream1_syn, 1),
|
| + };
|
| +
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_rst(ConstructSpdyRstStream(2, spdy::PROTOCOL_ERROR));
|
| + MockRead reads[] = {
|
| + CreateMockRead(*stream1_reply, 2),
|
| + CreateMockRead(*stream2_syn, 3),
|
| + CreateMockRead(*stream2_rst, 4),
|
| + CreateMockRead(*stream1_body, 5, false),
|
| + MockRead(true, ERR_IO_PENDING, 6), // Force a pause
|
| + };
|
| +
|
| + scoped_refptr<OrderedSocketData> data(
|
| + new OrderedSocketData(reads, arraysize(reads),
|
| + writes, arraysize(writes)));
|
| + NormalSpdyTransactionHelper helper(CreateGetRequest(),
|
| + BoundNetLog(), GetParam());
|
| +
|
| + helper.RunPreTestSetup();
|
| + helper.AddData(data.get());
|
| +
|
| + HttpNetworkTransaction* trans = helper.trans();
|
| +
|
| + // Start the transaction with basic parameters.
|
| + TestCompletionCallback callback;
|
| + int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + rv = callback.WaitForResult();
|
| + EXPECT_EQ(OK, rv);
|
| +
|
| + // Verify that we consumed all test data.
|
| + EXPECT_TRUE(data->at_read_eof()) << "Read count: "
|
| + << data->read_count()
|
| + << " Read index: "
|
| + << data->read_index();
|
| + EXPECT_TRUE(data->at_write_eof()) << "Write count: "
|
| + << data->write_count()
|
| + << " Write index: "
|
| + << data->write_index();
|
| +
|
| + // Verify the SYN_REPLY.
|
| + HttpResponseInfo response = *trans->GetResponseInfo();
|
| + EXPECT_TRUE(response.headers != NULL);
|
| + EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine());
|
| +}
|
| +
|
| TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) {
|
| static const unsigned char kPushBodyFrame1[] = {
|
| 0x00, 0x00, 0x00, 0x02, // header, ID
|
| - 0x01, 0x00, 0x00, 0x1E, // FIN, length
|
| - 'h', 'e', 'l', 'l', 'o', // "hello"
|
| + 0x01, 0x00, 0x00, 0x1F, // FIN, length
|
| + 'p', 'u', 's', 'h', 'e', 'd' // "pushed"
|
| };
|
| static const char kPushBodyFrame2[] = " my darling";
|
| static const char kPushBodyFrame3[] = " hello";
|
| static const char kPushBodyFrame4[] = " my baby";
|
|
|
| - scoped_ptr<spdy::SpdyFrame> req(
|
| - ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_body(ConstructSpdyBodyFrame(1, true));
|
| MockWrite writes[] = {
|
| - CreateMockWrite(*req, 1),
|
| + CreateMockWrite(*stream1_syn, 1),
|
| };
|
|
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| - scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
|
| MockRead reads[] = {
|
| - CreateMockRead(*resp, 2),
|
| - CreateMockRead(*rep, 3),
|
| + CreateMockRead(*stream1_reply, 2),
|
| + CreateMockRead(*stream2_syn, 3),
|
| MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame1),
|
| arraysize(kPushBodyFrame1), 4),
|
| MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame2),
|
| @@ -2220,13 +2318,13 @@
|
| arraysize(kPushBodyFrame3) - 1, 6),
|
| MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame4),
|
| arraysize(kPushBodyFrame4) - 1, 7),
|
| - MockRead(true, ERR_IO_PENDING, 8), // Force a pause
|
| - MockRead(true, 0, 0, 9) // EOF
|
| + CreateMockRead(*stream1_body, 8, false),
|
| + MockRead(true, ERR_IO_PENDING, 9), // Force a pause
|
| };
|
|
|
| HttpResponseInfo response;
|
| HttpResponseInfo response2;
|
| - std::string expected_push_result("hello my darling hello my baby");
|
| + std::string expected_push_result("pushed my darling hello my baby");
|
| RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads),
|
| &response, &response2, expected_push_result);
|
|
|
| @@ -2242,24 +2340,28 @@
|
| TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
|
| static const unsigned char kPushBodyFrame1[] = {
|
| 0x00, 0x00, 0x00, 0x02, // header, ID
|
| - 0x01, 0x00, 0x00, 0x1E, // FIN, length
|
| - 'h', 'e', 'l', 'l', 'o', // "hello"
|
| + 0x01, 0x00, 0x00, 0x1F, // FIN, length
|
| + 'p', 'u', 's', 'h', 'e', 'd' // "pushed"
|
| };
|
| static const char kPushBodyFrame2[] = " my darling";
|
| static const char kPushBodyFrame3[] = " hello";
|
| static const char kPushBodyFrame4[] = " my baby";
|
|
|
| - scoped_ptr<spdy::SpdyFrame> req(
|
| - ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_body(ConstructSpdyBodyFrame(1, true));
|
| MockWrite writes[] = {
|
| - CreateMockWrite(*req, 1),
|
| + CreateMockWrite(*stream1_syn, 1),
|
| };
|
|
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| - scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1, "/foo.dat"));
|
| MockRead reads[] = {
|
| - CreateMockRead(*resp, 2),
|
| - CreateMockRead(*rep, 3),
|
| + CreateMockRead(*stream1_reply, 2),
|
| + CreateMockRead(*stream2_syn, 3),
|
| MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame1),
|
| arraysize(kPushBodyFrame1), 4),
|
| MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame2),
|
| @@ -2269,12 +2371,13 @@
|
| arraysize(kPushBodyFrame3) - 1, 7),
|
| MockRead(true, reinterpret_cast<const char*>(kPushBodyFrame4),
|
| arraysize(kPushBodyFrame4) - 1, 8),
|
| - MockRead(true, 0, 0, 9) // EOF
|
| + CreateMockRead(*stream1_body.get(), 9, false),
|
| + MockRead(true, ERR_IO_PENDING, 10) // Force a pause.
|
| };
|
|
|
| HttpResponseInfo response;
|
| HttpResponseInfo response2;
|
| - std::string expected_push_result("hello my darling hello my baby");
|
| + std::string expected_push_result("pushed my darling hello my baby");
|
| RunServerPushTest(writes, arraysize(writes), reads, arraysize(reads),
|
| &response, &response2, expected_push_result);
|
|
|
| @@ -2288,20 +2391,26 @@
|
| }
|
|
|
| TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
|
| - scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| - scoped_ptr<spdy::SpdyFrame> res(
|
| - ConstructSpdyRstStream(2, spdy::INVALID_STREAM));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_body(ConstructSpdyBodyFrame(1, true));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_rst(ConstructSpdyRstStream(2, spdy::INVALID_STREAM));
|
| MockWrite writes[] = {
|
| - CreateMockWrite(*req, 1),
|
| - CreateMockWrite(*res, 4),
|
| + CreateMockWrite(*stream1_syn, 1),
|
| + CreateMockWrite(*stream2_rst, 4),
|
| };
|
|
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| - scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 0, "/foo.dat"));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_syn(ConstructSpdyPush(NULL, 0, 2, 0, "/foo.dat"));
|
| MockRead reads[] = {
|
| - CreateMockRead(*resp, 2),
|
| - CreateMockRead(*rep, 3),
|
| - MockRead(true, 0, 0, 5) // EOF
|
| + CreateMockRead(*stream1_reply, 2),
|
| + CreateMockRead(*stream2_syn, 3),
|
| + CreateMockRead(*stream1_body, 4),
|
| + MockRead(true, ERR_IO_PENDING, 5) // Force a pause
|
| };
|
|
|
| scoped_refptr<OrderedSocketData> data(
|
| @@ -2320,7 +2429,6 @@
|
| int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| rv = callback.WaitForResult();
|
| - data->CompleteRead();
|
| EXPECT_EQ(OK, rv);
|
|
|
| // Verify that we consumed all test data.
|
| @@ -2340,20 +2448,26 @@
|
| }
|
|
|
| TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
|
| - scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| - scoped_ptr<spdy::SpdyFrame> res(
|
| - ConstructSpdyRstStream(2, spdy::INVALID_ASSOCIATED_STREAM));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_body(ConstructSpdyBodyFrame(1, true));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_rst(ConstructSpdyRstStream(2, spdy::INVALID_ASSOCIATED_STREAM));
|
| MockWrite writes[] = {
|
| - CreateMockWrite(*req, 1),
|
| - CreateMockWrite(*res, 4),
|
| + CreateMockWrite(*stream1_syn, 1),
|
| + CreateMockWrite(*stream2_rst, 4),
|
| };
|
|
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| - scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 9, "/foo.dat"));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_syn(ConstructSpdyPush(NULL, 0, 2, 9, "/foo.dat"));
|
| MockRead reads[] = {
|
| - CreateMockRead(*resp, 2),
|
| - CreateMockRead(*rep, 3),
|
| - MockRead(true, 0, 0, 5) // EOF
|
| + CreateMockRead(*stream1_reply, 2),
|
| + CreateMockRead(*stream2_syn, 3),
|
| + CreateMockRead(*stream1_body, 4),
|
| + MockRead(true, ERR_IO_PENDING, 5), // Force a pause
|
| };
|
|
|
| scoped_refptr<OrderedSocketData> data(
|
| @@ -2372,7 +2486,6 @@
|
| int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| rv = callback.WaitForResult();
|
| - data->CompleteRead();
|
| EXPECT_EQ(OK, rv);
|
|
|
| // Verify that we consumed all test data.
|
| @@ -2392,20 +2505,26 @@
|
| }
|
|
|
| TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) {
|
| - scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| - scoped_ptr<spdy::SpdyFrame> res(
|
| - ConstructSpdyRstStream(2, spdy::PROTOCOL_ERROR));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_syn(ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_body(ConstructSpdyBodyFrame(1, true));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_rst(ConstructSpdyRstStream(2, spdy::PROTOCOL_ERROR));
|
| MockWrite writes[] = {
|
| - CreateMockWrite(*req, 1),
|
| - CreateMockWrite(*res, 4),
|
| + CreateMockWrite(*stream1_syn, 1),
|
| + CreateMockWrite(*stream2_rst, 4),
|
| };
|
|
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| - scoped_ptr<spdy::SpdyFrame> rep(ConstructSpdyPush(NULL, 0, 2, 1));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream1_reply(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<spdy::SpdyFrame>
|
| + stream2_syn(ConstructSpdyPush(NULL, 0, 2, 1));
|
| MockRead reads[] = {
|
| - CreateMockRead(*resp, 2),
|
| - CreateMockRead(*rep, 3),
|
| - MockRead(true, 0, 0, 5) // EOF
|
| + CreateMockRead(*stream1_reply, 2),
|
| + CreateMockRead(*stream2_syn, 3),
|
| + CreateMockRead(*stream1_body, 4),
|
| + MockRead(true, ERR_IO_PENDING, 5) // Force a pause
|
| };
|
|
|
| scoped_refptr<OrderedSocketData> data(
|
| @@ -2424,7 +2543,6 @@
|
| int rv = trans->Start(&CreateGetRequest(), &callback, BoundNetLog());
|
| EXPECT_EQ(ERR_IO_PENDING, rv);
|
| rv = callback.WaitForResult();
|
| - data->CompleteRead();
|
| EXPECT_EQ(OK, rv);
|
| // Verify that we consumed all test data.
|
| EXPECT_TRUE(data->at_read_eof()) << "Read count: "
|
| @@ -3743,8 +3861,8 @@
|
| BoundNetLog(), GetParam());
|
| helper.session_deps().reset(new SpdySessionDependencies(
|
| net::SpdyCreateFixedProxyService("myproxy:70")));
|
| - helper.session() = SpdySessionDependencies::SpdyCreateSession(
|
| - helper.session_deps().get());
|
| + helper.SetSession(SpdySessionDependencies::SpdyCreateSession(
|
| + helper.session_deps().get()));
|
| helper.RunPreTestSetup();
|
| HttpNetworkTransaction* trans = helper.trans();
|
|
|
| @@ -3970,7 +4088,7 @@
|
| NormalSpdyTransactionHelper helper_proxy(request_proxy,
|
| BoundNetLog(), GetParam());
|
| helper_proxy.session_deps().swap(ssd_proxy);
|
| - helper_proxy.session() = session_proxy;
|
| + helper_proxy.SetSession(session_proxy);
|
| helper_proxy.RunPreTestSetup();
|
| helper_proxy.AddData(data_proxy.get());
|
|
|
|
|