Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: net/url_request/url_request_unittest.cc

Issue 103803012: Make HSTS headers not clobber preloaded pins. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Respond to comments and fix compilation errors. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "build/build_config.h" 5 #include "build/build_config.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <windows.h> 8 #include <windows.h>
9 #include <shlobj.h> 9 #include <shlobj.h>
10 #endif 10 #endif
(...skipping 4942 matching lines...) Expand 10 before | Expand all | Expand 10 after
4953 TestDelegate d; 4953 TestDelegate d;
4954 URLRequest request(https_test_server.GetURL("files/hsts-headers.html"), 4954 URLRequest request(https_test_server.GetURL("files/hsts-headers.html"),
4955 DEFAULT_PRIORITY, 4955 DEFAULT_PRIORITY,
4956 &d, 4956 &d,
4957 &default_context_); 4957 &default_context_);
4958 request.Start(); 4958 request.Start();
4959 base::RunLoop().Run(); 4959 base::RunLoop().Run();
4960 4960
4961 TransportSecurityState* security_state = 4961 TransportSecurityState* security_state =
4962 default_context_.transport_security_state(); 4962 default_context_.transport_security_state();
4963 bool sni_available = true;
4964 TransportSecurityState::DomainState domain_state; 4963 TransportSecurityState::DomainState domain_state;
4965 EXPECT_TRUE(security_state->GetDomainState( 4964 EXPECT_TRUE(security_state->GetDynamicDomainState(
4966 SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 4965 SpawnedTestServer::kLocalhost, &domain_state));
4967 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 4966 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
4968 domain_state.upgrade_mode); 4967 domain_state.sts.upgrade_mode);
4969 EXPECT_TRUE(domain_state.sts_include_subdomains); 4968 EXPECT_TRUE(domain_state.sts.include_subdomains);
4970 EXPECT_FALSE(domain_state.pkp_include_subdomains); 4969 EXPECT_FALSE(domain_state.pkp.include_subdomains);
4971 #if defined(OS_ANDROID) 4970 #if defined(OS_ANDROID)
4972 // Android's CertVerifyProc does not (yet) handle pins. 4971 // Android's CertVerifyProc does not (yet) handle pins.
4973 #else 4972 #else
4974 EXPECT_FALSE(domain_state.HasPublicKeyPins()); 4973 EXPECT_FALSE(domain_state.HasPublicKeyPins());
4975 #endif 4974 #endif
4976 } 4975 }
4977 4976
4978 // Android's CertVerifyProc does not (yet) handle pins. Therefore, it will 4977 // Android's CertVerifyProc does not (yet) handle pins. Therefore, it will
4979 // reject HPKP headers, and a test setting only HPKP headers will fail (no 4978 // reject HPKP headers, and a test setting only HPKP headers will fail (no
4980 // DomainState present because header rejected). 4979 // DomainState present because header rejected).
(...skipping 16 matching lines...) Expand all
4997 TestDelegate d; 4996 TestDelegate d;
4998 URLRequest request(https_test_server.GetURL("files/hpkp-headers.html"), 4997 URLRequest request(https_test_server.GetURL("files/hpkp-headers.html"),
4999 DEFAULT_PRIORITY, 4998 DEFAULT_PRIORITY,
5000 &d, 4999 &d,
5001 &default_context_); 5000 &default_context_);
5002 request.Start(); 5001 request.Start();
5003 base::RunLoop().Run(); 5002 base::RunLoop().Run();
5004 5003
5005 TransportSecurityState* security_state = 5004 TransportSecurityState* security_state =
5006 default_context_.transport_security_state(); 5005 default_context_.transport_security_state();
5007 bool sni_available = true;
5008 TransportSecurityState::DomainState domain_state; 5006 TransportSecurityState::DomainState domain_state;
5009 EXPECT_TRUE(security_state->GetDomainState( 5007 EXPECT_TRUE(security_state->GetDynamicDomainState(
5010 SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 5008 SpawnedTestServer::kLocalhost, &domain_state));
5011 EXPECT_EQ(TransportSecurityState::DomainState::MODE_DEFAULT, 5009 EXPECT_EQ(TransportSecurityState::DomainState::MODE_DEFAULT,
5012 domain_state.upgrade_mode); 5010 domain_state.sts.upgrade_mode);
5013 EXPECT_FALSE(domain_state.sts_include_subdomains); 5011 EXPECT_FALSE(domain_state.sts.include_subdomains);
5014 EXPECT_FALSE(domain_state.pkp_include_subdomains); 5012 EXPECT_FALSE(domain_state.pkp.include_subdomains);
5015 EXPECT_TRUE(domain_state.HasPublicKeyPins()); 5013 EXPECT_TRUE(domain_state.HasPublicKeyPins());
5016 EXPECT_NE(domain_state.upgrade_expiry, 5014 EXPECT_NE(domain_state.sts.expiry, domain_state.pkp.expiry);
5017 domain_state.dynamic_spki_hashes_expiry);
5018 } 5015 }
5019 5016
5020 TEST_F(URLRequestTestHTTP, ProcessSTSOnce) { 5017 TEST_F(URLRequestTestHTTP, ProcessSTSOnce) {
5021 SpawnedTestServer::SSLOptions ssl_options; 5018 SpawnedTestServer::SSLOptions ssl_options;
5022 SpawnedTestServer https_test_server( 5019 SpawnedTestServer https_test_server(
5023 SpawnedTestServer::TYPE_HTTPS, 5020 SpawnedTestServer::TYPE_HTTPS,
5024 ssl_options, 5021 ssl_options,
5025 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 5022 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
5026 ASSERT_TRUE(https_test_server.Start()); 5023 ASSERT_TRUE(https_test_server.Start());
5027 5024
5028 TestDelegate d; 5025 TestDelegate d;
5029 URLRequest request( 5026 URLRequest request(
5030 https_test_server.GetURL("files/hsts-multiple-headers.html"), 5027 https_test_server.GetURL("files/hsts-multiple-headers.html"),
5031 DEFAULT_PRIORITY, 5028 DEFAULT_PRIORITY,
5032 &d, 5029 &d,
5033 &default_context_); 5030 &default_context_);
5034 request.Start(); 5031 request.Start();
5035 base::RunLoop().Run(); 5032 base::RunLoop().Run();
5036 5033
5037 // We should have set parameters from the first header, not the second. 5034 // We should have set parameters from the first header, not the second.
5038 TransportSecurityState* security_state = 5035 TransportSecurityState* security_state =
5039 default_context_.transport_security_state(); 5036 default_context_.transport_security_state();
5040 bool sni_available = true;
5041 TransportSecurityState::DomainState domain_state; 5037 TransportSecurityState::DomainState domain_state;
5042 EXPECT_TRUE(security_state->GetDomainState( 5038 EXPECT_TRUE(security_state->GetDynamicDomainState(
5043 SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 5039 SpawnedTestServer::kLocalhost, &domain_state));
5044 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 5040 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
5045 domain_state.upgrade_mode); 5041 domain_state.sts.upgrade_mode);
5046 EXPECT_FALSE(domain_state.sts_include_subdomains); 5042 EXPECT_FALSE(domain_state.sts.include_subdomains);
5047 EXPECT_FALSE(domain_state.pkp_include_subdomains); 5043 EXPECT_FALSE(domain_state.pkp.include_subdomains);
5048 } 5044 }
5049 5045
5050 TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) { 5046 TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) {
5051 SpawnedTestServer::SSLOptions ssl_options; 5047 SpawnedTestServer::SSLOptions ssl_options;
5052 SpawnedTestServer https_test_server( 5048 SpawnedTestServer https_test_server(
5053 SpawnedTestServer::TYPE_HTTPS, 5049 SpawnedTestServer::TYPE_HTTPS,
5054 ssl_options, 5050 ssl_options,
5055 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 5051 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
5056 ASSERT_TRUE(https_test_server.Start()); 5052 ASSERT_TRUE(https_test_server.Start());
5057 5053
5058 TestDelegate d; 5054 TestDelegate d;
5059 URLRequest request( 5055 URLRequest request(
5060 https_test_server.GetURL("files/hsts-and-hpkp-headers.html"), 5056 https_test_server.GetURL("files/hsts-and-hpkp-headers.html"),
5061 DEFAULT_PRIORITY, 5057 DEFAULT_PRIORITY,
5062 &d, 5058 &d,
5063 &default_context_); 5059 &default_context_);
5064 request.Start(); 5060 request.Start();
5065 base::RunLoop().Run(); 5061 base::RunLoop().Run();
5066 5062
5067 // We should have set parameters from the first header, not the second. 5063 // We should have set parameters from the first header, not the second.
5068 TransportSecurityState* security_state = 5064 TransportSecurityState* security_state =
5069 default_context_.transport_security_state(); 5065 default_context_.transport_security_state();
5070 bool sni_available = true;
5071 TransportSecurityState::DomainState domain_state; 5066 TransportSecurityState::DomainState domain_state;
5072 EXPECT_TRUE(security_state->GetDomainState( 5067 EXPECT_TRUE(security_state->GetDynamicDomainState(
5073 SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 5068 SpawnedTestServer::kLocalhost, &domain_state));
5074 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 5069 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
5075 domain_state.upgrade_mode); 5070 domain_state.sts.upgrade_mode);
5076 #if defined(OS_ANDROID) 5071 #if defined(OS_ANDROID)
5077 // Android's CertVerifyProc does not (yet) handle pins. 5072 // Android's CertVerifyProc does not (yet) handle pins.
5078 #else 5073 #else
5079 EXPECT_TRUE(domain_state.HasPublicKeyPins()); 5074 EXPECT_TRUE(domain_state.HasPublicKeyPins());
5080 #endif 5075 #endif
5081 EXPECT_NE(domain_state.upgrade_expiry, 5076 EXPECT_NE(domain_state.sts.expiry, domain_state.pkp.expiry);
5082 domain_state.dynamic_spki_hashes_expiry);
5083 5077
5084 // Even though there is an HSTS header asserting includeSubdomains, it is 5078 // Even though there is an HSTS header asserting includeSubdomains, it is
5085 // the *second* such header, and we MUST process only the first. 5079 // the *second* such header, and we MUST process only the first.
5086 EXPECT_FALSE(domain_state.sts_include_subdomains); 5080 EXPECT_FALSE(domain_state.sts.include_subdomains);
5087 // includeSubdomains does not occur in the test HPKP header. 5081 // includeSubdomains does not occur in the test HPKP header.
5088 EXPECT_FALSE(domain_state.pkp_include_subdomains); 5082 EXPECT_FALSE(domain_state.pkp.include_subdomains);
5089 } 5083 }
5090 5084
5091 // Tests that when multiple HPKP headers are present, asserting different 5085 // Tests that when multiple HPKP headers are present, asserting different
5092 // policies, that only the first such policy is processed. 5086 // policies, that only the first such policy is processed.
5093 TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP2) { 5087 TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP2) {
5094 SpawnedTestServer::SSLOptions ssl_options; 5088 SpawnedTestServer::SSLOptions ssl_options;
5095 SpawnedTestServer https_test_server( 5089 SpawnedTestServer https_test_server(
5096 SpawnedTestServer::TYPE_HTTPS, 5090 SpawnedTestServer::TYPE_HTTPS,
5097 ssl_options, 5091 ssl_options,
5098 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 5092 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
5099 ASSERT_TRUE(https_test_server.Start()); 5093 ASSERT_TRUE(https_test_server.Start());
5100 5094
5101 TestDelegate d; 5095 TestDelegate d;
5102 URLRequest request( 5096 URLRequest request(
5103 https_test_server.GetURL("files/hsts-and-hpkp-headers2.html"), 5097 https_test_server.GetURL("files/hsts-and-hpkp-headers2.html"),
5104 DEFAULT_PRIORITY, 5098 DEFAULT_PRIORITY,
5105 &d, 5099 &d,
5106 &default_context_); 5100 &default_context_);
5107 request.Start(); 5101 request.Start();
5108 base::RunLoop().Run(); 5102 base::RunLoop().Run();
5109 5103
5110 TransportSecurityState* security_state = 5104 TransportSecurityState* security_state =
5111 default_context_.transport_security_state(); 5105 default_context_.transport_security_state();
5112 bool sni_available = true;
5113 TransportSecurityState::DomainState domain_state; 5106 TransportSecurityState::DomainState domain_state;
5114 EXPECT_TRUE(security_state->GetDomainState( 5107 EXPECT_TRUE(security_state->GetDynamicDomainState(
5115 SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 5108 SpawnedTestServer::kLocalhost, &domain_state));
5116 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 5109 EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
5117 domain_state.upgrade_mode); 5110 domain_state.sts.upgrade_mode);
5118 #if defined(OS_ANDROID) 5111 #if defined(OS_ANDROID)
5119 // Android's CertVerifyProc does not (yet) handle pins. 5112 // Android's CertVerifyProc does not (yet) handle pins.
5120 #else 5113 #else
5121 EXPECT_TRUE(domain_state.HasPublicKeyPins()); 5114 EXPECT_TRUE(domain_state.HasPublicKeyPins());
5122 #endif 5115 #endif
5123 EXPECT_NE(domain_state.upgrade_expiry, 5116 EXPECT_NE(domain_state.sts.expiry, domain_state.pkp.expiry);
5124 domain_state.dynamic_spki_hashes_expiry);
5125 5117
5126 EXPECT_TRUE(domain_state.sts_include_subdomains); 5118 EXPECT_TRUE(domain_state.sts.include_subdomains);
5127 EXPECT_FALSE(domain_state.pkp_include_subdomains); 5119 EXPECT_FALSE(domain_state.pkp.include_subdomains);
5128 } 5120 }
5129 5121
5130 TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) { 5122 TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) {
5131 ASSERT_TRUE(test_server_.Start()); 5123 ASSERT_TRUE(test_server_.Start());
5132 5124
5133 TestDelegate d; 5125 TestDelegate d;
5134 URLRequest req(test_server_.GetURL("files/content-type-normalization.html"), 5126 URLRequest req(test_server_.GetURL("files/content-type-normalization.html"),
5135 DEFAULT_PRIORITY, 5127 DEFAULT_PRIORITY,
5136 &d, 5128 &d,
5137 &default_context_); 5129 &default_context_);
(...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after
6655 // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't 6647 // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't
6656 // matter. It just has to be any error. 6648 // matter. It just has to be any error.
6657 SpawnedTestServer::SSLOptions ssl_options( 6649 SpawnedTestServer::SSLOptions ssl_options(
6658 SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 6650 SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
6659 SpawnedTestServer test_server( 6651 SpawnedTestServer test_server(
6660 SpawnedTestServer::TYPE_HTTPS, 6652 SpawnedTestServer::TYPE_HTTPS,
6661 ssl_options, 6653 ssl_options,
6662 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 6654 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
6663 ASSERT_TRUE(test_server.Start()); 6655 ASSERT_TRUE(test_server.Start());
6664 6656
6665 // We require that the URL be www.google.com in order to pick up the 6657 // We require that the URL be www.google.com in order to pick up the static
6666 // preloaded and dynamic HSTS and public key pin entries in the 6658 // and dynamic STS and PKP entries in the TransportSecurityState. This means
6667 // TransportSecurityState. This means that we have to use a 6659 // that we have to use a MockHostResolver in order to direct www.google.com to
6668 // MockHostResolver in order to direct www.google.com to the testserver. 6660 // the testserver. By default, MockHostResolver maps all hosts to 127.0.0.1.
6669 // By default, MockHostResolver maps all hosts to 127.0.0.1.
6670 6661
6671 MockHostResolver host_resolver; 6662 MockHostResolver host_resolver;
6672 TestNetworkDelegate network_delegate; // Must outlive URLRequest. 6663 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
6673 TestURLRequestContext context(true); 6664 TestURLRequestContext context(true);
6674 context.set_network_delegate(&network_delegate); 6665 context.set_network_delegate(&network_delegate);
6675 context.set_host_resolver(&host_resolver); 6666 context.set_host_resolver(&host_resolver);
6676 TransportSecurityState transport_security_state; 6667 TransportSecurityState transport_security_state;
6677 TransportSecurityState::DomainState domain_state; 6668
6678 EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true, 6669 TransportSecurityState::DomainState static_domain_state;
6679 &domain_state)); 6670 EXPECT_TRUE(transport_security_state.GetStaticDomainState(
6671 "www.google.com", true, &static_domain_state));
6680 context.set_transport_security_state(&transport_security_state); 6672 context.set_transport_security_state(&transport_security_state);
6681 context.Init(); 6673 context.Init();
6682 6674
6675 TransportSecurityState::DomainState dynamic_domain_state;
6676 EXPECT_FALSE(transport_security_state.GetDynamicDomainState(
6677 "www.google.com", &dynamic_domain_state));
6678
6683 TestDelegate d; 6679 TestDelegate d;
6684 URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 6680 URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d",
6685 test_server.host_port_pair().port())), 6681 test_server.host_port_pair().port())),
6686 DEFAULT_PRIORITY, 6682 DEFAULT_PRIORITY,
6687 &d, 6683 &d,
6688 &context); 6684 &context);
6689 6685
6690 r.Start(); 6686 r.Start();
6691 EXPECT_TRUE(r.is_pending()); 6687 EXPECT_TRUE(r.is_pending());
6692 6688
6693 base::RunLoop().Run(); 6689 base::RunLoop().Run();
6694 6690
6695 EXPECT_EQ(1, d.response_started_count()); 6691 EXPECT_EQ(1, d.response_started_count());
6696 EXPECT_FALSE(d.received_data_before_response()); 6692 EXPECT_FALSE(d.received_data_before_response());
6697 EXPECT_TRUE(d.have_certificate_errors()); 6693 EXPECT_TRUE(d.have_certificate_errors());
6698 EXPECT_TRUE(d.certificate_errors_are_fatal()); 6694 EXPECT_TRUE(d.certificate_errors_are_fatal());
6699 6695
6700 // Get a fresh copy of the state, and check that it hasn't been updated. 6696 // Get a fresh copy of the states, and check that they haven't changed.
6701 TransportSecurityState::DomainState new_domain_state; 6697 TransportSecurityState::DomainState new_static_domain_state;
6702 EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true, 6698 EXPECT_TRUE(transport_security_state.GetStaticDomainState(
6703 &new_domain_state)); 6699 "www.google.com", true, &new_static_domain_state));
6704 EXPECT_EQ(new_domain_state.upgrade_mode, domain_state.upgrade_mode); 6700 TransportSecurityState::DomainState new_dynamic_domain_state;
6705 EXPECT_EQ(new_domain_state.sts_include_subdomains, 6701 EXPECT_FALSE(transport_security_state.GetDynamicDomainState(
6706 domain_state.sts_include_subdomains); 6702 "www.google.com", &new_dynamic_domain_state));
6707 EXPECT_EQ(new_domain_state.pkp_include_subdomains, 6703
6708 domain_state.pkp_include_subdomains); 6704 EXPECT_EQ(new_static_domain_state.sts.upgrade_mode,
6709 EXPECT_TRUE(FingerprintsEqual(new_domain_state.static_spki_hashes, 6705 static_domain_state.sts.upgrade_mode);
6710 domain_state.static_spki_hashes)); 6706 EXPECT_EQ(new_static_domain_state.sts.include_subdomains,
6711 EXPECT_TRUE(FingerprintsEqual(new_domain_state.dynamic_spki_hashes, 6707 static_domain_state.sts.include_subdomains);
6712 domain_state.dynamic_spki_hashes)); 6708 EXPECT_EQ(new_static_domain_state.pkp.include_subdomains,
6713 EXPECT_TRUE(FingerprintsEqual(new_domain_state.bad_static_spki_hashes, 6709 static_domain_state.pkp.include_subdomains);
6714 domain_state.bad_static_spki_hashes)); 6710 EXPECT_TRUE(FingerprintsEqual(new_static_domain_state.pkp.spki_hashes,
6711 static_domain_state.pkp.spki_hashes));
6712 EXPECT_TRUE(FingerprintsEqual(new_static_domain_state.pkp.bad_spki_hashes,
6713 static_domain_state.pkp.bad_spki_hashes));
6715 } 6714 }
6716 6715
6717 // Make sure HSTS preserves a POST request's method and body. 6716 // Make sure HSTS preserves a POST request's method and body.
6718 TEST_F(HTTPSRequestTest, HSTSPreservesPosts) { 6717 TEST_F(HTTPSRequestTest, HSTSPreservesPosts) {
6719 static const char kData[] = "hello world"; 6718 static const char kData[] = "hello world";
6720 6719
6721 SpawnedTestServer::SSLOptions ssl_options( 6720 SpawnedTestServer::SSLOptions ssl_options(
6722 SpawnedTestServer::SSLOptions::CERT_OK); 6721 SpawnedTestServer::SSLOptions::CERT_OK);
6723 SpawnedTestServer test_server( 6722 SpawnedTestServer test_server(
6724 SpawnedTestServer::TYPE_HTTPS, 6723 SpawnedTestServer::TYPE_HTTPS,
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after
7994 7993
7995 EXPECT_FALSE(r.is_pending()); 7994 EXPECT_FALSE(r.is_pending());
7996 EXPECT_EQ(1, d->response_started_count()); 7995 EXPECT_EQ(1, d->response_started_count());
7997 EXPECT_FALSE(d->received_data_before_response()); 7996 EXPECT_FALSE(d->received_data_before_response());
7998 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 7997 EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
7999 } 7998 }
8000 } 7999 }
8001 #endif // !defined(DISABLE_FTP_SUPPORT) 8000 #endif // !defined(DISABLE_FTP_SUPPORT)
8002 8001
8003 } // namespace net 8002 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698