Index: net/http/http_network_transaction_unittest.cc |
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc |
index e2397215272d8e11a951547b5266654d1064cb28..84b758a4408d91e9df2c8a8395bb89a929273214 100644 |
--- a/net/http/http_network_transaction_unittest.cc |
+++ b/net/http/http_network_transaction_unittest.cc |
@@ -10,6 +10,7 @@ |
#include <limits> |
#include <memory> |
+#include <set> |
#include <string> |
#include <utility> |
#include <vector> |
@@ -34,6 +35,7 @@ |
#include "net/base/load_timing_info.h" |
#include "net/base/load_timing_info_test_util.h" |
#include "net/base/net_errors.h" |
+#include "net/base/network_throttle_manager.h" |
#include "net/base/proxy_delegate.h" |
#include "net/base/request_priority.h" |
#include "net/base/test_completion_callback.h" |
@@ -109,6 +111,101 @@ namespace net { |
namespace { |
+class TestNetworkStreamThrottler : public NetworkThrottleManager { |
+ public: |
+ TestNetworkStreamThrottler() |
+ : throttle_new_requests_(false), |
+ num_set_priority_calls_(0), |
+ last_priority_set_(IDLE) {} |
+ |
+ ~TestNetworkStreamThrottler() override { |
+ EXPECT_TRUE(outstanding_throttles_.empty()); |
+ } |
+ |
+ // NetworkThrottleManager |
+ std::unique_ptr<Throttle> CreateThrottle(ThrottleDelegate* delegate, |
+ RequestPriority priority, |
+ bool ignore_limits) override { |
+ std::unique_ptr<TestThrottle> test_throttle( |
+ new TestThrottle(throttle_new_requests_, delegate, this)); |
+ outstanding_throttles_.insert(test_throttle.get()); |
+ return std::move(test_throttle); |
+ } |
+ |
+ void UnthrottleAllRequests() { |
+ std::set<TestThrottle*> outstanding_throttles_copy(outstanding_throttles_); |
+ for (auto& throttle : outstanding_throttles_copy) { |
+ if (throttle->IsThrottled()) |
+ throttle->Unthrottle(); |
+ } |
+ } |
+ |
+ void set_throttle_new_requests(bool throttle_new_requests) { |
+ throttle_new_requests_ = throttle_new_requests; |
+ } |
+ |
+ // Includes both throttled and unthrottled throttles. |
+ size_t num_outstanding_requests() const { |
+ return outstanding_throttles_.size(); |
+ } |
+ |
+ int num_set_priority_calls() const { return num_set_priority_calls_; } |
+ RequestPriority last_priority_set() const { return last_priority_set_; } |
+ void set_priority_change_closure( |
+ const base::Closure& priority_change_closure) { |
+ priority_change_closure_ = priority_change_closure; |
+ } |
+ |
+ private: |
+ class TestThrottle : public NetworkThrottleManager::Throttle { |
+ public: |
+ ~TestThrottle() override { throttler_->OnThrottleDestroyed(this); } |
+ |
+ // Throttle |
+ bool IsThrottled() const override { return throttled_; } |
+ void SetPriority(RequestPriority priority) override { |
+ throttler_->SetPriorityCalled(priority); |
+ } |
+ |
+ TestThrottle(bool throttled, |
+ ThrottleDelegate* delegate, |
+ TestNetworkStreamThrottler* throttler) |
+ : throttled_(throttled), delegate_(delegate), throttler_(throttler) {} |
+ |
+ void Unthrottle() { |
+ EXPECT_TRUE(throttled_); |
+ |
+ throttled_ = false; |
+ delegate_->OnThrottleStateChanged(); |
+ } |
+ |
+ bool throttled_; |
+ ThrottleDelegate* delegate_; |
+ TestNetworkStreamThrottler* throttler_; |
+ }; |
+ |
+ void OnThrottleDestroyed(TestThrottle* throttle) { |
+ EXPECT_NE(0u, outstanding_throttles_.count(throttle)); |
+ outstanding_throttles_.erase(throttle); |
+ } |
+ |
+ void SetPriorityCalled(RequestPriority priority) { |
+ ++num_set_priority_calls_; |
+ last_priority_set_ = priority; |
+ if (!priority_change_closure_.is_null()) |
+ priority_change_closure_.Run(); |
+ } |
+ |
+ // Includes both throttled and unthrottled throttles. |
+ std::set<TestThrottle*> outstanding_throttles_; |
+ bool throttle_new_requests_; |
+ int num_set_priority_calls_; |
+ RequestPriority last_priority_set_; |
+ base::Closure priority_change_closure_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestNetworkStreamThrottler); |
+}; |
+ |
const base::string16 kBar(ASCIIToUTF16("bar")); |
const base::string16 kBar2(ASCIIToUTF16("bar2")); |
const base::string16 kBar3(ASCIIToUTF16("bar3")); |
@@ -257,6 +354,24 @@ std::unique_ptr<HttpNetworkSession> CreateSession( |
return SpdySessionDependencies::SpdyCreateSession(session_deps); |
} |
+// Note that the pointer written into |*throttler| will only be valid |
+// for the lifetime of the returned HttpNetworkSession. |
+std::unique_ptr<HttpNetworkSession> CreateSessionWithThrottler( |
+ SpdySessionDependencies* session_deps, |
+ TestNetworkStreamThrottler** throttler) { |
+ std::unique_ptr<HttpNetworkSession> session( |
+ SpdySessionDependencies::SpdyCreateSession(session_deps)); |
+ |
+ std::unique_ptr<TestNetworkStreamThrottler> owned_throttler( |
+ new TestNetworkStreamThrottler); |
+ *throttler = owned_throttler.get(); |
+ |
+ HttpNetworkSessionPeer peer(session.get()); |
+ peer.SetNetworkStreamThrottler(std::move(owned_throttler)); |
+ |
+ return session; |
+} |
+ |
} // namespace |
class HttpNetworkTransactionTest : public PlatformTest { |
@@ -328,7 +443,6 @@ class HttpNetworkTransactionTest : public PlatformTest { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
BoundTestNetLog log; |
session_deps_.net_log = log.bound().net_log(); |
@@ -1051,7 +1165,6 @@ TEST_F(HttpNetworkTransactionTest, TwoIdenticalLocationHeaders) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://redirect.com/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -1096,7 +1209,6 @@ TEST_F(HttpNetworkTransactionTest, Head) { |
HttpRequestInfo request; |
request.method = "HEAD"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -1177,7 +1289,6 @@ TEST_F(HttpNetworkTransactionTest, ReuseConnection) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -1213,7 +1324,6 @@ TEST_F(HttpNetworkTransactionTest, Ignores100) { |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
// Check the upload progress returned before initialization is correct. |
UploadProgress progress = request.upload_data_stream->GetUploadProgress(); |
@@ -1259,7 +1369,6 @@ TEST_F(HttpNetworkTransactionTest, Ignores1xx) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.foo.com/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -1297,7 +1406,6 @@ TEST_F(HttpNetworkTransactionTest, Incomplete100ThenEOF) { |
HttpRequestInfo request; |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -1327,7 +1435,6 @@ TEST_F(HttpNetworkTransactionTest, EmptyResponse) { |
HttpRequestInfo request; |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -1353,7 +1460,6 @@ void HttpNetworkTransactionTest::KeepAliveConnectionResendRequestTest( |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.foo.com/"); |
- request.load_flags = 0; |
TestNetLog net_log; |
session_deps_.net_log = &net_log; |
@@ -1443,7 +1549,6 @@ void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest( |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.foo.com/"); |
- request.load_flags = 0; |
TestNetLog net_log; |
session_deps_.net_log = &net_log; |
@@ -1637,7 +1742,6 @@ TEST_F(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -1693,7 +1797,6 @@ TEST_F(HttpNetworkTransactionTest, KeepAliveEarlyClose) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
std::unique_ptr<HttpNetworkTransaction> trans( |
@@ -1734,7 +1837,6 @@ TEST_F(HttpNetworkTransactionTest, KeepAliveEarlyClose2) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
std::unique_ptr<HttpNetworkTransaction> trans( |
@@ -1774,7 +1876,6 @@ TEST_F(HttpNetworkTransactionTest, KeepAliveAfterUnreadBody) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.foo.com/"); |
- request.load_flags = 0; |
TestNetLog net_log; |
session_deps_.net_log = &net_log; |
@@ -2191,7 +2292,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuth) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
TestNetLog log; |
session_deps_.net_log = &log; |
@@ -2298,7 +2398,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthWithAddressChange) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
TestNetLog log; |
MockHostResolver* resolver = new MockHostResolver(); |
@@ -2463,7 +2562,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthKeepAlive) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
TestNetLog log; |
session_deps_.net_log = &log; |
@@ -2553,7 +2651,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthKeepAliveNoBody) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -2627,7 +2724,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthKeepAliveLargeBody) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -2709,7 +2805,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthKeepAliveImpatientServer) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -3480,7 +3575,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyCancelTunnel) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// Configure against proxy server "myproxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("myproxy:70"); |
@@ -3538,7 +3632,6 @@ TEST_F(HttpNetworkTransactionTest, SanitizeProxyAuthHeaders) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// Configure against proxy server "myproxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("myproxy:70"); |
@@ -3599,7 +3692,6 @@ TEST_F(HttpNetworkTransactionTest, UnexpectedProxyAuth) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
// We are using a DIRECT connection (i.e. no proxy) for this session. |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -4532,7 +4624,6 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyGet) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
// Configure against https proxy server "proxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70"); |
@@ -4592,7 +4683,6 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyGetWithSessionRace) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
// Configure SPDY proxy server "proxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70"); |
@@ -4660,7 +4750,6 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyGetWithProxyAuth) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
// Configure against https proxy server "myproxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("https://myproxy:70"); |
@@ -4753,7 +4842,6 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectHttps) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// Configure against https proxy server "proxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70"); |
@@ -4836,7 +4924,6 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectSpdy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// Configure against https proxy server "proxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70"); |
@@ -4923,7 +5010,6 @@ TEST_F(HttpNetworkTransactionTest, HttpsProxySpdyConnectFailure) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// Configure against https proxy server "proxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("https://proxy:70"); |
@@ -5421,7 +5507,6 @@ void HttpNetworkTransactionTest::ConnectStatusHelperWithExpectedStatus( |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// Configure against proxy server "myproxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("myproxy:70"); |
@@ -5636,7 +5721,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyThenServer) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
// Configure against proxy server "myproxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("myproxy:70"); |
@@ -5898,7 +5982,6 @@ TEST_F(HttpNetworkTransactionTest, NTLMAuth2) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://172.22.68.17/kids/login.aspx"); |
- request.load_flags = 0; |
HttpAuthHandlerNTLM::ScopedProcSetter proc_setter(MockGenerateRandom2, |
MockGetHostName); |
@@ -6099,7 +6182,6 @@ TEST_F(HttpNetworkTransactionTest, LargeHeadersNoBody) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -6133,7 +6215,6 @@ TEST_F(HttpNetworkTransactionTest, DontRecycleTransportSocketForSSLTunnel) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// Configure against proxy server "myproxy:70". |
session_deps_.proxy_service = ProxyService::CreateFixed("myproxy:70"); |
@@ -6189,7 +6270,6 @@ TEST_F(HttpNetworkTransactionTest, RecycleSocket) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -6244,7 +6324,6 @@ TEST_F(HttpNetworkTransactionTest, RecycleSSLSocket) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockWrite data_writes[] = { |
MockWrite( |
@@ -6303,7 +6382,6 @@ TEST_F(HttpNetworkTransactionTest, RecycleDeadSSLSocket) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockWrite data_writes[] = { |
MockWrite( |
@@ -6534,7 +6612,6 @@ TEST_F(HttpNetworkTransactionTest, RecycleSocketAfterZeroContentLength) { |
"tran=undefined&ei=mAXcSeegAo-SMurloeUN&" |
"e=17259,18167,19592,19773,19981,20133,20173,20233&" |
"rt=prt.2642,ol.2649,xjs.2951"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -6951,7 +7028,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthCacheAndPreauth) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/x/y/z"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -7028,7 +7104,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthCacheAndPreauth) { |
// Note that Transaction 1 was at /x/y/z, so this is in the same |
// protection space as MyRealm1. |
request.url = GURL("http://www.example.org/x/y/a/b"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -7113,7 +7188,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthCacheAndPreauth) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/x/y/z2"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -7161,7 +7235,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthCacheAndPreauth) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/x/1"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -7232,7 +7305,6 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthCacheAndPreauth) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/p/q/t"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -7346,7 +7418,6 @@ TEST_F(HttpNetworkTransactionTest, DigestPreAuthNonceCount) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/x/y/z"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -7426,7 +7497,6 @@ TEST_F(HttpNetworkTransactionTest, DigestPreAuthNonceCount) { |
// Note that Transaction 1 was at /x/y/z, so this is in the same |
// protection space as digest. |
request.url = GURL("http://www.example.org/x/y/a/b"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -7513,7 +7583,6 @@ TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificate) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -7571,7 +7640,6 @@ TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificateViaProxy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockWrite proxy_writes[] = { |
MockWrite("CONNECT www.example.org:443 HTTP/1.1\r\n" |
@@ -7652,7 +7720,6 @@ TEST_F(HttpNetworkTransactionTest, HTTPSViaHttpsProxy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockWrite data_writes[] = { |
MockWrite("CONNECT www.example.org:443 HTTP/1.1\r\n" |
@@ -7716,7 +7783,6 @@ TEST_F(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaHttpsProxy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockWrite data_writes[] = { |
MockWrite("CONNECT www.example.org:443 HTTP/1.1\r\n" |
@@ -7788,7 +7854,6 @@ TEST_F(HttpNetworkTransactionTest, RedirectOfHttpsConnectViaSpdyProxy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
SpdySerializedFrame conn(spdy_util_.ConstructSpdyConnect( |
NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443))); |
@@ -7844,7 +7909,6 @@ TEST_F(HttpNetworkTransactionTest, ErrorResponseToHttpsConnectViaHttpsProxy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockWrite data_writes[] = { |
MockWrite("CONNECT www.example.org:443 HTTP/1.1\r\n" |
@@ -7887,7 +7951,6 @@ TEST_F(HttpNetworkTransactionTest, ErrorResponseToHttpsConnectViaSpdyProxy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
SpdySerializedFrame conn(spdy_util_.ConstructSpdyConnect( |
NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443))); |
@@ -8355,7 +8418,6 @@ TEST_F(HttpNetworkTransactionTest, HTTPSBadCertificateViaHttpsProxy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// Attempt to fetch the URL from a server with a bad cert |
MockWrite bad_cert_writes[] = { |
@@ -8509,7 +8571,6 @@ TEST_F(HttpNetworkTransactionTest, BuildRequest_Referer) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
request.extra_headers.SetHeader(HttpRequestHeaders::kReferer, |
"http://the.previous.site.com/"); |
@@ -8815,7 +8876,6 @@ TEST_F(HttpNetworkTransactionTest, SOCKS4_HTTP_GET) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
session_deps_.proxy_service = |
ProxyService::CreateFixedFromPacResult("SOCKS myproxy:1080"); |
@@ -8874,7 +8934,6 @@ TEST_F(HttpNetworkTransactionTest, SOCKS4_SSL_GET) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
session_deps_.proxy_service = |
ProxyService::CreateFixedFromPacResult("SOCKS myproxy:1080"); |
@@ -8938,7 +8997,6 @@ TEST_F(HttpNetworkTransactionTest, SOCKS4_HTTP_GET_no_PAC) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
session_deps_.proxy_service = |
ProxyService::CreateFixed("socks4://myproxy:1080"); |
@@ -8996,7 +9054,6 @@ TEST_F(HttpNetworkTransactionTest, SOCKS5_HTTP_GET) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
session_deps_.proxy_service = |
ProxyService::CreateFixedFromPacResult("SOCKS5 myproxy:1080"); |
@@ -9068,7 +9125,6 @@ TEST_F(HttpNetworkTransactionTest, SOCKS5_SSL_GET) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
session_deps_.proxy_service = |
ProxyService::CreateFixedFromPacResult("SOCKS5 myproxy:1080"); |
@@ -9173,7 +9229,6 @@ int GroupNameTransactionHelper(const std::string& url, |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL(url); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session); |
@@ -9487,7 +9542,6 @@ TEST_F(HttpNetworkTransactionTest, RequestWriteError) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.foo.com/"); |
- request.load_flags = 0; |
MockWrite write_failure[] = { |
MockWrite(ASYNC, ERR_CONNECTION_RESET), |
@@ -9517,7 +9571,6 @@ TEST_F(HttpNetworkTransactionTest, ConnectionClosedAfterStartOfHeaders) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.foo.com/"); |
- request.load_flags = 0; |
MockRead data_reads[] = { |
MockRead("HTTP/1."), |
@@ -9560,7 +9613,6 @@ TEST_F(HttpNetworkTransactionTest, DrainResetOK) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
MockWrite data_writes1[] = { |
MockWrite( |
@@ -9640,7 +9692,6 @@ TEST_F(HttpNetworkTransactionTest, HTTPSViaProxyWithExtraData) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockRead proxy_reads[] = { |
MockRead("HTTP/1.0 200 Connected\r\n\r\nExtra data"), |
@@ -9671,7 +9722,6 @@ TEST_F(HttpNetworkTransactionTest, LargeContentLengthThenClose) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -9719,7 +9769,6 @@ TEST_F(HttpNetworkTransactionTest, UploadFileSmallerThanLength) { |
request.method = "POST"; |
request.url = GURL("http://www.example.org/upload"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -9766,7 +9815,6 @@ TEST_F(HttpNetworkTransactionTest, UploadUnreadableFile) { |
request.method = "POST"; |
request.url = GURL("http://www.example.org/upload"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
// If we try to upload an unreadable file, the transaction should fail. |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -9820,7 +9868,6 @@ TEST_F(HttpNetworkTransactionTest, CancelDuringInitRequestBody) { |
request.method = "POST"; |
request.url = GURL("http://www.example.org/upload"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
std::unique_ptr<HttpNetworkTransaction> trans( |
@@ -9847,7 +9894,6 @@ TEST_F(HttpNetworkTransactionTest, ChangeAuthRealms) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
// First transaction will request a resource and receive a Basic challenge |
// with realm="first_realm". |
@@ -10009,7 +10055,6 @@ TEST_F(HttpNetworkTransactionTest, HonorAlternativeServiceHeader) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&data); |
@@ -10223,7 +10268,6 @@ TEST_F(HttpNetworkTransactionTest, ClearAlternativeServices) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
TestCompletionCallback callback; |
@@ -10260,7 +10304,6 @@ TEST_F(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeaders) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); |
session_deps_.socket_factory->AddSocketDataProvider(&data); |
@@ -10356,7 +10399,6 @@ TEST_F(HttpNetworkTransactionTest, IdentifyQuicBroken) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL(origin_url); |
- request.load_flags = 0; |
TestCompletionCallback callback; |
NetErrorDetails details; |
EXPECT_FALSE(details.quic_broken); |
@@ -10430,7 +10472,6 @@ TEST_F(HttpNetworkTransactionTest, IdentifyQuicNotBroken) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL(origin_url); |
- request.load_flags = 0; |
TestCompletionCallback callback; |
NetErrorDetails details; |
EXPECT_FALSE(details.quic_broken); |
@@ -10444,7 +10485,6 @@ TEST_F(HttpNetworkTransactionTest, MarkBrokenAlternateProtocolAndFallback) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockConnect mock_connect(ASYNC, ERR_CONNECTION_REFUSED); |
StaticSocketDataProvider first_data; |
@@ -10759,7 +10799,6 @@ TEST_F(HttpNetworkTransactionTest, AlternateProtocolUnsafeBlocked) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
// The alternate protocol request will error out before we attempt to connect, |
// so only the standard HTTP request will try to connect. |
@@ -10806,7 +10845,6 @@ TEST_F(HttpNetworkTransactionTest, UseAlternateProtocolForNpnSpdy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockRead data_reads[] = { |
MockRead("HTTP/1.1 200 OK\r\n"), |
@@ -10887,7 +10925,6 @@ TEST_F(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// First transaction receives Alt-Svc header over HTTP/1.1. |
MockRead data_reads[] = { |
@@ -11000,7 +11037,6 @@ TEST_F(HttpNetworkTransactionTest, StallAlternativeServiceForNpnSpdy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockRead data_reads[] = { |
MockRead("HTTP/1.1 200 OK\r\n"), |
@@ -11215,7 +11251,6 @@ TEST_F(HttpNetworkTransactionTest, UseAlternativeServiceForTunneledNpnSpdy) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockRead data_reads[] = { |
MockRead("HTTP/1.1 200 OK\r\n"), |
@@ -11319,7 +11354,6 @@ TEST_F(HttpNetworkTransactionTest, |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockRead data_reads[] = { |
MockRead("HTTP/1.1 200 OK\r\n"), |
@@ -12147,7 +12181,6 @@ TEST_F(HttpNetworkTransactionTest, GenerateAuthToken) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL(test_config.server_url); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -12251,7 +12284,6 @@ TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = origin; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -12414,7 +12446,6 @@ TEST_F(HttpNetworkTransactionTest, NpnWithHttpOverSSL) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
MockWrite data_writes[] = { |
MockWrite( |
@@ -12470,7 +12501,6 @@ TEST_F(HttpNetworkTransactionTest, SpdyPostNPNServerHangup) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
SSLSocketDataProvider ssl(ASYNC, OK); |
ssl.next_proto = kProtoHTTP2; |
@@ -12539,7 +12569,6 @@ TEST_F(HttpNetworkTransactionTest, SimpleCancel) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
session_deps_.host_resolver->set_synchronous_mode(true); |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -12586,7 +12615,6 @@ TEST_F(HttpNetworkTransactionTest, CancelAfterHeaders) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
TestCompletionCallback callback; |
@@ -12920,7 +12948,6 @@ TEST_F(HttpNetworkTransactionTest, PreconnectWithExistingSpdySession) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org/"); |
- request.load_flags = 0; |
// This is the important line that marks this as a preconnect. |
request.motivation = HttpRequestInfo::PRECONNECT_MOTIVATED; |
@@ -13688,7 +13715,6 @@ TEST_F(HttpNetworkTransactionTest, AlternativeServiceNotOnHttp11) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("https://www.example.org:443"); |
- request.load_flags = 0; |
TestCompletionCallback callback; |
// HTTP/2 (or SPDY) is required for alternative service, if HTTP/1.1 is |
@@ -14388,7 +14414,6 @@ TEST_F(HttpNetworkTransactionTest, HttpSyncConnectError) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -14424,7 +14449,6 @@ TEST_F(HttpNetworkTransactionTest, HttpAsyncConnectError) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -14460,7 +14484,6 @@ TEST_F(HttpNetworkTransactionTest, HttpSyncWriteError) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -14493,7 +14516,6 @@ TEST_F(HttpNetworkTransactionTest, HttpAsyncWriteError) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -14526,7 +14548,6 @@ TEST_F(HttpNetworkTransactionTest, HttpSyncReadError) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -14562,7 +14583,6 @@ TEST_F(HttpNetworkTransactionTest, HttpAsyncReadError) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -14598,7 +14618,6 @@ TEST_F(HttpNetworkTransactionTest, GetFullRequestHeadersIncludesExtraHeader) { |
HttpRequestInfo request; |
request.method = "GET"; |
request.url = GURL("http://www.example.org/"); |
- request.load_flags = 0; |
request.extra_headers.SetHeader("X-Foo", "bar"); |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
@@ -15287,7 +15306,6 @@ TEST_F(HttpNetworkTransactionTest, PostReadsErrorResponseAfterReset) { |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -15426,7 +15444,6 @@ TEST_F(HttpNetworkTransactionTest, |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -15478,7 +15495,6 @@ TEST_F(HttpNetworkTransactionTest, ChunkedPostReadsErrorResponseAfterReset) { |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -15537,7 +15553,6 @@ TEST_F(HttpNetworkTransactionTest, PostReadsErrorResponseAfterResetAnd100) { |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -15590,7 +15605,6 @@ TEST_F(HttpNetworkTransactionTest, PostIgnoresNonErrorResponseAfterReset) { |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -15632,7 +15646,6 @@ TEST_F(HttpNetworkTransactionTest, |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -15675,7 +15688,6 @@ TEST_F(HttpNetworkTransactionTest, PostIgnoresHttp09ResponseAfterReset) { |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -15715,7 +15727,6 @@ TEST_F(HttpNetworkTransactionTest, PostIgnoresPartial400HeadersAfterReset) { |
request.method = "POST"; |
request.url = GURL("http://www.foo.com/"); |
request.upload_data_stream = &upload_data_stream; |
- request.load_flags = 0; |
std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
@@ -16065,6 +16076,296 @@ TEST_F(HttpNetworkTransactionTest, TotalNetworkBytesChunkedPost) { |
trans.GetTotalReceivedBytes()); |
} |
+// Confirm that transactions whose throttle is created in (and stays in) |
+// the unthrottled state are not blocked. |
+TEST_F(HttpNetworkTransactionTest, ThrottlingUnthrottled) { |
+ TestNetworkStreamThrottler* throttler(nullptr); |
+ std::unique_ptr<HttpNetworkSession> session( |
+ CreateSessionWithThrottler(&session_deps_, &throttler)); |
+ |
+ // Send a simple request and make sure it goes through. |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ std::unique_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
+ |
+ MockWrite data_writes[] = { |
+ MockWrite("GET / HTTP/1.1\r\n" |
+ "Host: www.example.org\r\n" |
+ "Connection: keep-alive\r\n\r\n"), |
+ }; |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, OK), |
+ }; |
+ StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes, |
+ arraysize(data_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&reads); |
+ |
+ TestCompletionCallback callback; |
+ trans->Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+} |
+ |
+// Confirm requests can be blocked by a throttler, and are resumed |
+// when the throttle is unblocked. |
+TEST_F(HttpNetworkTransactionTest, ThrottlingBasic) { |
+ TestNetworkStreamThrottler* throttler(nullptr); |
+ std::unique_ptr<HttpNetworkSession> session( |
+ CreateSessionWithThrottler(&session_deps_, &throttler)); |
+ |
+ // Send a simple request and make sure it goes through. |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ MockWrite data_writes[] = { |
+ MockWrite("GET / HTTP/1.1\r\n" |
+ "Host: www.example.org\r\n" |
+ "Connection: keep-alive\r\n\r\n"), |
+ }; |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, OK), |
+ }; |
+ StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes, |
+ arraysize(data_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&reads); |
+ |
+ // Start a request that will be throttled at start; confirm it |
+ // doesn't complete. |
+ throttler->set_throttle_new_requests(true); |
+ std::unique_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
+ |
+ TestCompletionCallback callback; |
+ int rv = trans->Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(LOAD_STATE_THROTTLED, trans->GetLoadState()); |
+ EXPECT_FALSE(callback.have_result()); |
+ |
+ // Confirm the request goes on to complete when unthrottled. |
+ throttler->UnthrottleAllRequests(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(callback.have_result()); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+} |
+ |
+// Destroy a request while it's throttled. |
+TEST_F(HttpNetworkTransactionTest, ThrottlingDestruction) { |
+ TestNetworkStreamThrottler* throttler(nullptr); |
+ std::unique_ptr<HttpNetworkSession> session( |
+ CreateSessionWithThrottler(&session_deps_, &throttler)); |
+ |
+ // Send a simple request and make sure it goes through. |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ MockWrite data_writes[] = { |
+ MockWrite("GET / HTTP/1.1\r\n" |
+ "Host: www.example.org\r\n" |
+ "Connection: keep-alive\r\n\r\n"), |
+ }; |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, OK), |
+ }; |
+ StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes, |
+ arraysize(data_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&reads); |
+ |
+ // Start a request that will be throttled at start; confirm it |
+ // doesn't complete. |
+ throttler->set_throttle_new_requests(true); |
+ std::unique_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
+ |
+ TestCompletionCallback callback; |
+ int rv = trans->Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(LOAD_STATE_THROTTLED, trans->GetLoadState()); |
+ EXPECT_FALSE(callback.have_result()); |
+ |
+ EXPECT_EQ(1u, throttler->num_outstanding_requests()); |
+ trans.reset(); |
+ EXPECT_EQ(0u, throttler->num_outstanding_requests()); |
+} |
+ |
+// Confirm the throttler receives SetPriority calls. |
+TEST_F(HttpNetworkTransactionTest, ThrottlingPrioritySet) { |
+ TestNetworkStreamThrottler* throttler(nullptr); |
+ std::unique_ptr<HttpNetworkSession> session( |
+ CreateSessionWithThrottler(&session_deps_, &throttler)); |
+ |
+ // Send a simple request and make sure it goes through. |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ MockWrite data_writes[] = { |
+ MockWrite("GET / HTTP/1.1\r\n" |
+ "Host: www.example.org\r\n" |
+ "Connection: keep-alive\r\n\r\n"), |
+ }; |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, OK), |
+ }; |
+ StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes, |
+ arraysize(data_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&reads); |
+ |
+ throttler->set_throttle_new_requests(true); |
+ std::unique_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(IDLE, session.get())); |
+ // Start the transaction to associate a throttle with it. |
+ TestCompletionCallback callback; |
+ int rv = trans->Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ |
+ EXPECT_EQ(0, throttler->num_set_priority_calls()); |
+ trans->SetPriority(LOW); |
+ EXPECT_EQ(1, throttler->num_set_priority_calls()); |
+ EXPECT_EQ(LOW, throttler->last_priority_set()); |
+ |
+ throttler->UnthrottleAllRequests(); |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(callback.have_result()); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+} |
+ |
+// Confirm that unthrottling from a SetPriority call by the |
+// throttler works properly. |
+TEST_F(HttpNetworkTransactionTest, ThrottlingPrioritySetUnthrottle) { |
+ TestNetworkStreamThrottler* throttler(nullptr); |
+ std::unique_ptr<HttpNetworkSession> session( |
+ CreateSessionWithThrottler(&session_deps_, &throttler)); |
+ |
+ // Send a simple request and make sure it goes through. |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ MockWrite data_writes[] = { |
+ MockWrite("GET / HTTP/1.1\r\n" |
+ "Host: www.example.org\r\n" |
+ "Connection: keep-alive\r\n\r\n"), |
+ }; |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, OK), |
+ }; |
+ StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes, |
+ arraysize(data_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&reads); |
+ |
+ StaticSocketDataProvider reads1(data_reads, arraysize(data_reads), |
+ data_writes, arraysize(data_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&reads1); |
+ |
+ // Start a request that will be throttled at start; confirm it |
+ // doesn't complete. |
+ throttler->set_throttle_new_requests(true); |
+ std::unique_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
+ |
+ TestCompletionCallback callback; |
+ int rv = trans->Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(LOAD_STATE_THROTTLED, trans->GetLoadState()); |
+ EXPECT_FALSE(callback.have_result()); |
+ |
+ // Create a new request, call SetPriority on it to unthrottle, |
+ // and make sure that allows the original request to complete. |
+ std::unique_ptr<HttpTransaction> trans1( |
+ new HttpNetworkTransaction(LOW, session.get())); |
+ throttler->set_priority_change_closure( |
+ base::Bind(&TestNetworkStreamThrottler::UnthrottleAllRequests, |
+ base::Unretained(throttler))); |
+ |
+ // Start the transaction to associate a throttle with it. |
+ TestCompletionCallback callback1; |
+ rv = trans1->Start(&request, callback1.callback(), NetLogWithSource()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ |
+ trans1->SetPriority(IDLE); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(callback.have_result()); |
+ EXPECT_EQ(OK, callback.WaitForResult()); |
+ ASSERT_TRUE(callback1.have_result()); |
+ EXPECT_EQ(OK, callback1.WaitForResult()); |
+} |
+ |
+// Transaction will be destroyed when the unique_ptr goes out of scope. |
+void DestroyTransaction(std::unique_ptr<HttpTransaction> transaction) {} |
+ |
+// Confirm that destroying a transaction from a SetPriority call by the |
+// throttler works properly. |
+TEST_F(HttpNetworkTransactionTest, ThrottlingPrioritySetDestroy) { |
+ TestNetworkStreamThrottler* throttler(nullptr); |
+ std::unique_ptr<HttpNetworkSession> session( |
+ CreateSessionWithThrottler(&session_deps_, &throttler)); |
+ |
+ // Send a simple request and make sure it goes through. |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ MockWrite data_writes[] = { |
+ MockWrite("GET / HTTP/1.1\r\n" |
+ "Host: www.example.org\r\n" |
+ "Connection: keep-alive\r\n\r\n"), |
+ }; |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.0 200 OK\r\n\r\n"), MockRead("hello world"), |
+ MockRead(SYNCHRONOUS, OK), |
+ }; |
+ StaticSocketDataProvider reads(data_reads, arraysize(data_reads), data_writes, |
+ arraysize(data_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&reads); |
+ |
+ StaticSocketDataProvider reads1(data_reads, arraysize(data_reads), |
+ data_writes, arraysize(data_writes)); |
+ session_deps_.socket_factory->AddSocketDataProvider(&reads1); |
+ |
+ // Start a request that will be throttled at start; confirm it |
+ // doesn't complete. |
+ throttler->set_throttle_new_requests(true); |
+ std::unique_ptr<HttpTransaction> trans( |
+ new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); |
+ |
+ TestCompletionCallback callback; |
+ int rv = trans->Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_EQ(ERR_IO_PENDING, rv); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(LOAD_STATE_THROTTLED, trans->GetLoadState()); |
+ EXPECT_FALSE(callback.have_result()); |
+ |
+ // Arrange for the set priority call on the above transaction to delete |
+ // the transaction. |
+ HttpTransaction* trans_ptr(trans.get()); |
+ throttler->set_priority_change_closure( |
+ base::Bind(&DestroyTransaction, base::Passed(&trans))); |
+ |
+ // Call it and check results (partially a "doesn't crash" test). |
+ trans_ptr->SetPriority(IDLE); |
+ trans_ptr = nullptr; // No longer a valid pointer. |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_FALSE(callback.have_result()); |
+} |
+ |
#if !defined(OS_IOS) |
TEST_F(HttpNetworkTransactionTest, TokenBindingSpdy) { |
const std::string https_url = "https://www.example.com"; |