| 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 b937655a023133c3a18b96abb33e25684dab2de4..1ecbc3993993aa6b081d3ab0aad6700dddcd0aa8 100644
|
| --- a/net/spdy/spdy_network_transaction_unittest.cc
|
| +++ b/net/spdy/spdy_network_transaction_unittest.cc
|
| @@ -33,6 +33,7 @@
|
| #include "net/spdy/spdy_session_pool.h"
|
| #include "net/spdy/spdy_test_util_common.h"
|
| #include "net/spdy/spdy_test_utils.h"
|
| +#include "net/ssl/ssl_connection_status_flags.h"
|
| #include "net/url_request/url_request_test_util.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/platform_test.h"
|
| @@ -217,7 +218,7 @@ class SpdyNetworkTransactionTest
|
| }
|
|
|
| bool StartDefaultTest() {
|
| - output_.rv = trans_->Start(&request_, callback.callback(), log_);
|
| + output_.rv = trans_->Start(&request_, callback_.callback(), log_);
|
|
|
| // We expect an IO Pending or some sort of error.
|
| EXPECT_LT(output_.rv, 0);
|
| @@ -225,7 +226,7 @@ class SpdyNetworkTransactionTest
|
| }
|
|
|
| void FinishDefaultTest() {
|
| - output_.rv = callback.WaitForResult();
|
| + output_.rv = callback_.WaitForResult();
|
| if (output_.rv != OK) {
|
| session_->spdy_session_pool()->CloseCurrentSessions(net::ERR_ABORTED);
|
| return;
|
| @@ -305,17 +306,35 @@ class SpdyNetworkTransactionTest
|
| VerifyDataConsumed();
|
| }
|
|
|
| + void RunToCompletionWithSSLData(
|
| + StaticSocketDataProvider* data,
|
| + scoped_ptr<SSLSocketDataProvider> ssl_provider) {
|
| + RunPreTestSetup();
|
| + AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass());
|
| + RunDefaultTest();
|
| + VerifyDataConsumed();
|
| + }
|
| +
|
| void AddData(StaticSocketDataProvider* data) {
|
| + scoped_ptr<SSLSocketDataProvider> ssl_provider(
|
| + new SSLSocketDataProvider(ASYNC, OK));
|
| + AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass());
|
| + }
|
| +
|
| + void AddDataWithSSLSocketDataProvider(
|
| + StaticSocketDataProvider* data,
|
| + scoped_ptr<SSLSocketDataProvider> ssl_provider) {
|
| DCHECK(!deterministic_);
|
| data_vector_.push_back(data);
|
| - SSLSocketDataProvider* ssl_provider =
|
| - new SSLSocketDataProvider(ASYNC, OK);
|
| if (test_params_.ssl_type == SPDYNPN)
|
| ssl_provider->SetNextProto(test_params_.protocol);
|
|
|
| - ssl_vector_.push_back(ssl_provider);
|
| - if (test_params_.ssl_type == SPDYNPN || test_params_.ssl_type == SPDYSSL)
|
| - session_deps_->socket_factory->AddSSLSocketDataProvider(ssl_provider);
|
| + if (test_params_.ssl_type == SPDYNPN ||
|
| + test_params_.ssl_type == SPDYSSL) {
|
| + session_deps_->socket_factory->AddSSLSocketDataProvider(
|
| + ssl_provider.get());
|
| + }
|
| + ssl_vector_.push_back(ssl_provider.release());
|
|
|
| session_deps_->socket_factory->AddSocketDataProvider(data);
|
| if (test_params_.ssl_type == SPDYNPN) {
|
| @@ -388,7 +407,7 @@ class SpdyNetworkTransactionTest
|
| TransactionHelperResult output_;
|
| scoped_ptr<StaticSocketDataProvider> first_transaction_;
|
| SSLVector ssl_vector_;
|
| - TestCompletionCallback callback;
|
| + TestCompletionCallback callback_;
|
| scoped_ptr<HttpNetworkTransaction> trans_;
|
| scoped_ptr<HttpNetworkTransaction> trans_http_;
|
| DataVector data_vector_;
|
| @@ -6579,4 +6598,113 @@ TEST_P(SpdyNetworkTransactionTest, FlowControlNegativeSendWindowSize) {
|
| helper.VerifyDataConsumed();
|
| }
|
|
|
| +class SpdyNetworkTransactionNoTLSUsageCheckTest
|
| + : public SpdyNetworkTransactionTest {
|
| + protected:
|
| + void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
|
| + // Construct the request.
|
| + scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyGet(
|
| + "https://www.google.com/", false, 1, LOWEST));
|
| + MockWrite writes[] = {CreateMockWrite(*req)};
|
| +
|
| + scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
|
| + scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true));
|
| + MockRead reads[] = {
|
| + CreateMockRead(*resp), CreateMockRead(*body),
|
| + MockRead(ASYNC, 0, 0) // EOF
|
| + };
|
| +
|
| + DelayedSocketData data(
|
| + 1, reads, arraysize(reads), writes, arraysize(writes));
|
| + HttpRequestInfo request;
|
| + request.method = "GET";
|
| + request.url = GURL("https://www.google.com/");
|
| + NormalSpdyTransactionHelper helper(
|
| + request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
|
| + helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass());
|
| + TransactionHelperResult out = helper.output();
|
| + EXPECT_EQ(OK, out.rv);
|
| + EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
|
| + EXPECT_EQ("hello!", out.response_data);
|
| + }
|
| +};
|
| +
|
| +//-----------------------------------------------------------------------------
|
| +// All tests are run with three different connection types: SPDY after NPN
|
| +// negotiation, SPDY without SSL, and SPDY with SSL.
|
| +//
|
| +// TODO(akalin): Use ::testing::Combine() when we are able to use
|
| +// <tr1/tuple>.
|
| +INSTANTIATE_TEST_CASE_P(
|
| + Spdy,
|
| + SpdyNetworkTransactionNoTLSUsageCheckTest,
|
| + ::testing::Values(SpdyNetworkTransactionTestParams(kProtoDeprecatedSPDY2,
|
| + SPDYNPN),
|
| + SpdyNetworkTransactionTestParams(kProtoSPDY3, SPDYNPN),
|
| + SpdyNetworkTransactionTestParams(kProtoSPDY31, SPDYNPN)));
|
| +
|
| +TEST_P(SpdyNetworkTransactionNoTLSUsageCheckTest, TLSVersionTooOld) {
|
| + scoped_ptr<SSLSocketDataProvider> ssl_provider(
|
| + new SSLSocketDataProvider(ASYNC, OK));
|
| + SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3,
|
| + &ssl_provider->connection_status);
|
| +
|
| + RunNoTLSUsageCheckTest(ssl_provider.Pass());
|
| +}
|
| +
|
| +TEST_P(SpdyNetworkTransactionNoTLSUsageCheckTest, TLSCipherSuiteSucky) {
|
| + scoped_ptr<SSLSocketDataProvider> ssl_provider(
|
| + new SSLSocketDataProvider(ASYNC, OK));
|
| + // Set to TLS_RSA_WITH_NULL_MD5
|
| + SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
|
| +
|
| + RunNoTLSUsageCheckTest(ssl_provider.Pass());
|
| +}
|
| +
|
| +class SpdyNetworkTransactionTLSUsageCheckTest
|
| + : public SpdyNetworkTransactionTest {
|
| + protected:
|
| + void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
|
| + // TODO(willchan): Fix crbug.com/375033 to send GOAWAYs.
|
| + // scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway());
|
| + // MockWrite writes[] = {
|
| + // CreateMockWrite(*goaway)
|
| + // };
|
| +
|
| + // DelayedSocketData data(1, NULL, 0, writes, arraysize(writes));
|
| + DelayedSocketData data(1, NULL, 0, NULL, 0);
|
| + HttpRequestInfo request;
|
| + request.method = "GET";
|
| + request.url = GURL("https://www.google.com/");
|
| + NormalSpdyTransactionHelper helper(
|
| + request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
|
| + helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass());
|
| + TransactionHelperResult out = helper.output();
|
| + EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv);
|
| + }
|
| +};
|
| +
|
| +INSTANTIATE_TEST_CASE_P(
|
| + Spdy,
|
| + SpdyNetworkTransactionTLSUsageCheckTest,
|
| + ::testing::Values(SpdyNetworkTransactionTestParams(kProtoSPDY4, SPDYNPN)));
|
| +
|
| +TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSVersionTooOld) {
|
| + scoped_ptr<SSLSocketDataProvider> ssl_provider(
|
| + new SSLSocketDataProvider(ASYNC, OK));
|
| + SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3,
|
| + &ssl_provider->connection_status);
|
| +
|
| + RunTLSUsageCheckTest(ssl_provider.Pass());
|
| +}
|
| +
|
| +TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) {
|
| + scoped_ptr<SSLSocketDataProvider> ssl_provider(
|
| + new SSLSocketDataProvider(ASYNC, OK));
|
| + // Set to TLS_RSA_WITH_NULL_MD5
|
| + SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
|
| +
|
| + RunTLSUsageCheckTest(ssl_provider.Pass());
|
| +}
|
| +
|
| } // namespace net
|
|
|