| 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 "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 enum SpdyNetworkTransactionSpdy2TestTypes { | 32 enum SpdyNetworkTransactionSpdy2TestTypes { |
| 33 SPDYNPN, | 33 SPDYNPN, |
| 34 SPDYNOSSL, | 34 SPDYNOSSL, |
| 35 SPDYSSL, | 35 SPDYSSL, |
| 36 }; | 36 }; |
| 37 class SpdyNetworkTransactionSpdy2Test | 37 class SpdyNetworkTransactionSpdy2Test |
| 38 : public ::testing::TestWithParam<SpdyNetworkTransactionSpdy2TestTypes> { | 38 : public ::testing::TestWithParam<SpdyNetworkTransactionSpdy2TestTypes> { |
| 39 protected: | 39 protected: |
| 40 | 40 |
| 41 virtual void SetUp() { | 41 virtual void SetUp() { |
| 42 // By default, all tests turn off compression. | |
| 43 EnableCompression(false); | |
| 44 SpdySession::set_default_protocol(SSLClientSocket::kProtoSPDY2); | 42 SpdySession::set_default_protocol(SSLClientSocket::kProtoSPDY2); |
| 45 google_get_request_initialized_ = false; | 43 google_get_request_initialized_ = false; |
| 46 google_post_request_initialized_ = false; | 44 google_post_request_initialized_ = false; |
| 47 google_chunked_post_request_initialized_ = false; | 45 google_chunked_post_request_initialized_ = false; |
| 48 } | 46 } |
| 49 | 47 |
| 50 virtual void TearDown() { | 48 virtual void TearDown() { |
| 51 // Empty the current queue. | 49 // Empty the current queue. |
| 52 MessageLoop::current()->RunAllPending(); | 50 MessageLoop::current()->RunAllPending(); |
| 53 } | 51 } |
| 54 | 52 |
| 55 struct TransactionHelperResult { | 53 struct TransactionHelperResult { |
| 56 int rv; | 54 int rv; |
| 57 std::string status_line; | 55 std::string status_line; |
| 58 std::string response_data; | 56 std::string response_data; |
| 59 HttpResponseInfo response_info; | 57 HttpResponseInfo response_info; |
| 60 }; | 58 }; |
| 61 | 59 |
| 62 void EnableCompression(bool enabled) { | |
| 63 spdy::SpdyFramer::set_enable_compression_default(enabled); | |
| 64 } | |
| 65 | |
| 66 // A helper class that handles all the initial npn/ssl setup. | 60 // A helper class that handles all the initial npn/ssl setup. |
| 67 class NormalSpdyTransactionHelper { | 61 class NormalSpdyTransactionHelper { |
| 68 public: | 62 public: |
| 69 NormalSpdyTransactionHelper(const HttpRequestInfo& request, | 63 NormalSpdyTransactionHelper(const HttpRequestInfo& request, |
| 70 const BoundNetLog& log, | 64 const BoundNetLog& log, |
| 71 SpdyNetworkTransactionSpdy2TestTypes test_type) | 65 SpdyNetworkTransactionSpdy2TestTypes test_type) |
| 72 : request_(request), | 66 : request_(request), |
| 73 session_deps_(new SpdySessionDependencies()), | 67 session_deps_(new SpdySessionDependencies()), |
| 74 session_(SpdySessionDependencies::SpdyCreateSession( | 68 session_(SpdySessionDependencies::SpdyCreateSession( |
| 75 session_deps_.get())), | 69 session_deps_.get())), |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 } | 516 } |
| 523 | 517 |
| 524 private: | 518 private: |
| 525 bool google_get_request_initialized_; | 519 bool google_get_request_initialized_; |
| 526 bool google_post_request_initialized_; | 520 bool google_post_request_initialized_; |
| 527 bool google_chunked_post_request_initialized_; | 521 bool google_chunked_post_request_initialized_; |
| 528 HttpRequestInfo google_get_request_; | 522 HttpRequestInfo google_get_request_; |
| 529 HttpRequestInfo google_post_request_; | 523 HttpRequestInfo google_post_request_; |
| 530 HttpRequestInfo google_chunked_post_request_; | 524 HttpRequestInfo google_chunked_post_request_; |
| 531 HttpRequestInfo google_get_push_request_; | 525 HttpRequestInfo google_get_push_request_; |
| 526 SpdyTestStateHelper spdy_state_; |
| 532 }; | 527 }; |
| 533 | 528 |
| 534 //----------------------------------------------------------------------------- | 529 //----------------------------------------------------------------------------- |
| 535 // All tests are run with three different connection types: SPDY after NPN | 530 // All tests are run with three different connection types: SPDY after NPN |
| 536 // negotiation, SPDY without SSL, and SPDY with SSL. | 531 // negotiation, SPDY without SSL, and SPDY with SSL. |
| 537 INSTANTIATE_TEST_CASE_P(Spdy, | 532 INSTANTIATE_TEST_CASE_P(Spdy, |
| 538 SpdyNetworkTransactionSpdy2Test, | 533 SpdyNetworkTransactionSpdy2Test, |
| 539 ::testing::Values(SPDYNOSSL, SPDYSSL, SPDYNPN)); | 534 ::testing::Values(SPDYNOSSL, SPDYSSL, SPDYNPN)); |
| 540 | 535 |
| 541 | 536 |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1048 } | 1043 } |
| 1049 EXPECT_EQ(OK, out.rv); | 1044 EXPECT_EQ(OK, out.rv); |
| 1050 } | 1045 } |
| 1051 | 1046 |
| 1052 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds | 1047 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds |
| 1053 // a fourth transaction. The third and fourth transactions have | 1048 // a fourth transaction. The third and fourth transactions have |
| 1054 // different data ("hello!" vs "hello!hello!") and because of the | 1049 // different data ("hello!" vs "hello!hello!") and because of the |
| 1055 // user specified priority, we expect to see them inverted in | 1050 // user specified priority, we expect to see them inverted in |
| 1056 // the response from the server. | 1051 // the response from the server. |
| 1057 TEST_P(SpdyNetworkTransactionSpdy2Test, FourGetsWithMaxConcurrentPriority) { | 1052 TEST_P(SpdyNetworkTransactionSpdy2Test, FourGetsWithMaxConcurrentPriority) { |
| 1058 SpdySession::set_enable_ping_based_connection_checking(false); | |
| 1059 | |
| 1060 // Construct the request. | 1053 // Construct the request. |
| 1061 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 1054 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 1062 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | 1055 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 1063 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false)); | 1056 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false)); |
| 1064 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true)); | 1057 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true)); |
| 1065 | 1058 |
| 1066 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST)); | 1059 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST)); |
| 1067 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); | 1060 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 1068 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false)); | 1061 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false)); |
| 1069 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true)); | 1062 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true)); |
| (...skipping 2367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3437 TransactionHelperResult out = helper.output(); | 3430 TransactionHelperResult out = helper.output(); |
| 3438 EXPECT_EQ(OK, out.rv); | 3431 EXPECT_EQ(OK, out.rv); |
| 3439 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 3432 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 3440 EXPECT_EQ("hello!", out.response_data); | 3433 EXPECT_EQ("hello!", out.response_data); |
| 3441 } | 3434 } |
| 3442 | 3435 |
| 3443 // In this test, we enable compression, but get a uncompressed SynReply from | 3436 // In this test, we enable compression, but get a uncompressed SynReply from |
| 3444 // the server. Verify that teardown is all clean. | 3437 // the server. Verify that teardown is all clean. |
| 3445 TEST_P(SpdyNetworkTransactionSpdy2Test, DecompressFailureOnSynReply) { | 3438 TEST_P(SpdyNetworkTransactionSpdy2Test, DecompressFailureOnSynReply) { |
| 3446 // For this test, we turn on the normal compression. | 3439 // For this test, we turn on the normal compression. |
| 3447 EnableCompression(true); | 3440 spdy::SpdyFramer::set_enable_compression_default(true); |
| 3448 | 3441 |
| 3449 scoped_ptr<spdy::SpdyFrame> compressed( | 3442 scoped_ptr<spdy::SpdyFrame> compressed( |
| 3450 ConstructSpdyGet(NULL, 0, true, 1, LOWEST)); | 3443 ConstructSpdyGet(NULL, 0, true, 1, LOWEST)); |
| 3451 scoped_ptr<spdy::SpdyFrame> rst( | 3444 scoped_ptr<spdy::SpdyFrame> rst( |
| 3452 ConstructSpdyRstStream(1, spdy::PROTOCOL_ERROR)); | 3445 ConstructSpdyRstStream(1, spdy::PROTOCOL_ERROR)); |
| 3453 MockWrite writes[] = { | 3446 MockWrite writes[] = { |
| 3454 CreateMockWrite(*compressed), | 3447 CreateMockWrite(*compressed), |
| 3455 }; | 3448 }; |
| 3456 | 3449 |
| 3457 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | 3450 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 3458 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); | 3451 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
| 3459 MockRead reads[] = { | 3452 MockRead reads[] = { |
| 3460 CreateMockRead(*resp), | 3453 CreateMockRead(*resp), |
| 3461 }; | 3454 }; |
| 3462 | 3455 |
| 3463 scoped_ptr<DelayedSocketData> data( | 3456 scoped_ptr<DelayedSocketData> data( |
| 3464 new DelayedSocketData(1, reads, arraysize(reads), | 3457 new DelayedSocketData(1, reads, arraysize(reads), |
| 3465 writes, arraysize(writes))); | 3458 writes, arraysize(writes))); |
| 3466 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 3459 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
| 3467 BoundNetLog(), GetParam()); | 3460 BoundNetLog(), GetParam()); |
| 3468 helper.RunToCompletion(data.get()); | 3461 helper.RunToCompletion(data.get()); |
| 3469 TransactionHelperResult out = helper.output(); | 3462 TransactionHelperResult out = helper.output(); |
| 3470 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); | 3463 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); |
| 3471 data->Reset(); | 3464 data->Reset(); |
| 3472 | |
| 3473 EnableCompression(false); | |
| 3474 } | 3465 } |
| 3475 | 3466 |
| 3476 // Test that the NetLog contains good data for a simple GET request. | 3467 // Test that the NetLog contains good data for a simple GET request. |
| 3477 TEST_P(SpdyNetworkTransactionSpdy2Test, NetLog) { | 3468 TEST_P(SpdyNetworkTransactionSpdy2Test, NetLog) { |
| 3478 static const char* const kExtraHeaders[] = { | 3469 static const char* const kExtraHeaders[] = { |
| 3479 "user-agent", "Chrome", | 3470 "user-agent", "Chrome", |
| 3480 }; | 3471 }; |
| 3481 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(kExtraHeaders, 1, false, 1, | 3472 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(kExtraHeaders, 1, false, 1, |
| 3482 LOWEST)); | 3473 LOWEST)); |
| 3483 MockWrite writes[] = { CreateMockWrite(*req) }; | 3474 MockWrite writes[] = { CreateMockWrite(*req) }; |
| (...skipping 2019 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5503 << " Write index: " | 5494 << " Write index: " |
| 5504 << data->write_index(); | 5495 << data->write_index(); |
| 5505 | 5496 |
| 5506 // Verify the SYN_REPLY. | 5497 // Verify the SYN_REPLY. |
| 5507 HttpResponseInfo response = *trans->GetResponseInfo(); | 5498 HttpResponseInfo response = *trans->GetResponseInfo(); |
| 5508 EXPECT_TRUE(response.headers != NULL); | 5499 EXPECT_TRUE(response.headers != NULL); |
| 5509 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); | 5500 EXPECT_EQ("HTTP/1.1 200 OK", response.headers->GetStatusLine()); |
| 5510 } | 5501 } |
| 5511 | 5502 |
| 5512 } // namespace net | 5503 } // namespace net |
| OLD | NEW |