| Index: net/spdy/spdy_network_transaction_unittest.cc
|
| diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
|
| index acfb7eaa246a60beea6dfc62209d93a87a358bcd..9f4e1fef7501b18bcad1071ae90105f16eda0a59 100644
|
| --- a/net/spdy/spdy_network_transaction_unittest.cc
|
| +++ b/net/spdy/spdy_network_transaction_unittest.cc
|
| @@ -11,6 +11,7 @@
|
| #include "net/base/net_log_unittest.h"
|
| #include "net/http/http_network_session_peer.h"
|
| #include "net/http/http_transaction_unittest.h"
|
| +#include "net/socket/client_socket_pool_base.h"
|
| #include "net/spdy/spdy_http_stream.h"
|
| #include "net/spdy/spdy_http_utils.h"
|
| #include "net/spdy/spdy_session.h"
|
| @@ -35,17 +36,25 @@ enum SpdyNetworkTransactionTestTypes {
|
| class SpdyNetworkTransactionTest
|
| : public ::testing::TestWithParam<SpdyNetworkTransactionTestTypes> {
|
| protected:
|
| +
|
| virtual void SetUp() {
|
| // By default, all tests turn off compression.
|
| EnableCompression(false);
|
| google_get_request_initialized_ = false;
|
| google_post_request_initialized_ = false;
|
| google_chunked_post_request_initialized_ = false;
|
| +
|
| + backup_jobs_prev_value_ =
|
| + internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled();
|
| + internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
|
| + false);
|
| }
|
|
|
| virtual void TearDown() {
|
| // Empty the current queue.
|
| MessageLoop::current()->RunAllPending();
|
| + internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
|
| + backup_jobs_prev_value_);
|
| }
|
|
|
| struct TransactionHelperResult {
|
| @@ -167,10 +176,8 @@ class SpdyNetworkTransactionTest
|
| EXPECT_EQ(spdy_enabled_, response->was_fetched_via_spdy);
|
| if (test_type_ == SPDYNPN && spdy_enabled_) {
|
| EXPECT_TRUE(response->was_npn_negotiated);
|
| - EXPECT_TRUE(response->was_alternate_protocol_available);
|
| } else {
|
| EXPECT_TRUE(!response->was_npn_negotiated);
|
| - EXPECT_TRUE(!response->was_alternate_protocol_available);
|
| }
|
| // If SPDY is not enabled, a HTTP request should not be diverted
|
| // over a SSL session.
|
| @@ -237,9 +244,20 @@ class SpdyNetworkTransactionTest
|
| ssl_->was_npn_negotiated = true;
|
| }
|
| ssl_vector_.push_back(ssl_);
|
| - if(test_type_ == SPDYNPN || test_type_ == SPDYSSL)
|
| + if (test_type_ == SPDYNPN || test_type_ == SPDYSSL)
|
| session_deps_->socket_factory->AddSSLSocketDataProvider(ssl_.get());
|
| session_deps_->socket_factory->AddSocketDataProvider(data);
|
| + if (test_type_ == SPDYNPN) {
|
| + MockConnect never_finishing_connect(false, ERR_IO_PENDING);
|
| + linked_ptr<StaticSocketDataProvider>
|
| + hanging_non_alternate_protocol_socket(
|
| + new StaticSocketDataProvider(NULL, 0, NULL, 0));
|
| + hanging_non_alternate_protocol_socket->set_connect_data(
|
| + never_finishing_connect);
|
| + session_deps_->socket_factory->AddSocketDataProvider(
|
| + hanging_non_alternate_protocol_socket.get());
|
| + alternate_vector_.push_back(hanging_non_alternate_protocol_socket);
|
| + }
|
| }
|
|
|
| void AddDeterministicData(DeterministicSocketData* data) {
|
| @@ -253,10 +271,23 @@ class SpdyNetworkTransactionTest
|
| ssl_->was_npn_negotiated = true;
|
| }
|
| ssl_vector_.push_back(ssl_);
|
| - if(test_type_ == SPDYNPN || test_type_ == SPDYSSL)
|
| + if (test_type_ == SPDYNPN || test_type_ == SPDYSSL) {
|
| session_deps_->deterministic_socket_factory->
|
| AddSSLSocketDataProvider(ssl_.get());
|
| + }
|
| session_deps_->deterministic_socket_factory->AddSocketDataProvider(data);
|
| + if (test_type_ == SPDYNPN) {
|
| + MockConnect never_finishing_connect(false, ERR_IO_PENDING);
|
| + scoped_refptr<DeterministicSocketData>
|
| + hanging_non_alternate_protocol_socket(
|
| + new DeterministicSocketData(NULL, 0, NULL, 0));
|
| + hanging_non_alternate_protocol_socket->set_connect_data(
|
| + never_finishing_connect);
|
| + session_deps_->deterministic_socket_factory->AddSocketDataProvider(
|
| + hanging_non_alternate_protocol_socket);
|
| + alternate_deterministic_vector_.push_back(
|
| + hanging_non_alternate_protocol_socket);
|
| + }
|
| }
|
|
|
| // This can only be called after RunPreTestSetup. It adds a Data Provider,
|
| @@ -289,6 +320,9 @@ class SpdyNetworkTransactionTest
|
| private:
|
| typedef std::vector<StaticSocketDataProvider*> DataVector;
|
| typedef std::vector<linked_ptr<SSLSocketDataProvider> > SSLVector;
|
| + typedef std::vector<linked_ptr<StaticSocketDataProvider> > AlternateVector;
|
| + typedef std::vector<scoped_refptr<DeterministicSocketData> >
|
| + AlternateDeterministicVector;
|
| HttpRequestInfo request_;
|
| scoped_ptr<SpdySessionDependencies> session_deps_;
|
| scoped_refptr<HttpNetworkSession> session_;
|
| @@ -299,6 +333,8 @@ class SpdyNetworkTransactionTest
|
| scoped_ptr<HttpNetworkTransaction> trans_;
|
| scoped_ptr<HttpNetworkTransaction> trans_http_;
|
| DataVector data_vector_;
|
| + AlternateVector alternate_vector_;
|
| + AlternateDeterministicVector alternate_deterministic_vector_;
|
| const BoundNetLog& log_;
|
| SpdyNetworkTransactionTestTypes test_type_;
|
| int port_;
|
| @@ -475,6 +511,8 @@ class SpdyNetworkTransactionTest
|
| HttpRequestInfo google_post_request_;
|
| HttpRequestInfo google_chunked_post_request_;
|
| HttpRequestInfo google_get_push_request_;
|
| +
|
| + bool backup_jobs_prev_value_;
|
| };
|
|
|
| //-----------------------------------------------------------------------------
|
| @@ -704,7 +742,7 @@ TEST_P(SpdyNetworkTransactionTest, TwoGetsLateBinding) {
|
| new OrderedSocketData(reads, arraysize(reads),
|
| writes, arraysize(writes)));
|
|
|
| - MockConnect never_finishing_connect(true, ERR_IO_PENDING);
|
| + MockConnect never_finishing_connect(false, ERR_IO_PENDING);
|
|
|
| scoped_refptr<OrderedSocketData> data_placeholder(
|
| new OrderedSocketData(NULL, 0, NULL, 0));
|
| @@ -893,10 +931,12 @@ TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) {
|
| settings.push_back(spdy::SpdySetting(id, max_concurrent_streams));
|
| scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings));
|
|
|
| - MockWrite writes[] = { CreateMockWrite(*req),
|
| - CreateMockWrite(*req2),
|
| - CreateMockWrite(*req3),
|
| + MockWrite writes[] = {
|
| + CreateMockWrite(*req),
|
| + CreateMockWrite(*req2),
|
| + CreateMockWrite(*req3),
|
| };
|
| +
|
| MockRead reads[] = {
|
| CreateMockRead(*settings_frame, 1),
|
| CreateMockRead(*resp),
|
| @@ -921,14 +961,14 @@ TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) {
|
| BoundNetLog log;
|
| TransactionHelperResult out;
|
| {
|
| - NormalSpdyTransactionHelper helper(CreateGetRequest(),
|
| - BoundNetLog(), GetParam());
|
| - helper.RunPreTestSetup();
|
| - helper.AddData(data.get());
|
| - // We require placeholder data because three get requests are sent out, so
|
| - // there needs to be three sets of SSL connection data.
|
| - helper.AddData(data_placeholder.get());
|
| - helper.AddData(data_placeholder.get());
|
| + NormalSpdyTransactionHelper helper(CreateGetRequest(),
|
| + BoundNetLog(), GetParam());
|
| + helper.RunPreTestSetup();
|
| + helper.AddData(data.get());
|
| + // We require placeholder data because three get requests are sent out, so
|
| + // there needs to be three sets of SSL connection data.
|
| + helper.AddData(data_placeholder.get());
|
| + helper.AddData(data_placeholder.get());
|
| scoped_ptr<HttpNetworkTransaction> trans1(
|
| new HttpNetworkTransaction(helper.session()));
|
| scoped_ptr<HttpNetworkTransaction> trans2(
|
| @@ -1716,7 +1756,7 @@ TEST_P(SpdyNetworkTransactionTest, SocketWriteReturnsZero) {
|
|
|
| scoped_refptr<DeterministicSocketData> data(
|
| new DeterministicSocketData(reads, arraysize(reads),
|
| - writes, arraysize(writes)));
|
| + writes, arraysize(writes)));
|
| NormalSpdyTransactionHelper helper(CreateGetRequest(),
|
| BoundNetLog(), GetParam());
|
| helper.SetDeterministic();
|
| @@ -3807,80 +3847,6 @@ TEST_P(SpdyNetworkTransactionTest, BufferFull) {
|
| EXPECT_EQ("goodbye world", out.response_data);
|
| }
|
|
|
| -TEST_P(SpdyNetworkTransactionTest, ConnectFailureFallbackToHttp) {
|
| - MockConnect connects[] = {
|
| - MockConnect(true, ERR_NAME_NOT_RESOLVED),
|
| - MockConnect(false, ERR_NAME_NOT_RESOLVED),
|
| - MockConnect(true, ERR_INTERNET_DISCONNECTED),
|
| - MockConnect(false, ERR_INTERNET_DISCONNECTED)
|
| - };
|
| -
|
| - for (size_t index = 0; index < arraysize(connects); ++index) {
|
| - scoped_ptr<spdy::SpdyFrame> req(
|
| - ConstructSpdyGet(NULL, 0, false, 1, LOWEST));
|
| - MockWrite writes[] = {
|
| - CreateMockWrite(*req),
|
| - MockWrite(true, 0, 0) // EOF
|
| - };
|
| -
|
| - scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1));
|
| - scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true));
|
| - MockRead reads[] = {
|
| - CreateMockRead(*resp),
|
| - CreateMockRead(*body),
|
| - MockRead(true, 0, 0) // EOF
|
| - };
|
| -
|
| - scoped_refptr<DelayedSocketData> data(
|
| - new DelayedSocketData(connects[index], 1, reads, arraysize(reads),
|
| - writes, arraysize(writes)));
|
| - NormalSpdyTransactionHelper helper(CreateGetRequest(),
|
| - BoundNetLog(), GetParam());
|
| - helper.RunPreTestSetup();
|
| - helper.AddData(data.get());
|
| -
|
| - // Set up http fallback data.
|
| - MockRead http_fallback_data[] = {
|
| - MockRead("HTTP/1.1 200 OK\r\n\r\n"),
|
| - MockRead("hello world!!!"),
|
| - MockRead(true, OK),
|
| - };
|
| -
|
| - scoped_ptr<StaticSocketDataProvider> http_fallback(
|
| - new StaticSocketDataProvider(http_fallback_data,
|
| - arraysize(http_fallback_data),
|
| - NULL, 0));
|
| - helper.AddDataNoSSL(http_fallback.get());
|
| - HttpNetworkTransaction* trans = helper.trans();
|
| - TestCompletionCallback callback;
|
| -
|
| - int rv = trans->Start(&helper.request(), &callback, BoundNetLog());
|
| - EXPECT_EQ(rv, ERR_IO_PENDING);
|
| - rv = callback.WaitForResult();
|
| - const HttpResponseInfo* response = trans->GetResponseInfo();
|
| - if (GetParam() == SPDYNOSSL || GetParam() == SPDYSSL) {
|
| - ASSERT_TRUE(response == NULL);
|
| - return;
|
| - }
|
| - if (GetParam() != SPDYNPN)
|
| - NOTREACHED();
|
| - ASSERT_TRUE(response != NULL);
|
| - ASSERT_TRUE(response->headers != NULL);
|
| - EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
|
| - std::string response_data;
|
| - rv = ReadTransaction(trans, &response_data);
|
| - EXPECT_EQ(OK, rv);
|
| -
|
| - EXPECT_TRUE(!response->was_fetched_via_spdy);
|
| - EXPECT_TRUE(!response->was_npn_negotiated);
|
| - EXPECT_TRUE(response->was_alternate_protocol_available);
|
| - EXPECT_TRUE(http_fallback->at_read_eof());
|
| - EXPECT_EQ(0u, data->read_index());
|
| - EXPECT_EQ(0u, data->write_index());
|
| - EXPECT_EQ("hello world!!!", response_data);
|
| - }
|
| -}
|
| -
|
| // Verify that basic buffering works; when multiple data frames arrive
|
| // at the same time, ensure that we don't notify a read completion for
|
| // each data frame individually.
|
|
|