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

Unified Diff: net/http/http_network_transaction_unittest.cc

Issue 1901533002: Implementation of network level throttler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Destroy transaction before session in QuicUploadWriteError. Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/http/http_network_transaction.cc ('k') | net/http/http_stream_factory_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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";
« no previous file with comments | « net/http/http_network_transaction.cc ('k') | net/http/http_stream_factory_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698