| OLD | NEW | 
| (Empty) |  | 
 |    1 // Copyright 2017 The Chromium Authors. All rights reserved. | 
 |    2 // Use of this source code is governed by a BSD-style license that can be | 
 |    3 // found in the LICENSE file. | 
 |    4  | 
 |    5 #include "content/child/throttling_url_loader.h" | 
 |    6 #include "base/logging.h" | 
 |    7 #include "base/macros.h" | 
 |    8 #include "base/message_loop/message_loop.h" | 
 |    9 #include "base/run_loop.h" | 
 |   10 #include "content/common/url_loader.mojom.h" | 
 |   11 #include "content/common/url_loader_factory.mojom.h" | 
 |   12 #include "content/public/child/url_loader_throttle.h" | 
 |   13 #include "testing/gtest/include/gtest/gtest.h" | 
 |   14  | 
 |   15 namespace content { | 
 |   16 namespace { | 
 |   17  | 
 |   18 class TestURLLoaderFactory : public mojom::URLLoaderFactory { | 
 |   19  public: | 
 |   20   TestURLLoaderFactory() : binding_(this) { | 
 |   21     binding_.Bind(mojo::MakeRequest(&factory_ptr_)); | 
 |   22   } | 
 |   23  | 
 |   24   mojom::URLLoaderFactoryPtr& factory_ptr() { return factory_ptr_; } | 
 |   25   mojom::URLLoaderClientPtr& client_ptr() { return client_ptr_; } | 
 |   26  | 
 |   27   size_t create_loader_and_start_called() const { | 
 |   28     return create_loader_and_start_called_; | 
 |   29   } | 
 |   30  | 
 |   31   void NotifyClientOnReceiveResponse() { | 
 |   32     client_ptr_->OnReceiveResponse(ResourceResponseHead(), base::nullopt, | 
 |   33                                    nullptr); | 
 |   34   } | 
 |   35  | 
 |   36   void NotifyClientOnReceiveRedirect() { | 
 |   37     client_ptr_->OnReceiveRedirect(net::RedirectInfo(), ResourceResponseHead()); | 
 |   38   } | 
 |   39  | 
 |   40   void NotifyClientOnComplete(int error_code) { | 
 |   41     ResourceRequestCompletionStatus data; | 
 |   42     data.error_code = error_code; | 
 |   43     client_ptr_->OnComplete(data); | 
 |   44   } | 
 |   45  | 
 |   46  private: | 
 |   47   // mojom::URLLoaderFactory implementation. | 
 |   48   void CreateLoaderAndStart(mojom::URLLoaderAssociatedRequest request, | 
 |   49                             int32_t routing_id, | 
 |   50                             int32_t request_id, | 
 |   51                             uint32_t options, | 
 |   52                             const ResourceRequest& url_request, | 
 |   53                             mojom::URLLoaderClientPtr client) override { | 
 |   54     create_loader_and_start_called_++; | 
 |   55  | 
 |   56     client_ptr_ = std::move(client); | 
 |   57   } | 
 |   58  | 
 |   59   void SyncLoad(int32_t routing_id, | 
 |   60                 int32_t request_id, | 
 |   61                 const ResourceRequest& request, | 
 |   62                 SyncLoadCallback callback) override { | 
 |   63     NOTREACHED(); | 
 |   64   } | 
 |   65  | 
 |   66   size_t create_loader_and_start_called_ = 0; | 
 |   67  | 
 |   68   mojo::Binding<mojom::URLLoaderFactory> binding_; | 
 |   69   mojom::URLLoaderFactoryPtr factory_ptr_; | 
 |   70   mojom::URLLoaderClientPtr client_ptr_; | 
 |   71   DISALLOW_COPY_AND_ASSIGN(TestURLLoaderFactory); | 
 |   72 }; | 
 |   73  | 
 |   74 class TestURLLoaderClient : public mojom::URLLoaderClient { | 
 |   75  public: | 
 |   76   TestURLLoaderClient() {} | 
 |   77  | 
 |   78   size_t on_received_response_called() const { | 
 |   79     return on_received_response_called_; | 
 |   80   } | 
 |   81  | 
 |   82   size_t on_received_redirect_called() const { | 
 |   83     return on_received_redirect_called_; | 
 |   84   } | 
 |   85  | 
 |   86   size_t on_complete_called() const { return on_complete_called_; } | 
 |   87  | 
 |   88   using OnCompleteCallback = base::Callback<void(int error_code)>; | 
 |   89   void set_on_complete_callback(const OnCompleteCallback& callback) { | 
 |   90     on_complete_callback_ = callback; | 
 |   91   } | 
 |   92  | 
 |   93  private: | 
 |   94   // mojom::URLLoaderClient implementation: | 
 |   95   void OnReceiveResponse( | 
 |   96       const ResourceResponseHead& response_head, | 
 |   97       const base::Optional<net::SSLInfo>& ssl_info, | 
 |   98       mojom::DownloadedTempFilePtr downloaded_file) override { | 
 |   99     on_received_response_called_++; | 
 |  100   } | 
 |  101   void OnReceiveRedirect(const net::RedirectInfo& redirect_info, | 
 |  102                          const ResourceResponseHead& response_head) override { | 
 |  103     on_received_redirect_called_++; | 
 |  104   } | 
 |  105   void OnDataDownloaded(int64_t data_len, int64_t encoded_data_len) override {} | 
 |  106   void OnUploadProgress(int64_t current_position, | 
 |  107                         int64_t total_size, | 
 |  108                         OnUploadProgressCallback ack_callback) override {} | 
 |  109   void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {} | 
 |  110   void OnTransferSizeUpdated(int32_t transfer_size_diff) override {} | 
 |  111   void OnStartLoadingResponseBody( | 
 |  112       mojo::ScopedDataPipeConsumerHandle body) override {} | 
 |  113   void OnComplete(const ResourceRequestCompletionStatus& status) override { | 
 |  114     on_complete_called_++; | 
 |  115     if (on_complete_callback_) | 
 |  116       on_complete_callback_.Run(status.error_code); | 
 |  117   } | 
 |  118  | 
 |  119   size_t on_received_response_called_ = 0; | 
 |  120   size_t on_received_redirect_called_ = 0; | 
 |  121   size_t on_complete_called_ = 0; | 
 |  122  | 
 |  123   OnCompleteCallback on_complete_callback_; | 
 |  124  | 
 |  125   DISALLOW_COPY_AND_ASSIGN(TestURLLoaderClient); | 
 |  126 }; | 
 |  127  | 
 |  128 class TestURLLoaderThrottle : public URLLoaderThrottle { | 
 |  129  public: | 
 |  130   TestURLLoaderThrottle() {} | 
 |  131  | 
 |  132   using ThrottleCallback = | 
 |  133       base::Callback<void(URLLoaderThrottle::Delegate* delegate, bool* defer)>; | 
 |  134  | 
 |  135   size_t will_start_request_called() const { | 
 |  136     return will_start_request_called_; | 
 |  137   } | 
 |  138   size_t will_redirect_request_called() const { | 
 |  139     return will_redirect_request_called_; | 
 |  140   } | 
 |  141   size_t will_process_response_called() const { | 
 |  142     return will_process_response_called_; | 
 |  143   } | 
 |  144  | 
 |  145   void set_will_start_request_callback(const ThrottleCallback& callback) { | 
 |  146     will_start_request_callback_ = callback; | 
 |  147   } | 
 |  148  | 
 |  149   void set_will_redirect_request_callback(const ThrottleCallback& callback) { | 
 |  150     will_redirect_request_callback_ = callback; | 
 |  151   } | 
 |  152  | 
 |  153   void set_will_process_response_callback(const ThrottleCallback& callback) { | 
 |  154     will_process_response_callback_ = callback; | 
 |  155   } | 
 |  156  | 
 |  157   Delegate* delegate() const { return delegate_; } | 
 |  158  | 
 |  159  private: | 
 |  160   // URLLoaderThrottle implementation. | 
 |  161   void WillStartRequest(const GURL& url, | 
 |  162                         int load_flags, | 
 |  163                         ResourceType resource_type, | 
 |  164                         bool* defer) override { | 
 |  165     will_start_request_called_++; | 
 |  166     if (will_start_request_callback_) | 
 |  167       will_start_request_callback_.Run(delegate_, defer); | 
 |  168   } | 
 |  169  | 
 |  170   void WillRedirectRequest(const net::RedirectInfo& redirect_info, | 
 |  171                            bool* defer) override { | 
 |  172     will_redirect_request_called_++; | 
 |  173     if (will_redirect_request_callback_) | 
 |  174       will_redirect_request_callback_.Run(delegate_, defer); | 
 |  175   } | 
 |  176  | 
 |  177   void WillProcessResponse(bool* defer) override { | 
 |  178     will_process_response_called_++; | 
 |  179     if (will_process_response_callback_) | 
 |  180       will_process_response_callback_.Run(delegate_, defer); | 
 |  181   } | 
 |  182  | 
 |  183   size_t will_start_request_called_ = 0; | 
 |  184   size_t will_redirect_request_called_ = 0; | 
 |  185   size_t will_process_response_called_ = 0; | 
 |  186  | 
 |  187   ThrottleCallback will_start_request_callback_; | 
 |  188   ThrottleCallback will_redirect_request_callback_; | 
 |  189   ThrottleCallback will_process_response_callback_; | 
 |  190  | 
 |  191   DISALLOW_COPY_AND_ASSIGN(TestURLLoaderThrottle); | 
 |  192 }; | 
 |  193  | 
 |  194 class ThrottlingURLLoaderTest : public testing::Test { | 
 |  195  public: | 
 |  196   ThrottlingURLLoaderTest() {} | 
 |  197  | 
 |  198  protected: | 
 |  199   // testing::Test implementation. | 
 |  200   void SetUp() override { | 
 |  201     auto throttle = base::MakeUnique<TestURLLoaderThrottle>(); | 
 |  202     throttle_ = throttle.get(); | 
 |  203  | 
 |  204     throttles_.push_back(std::move(throttle)); | 
 |  205   } | 
 |  206  | 
 |  207   void CreateLoaderAndStart() { | 
 |  208     auto request = base::MakeUnique<ResourceRequest>(); | 
 |  209     request->url = GURL("http://example.org"); | 
 |  210     loader_ = ThrottlingURLLoader::CreateLoaderAndStart( | 
 |  211         factory_.factory_ptr().get(), std::move(throttles_), 0, 0, 0, | 
 |  212         std::move(request), &client_); | 
 |  213     factory_.factory_ptr().FlushForTesting(); | 
 |  214   } | 
 |  215  | 
 |  216   // Be the first member so it is destroyed last. | 
 |  217   base::MessageLoop message_loop_; | 
 |  218  | 
 |  219   std::unique_ptr<ThrottlingURLLoader> loader_; | 
 |  220   std::vector<std::unique_ptr<URLLoaderThrottle>> throttles_; | 
 |  221  | 
 |  222   TestURLLoaderFactory factory_; | 
 |  223   TestURLLoaderClient client_; | 
 |  224  | 
 |  225   // Owned by |throttles_| or |loader_|. | 
 |  226   TestURLLoaderThrottle* throttle_ = nullptr; | 
 |  227  | 
 |  228   DISALLOW_COPY_AND_ASSIGN(ThrottlingURLLoaderTest); | 
 |  229 }; | 
 |  230  | 
 |  231 TEST_F(ThrottlingURLLoaderTest, CancelBeforeStart) { | 
 |  232   throttle_->set_will_start_request_callback( | 
 |  233       base::Bind([](URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  234         delegate->CancelWithError(net::ERR_ACCESS_DENIED); | 
 |  235       })); | 
 |  236  | 
 |  237   base::RunLoop run_loop; | 
 |  238   client_.set_on_complete_callback(base::Bind( | 
 |  239       [](const base::Closure& quit_closure, int error) { | 
 |  240         EXPECT_EQ(net::ERR_ACCESS_DENIED, error); | 
 |  241         quit_closure.Run(); | 
 |  242       }, | 
 |  243       run_loop.QuitClosure())); | 
 |  244  | 
 |  245   CreateLoaderAndStart(); | 
 |  246   run_loop.Run(); | 
 |  247  | 
 |  248   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  249   EXPECT_EQ(0u, throttle_->will_redirect_request_called()); | 
 |  250   EXPECT_EQ(0u, throttle_->will_process_response_called()); | 
 |  251  | 
 |  252   EXPECT_EQ(0u, factory_.create_loader_and_start_called()); | 
 |  253  | 
 |  254   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  255   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  256   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  257 } | 
 |  258  | 
 |  259 TEST_F(ThrottlingURLLoaderTest, DeferBeforeStart) { | 
 |  260   throttle_->set_will_start_request_callback( | 
 |  261       base::Bind([](URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  262         *defer = true; | 
 |  263       })); | 
 |  264  | 
 |  265   base::RunLoop run_loop; | 
 |  266   client_.set_on_complete_callback(base::Bind( | 
 |  267       [](const base::Closure& quit_closure, int error) { | 
 |  268         EXPECT_EQ(net::OK, error); | 
 |  269         quit_closure.Run(); | 
 |  270       }, | 
 |  271       run_loop.QuitClosure())); | 
 |  272  | 
 |  273   CreateLoaderAndStart(); | 
 |  274  | 
 |  275   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  276   EXPECT_EQ(0u, throttle_->will_redirect_request_called()); | 
 |  277   EXPECT_EQ(0u, throttle_->will_process_response_called()); | 
 |  278  | 
 |  279   EXPECT_EQ(0u, factory_.create_loader_and_start_called()); | 
 |  280  | 
 |  281   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  282   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  283   EXPECT_EQ(0u, client_.on_complete_called()); | 
 |  284  | 
 |  285   throttle_->delegate()->Resume(); | 
 |  286   factory_.factory_ptr().FlushForTesting(); | 
 |  287  | 
 |  288   EXPECT_EQ(1u, factory_.create_loader_and_start_called()); | 
 |  289  | 
 |  290   factory_.NotifyClientOnReceiveResponse(); | 
 |  291   factory_.NotifyClientOnComplete(net::OK); | 
 |  292  | 
 |  293   run_loop.Run(); | 
 |  294  | 
 |  295   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  296   EXPECT_EQ(0u, throttle_->will_redirect_request_called()); | 
 |  297   EXPECT_EQ(1u, throttle_->will_process_response_called()); | 
 |  298  | 
 |  299   EXPECT_EQ(1u, client_.on_received_response_called()); | 
 |  300   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  301   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  302 } | 
 |  303  | 
 |  304 TEST_F(ThrottlingURLLoaderTest, CancelBeforeRedirect) { | 
 |  305   throttle_->set_will_redirect_request_callback( | 
 |  306       base::Bind([](URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  307         delegate->CancelWithError(net::ERR_ACCESS_DENIED); | 
 |  308       })); | 
 |  309  | 
 |  310   base::RunLoop run_loop; | 
 |  311   client_.set_on_complete_callback(base::Bind( | 
 |  312       [](const base::Closure& quit_closure, int error) { | 
 |  313         EXPECT_EQ(net::ERR_ACCESS_DENIED, error); | 
 |  314         quit_closure.Run(); | 
 |  315       }, | 
 |  316       run_loop.QuitClosure())); | 
 |  317  | 
 |  318   CreateLoaderAndStart(); | 
 |  319  | 
 |  320   factory_.NotifyClientOnReceiveRedirect(); | 
 |  321  | 
 |  322   run_loop.Run(); | 
 |  323  | 
 |  324   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  325   EXPECT_EQ(1u, throttle_->will_redirect_request_called()); | 
 |  326   EXPECT_EQ(0u, throttle_->will_process_response_called()); | 
 |  327  | 
 |  328   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  329   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  330   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  331 } | 
 |  332  | 
 |  333 TEST_F(ThrottlingURLLoaderTest, DeferBeforeRedirect) { | 
 |  334   base::RunLoop run_loop1; | 
 |  335   throttle_->set_will_redirect_request_callback(base::Bind( | 
 |  336       [](const base::Closure& quit_closure, | 
 |  337          URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  338         *defer = true; | 
 |  339         quit_closure.Run(); | 
 |  340       }, | 
 |  341       run_loop1.QuitClosure())); | 
 |  342  | 
 |  343   base::RunLoop run_loop2; | 
 |  344   client_.set_on_complete_callback(base::Bind( | 
 |  345       [](const base::Closure& quit_closure, int error) { | 
 |  346         EXPECT_EQ(net::ERR_UNEXPECTED, error); | 
 |  347         quit_closure.Run(); | 
 |  348       }, | 
 |  349       run_loop2.QuitClosure())); | 
 |  350  | 
 |  351   CreateLoaderAndStart(); | 
 |  352  | 
 |  353   factory_.NotifyClientOnReceiveRedirect(); | 
 |  354  | 
 |  355   run_loop1.Run(); | 
 |  356  | 
 |  357   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  358   EXPECT_EQ(1u, throttle_->will_redirect_request_called()); | 
 |  359   EXPECT_EQ(0u, throttle_->will_process_response_called()); | 
 |  360  | 
 |  361   factory_.NotifyClientOnComplete(net::ERR_UNEXPECTED); | 
 |  362  | 
 |  363   base::RunLoop run_loop3; | 
 |  364   run_loop3.RunUntilIdle(); | 
 |  365  | 
 |  366   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  367   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  368   EXPECT_EQ(0u, client_.on_complete_called()); | 
 |  369  | 
 |  370   throttle_->delegate()->Resume(); | 
 |  371   run_loop2.Run(); | 
 |  372  | 
 |  373   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  374   EXPECT_EQ(1u, throttle_->will_redirect_request_called()); | 
 |  375   EXPECT_EQ(0u, throttle_->will_process_response_called()); | 
 |  376  | 
 |  377   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  378   EXPECT_EQ(1u, client_.on_received_redirect_called()); | 
 |  379   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  380 } | 
 |  381  | 
 |  382 TEST_F(ThrottlingURLLoaderTest, CancelBeforeResponse) { | 
 |  383   throttle_->set_will_process_response_callback( | 
 |  384       base::Bind([](URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  385         delegate->CancelWithError(net::ERR_ACCESS_DENIED); | 
 |  386       })); | 
 |  387  | 
 |  388   base::RunLoop run_loop; | 
 |  389   client_.set_on_complete_callback(base::Bind( | 
 |  390       [](const base::Closure& quit_closure, int error) { | 
 |  391         EXPECT_EQ(net::ERR_ACCESS_DENIED, error); | 
 |  392         quit_closure.Run(); | 
 |  393       }, | 
 |  394       run_loop.QuitClosure())); | 
 |  395  | 
 |  396   CreateLoaderAndStart(); | 
 |  397  | 
 |  398   factory_.NotifyClientOnReceiveResponse(); | 
 |  399  | 
 |  400   run_loop.Run(); | 
 |  401  | 
 |  402   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  403   EXPECT_EQ(0u, throttle_->will_redirect_request_called()); | 
 |  404   EXPECT_EQ(1u, throttle_->will_process_response_called()); | 
 |  405  | 
 |  406   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  407   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  408   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  409 } | 
 |  410  | 
 |  411 TEST_F(ThrottlingURLLoaderTest, DeferBeforeResponse) { | 
 |  412   base::RunLoop run_loop1; | 
 |  413   throttle_->set_will_process_response_callback(base::Bind( | 
 |  414       [](const base::Closure& quit_closure, | 
 |  415          URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  416         *defer = true; | 
 |  417         quit_closure.Run(); | 
 |  418       }, | 
 |  419       run_loop1.QuitClosure())); | 
 |  420  | 
 |  421   base::RunLoop run_loop2; | 
 |  422   client_.set_on_complete_callback(base::Bind( | 
 |  423       [](const base::Closure& quit_closure, int error) { | 
 |  424         EXPECT_EQ(net::ERR_UNEXPECTED, error); | 
 |  425         quit_closure.Run(); | 
 |  426       }, | 
 |  427       run_loop2.QuitClosure())); | 
 |  428  | 
 |  429   CreateLoaderAndStart(); | 
 |  430  | 
 |  431   factory_.NotifyClientOnReceiveResponse(); | 
 |  432  | 
 |  433   run_loop1.Run(); | 
 |  434  | 
 |  435   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  436   EXPECT_EQ(0u, throttle_->will_redirect_request_called()); | 
 |  437   EXPECT_EQ(1u, throttle_->will_process_response_called()); | 
 |  438  | 
 |  439   factory_.NotifyClientOnComplete(net::ERR_UNEXPECTED); | 
 |  440  | 
 |  441   base::RunLoop run_loop3; | 
 |  442   run_loop3.RunUntilIdle(); | 
 |  443  | 
 |  444   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  445   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  446   EXPECT_EQ(0u, client_.on_complete_called()); | 
 |  447  | 
 |  448   throttle_->delegate()->Resume(); | 
 |  449   run_loop2.Run(); | 
 |  450  | 
 |  451   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  452   EXPECT_EQ(0u, throttle_->will_redirect_request_called()); | 
 |  453   EXPECT_EQ(1u, throttle_->will_process_response_called()); | 
 |  454  | 
 |  455   EXPECT_EQ(1u, client_.on_received_response_called()); | 
 |  456   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  457   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  458 } | 
 |  459  | 
 |  460 TEST_F(ThrottlingURLLoaderTest, ResumeNoOpIfNotDeferred) { | 
 |  461   auto resume_callback = | 
 |  462       base::Bind([](URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  463         delegate->Resume(); | 
 |  464         delegate->Resume(); | 
 |  465       }); | 
 |  466   throttle_->set_will_start_request_callback(resume_callback); | 
 |  467   throttle_->set_will_redirect_request_callback(resume_callback); | 
 |  468   throttle_->set_will_process_response_callback(resume_callback); | 
 |  469  | 
 |  470   base::RunLoop run_loop; | 
 |  471   client_.set_on_complete_callback(base::Bind( | 
 |  472       [](const base::Closure& quit_closure, int error) { | 
 |  473         EXPECT_EQ(net::OK, error); | 
 |  474         quit_closure.Run(); | 
 |  475       }, | 
 |  476       run_loop.QuitClosure())); | 
 |  477  | 
 |  478   CreateLoaderAndStart(); | 
 |  479   factory_.NotifyClientOnReceiveRedirect(); | 
 |  480   factory_.NotifyClientOnReceiveResponse(); | 
 |  481   factory_.NotifyClientOnComplete(net::OK); | 
 |  482  | 
 |  483   run_loop.Run(); | 
 |  484  | 
 |  485   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  486   EXPECT_EQ(1u, throttle_->will_redirect_request_called()); | 
 |  487   EXPECT_EQ(1u, throttle_->will_process_response_called()); | 
 |  488  | 
 |  489   EXPECT_EQ(1u, client_.on_received_response_called()); | 
 |  490   EXPECT_EQ(1u, client_.on_received_redirect_called()); | 
 |  491   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  492 } | 
 |  493  | 
 |  494 TEST_F(ThrottlingURLLoaderTest, CancelNoOpIfAlreadyCanceled) { | 
 |  495   throttle_->set_will_start_request_callback( | 
 |  496       base::Bind([](URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  497         delegate->CancelWithError(net::ERR_ACCESS_DENIED); | 
 |  498         delegate->CancelWithError(net::ERR_UNEXPECTED); | 
 |  499       })); | 
 |  500  | 
 |  501   base::RunLoop run_loop; | 
 |  502   client_.set_on_complete_callback(base::Bind( | 
 |  503       [](const base::Closure& quit_closure, int error) { | 
 |  504         EXPECT_EQ(net::ERR_ACCESS_DENIED, error); | 
 |  505         quit_closure.Run(); | 
 |  506       }, | 
 |  507       run_loop.QuitClosure())); | 
 |  508  | 
 |  509   CreateLoaderAndStart(); | 
 |  510   throttle_->delegate()->CancelWithError(net::ERR_INVALID_ARGUMENT); | 
 |  511   run_loop.Run(); | 
 |  512  | 
 |  513   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  514   EXPECT_EQ(0u, throttle_->will_redirect_request_called()); | 
 |  515   EXPECT_EQ(0u, throttle_->will_process_response_called()); | 
 |  516  | 
 |  517   EXPECT_EQ(0u, factory_.create_loader_and_start_called()); | 
 |  518  | 
 |  519   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  520   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  521   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  522 } | 
 |  523  | 
 |  524 TEST_F(ThrottlingURLLoaderTest, ResumeNoOpIfAlreadyCanceled) { | 
 |  525   throttle_->set_will_process_response_callback( | 
 |  526       base::Bind([](URLLoaderThrottle::Delegate* delegate, bool* defer) { | 
 |  527         delegate->CancelWithError(net::ERR_ACCESS_DENIED); | 
 |  528         delegate->Resume(); | 
 |  529       })); | 
 |  530  | 
 |  531   base::RunLoop run_loop1; | 
 |  532   client_.set_on_complete_callback(base::Bind( | 
 |  533       [](const base::Closure& quit_closure, int error) { | 
 |  534         EXPECT_EQ(net::ERR_ACCESS_DENIED, error); | 
 |  535         quit_closure.Run(); | 
 |  536       }, | 
 |  537       run_loop1.QuitClosure())); | 
 |  538  | 
 |  539   CreateLoaderAndStart(); | 
 |  540  | 
 |  541   factory_.NotifyClientOnReceiveResponse(); | 
 |  542  | 
 |  543   run_loop1.Run(); | 
 |  544  | 
 |  545   throttle_->delegate()->Resume(); | 
 |  546  | 
 |  547   base::RunLoop run_loop2; | 
 |  548   run_loop2.RunUntilIdle(); | 
 |  549  | 
 |  550   EXPECT_EQ(1u, throttle_->will_start_request_called()); | 
 |  551   EXPECT_EQ(0u, throttle_->will_redirect_request_called()); | 
 |  552   EXPECT_EQ(1u, throttle_->will_process_response_called()); | 
 |  553  | 
 |  554   EXPECT_EQ(0u, client_.on_received_response_called()); | 
 |  555   EXPECT_EQ(0u, client_.on_received_redirect_called()); | 
 |  556   EXPECT_EQ(1u, client_.on_complete_called()); | 
 |  557 } | 
 |  558  | 
 |  559 }  // namespace | 
 |  560 }  // namespace content | 
| OLD | NEW |