| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "net/http/http_transaction_test_util.h" | 26 #include "net/http/http_transaction_test_util.h" |
| 27 #include "net/socket/client_socket_pool_base.h" | 27 #include "net/socket/client_socket_pool_base.h" |
| 28 #include "net/socket/next_proto.h" | 28 #include "net/socket/next_proto.h" |
| 29 #include "net/spdy/buffered_spdy_framer.h" | 29 #include "net/spdy/buffered_spdy_framer.h" |
| 30 #include "net/spdy/spdy_http_stream.h" | 30 #include "net/spdy/spdy_http_stream.h" |
| 31 #include "net/spdy/spdy_http_utils.h" | 31 #include "net/spdy/spdy_http_utils.h" |
| 32 #include "net/spdy/spdy_session.h" | 32 #include "net/spdy/spdy_session.h" |
| 33 #include "net/spdy/spdy_session_pool.h" | 33 #include "net/spdy/spdy_session_pool.h" |
| 34 #include "net/spdy/spdy_test_util_common.h" | 34 #include "net/spdy/spdy_test_util_common.h" |
| 35 #include "net/spdy/spdy_test_utils.h" | 35 #include "net/spdy/spdy_test_utils.h" |
| 36 #include "net/ssl/ssl_connection_status_flags.h" |
| 36 #include "net/url_request/url_request_test_util.h" | 37 #include "net/url_request/url_request_test_util.h" |
| 37 #include "testing/gmock/include/gmock/gmock.h" | 38 #include "testing/gmock/include/gmock/gmock.h" |
| 38 #include "testing/platform_test.h" | 39 #include "testing/platform_test.h" |
| 39 | 40 |
| 40 //----------------------------------------------------------------------------- | 41 //----------------------------------------------------------------------------- |
| 41 | 42 |
| 42 namespace net { | 43 namespace net { |
| 43 | 44 |
| 44 namespace { | 45 namespace { |
| 45 | 46 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 // Start the transaction, read some data, finish. | 211 // Start the transaction, read some data, finish. |
| 211 void RunDefaultTest() { | 212 void RunDefaultTest() { |
| 212 LOG(INFO) << __FUNCTION__; | 213 LOG(INFO) << __FUNCTION__; |
| 213 if (!StartDefaultTest()) | 214 if (!StartDefaultTest()) |
| 214 return; | 215 return; |
| 215 FinishDefaultTest(); | 216 FinishDefaultTest(); |
| 216 LOG(INFO) << __FUNCTION__; | 217 LOG(INFO) << __FUNCTION__; |
| 217 } | 218 } |
| 218 | 219 |
| 219 bool StartDefaultTest() { | 220 bool StartDefaultTest() { |
| 220 output_.rv = trans_->Start(&request_, callback.callback(), log_); | 221 output_.rv = trans_->Start(&request_, callback_.callback(), log_); |
| 221 | 222 |
| 222 // We expect an IO Pending or some sort of error. | 223 // We expect an IO Pending or some sort of error. |
| 223 EXPECT_LT(output_.rv, 0); | 224 EXPECT_LT(output_.rv, 0); |
| 224 return output_.rv == ERR_IO_PENDING; | 225 return output_.rv == ERR_IO_PENDING; |
| 225 } | 226 } |
| 226 | 227 |
| 227 void FinishDefaultTest() { | 228 void FinishDefaultTest() { |
| 228 output_.rv = callback.WaitForResult(); | 229 output_.rv = callback_.WaitForResult(); |
| 229 if (output_.rv != OK) { | 230 if (output_.rv != OK) { |
| 230 session_->spdy_session_pool()->CloseCurrentSessions(net::ERR_ABORTED); | 231 session_->spdy_session_pool()->CloseCurrentSessions(net::ERR_ABORTED); |
| 231 return; | 232 return; |
| 232 } | 233 } |
| 233 | 234 |
| 234 // Verify responses. | 235 // Verify responses. |
| 235 const HttpResponseInfo* response = trans_->GetResponseInfo(); | 236 const HttpResponseInfo* response = trans_->GetResponseInfo(); |
| 236 ASSERT_TRUE(response != NULL); | 237 ASSERT_TRUE(response != NULL); |
| 237 ASSERT_TRUE(response->headers.get() != NULL); | 238 ASSERT_TRUE(response->headers.get() != NULL); |
| 238 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 239 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 } | 299 } |
| 299 } | 300 } |
| 300 | 301 |
| 301 void RunToCompletion(StaticSocketDataProvider* data) { | 302 void RunToCompletion(StaticSocketDataProvider* data) { |
| 302 RunPreTestSetup(); | 303 RunPreTestSetup(); |
| 303 AddData(data); | 304 AddData(data); |
| 304 RunDefaultTest(); | 305 RunDefaultTest(); |
| 305 VerifyDataConsumed(); | 306 VerifyDataConsumed(); |
| 306 } | 307 } |
| 307 | 308 |
| 309 void RunToCompletionWithSSLData( |
| 310 StaticSocketDataProvider* data, |
| 311 scoped_ptr<SSLSocketDataProvider> ssl_provider) { |
| 312 RunPreTestSetup(); |
| 313 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass()); |
| 314 RunDefaultTest(); |
| 315 VerifyDataConsumed(); |
| 316 } |
| 317 |
| 308 void AddData(StaticSocketDataProvider* data) { | 318 void AddData(StaticSocketDataProvider* data) { |
| 319 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 320 new SSLSocketDataProvider(ASYNC, OK)); |
| 321 AddDataWithSSLSocketDataProvider(data, ssl_provider.Pass()); |
| 322 } |
| 323 |
| 324 void AddDataWithSSLSocketDataProvider( |
| 325 StaticSocketDataProvider* data, |
| 326 scoped_ptr<SSLSocketDataProvider> ssl_provider) { |
| 309 DCHECK(!deterministic_); | 327 DCHECK(!deterministic_); |
| 310 data_vector_.push_back(data); | 328 data_vector_.push_back(data); |
| 311 SSLSocketDataProvider* ssl_provider = | |
| 312 new SSLSocketDataProvider(ASYNC, OK); | |
| 313 if (test_params_.ssl_type == SPDYNPN) | 329 if (test_params_.ssl_type == SPDYNPN) |
| 314 ssl_provider->SetNextProto(test_params_.protocol); | 330 ssl_provider->SetNextProto(test_params_.protocol); |
| 315 | 331 |
| 316 ssl_vector_.push_back(ssl_provider); | 332 if (test_params_.ssl_type == SPDYNPN || |
| 317 if (test_params_.ssl_type == SPDYNPN || test_params_.ssl_type == SPDYSSL) | 333 test_params_.ssl_type == SPDYSSL) { |
| 318 session_deps_->socket_factory->AddSSLSocketDataProvider(ssl_provider); | 334 session_deps_->socket_factory->AddSSLSocketDataProvider( |
| 335 ssl_provider.get()); |
| 336 } |
| 337 ssl_vector_.push_back(ssl_provider.release()); |
| 319 | 338 |
| 320 session_deps_->socket_factory->AddSocketDataProvider(data); | 339 session_deps_->socket_factory->AddSocketDataProvider(data); |
| 321 if (test_params_.ssl_type == SPDYNPN) { | 340 if (test_params_.ssl_type == SPDYNPN) { |
| 322 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); | 341 MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 323 StaticSocketDataProvider* hanging_non_alternate_protocol_socket = | 342 StaticSocketDataProvider* hanging_non_alternate_protocol_socket = |
| 324 new StaticSocketDataProvider(NULL, 0, NULL, 0); | 343 new StaticSocketDataProvider(NULL, 0, NULL, 0); |
| 325 hanging_non_alternate_protocol_socket->set_connect_data( | 344 hanging_non_alternate_protocol_socket->set_connect_data( |
| 326 never_finishing_connect); | 345 never_finishing_connect); |
| 327 session_deps_->socket_factory->AddSocketDataProvider( | 346 session_deps_->socket_factory->AddSocketDataProvider( |
| 328 hanging_non_alternate_protocol_socket); | 347 hanging_non_alternate_protocol_socket); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 typedef ScopedVector<SSLSocketDataProvider> SSLVector; | 400 typedef ScopedVector<SSLSocketDataProvider> SSLVector; |
| 382 typedef ScopedVector<StaticSocketDataProvider> AlternateVector; | 401 typedef ScopedVector<StaticSocketDataProvider> AlternateVector; |
| 383 typedef ScopedVector<DeterministicSocketData> AlternateDeterministicVector; | 402 typedef ScopedVector<DeterministicSocketData> AlternateDeterministicVector; |
| 384 HttpRequestInfo request_; | 403 HttpRequestInfo request_; |
| 385 RequestPriority priority_; | 404 RequestPriority priority_; |
| 386 scoped_ptr<SpdySessionDependencies> session_deps_; | 405 scoped_ptr<SpdySessionDependencies> session_deps_; |
| 387 scoped_refptr<HttpNetworkSession> session_; | 406 scoped_refptr<HttpNetworkSession> session_; |
| 388 TransactionHelperResult output_; | 407 TransactionHelperResult output_; |
| 389 scoped_ptr<StaticSocketDataProvider> first_transaction_; | 408 scoped_ptr<StaticSocketDataProvider> first_transaction_; |
| 390 SSLVector ssl_vector_; | 409 SSLVector ssl_vector_; |
| 391 TestCompletionCallback callback; | 410 TestCompletionCallback callback_; |
| 392 scoped_ptr<HttpNetworkTransaction> trans_; | 411 scoped_ptr<HttpNetworkTransaction> trans_; |
| 393 scoped_ptr<HttpNetworkTransaction> trans_http_; | 412 scoped_ptr<HttpNetworkTransaction> trans_http_; |
| 394 DataVector data_vector_; | 413 DataVector data_vector_; |
| 395 AlternateVector alternate_vector_; | 414 AlternateVector alternate_vector_; |
| 396 AlternateDeterministicVector alternate_deterministic_vector_; | 415 AlternateDeterministicVector alternate_deterministic_vector_; |
| 397 const BoundNetLog& log_; | 416 const BoundNetLog& log_; |
| 398 SpdyNetworkTransactionTestParams test_params_; | 417 SpdyNetworkTransactionTestParams test_params_; |
| 399 int port_; | 418 int port_; |
| 400 bool deterministic_; | 419 bool deterministic_; |
| 401 bool spdy_enabled_; | 420 bool spdy_enabled_; |
| (...skipping 6170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6572 // But the body is not yet fully sent (kUploadData is not yet sent) | 6591 // But the body is not yet fully sent (kUploadData is not yet sent) |
| 6573 // since we're send-stalled. | 6592 // since we're send-stalled. |
| 6574 EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control()); | 6593 EXPECT_TRUE(stream->stream()->send_stalled_by_flow_control()); |
| 6575 | 6594 |
| 6576 // Read in WINDOW_UPDATE or SETTINGS frame. | 6595 // Read in WINDOW_UPDATE or SETTINGS frame. |
| 6577 data.RunFor((GetParam().protocol >= kProtoSPDY31) ? 9 : 8); | 6596 data.RunFor((GetParam().protocol >= kProtoSPDY31) ? 9 : 8); |
| 6578 rv = callback.WaitForResult(); | 6597 rv = callback.WaitForResult(); |
| 6579 helper.VerifyDataConsumed(); | 6598 helper.VerifyDataConsumed(); |
| 6580 } | 6599 } |
| 6581 | 6600 |
| 6601 class SpdyNetworkTransactionNoTLSUsageCheckTest |
| 6602 : public SpdyNetworkTransactionTest { |
| 6603 protected: |
| 6604 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { |
| 6605 // Construct the request. |
| 6606 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyGet( |
| 6607 "https://www.google.com/", false, 1, LOWEST)); |
| 6608 MockWrite writes[] = {CreateMockWrite(*req)}; |
| 6609 |
| 6610 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 6611 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
| 6612 MockRead reads[] = { |
| 6613 CreateMockRead(*resp), CreateMockRead(*body), |
| 6614 MockRead(ASYNC, 0, 0) // EOF |
| 6615 }; |
| 6616 |
| 6617 DelayedSocketData data( |
| 6618 1, reads, arraysize(reads), writes, arraysize(writes)); |
| 6619 HttpRequestInfo request; |
| 6620 request.method = "GET"; |
| 6621 request.url = GURL("https://www.google.com/"); |
| 6622 NormalSpdyTransactionHelper helper( |
| 6623 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); |
| 6624 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); |
| 6625 TransactionHelperResult out = helper.output(); |
| 6626 EXPECT_EQ(OK, out.rv); |
| 6627 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 6628 EXPECT_EQ("hello!", out.response_data); |
| 6629 } |
| 6630 }; |
| 6631 |
| 6632 //----------------------------------------------------------------------------- |
| 6633 // All tests are run with three different connection types: SPDY after NPN |
| 6634 // negotiation, SPDY without SSL, and SPDY with SSL. |
| 6635 // |
| 6636 // TODO(akalin): Use ::testing::Combine() when we are able to use |
| 6637 // <tr1/tuple>. |
| 6638 INSTANTIATE_TEST_CASE_P( |
| 6639 Spdy, |
| 6640 SpdyNetworkTransactionNoTLSUsageCheckTest, |
| 6641 ::testing::Values(SpdyNetworkTransactionTestParams(kProtoDeprecatedSPDY2, |
| 6642 SPDYNPN), |
| 6643 SpdyNetworkTransactionTestParams(kProtoSPDY3, SPDYNPN), |
| 6644 SpdyNetworkTransactionTestParams(kProtoSPDY31, SPDYNPN))); |
| 6645 |
| 6646 TEST_P(SpdyNetworkTransactionNoTLSUsageCheckTest, TLSVersionTooOld) { |
| 6647 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 6648 new SSLSocketDataProvider(ASYNC, OK)); |
| 6649 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3, |
| 6650 &ssl_provider->connection_status); |
| 6651 |
| 6652 RunNoTLSUsageCheckTest(ssl_provider.Pass()); |
| 6653 } |
| 6654 |
| 6655 TEST_P(SpdyNetworkTransactionNoTLSUsageCheckTest, TLSCipherSuiteSucky) { |
| 6656 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 6657 new SSLSocketDataProvider(ASYNC, OK)); |
| 6658 // Set to TLS_RSA_WITH_NULL_MD5 |
| 6659 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); |
| 6660 |
| 6661 RunNoTLSUsageCheckTest(ssl_provider.Pass()); |
| 6662 } |
| 6663 |
| 6664 class SpdyNetworkTransactionTLSUsageCheckTest |
| 6665 : public SpdyNetworkTransactionTest { |
| 6666 protected: |
| 6667 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { |
| 6668 // TODO(willchan): Fix crbug.com/375033 to send GOAWAYs. |
| 6669 // scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway()); |
| 6670 // MockWrite writes[] = { |
| 6671 // CreateMockWrite(*goaway) |
| 6672 // }; |
| 6673 |
| 6674 // DelayedSocketData data(1, NULL, 0, writes, arraysize(writes)); |
| 6675 DelayedSocketData data(1, NULL, 0, NULL, 0); |
| 6676 HttpRequestInfo request; |
| 6677 request.method = "GET"; |
| 6678 request.url = GURL("https://www.google.com/"); |
| 6679 NormalSpdyTransactionHelper helper( |
| 6680 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); |
| 6681 helper.RunToCompletionWithSSLData(&data, ssl_provider.Pass()); |
| 6682 TransactionHelperResult out = helper.output(); |
| 6683 EXPECT_EQ(ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, out.rv); |
| 6684 } |
| 6685 }; |
| 6686 |
| 6687 INSTANTIATE_TEST_CASE_P( |
| 6688 Spdy, |
| 6689 SpdyNetworkTransactionTLSUsageCheckTest, |
| 6690 ::testing::Values(SpdyNetworkTransactionTestParams(kProtoSPDY4, SPDYNPN))); |
| 6691 |
| 6692 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSVersionTooOld) { |
| 6693 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 6694 new SSLSocketDataProvider(ASYNC, OK)); |
| 6695 SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_SSL3, |
| 6696 &ssl_provider->connection_status); |
| 6697 |
| 6698 RunTLSUsageCheckTest(ssl_provider.Pass()); |
| 6699 } |
| 6700 |
| 6701 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { |
| 6702 scoped_ptr<SSLSocketDataProvider> ssl_provider( |
| 6703 new SSLSocketDataProvider(ASYNC, OK)); |
| 6704 // Set to TLS_RSA_WITH_NULL_MD5 |
| 6705 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); |
| 6706 |
| 6707 RunTLSUsageCheckTest(ssl_provider.Pass()); |
| 6708 } |
| 6709 |
| 6582 } // namespace net | 6710 } // namespace net |
| OLD | NEW |