| Index: net/url_request/url_request_unittest.cc
|
| diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
|
| index 4de15b47d7a14b482d6a0cab7f299e0d3cf3a462..a91224a5ed3b14afa109635d17b87baa318bd437 100644
|
| --- a/net/url_request/url_request_unittest.cc
|
| +++ b/net/url_request/url_request_unittest.cc
|
| @@ -388,17 +388,7 @@
|
| USER_CALLBACK, // User takes care of doing a callback. |retval_| and
|
| // |auth_retval_| are ignored. In every blocking stage the
|
| // message loop is quit.
|
| - USER_NOTIFY, // User is notified by a provided callback of the
|
| - // blocking, and synchronously returns instructions
|
| - // for handling it.
|
| };
|
| -
|
| - using NotificationCallback =
|
| - base::Callback<Error(const CompletionCallback&, const URLRequest*)>;
|
| -
|
| - using NotificationAuthCallback =
|
| - base::Callback<NetworkDelegate::AuthRequiredResponse(const AuthCallback&,
|
| - const URLRequest*)>;
|
|
|
| // Creates a delegate which does not block at all.
|
| explicit BlockingNetworkDelegate(BlockMode block_mode);
|
| @@ -436,17 +426,6 @@
|
| block_on_ = block_on;
|
| }
|
|
|
| - // Only valid if |block_mode_| == USER_NOTIFY
|
| - void set_notification_callback(
|
| - const NotificationCallback& notification_callback) {
|
| - notification_callback_ = notification_callback;
|
| - }
|
| -
|
| - void set_notification_auth_callback(
|
| - const NotificationAuthCallback& notification_auth_callback) {
|
| - notification_auth_callback_ = notification_auth_callback;
|
| - }
|
| -
|
| // Allows the user to check in which state did we block.
|
| Stage stage_blocked_for_callback() const {
|
| EXPECT_EQ(USER_CALLBACK, block_mode_);
|
| @@ -485,9 +464,7 @@
|
|
|
| // Checks whether we should block in |stage|. If yes, returns an error code
|
| // and optionally sets up callback based on |block_mode_|. If no, returns OK.
|
| - int MaybeBlockStage(Stage stage,
|
| - const URLRequest* request,
|
| - const CompletionCallback& callback);
|
| + int MaybeBlockStage(Stage stage, const CompletionCallback& callback);
|
|
|
| // Configuration parameters, can be adjusted by public methods:
|
| const BlockMode block_mode_;
|
| @@ -513,10 +490,6 @@
|
| // Callback objects stored during blocking stages.
|
| CompletionCallback callback_;
|
| AuthCallback auth_callback_;
|
| -
|
| - // Callback to request user instructions for blocking.
|
| - NotificationCallback notification_callback_;
|
| - NotificationAuthCallback notification_auth_callback_;
|
|
|
| base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_;
|
|
|
| @@ -577,7 +550,7 @@
|
| if (!redirect_url_.is_empty())
|
| *new_url = redirect_url_;
|
|
|
| - return MaybeBlockStage(ON_BEFORE_URL_REQUEST, request, callback);
|
| + return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback);
|
| }
|
|
|
| int BlockingNetworkDelegate::OnBeforeStartTransaction(
|
| @@ -586,7 +559,7 @@
|
| HttpRequestHeaders* headers) {
|
| TestNetworkDelegate::OnBeforeStartTransaction(request, callback, headers);
|
|
|
| - return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, request, callback);
|
| + return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback);
|
| }
|
|
|
| int BlockingNetworkDelegate::OnHeadersReceived(
|
| @@ -601,7 +574,7 @@
|
| override_response_headers,
|
| allowed_unsafe_redirect_url);
|
|
|
| - return MaybeBlockStage(ON_HEADERS_RECEIVED, request, callback);
|
| + return MaybeBlockStage(ON_HEADERS_RECEIVED, callback);
|
| }
|
|
|
| NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired(
|
| @@ -639,11 +612,6 @@
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
|
| return AUTH_REQUIRED_RESPONSE_IO_PENDING;
|
| -
|
| - case USER_NOTIFY:
|
| - // If the callback returns ERR_IO_PENDING, the user has accepted
|
| - // responsibility for running the callback in the future.
|
| - return notification_auth_callback_.Run(callback, request);
|
| }
|
| NOTREACHED();
|
| return AUTH_REQUIRED_RESPONSE_NO_ACTION; // Dummy value.
|
| @@ -658,7 +626,6 @@
|
|
|
| int BlockingNetworkDelegate::MaybeBlockStage(
|
| BlockingNetworkDelegate::Stage stage,
|
| - const URLRequest* request,
|
| const CompletionCallback& callback) {
|
| // Check that the user has provided callback for the previous blocked stage.
|
| EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
|
| @@ -684,11 +651,6 @@
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
|
| return ERR_IO_PENDING;
|
| -
|
| - case USER_NOTIFY:
|
| - // If the callback returns ERR_IO_PENDING, the user has accepted
|
| - // responsibility for running the callback in the future.
|
| - return notification_callback_.Run(callback, request);
|
| }
|
| NOTREACHED();
|
| return 0;
|
| @@ -7845,7 +7807,7 @@
|
| EXPECT_FALSE(req->response_info().network_accessed);
|
| }
|
|
|
| -// Test that a single job with a THROTTLED priority completes
|
| +// Test that a single job with a throttled priority completes
|
| // correctly in the absence of contention.
|
| TEST_F(URLRequestTestHTTP, ThrottledPriority) {
|
| ASSERT_TRUE(http_test_server()->Start());
|
| @@ -7858,281 +7820,6 @@
|
| base::RunLoop().Run();
|
|
|
| EXPECT_TRUE(req->status().is_success());
|
| -}
|
| -
|
| -// A class to hold state for responding to USER_NOTIFY callbacks from
|
| -// BlockingNetworkDelegate. It also accepts a RunLoop that will be
|
| -// signaled via QuitWhenIdle() when any request is blocked.
|
| -//
|
| -class NotificationCallbackHandler {
|
| - public:
|
| - // Default constructed object doesn't block anything.
|
| - NotificationCallbackHandler() : run_loop_(nullptr) {}
|
| -
|
| - void AddURLRequestToBlockList(const URLRequest* request) {
|
| - requests_to_block_.insert(request);
|
| - }
|
| -
|
| - Error ShouldBlockRequest(const CompletionCallback& callback,
|
| - const URLRequest* request) {
|
| - if (requests_to_block_.find(request) == requests_to_block_.end()) {
|
| - return OK;
|
| - }
|
| -
|
| - DCHECK(blocked_callbacks_.find(request) == blocked_callbacks_.end());
|
| - blocked_callbacks_[request] = callback;
|
| - if (run_loop_ && blocked_callbacks_.size() == requests_to_block_.size())
|
| - run_loop_->QuitWhenIdle();
|
| - return ERR_IO_PENDING;
|
| - }
|
| -
|
| - // Erases object's memory of blocked callbacks as a side effect.
|
| - void GetBlockedCallbacks(
|
| - std::map<const URLRequest*, CompletionCallback>* blocked_callbacks) {
|
| - blocked_callbacks_.swap(*blocked_callbacks);
|
| - }
|
| -
|
| - // Set a RunLoop that, if non-null, will be signaled if any request
|
| - // is blocked. It is the callers responsibility to make sure the
|
| - // passed object lives past the destruction of this class or
|
| - // next call to SetRunLoop().
|
| - void SetRunLoop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
|
| -
|
| - private:
|
| - std::set<const URLRequest*> requests_to_block_;
|
| - std::map<const URLRequest*, CompletionCallback> blocked_callbacks_;
|
| -
|
| - base::RunLoop* run_loop_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(NotificationCallbackHandler);
|
| -};
|
| -
|
| -TEST_F(URLRequestTestHTTP, MultiThrottledPriority) {
|
| - ASSERT_TRUE(http_test_server()->Start());
|
| -
|
| - base::RunLoop run_until_request_blocked;
|
| -
|
| - NotificationCallbackHandler notification_handler;
|
| - notification_handler.SetRunLoop(&run_until_request_blocked);
|
| - BlockingNetworkDelegate network_delegate(
|
| - BlockingNetworkDelegate::USER_NOTIFY);
|
| - network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
|
| - network_delegate.set_notification_callback(
|
| - base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
|
| - // Both objects are owned by this function, and
|
| - // |*network_delegate| will be destroyed first, so
|
| - // it's safe to pass it an unretained pointer.
|
| - base::Unretained(¬ification_handler)));
|
| -
|
| - TestURLRequestContext context(true);
|
| - context.set_network_delegate(&network_delegate);
|
| - context.Init();
|
| -
|
| - // Use different test URLs to make sure all three requests turn into
|
| - // HttpNetworkTransacations. Use different URLRequest::Delegates so that
|
| - // the requests may be waited on separately.
|
| - TestDelegate d1;
|
| - std::unique_ptr<URLRequest> req1(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/l"), THROTTLED, &d1));
|
| - notification_handler.AddURLRequestToBlockList(req1.get());
|
| -
|
| - TestDelegate d2;
|
| - std::unique_ptr<URLRequest> req2(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/2"), THROTTLED, &d2));
|
| - notification_handler.AddURLRequestToBlockList(req2.get());
|
| -
|
| - TestDelegate d3;
|
| - std::unique_ptr<URLRequest> req3(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/3"), THROTTLED, &d3));
|
| - req1->Start();
|
| - req2->Start();
|
| - req3->Start();
|
| - run_until_request_blocked.Run();
|
| - notification_handler.SetRunLoop(nullptr);
|
| -
|
| - // The first two requests should be blocked based on the notification
|
| - // callback, and their status should have blocked the third request
|
| - // through throttling.
|
| - EXPECT_TRUE(req1->status().is_io_pending());
|
| - EXPECT_TRUE(req2->status().is_io_pending());
|
| - EXPECT_TRUE(req3->status().is_io_pending());
|
| -
|
| - std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
|
| - notification_handler.GetBlockedCallbacks(&blocked_callbacks);
|
| - ASSERT_EQ(2u, blocked_callbacks.size());
|
| - ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
|
| - ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
|
| -
|
| - // Unblocking one of the requests blocked on the notification callback
|
| - // should let it complete, which should then let the third request
|
| - // complete. Unblock the second request, then wait for the third
|
| - // request to complete.
|
| - // TODO(rdsmith): Find something to wait on other than the third
|
| - // requests completion; if there's a bug in throttling, that will
|
| - // result in this test hanging rather than failing quickly.
|
| - d1.set_quit_on_complete(false);
|
| - d2.set_quit_on_complete(false);
|
| - d3.set_quit_on_complete(true);
|
| - blocked_callbacks[req2.get()].Run(OK);
|
| - base::RunLoop().Run();
|
| -
|
| - notification_handler.GetBlockedCallbacks(&blocked_callbacks);
|
| - EXPECT_EQ(0u, blocked_callbacks.size());
|
| - EXPECT_TRUE(req1->status().is_io_pending());
|
| - // req3 is only unblocked after req2 completes, so req2's
|
| - // success is guaranteed at this point in the function.
|
| - EXPECT_EQ(URLRequestStatus::SUCCESS, req2->status().status());
|
| - EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
|
| -}
|
| -
|
| -// Confirm that failing a request unblocks following requests.
|
| -TEST_F(URLRequestTestHTTP, ThrottledFailure) {
|
| - ASSERT_TRUE(http_test_server()->Start());
|
| -
|
| - base::RunLoop run_until_request_blocked;
|
| -
|
| - NotificationCallbackHandler notification_handler;
|
| - notification_handler.SetRunLoop(&run_until_request_blocked);
|
| - BlockingNetworkDelegate network_delegate(
|
| - BlockingNetworkDelegate::USER_NOTIFY);
|
| - network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
|
| - network_delegate.set_notification_callback(
|
| - base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
|
| - // Both objects are owned by this function, and
|
| - // |*network_delegate| will be destroyed first, so
|
| - // it's safe to pass it an unretained pointer.
|
| - base::Unretained(¬ification_handler)));
|
| -
|
| - TestURLRequestContext context(true);
|
| - context.set_network_delegate(&network_delegate);
|
| - context.Init();
|
| -
|
| - // Use different test URLs to make sure all three requests turn into
|
| - // HttpNetworkTransacations. Use different URLRequest::Delegates so that
|
| - // the requests may be waited on separately.
|
| - TestDelegate d1;
|
| - std::unique_ptr<URLRequest> req1(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/l"), THROTTLED, &d1));
|
| - notification_handler.AddURLRequestToBlockList(req1.get());
|
| -
|
| - TestDelegate d2;
|
| - std::unique_ptr<URLRequest> req2(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/2"), THROTTLED, &d2));
|
| - notification_handler.AddURLRequestToBlockList(req2.get());
|
| -
|
| - TestDelegate d3;
|
| - std::unique_ptr<URLRequest> req3(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/3"), THROTTLED, &d3));
|
| - req1->Start();
|
| - req2->Start();
|
| - req3->Start();
|
| - run_until_request_blocked.Run();
|
| - notification_handler.SetRunLoop(nullptr);
|
| -
|
| - // The first two requests should be blocked based on the notification
|
| - // callback, and their status should have blocked the third request
|
| - // through throttling.
|
| - EXPECT_TRUE(req1->status().is_io_pending());
|
| - EXPECT_TRUE(req2->status().is_io_pending());
|
| - EXPECT_TRUE(req3->status().is_io_pending());
|
| -
|
| - std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
|
| - notification_handler.GetBlockedCallbacks(&blocked_callbacks);
|
| - ASSERT_EQ(2u, blocked_callbacks.size());
|
| - ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
|
| - ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
|
| -
|
| - // Confirm canceling one of the outstanding requests allows the
|
| - // blocked request to complete.
|
| -
|
| - // TODO(rdsmith): Find something to wait on other than the third
|
| - // requests completion; if there's a bug in throttling, that will
|
| - // result in this test hanging rather than failing quickly.
|
| - d1.set_quit_on_complete(false);
|
| - d2.set_quit_on_complete(false);
|
| - d3.set_quit_on_complete(true);
|
| - req2->Cancel();
|
| - base::RunLoop().Run();
|
| -
|
| - notification_handler.GetBlockedCallbacks(&blocked_callbacks);
|
| - EXPECT_EQ(0u, blocked_callbacks.size());
|
| - EXPECT_TRUE(req1->status().is_io_pending());
|
| - EXPECT_EQ(URLRequestStatus::CANCELED, req2->status().status());
|
| - EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
|
| -}
|
| -
|
| -TEST_F(URLRequestTestHTTP, ThrottledRepriUnblock) {
|
| - ASSERT_TRUE(http_test_server()->Start());
|
| -
|
| - base::RunLoop run_until_request_blocked;
|
| -
|
| - NotificationCallbackHandler notification_handler;
|
| - notification_handler.SetRunLoop(&run_until_request_blocked);
|
| - BlockingNetworkDelegate network_delegate(
|
| - BlockingNetworkDelegate::USER_NOTIFY);
|
| - network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
|
| - network_delegate.set_notification_callback(
|
| - base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
|
| - // Both objects are owned by this function, and
|
| - // |*network_delegate| will be destroyed first, so
|
| - // it's safe to pass it an unretained pointer.
|
| - base::Unretained(¬ification_handler)));
|
| -
|
| - TestURLRequestContext context(true);
|
| - context.set_network_delegate(&network_delegate);
|
| - context.Init();
|
| -
|
| - // Use different test URLs to make sure all three requests turn into
|
| - // HttpNetworkTransacations. Use different URLRequest::Delegates so that
|
| - // the requests may be waited on separately.
|
| - TestDelegate d1;
|
| - std::unique_ptr<URLRequest> req1(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/l"), THROTTLED, &d1));
|
| - notification_handler.AddURLRequestToBlockList(req1.get());
|
| -
|
| - TestDelegate d2;
|
| - std::unique_ptr<URLRequest> req2(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/2"), THROTTLED, &d2));
|
| - notification_handler.AddURLRequestToBlockList(req2.get());
|
| -
|
| - TestDelegate d3;
|
| - std::unique_ptr<URLRequest> req3(context.CreateRequest(
|
| - http_test_server()->GetURL("/echoall/3"), THROTTLED, &d3));
|
| - req1->Start();
|
| - req2->Start();
|
| - req3->Start();
|
| - run_until_request_blocked.Run();
|
| - notification_handler.SetRunLoop(nullptr);
|
| -
|
| - // The first two requests should be blocked based on the notification
|
| - // callback, and their status should have blocked the third request
|
| - // through throttling.
|
| - EXPECT_TRUE(req1->status().is_io_pending());
|
| - EXPECT_TRUE(req2->status().is_io_pending());
|
| - EXPECT_TRUE(req3->status().is_io_pending());
|
| -
|
| - std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
|
| - notification_handler.GetBlockedCallbacks(&blocked_callbacks);
|
| - ASSERT_EQ(2u, blocked_callbacks.size());
|
| - ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
|
| - ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
|
| -
|
| - // Confirm raising the priority of the third request allows it to complete.
|
| -
|
| - // TODO(rdsmith): Find something to wait on other than the third
|
| - // requests completion; if there's a bug in throttling, that will
|
| - // result in this test hanging rather than failing quickly.
|
| - d1.set_quit_on_complete(false);
|
| - d2.set_quit_on_complete(false);
|
| - d3.set_quit_on_complete(true);
|
| - req3->SetPriority(IDLE);
|
| - base::RunLoop().Run();
|
| -
|
| - notification_handler.GetBlockedCallbacks(&blocked_callbacks);
|
| - EXPECT_EQ(0u, blocked_callbacks.size());
|
| - EXPECT_TRUE(req1->status().is_io_pending());
|
| - EXPECT_TRUE(req2->status().is_io_pending());
|
| - EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
|
| }
|
|
|
| TEST_F(URLRequestTestHTTP, RawBodyBytesNoContentEncoding) {
|
|
|