Index: content/browser/loader/throttling_resource_handler_unittest.cc |
diff --git a/content/browser/loader/throttling_resource_handler_unittest.cc b/content/browser/loader/throttling_resource_handler_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cc8525ba4a6a5871dc88eeaf8ade2f059e7fa6a1 |
--- /dev/null |
+++ b/content/browser/loader/throttling_resource_handler_unittest.cc |
@@ -0,0 +1,857 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/loader/throttling_resource_handler.h" |
+ |
+#include <memory> |
+ |
+#include "base/macros.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/memory/scoped_vector.h" |
+#include "base/message_loop/message_loop.h" |
+#include "content/browser/loader/mock_resource_loader.h" |
+#include "content/browser/loader/resource_request_info_impl.h" |
+#include "content/browser/loader/test_resource_handler.h" |
+#include "content/public/browser/resource_throttle.h" |
+#include "content/public/common/resource_response.h" |
+#include "net/base/request_priority.h" |
+#include "net/url_request/redirect_info.h" |
+#include "net/url_request/url_request.h" |
+#include "net/url_request/url_request_test_util.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "url/gurl.h" |
+ |
+namespace content { |
+namespace { |
+ |
+const char kInitialUrl[] = "http://initial/"; |
+const char kRedirectUrl[] = "http://redirect/"; |
+ |
+class TestResourceThrottle : public ResourceThrottle { |
+ public: |
+ explicit TestResourceThrottle(TestResourceThrottle* previous_throttle) { |
+ if (previous_throttle) { |
+ DCHECK(!previous_throttle->next_throttle_); |
+ previous_throttle_ = previous_throttle; |
+ previous_throttle_->next_throttle_ = this; |
+ } |
+ } |
+ |
+ ~TestResourceThrottle() override {} |
+ |
+ // Sets the throttle after this one, to enable checks that they're called in |
+ // the expected order. |
+ void SetNextThrottle(TestResourceThrottle* throttle) { |
+ DCHECK(!next_throttle_); |
+ DCHECK(!throttle->previous_throttle_); |
+ |
+ next_throttle_ = throttle; |
+ throttle->previous_throttle_ = this; |
+ } |
+ |
+ // ResourceThrottle implemenation: |
+ |
+ void WillStartRequest(bool* defer) override { |
+ EXPECT_EQ(0, will_start_request_called_); |
+ EXPECT_EQ(0, will_redirect_request_called_); |
+ EXPECT_EQ(0, will_process_response_called_); |
+ |
+ if (previous_throttle_) { |
+ EXPECT_EQ(1, previous_throttle_->will_start_request_called_); |
+ EXPECT_EQ(0, previous_throttle_->will_redirect_request_called_); |
+ EXPECT_EQ(0, previous_throttle_->will_process_response_called_); |
+ } |
+ |
+ if (next_throttle_) { |
+ EXPECT_EQ(0, next_throttle_->will_start_request_called_); |
+ EXPECT_EQ(0, next_throttle_->will_redirect_request_called_); |
+ EXPECT_EQ(0, next_throttle_->will_process_response_called_); |
+ } |
+ |
+ ++will_start_request_called_; |
+ *defer = defer_on_will_start_request_; |
+ if (cancel_on_will_start_request_) |
+ CancelWithError(net::ERR_UNEXPECTED); |
+ } |
+ |
+ void WillRedirectRequest(const net::RedirectInfo& redirect_info, |
+ bool* defer) override { |
+ EXPECT_EQ(GURL(kRedirectUrl), redirect_info.new_url); |
+ |
+ EXPECT_EQ(1, will_start_request_called_); |
+ // None of these tests use multiple redirects. |
+ EXPECT_EQ(0, will_redirect_request_called_); |
+ EXPECT_EQ(0, will_process_response_called_); |
+ |
+ if (previous_throttle_) { |
+ EXPECT_EQ(1, previous_throttle_->will_start_request_called_); |
+ EXPECT_EQ(1, previous_throttle_->will_redirect_request_called_); |
+ EXPECT_EQ(0, previous_throttle_->will_process_response_called_); |
+ } |
+ |
+ if (next_throttle_) { |
+ EXPECT_EQ(1, next_throttle_->will_start_request_called_); |
+ EXPECT_EQ(0, next_throttle_->will_redirect_request_called_); |
+ EXPECT_EQ(0, next_throttle_->will_process_response_called_); |
+ } |
+ |
+ ++will_redirect_request_called_; |
+ *defer = defer_on_will_redirect_request_; |
+ if (cancel_on_will_redirect_request_) |
+ CancelWithError(net::ERR_UNEXPECTED); |
+ } |
+ |
+ void WillProcessResponse(bool* defer) override { |
+ EXPECT_EQ(0, will_process_response_called_); |
+ |
+ if (previous_throttle_) |
+ EXPECT_EQ(1, previous_throttle_->will_process_response_called_); |
+ |
+ if (next_throttle_) |
+ EXPECT_EQ(0, next_throttle_->will_process_response_called_); |
+ |
+ ++will_process_response_called_; |
+ *defer = defer_on_will_process_response_; |
+ if (cancel_on_will_process_response_) |
+ CancelWithError(net::ERR_UNEXPECTED); |
+ } |
+ |
+ const char* GetNameForLogging() const override { return "Hank"; } |
+ |
+ int will_start_request_called() const { return will_start_request_called_; } |
+ int will_redirect_request_called() const { |
+ return will_redirect_request_called_; |
+ } |
+ int will_process_response_called() const { |
+ return will_process_response_called_; |
+ } |
+ |
+ void set_defer_on_will_start_request(bool defer_on_will_start_request) { |
+ defer_on_will_start_request_ = defer_on_will_start_request; |
+ } |
+ void set_defer_on_will_redirect_request(bool defer_on_will_redirect_request) { |
+ defer_on_will_redirect_request_ = defer_on_will_redirect_request; |
+ } |
+ void set_defer_on_will_process_response(bool defer_on_will_process_response) { |
+ defer_on_will_process_response_ = defer_on_will_process_response; |
+ } |
+ |
+ void set_cancel_on_will_start_request(bool cancel_on_will_start_request) { |
+ cancel_on_will_start_request_ = cancel_on_will_start_request; |
+ } |
+ void set_cancel_on_will_redirect_request( |
+ bool cancel_on_will_redirect_request) { |
+ cancel_on_will_redirect_request_ = cancel_on_will_redirect_request; |
+ } |
+ void set_cancel_on_will_process_response( |
+ bool cancel_on_will_process_response) { |
+ cancel_on_will_process_response_ = cancel_on_will_process_response; |
+ } |
+ |
+ using ResourceThrottle::Resume; |
+ using ResourceThrottle::CancelWithError; |
+ |
+ private: |
+ int will_start_request_called_ = 0; |
+ int will_redirect_request_called_ = 0; |
+ int will_process_response_called_ = 0; |
+ |
+ bool defer_on_will_start_request_ = false; |
+ bool defer_on_will_redirect_request_ = false; |
+ bool defer_on_will_process_response_ = false; |
+ |
+ bool cancel_on_will_start_request_ = false; |
+ bool cancel_on_will_redirect_request_ = false; |
+ bool cancel_on_will_process_response_ = false; |
+ |
+ TestResourceThrottle* previous_throttle_ = nullptr; |
+ TestResourceThrottle* next_throttle_ = nullptr; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestResourceThrottle); |
+}; |
+ |
+class ThrottlingResourceHandlerTest : public testing::Test { |
+ public: |
+ ThrottlingResourceHandlerTest() |
+ : never_started_url_request_(request_context_.CreateRequest( |
+ GURL(kInitialUrl), |
+ net::DEFAULT_PRIORITY, |
+ &never_started_url_request_delegate_)), |
+ throttle1_(new TestResourceThrottle(nullptr)), |
+ throttle2_(new TestResourceThrottle(throttle1_)), |
+ test_handler_(new TestResourceHandler()) { |
+ ScopedVector<ResourceThrottle> throttles; |
+ throttles.push_back(base::WrapUnique(throttle1_)); |
+ throttles.push_back(base::WrapUnique(throttle2_)); |
+ throttling_handler_.reset(new ThrottlingResourceHandler( |
+ base::WrapUnique(test_handler_), never_started_url_request_.get(), |
+ std::move(throttles))); |
+ mock_loader_.reset(new MockResourceLoader(throttling_handler_.get())); |
+ |
+ // Basic initial state sanity checks. |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ } |
+ |
+ // Finish the request with a 0-byte read and success. All of this is just |
+ // passed through to the TestResourceHandler, so is uninterested for these |
Randy Smith (Not in Mondays)
2016/12/20 22:16:41
nit: "is uninterested" ?
mmenke
2017/01/04 22:02:29
Done.
|
+ // tests. |
+ void FinishRequestSuccessfully() { |
+ EXPECT_EQ(0, test_handler_->on_will_read_called()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(1)); |
+ EXPECT_EQ(1, test_handler_->on_will_read_called()); |
+ EXPECT_EQ(0, test_handler_->on_read_completed_called()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnReadCompleted(0)); |
+ EXPECT_EQ(1, test_handler_->on_read_completed_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_completed_called()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::OK))); |
+ EXPECT_EQ(net::OK, mock_loader_->error_code()); |
+ EXPECT_EQ(1, test_handler_->on_read_completed_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+ } |
+ |
+ protected: |
+ // Needs to be first, so it's destroyed last. |
+ base::MessageLoopForIO message_loop_; |
+ |
+ // Machinery to construct a URLRequest that's just used as an argument to |
+ // methods that expect one, and is never actually started. |
+ net::TestURLRequestContext request_context_; |
+ net::TestDelegate never_started_url_request_delegate_; |
+ std::unique_ptr<net::URLRequest> never_started_url_request_; |
+ |
+ // Owned by test_handler_; |
+ TestResourceThrottle* throttle1_; |
+ TestResourceThrottle* throttle2_; |
+ |
+ // Owned by |throttling_handler_|. |
+ TestResourceHandler* test_handler_; |
+ std::unique_ptr<ThrottlingResourceHandler> throttling_handler_; |
+ std::unique_ptr<MockResourceLoader> mock_loader_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ThrottlingResourceHandlerTest); |
+}; |
+ |
+TEST_F(ThrottlingResourceHandlerTest, Sync) { |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ |
+ net::RedirectInfo redirect_info; |
+ redirect_info.status_code = 301; |
+ redirect_info.new_url = GURL(kRedirectUrl); |
+ ASSERT_EQ( |
+ MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnRequestRedirected(redirect_info, new ResourceResponse())); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_redirect_request_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseStarted(new ResourceResponse())); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ EXPECT_EQ(1, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(0, test_handler_->on_read_completed_called()); |
+ |
+ FinishRequestSuccessfully(); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, Async) { |
+ throttle1_->set_defer_on_will_start_request(true); |
+ throttle1_->set_defer_on_will_redirect_request(true); |
+ throttle1_->set_defer_on_will_process_response(true); |
+ |
+ throttle2_->set_defer_on_will_start_request(true); |
+ throttle2_->set_defer_on_will_redirect_request(true); |
+ throttle2_->set_defer_on_will_process_response(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ |
+ throttle1_->Resume(); |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->status()); |
+ |
+ throttle2_->Resume(); |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
+ |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ net::RedirectInfo redirect_info; |
+ redirect_info.status_code = 301; |
+ redirect_info.new_url = GURL(kRedirectUrl); |
+ ASSERT_EQ( |
+ MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnRequestRedirected(redirect_info, new ResourceResponse())); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ |
+ throttle1_->Resume(); |
+ EXPECT_EQ(1, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->status()); |
+ |
+ throttle2_->Resume(); |
+ EXPECT_EQ(1, test_handler_->on_request_redirected_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
+ |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnResponseStarted(new ResourceResponse())); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ throttle1_->Resume(); |
+ EXPECT_EQ(1, throttle2_->will_process_response_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->status()); |
+ |
+ throttle2_->Resume(); |
+ EXPECT_EQ(1, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(0, test_handler_->on_read_completed_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
+ |
+ FinishRequestSuccessfully(); |
+} |
+ |
+// For a given method (WillStartRequest, WillRedirectRequest, |
+// WillProcessResponse), each of the two throttles can cancel asynchronously or |
+// synchronously, and the second throttle can cancel synchronously or |
+// asynchronously after the first throttle completes synchronously or |
+// asynchronously, for a total of 6 combinations. However: |
Randy Smith (Not in Mondays)
2016/12/20 22:16:42
This comment is true if all that is being tested i
mmenke
2017/01/04 22:02:29
Done.
|
+// 1) Whenever the second throttle cancels asynchronously, it doesn't matter if |
+// the first one completed synchronously or asynchronously, the state when it |
+// cancels is the same. |
+// 2) The second cancelling asynchronously is much like the first one |
+// cancelling asynchronously, so isn't worth testing individually. |
+// 3) Similarly, the second cancelling synchronously after the first one |
+// completes synchronously doesn't really add anything to the first cancelling |
+// synchronously. |
+// So that leaves 3 interesting test cases for each of the three points |
+// throttles can cancel. |
+ |
+TEST_F(ThrottlingResourceHandlerTest, FirstThrottleSyncCancelOnWillStart) { |
+ throttle1_->set_cancel_on_will_start_request(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
Randy Smith (Not in Mondays)
2016/12/20 22:16:41
Worth a comment that this the the "URLRequest" res
mmenke
2017/01/04 22:02:29
Done.
|
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
Randy Smith (Not in Mondays)
2016/12/20 22:16:42
I wonder if it's worthwhile putting in a helper ro
mmenke
2017/01/04 22:02:29
TestHandler already does that, but I'm not sure th
Randy Smith (Not in Mondays)
2017/01/11 19:57:15
Acknowledged.
|
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, FirstThrottleAsyncCancelOnWillStart) { |
+ throttle1_->set_defer_on_will_start_request(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ |
+ throttle1_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+// The first throttle also defers and then resumes the request. |
Randy Smith (Not in Mondays)
2016/12/20 22:16:41
I presume this is because that's a "more complex"
mmenke
2017/01/04 22:02:29
It's so that it's a sync cancel with ThrottlingRes
Randy Smith (Not in Mondays)
2017/01/11 19:57:15
After several flip-flops, I agree with you--the di
|
+TEST_F(ThrottlingResourceHandlerTest, SecondThrottleSyncCancelOnWillStart) { |
+ throttle1_->set_defer_on_will_start_request(true); |
+ throttle2_->set_cancel_on_will_start_request(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ |
+ throttle1_->Resume(); |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, |
+ FirstThrottleSyncCancelOnRequestRedirected) { |
+ throttle1_->set_cancel_on_will_redirect_request(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ net::RedirectInfo redirect_info; |
+ redirect_info.status_code = 301; |
+ redirect_info.new_url = GURL(kRedirectUrl); |
+ ASSERT_EQ( |
+ MockResourceLoader::Status::CANCELED, |
+ mock_loader_->OnRequestRedirected(redirect_info, new ResourceResponse())); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, |
+ FirstThrottleAsyncCancelOnRequestRedirected) { |
+ throttle1_->set_defer_on_will_redirect_request(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ net::RedirectInfo redirect_info; |
+ redirect_info.status_code = 301; |
+ redirect_info.new_url = GURL(kRedirectUrl); |
+ ASSERT_EQ( |
+ MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnRequestRedirected(redirect_info, new ResourceResponse())); |
+ |
+ throttle1_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+// The first throttle also defers and then resumes the request. |
+TEST_F(ThrottlingResourceHandlerTest, |
+ SecondThrottleSyncCancelOnRequestRedirected) { |
+ throttle1_->set_defer_on_will_redirect_request(true); |
+ throttle2_->set_cancel_on_will_redirect_request(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ net::RedirectInfo redirect_info; |
+ redirect_info.status_code = 301; |
+ redirect_info.new_url = GURL(kRedirectUrl); |
+ ASSERT_EQ( |
+ MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnRequestRedirected(redirect_info, new ResourceResponse())); |
+ |
+ throttle1_->Resume(); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(1, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, |
+ FirstThrottleSyncCancelOnWillProcessResponse) { |
+ throttle1_->set_cancel_on_will_process_response(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
+ mock_loader_->OnResponseStarted(new ResourceResponse())); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, |
+ FirstThrottleAsyncCancelOnWillProcessResponse) { |
+ throttle1_->set_defer_on_will_process_response(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnResponseStarted(new ResourceResponse())); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ |
+ throttle1_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+// The first throttle also defers and then resumes the request. |
+TEST_F(ThrottlingResourceHandlerTest, |
+ SecondThrottleSyncCancelOnWillProcessResponse) { |
+ throttle1_->set_defer_on_will_process_response(true); |
+ throttle2_->set_cancel_on_will_process_response(true); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnResponseStarted(new ResourceResponse())); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ |
+ throttle1_->Resume(); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ EXPECT_EQ(1, throttle2_->will_process_response_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(1, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, OutOfBandCancelBeforeWillStart) { |
Randy Smith (Not in Mondays)
2016/12/20 22:16:41
As noted elsewhere, I'd like to understand the OOB
Randy Smith (Not in Mondays)
2017/01/11 19:57:15
As noted elsewhere, accepted for this CL.
|
+ throttle1_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ EXPECT_EQ(net::ERR_UNEXPECTED, mock_loader_->error_code()); |
+ |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(0, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, OutOfBandCancelAfterWillStart) { |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ throttle1_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ EXPECT_EQ(net::ERR_UNEXPECTED, mock_loader_->error_code()); |
+ |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, OutOfBandCancelAfterRequestRedirected) { |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ net::RedirectInfo redirect_info; |
+ redirect_info.status_code = 301; |
+ redirect_info.new_url = GURL(kRedirectUrl); |
+ EXPECT_EQ( |
+ MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnRequestRedirected(redirect_info, new ResourceResponse())); |
+ |
+ throttle1_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ EXPECT_EQ(net::ERR_UNEXPECTED, mock_loader_->error_code()); |
+ |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(1, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, OutOfBandCancelAfterResponseStarted) { |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ net::RedirectInfo redirect_info; |
+ redirect_info.status_code = 301; |
+ redirect_info.new_url = GURL(kRedirectUrl); |
+ EXPECT_EQ( |
+ MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnRequestRedirected(redirect_info, new ResourceResponse())); |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseStarted(new ResourceResponse())); |
+ |
+ throttle1_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ EXPECT_EQ(net::ERR_UNEXPECTED, mock_loader_->error_code()); |
+ |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(1, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(1, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(1, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(1, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(1, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, OutOfBandCancelAndResumeDuringWillStart) { |
+ throttle1_->set_defer_on_will_start_request(1); |
+ EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ // |throttle2_| cancels. |
+ throttle2_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ EXPECT_EQ(net::ERR_UNEXPECTED, mock_loader_->error_code()); |
+ |
+ // |throttle1_|, blissfully unaware of cancellation, resumes the request. |
+ throttle1_->Resume(); |
+ |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+TEST_F(ThrottlingResourceHandlerTest, DoubleCancelDuringWillStart) { |
+ throttle1_->set_defer_on_will_start_request(1); |
+ EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader_->OnWillStart(GURL(kInitialUrl))); |
+ |
+ // |throttle2_| cancels. |
+ throttle2_->CancelWithError(net::ERR_UNEXPECTED); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ EXPECT_EQ(net::ERR_UNEXPECTED, mock_loader_->error_code()); |
+ |
+ // |throttle1_|, unaware of the cancellation, also cancels. |
+ throttle1_->CancelWithError(net::ERR_FAILED); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
+ EXPECT_EQ(net::ERR_UNEXPECTED, mock_loader_->error_code()); |
+ |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader_->OnResponseCompleted( |
+ net::URLRequestStatus::FromError(net::ERR_UNEXPECTED))); |
+ |
+ EXPECT_EQ(1, throttle1_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle1_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, throttle2_->will_start_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_redirect_request_called()); |
+ EXPECT_EQ(0, throttle2_->will_process_response_called()); |
+ |
+ EXPECT_EQ(0, test_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, test_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, test_handler_->on_response_started_called()); |
+ EXPECT_EQ(1, test_handler_->on_response_completed_called()); |
+} |
+ |
+} // namespace |
+} // namespace content |