Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/loader/mojo_async_resource_handler.h" | 5 #include "content/browser/loader/mojo_async_resource_handler.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/callback.h" | 12 #include "base/callback.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
| 16 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
| 17 #include "content/browser/loader/mock_resource_loader.h" | |
| 17 #include "content/browser/loader/resource_controller.h" | 18 #include "content/browser/loader/resource_controller.h" |
| 18 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 19 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 19 #include "content/browser/loader/resource_request_info_impl.h" | 20 #include "content/browser/loader/resource_request_info_impl.h" |
| 20 #include "content/browser/loader/test_url_loader_client.h" | 21 #include "content/browser/loader/test_url_loader_client.h" |
| 21 #include "content/common/resource_request_completion_status.h" | 22 #include "content/common/resource_request_completion_status.h" |
| 22 #include "content/common/url_loader.mojom.h" | 23 #include "content/common/url_loader.mojom.h" |
| 23 #include "content/public/browser/appcache_service.h" | 24 #include "content/public/browser/appcache_service.h" |
| 24 #include "content/public/browser/navigation_data.h" | 25 #include "content/public/browser/navigation_data.h" |
| 25 #include "content/public/browser/resource_context.h" | 26 #include "content/public/browser/resource_context.h" |
| 26 #include "content/public/browser/resource_dispatcher_host_delegate.h" | 27 #include "content/public/browser/resource_dispatcher_host_delegate.h" |
| 27 #include "content/public/browser/resource_throttle.h" | 28 #include "content/public/browser/resource_throttle.h" |
| 28 #include "content/public/browser/stream_info.h" | 29 #include "content/public/browser/stream_info.h" |
| 29 #include "content/public/common/resource_response.h" | 30 #include "content/public/common/resource_response.h" |
| 30 #include "content/public/common/resource_type.h" | 31 #include "content/public/common/resource_type.h" |
| 31 #include "content/public/test/test_browser_context.h" | 32 #include "content/public/test/test_browser_context.h" |
| 32 #include "content/public/test/test_browser_thread_bundle.h" | 33 #include "content/public/test/test_browser_thread_bundle.h" |
| 33 #include "mojo/public/c/system/data_pipe.h" | 34 #include "mojo/public/c/system/data_pipe.h" |
| 34 #include "mojo/public/c/system/types.h" | 35 #include "mojo/public/c/system/types.h" |
| 35 #include "mojo/public/cpp/bindings/strong_binding.h" | 36 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 36 #include "mojo/public/cpp/system/data_pipe.h" | 37 #include "mojo/public/cpp/system/data_pipe.h" |
| 37 #include "net/base/auth.h" | 38 #include "net/base/auth.h" |
| 38 #include "net/base/net_errors.h" | 39 #include "net/base/net_errors.h" |
| 39 #include "net/http/http_response_headers.h" | 40 #include "net/http/http_response_headers.h" |
| 40 #include "net/http/http_response_info.h" | 41 #include "net/http/http_response_info.h" |
| 41 #include "net/http/http_status_code.h" | 42 #include "net/http/http_status_code.h" |
| 42 #include "net/http/http_util.h" | 43 #include "net/http/http_util.h" |
| 43 #include "net/ssl/client_cert_store.h" | 44 #include "net/ssl/client_cert_store.h" |
| 44 #include "net/test/url_request/url_request_failed_job.h" | |
| 45 #include "net/url_request/url_request.h" | 45 #include "net/url_request/url_request.h" |
| 46 #include "net/url_request/url_request_context.h" | 46 #include "net/url_request/url_request_context.h" |
| 47 #include "net/url_request/url_request_filter.h" | |
| 48 #include "net/url_request/url_request_status.h" | 47 #include "net/url_request/url_request_status.h" |
| 49 #include "net/url_request/url_request_test_util.h" | 48 #include "net/url_request/url_request_test_util.h" |
| 50 #include "testing/gtest/include/gtest/gtest.h" | 49 #include "testing/gtest/include/gtest/gtest.h" |
| 51 #include "ui/base/page_transition_types.h" | 50 #include "ui/base/page_transition_types.h" |
| 52 | 51 |
| 53 namespace content { | 52 namespace content { |
| 54 namespace { | 53 namespace { |
| 55 | 54 |
| 56 constexpr int kSizeMimeSnifferRequiresForFirstOnWillRead = 2048; | 55 constexpr int kSizeMimeSnifferRequiresForFirstOnWillRead = 2048; |
| 57 | 56 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 num_on_response_started_calls_expectation_ = expectation; | 166 num_on_response_started_calls_expectation_ = expectation; |
| 168 } | 167 } |
| 169 | 168 |
| 170 private: | 169 private: |
| 171 int num_on_response_started_calls_ = 0; | 170 int num_on_response_started_calls_ = 0; |
| 172 int num_on_response_started_calls_expectation_ = 0; | 171 int num_on_response_started_calls_expectation_ = 0; |
| 173 | 172 |
| 174 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate); | 173 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate); |
| 175 }; | 174 }; |
| 176 | 175 |
| 177 class TestResourceController : public ResourceController { | |
| 178 public: | |
| 179 TestResourceController() {} | |
| 180 ~TestResourceController() override {} | |
| 181 | |
| 182 void Cancel() override { ADD_FAILURE() << "Cancel should not be called."; } | |
| 183 | |
| 184 void CancelAndIgnore() override { | |
| 185 ADD_FAILURE() << "CancelAndIgnore should not be called."; | |
| 186 } | |
| 187 | |
| 188 void CancelWithError(int error_code) override { | |
| 189 // While cancelling more than once is legal, none of these tests should do | |
| 190 // it. | |
| 191 EXPECT_FALSE(is_cancel_with_error_called_); | |
| 192 | |
| 193 is_cancel_with_error_called_ = true; | |
| 194 error_ = error_code; | |
| 195 if (quit_closure_) | |
| 196 quit_closure_.Run(); | |
| 197 } | |
| 198 | |
| 199 void Resume() override { ++num_resume_calls_; } | |
| 200 | |
| 201 void RunUntilCancelWithErrorCalled() { | |
| 202 base::RunLoop run_loop; | |
| 203 quit_closure_ = run_loop.QuitClosure(); | |
| 204 run_loop.Run(); | |
| 205 } | |
| 206 | |
| 207 void set_quit_closure(const base::Closure& quit_closure) { | |
| 208 quit_closure_ = quit_closure; | |
| 209 } | |
| 210 | |
| 211 bool is_cancel_with_error_called() const { | |
| 212 return is_cancel_with_error_called_; | |
| 213 } | |
| 214 int error() const { return error_; } | |
| 215 int num_resume_calls() const { return num_resume_calls_; } | |
| 216 | |
| 217 private: | |
| 218 bool is_cancel_with_error_called_ = false; | |
| 219 int error_ = net::OK; | |
| 220 int num_resume_calls_ = 0; | |
| 221 base::Closure quit_closure_; | |
| 222 | |
| 223 DISALLOW_COPY_AND_ASSIGN(TestResourceController); | |
| 224 }; | |
| 225 | |
| 226 class MojoAsyncResourceHandlerWithCustomDataPipeOperations | 176 class MojoAsyncResourceHandlerWithCustomDataPipeOperations |
| 227 : public MojoAsyncResourceHandler { | 177 : public MojoAsyncResourceHandler { |
| 228 public: | 178 public: |
| 229 MojoAsyncResourceHandlerWithCustomDataPipeOperations( | 179 MojoAsyncResourceHandlerWithCustomDataPipeOperations( |
| 230 net::URLRequest* request, | 180 net::URLRequest* request, |
| 231 ResourceDispatcherHostImpl* rdh, | 181 ResourceDispatcherHostImpl* rdh, |
| 232 mojom::URLLoaderAssociatedRequest mojo_request, | 182 mojom::URLLoaderAssociatedRequest mojo_request, |
| 233 mojom::URLLoaderClientAssociatedPtr url_loader_client) | 183 mojom::URLLoaderClientAssociatedPtr url_loader_client) |
| 234 : MojoAsyncResourceHandler(request, | 184 : MojoAsyncResourceHandler(request, |
| 235 rdh, | 185 rdh, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 312 }; | 262 }; |
| 313 | 263 |
| 314 class MojoAsyncResourceHandlerTestBase { | 264 class MojoAsyncResourceHandlerTestBase { |
| 315 public: | 265 public: |
| 316 MojoAsyncResourceHandlerTestBase() | 266 MojoAsyncResourceHandlerTestBase() |
| 317 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP), | 267 : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP), |
| 318 browser_context_(new TestBrowserContext()) { | 268 browser_context_(new TestBrowserContext()) { |
| 319 MojoAsyncResourceHandler::SetAllocationSizeForTesting(32 * 1024); | 269 MojoAsyncResourceHandler::SetAllocationSizeForTesting(32 * 1024); |
| 320 rdh_.SetDelegate(&rdh_delegate_); | 270 rdh_.SetDelegate(&rdh_delegate_); |
| 321 | 271 |
| 322 url_request_delegate_.reset(new net::TestDelegate()); | 272 // Create and initialize |request_|. None of this matters, for these tests, |
| 273 // just need something non-NULL. | |
| 323 net::URLRequestContext* request_context = | 274 net::URLRequestContext* request_context = |
| 324 browser_context_->GetResourceContext()->GetRequestContext(); | 275 browser_context_->GetResourceContext()->GetRequestContext(); |
| 325 request_ = request_context->CreateRequest( | 276 request_ = request_context->CreateRequest( |
| 326 net::URLRequestFailedJob::GetMockHttpUrl(net::ERR_TIMED_OUT), | 277 GURL("http://foo/"), net::DEFAULT_PRIORITY, &url_request_delegate_); |
| 327 net::DEFAULT_PRIORITY, url_request_delegate_.get()); | |
| 328 ResourceRequestInfo::AllocateForTesting( | 278 ResourceRequestInfo::AllocateForTesting( |
| 329 request_.get(), // request | 279 request_.get(), // request |
| 330 RESOURCE_TYPE_XHR, // resource_type | 280 RESOURCE_TYPE_XHR, // resource_type |
| 331 browser_context_->GetResourceContext(), // context | 281 browser_context_->GetResourceContext(), // context |
| 332 2, // render_process_id | 282 2, // render_process_id |
| 333 0, // render_view_id | 283 0, // render_view_id |
| 334 0, // render_frame_id | 284 0, // render_frame_id |
| 335 true, // is_main_frame | 285 true, // is_main_frame |
| 336 false, // parent_is_main_frame | 286 false, // parent_is_main_frame |
| 337 false, // allow_download | 287 false, // allow_download |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 353 url_loader_factory_.FlushForTesting(); | 303 url_loader_factory_.FlushForTesting(); |
| 354 DCHECK(weak_binding); | 304 DCHECK(weak_binding); |
| 355 TestURLLoaderFactory* factory_impl = | 305 TestURLLoaderFactory* factory_impl = |
| 356 static_cast<TestURLLoaderFactory*>(weak_binding->impl()); | 306 static_cast<TestURLLoaderFactory*>(weak_binding->impl()); |
| 357 | 307 |
| 358 mojom::URLLoaderClientAssociatedPtr client_ptr; | 308 mojom::URLLoaderClientAssociatedPtr client_ptr; |
| 359 client_ptr.Bind(factory_impl->PassClientPtrInfo()); | 309 client_ptr.Bind(factory_impl->PassClientPtrInfo()); |
| 360 handler_.reset(new MojoAsyncResourceHandlerWithCustomDataPipeOperations( | 310 handler_.reset(new MojoAsyncResourceHandlerWithCustomDataPipeOperations( |
| 361 request_.get(), &rdh_, factory_impl->PassLoaderRequest(), | 311 request_.get(), &rdh_, factory_impl->PassLoaderRequest(), |
| 362 std::move(client_ptr))); | 312 std::move(client_ptr))); |
| 363 handler_->SetController(&resource_controller_); | 313 mock_loader_.reset(new MockResourceLoader(handler_.get())); |
| 364 } | 314 } |
| 365 | 315 |
| 366 virtual ~MojoAsyncResourceHandlerTestBase() { | 316 virtual ~MojoAsyncResourceHandlerTestBase() { |
| 367 net::URLRequestFilter::GetInstance()->ClearHandlers(); | |
| 368 MojoAsyncResourceHandler::SetAllocationSizeForTesting( | 317 MojoAsyncResourceHandler::SetAllocationSizeForTesting( |
| 369 MojoAsyncResourceHandler::kDefaultAllocationSize); | 318 MojoAsyncResourceHandler::kDefaultAllocationSize); |
| 370 base::RunLoop().RunUntilIdle(); | 319 base::RunLoop().RunUntilIdle(); |
| 371 } | 320 } |
| 372 | 321 |
| 373 // Returns false if something bad happens. | 322 // Returns false if something bad happens. |
| 374 bool CallOnWillStart() { | |
| 375 bool defer = false; | |
| 376 if (!handler_->OnWillStart(request_->url(), &defer)) { | |
| 377 ADD_FAILURE() << "OnWillStart returns false."; | |
| 378 return false; | |
| 379 } | |
| 380 if (defer) { | |
| 381 ADD_FAILURE() << "OnWillStart sets |defer| true."; | |
| 382 return false; | |
| 383 } | |
| 384 return true; | |
| 385 } | |
| 386 | |
| 387 // Returns false if something bad happens. | |
| 388 bool CallOnWillStartAndOnResponseStarted() { | 323 bool CallOnWillStartAndOnResponseStarted() { |
| 389 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 324 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
| 390 if (!CallOnWillStart()) | 325 MockResourceLoader::Status result = |
| 326 mock_loader_->OnWillStart(request_->url()); | |
| 327 EXPECT_EQ(MockResourceLoader::Status::IDLE, result); | |
| 328 if (result != MockResourceLoader::Status::IDLE) | |
| 391 return false; | 329 return false; |
| 392 | 330 |
| 393 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 331 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
| 394 bool defer = false; | 332 result = mock_loader_->OnResponseStarted(response); |
| 395 if (!handler_->OnResponseStarted(response.get(), &defer)) { | 333 EXPECT_EQ(MockResourceLoader::Status::IDLE, result); |
| 396 ADD_FAILURE() << "OnResponseStarted returns false."; | 334 if (result != MockResourceLoader::Status::IDLE) |
| 397 return false; | 335 return false; |
| 398 } | 336 |
| 399 if (defer) { | |
| 400 ADD_FAILURE() << "OnResponseStarted sets |defer| true."; | |
| 401 return false; | |
| 402 } | |
| 403 if (url_loader_client_.has_received_response()) { | 337 if (url_loader_client_.has_received_response()) { |
| 404 ADD_FAILURE() << "URLLoaderClient unexpectedly gets a response."; | 338 ADD_FAILURE() << "URLLoaderClient unexpectedly gets a response."; |
| 405 return false; | 339 return false; |
| 406 } | 340 } |
| 407 url_loader_client_.RunUntilResponseReceived(); | 341 url_loader_client_.RunUntilResponseReceived(); |
| 408 return true; | 342 return true; |
| 409 } | 343 } |
| 410 | 344 |
| 411 TestBrowserThreadBundle thread_bundle_; | 345 TestBrowserThreadBundle thread_bundle_; |
| 412 TestResourceDispatcherHostDelegate rdh_delegate_; | 346 TestResourceDispatcherHostDelegate rdh_delegate_; |
| 413 ResourceDispatcherHostImpl rdh_; | 347 ResourceDispatcherHostImpl rdh_; |
| 414 mojom::URLLoaderFactoryPtr url_loader_factory_; | 348 mojom::URLLoaderFactoryPtr url_loader_factory_; |
| 415 mojom::URLLoaderAssociatedPtr url_loader_proxy_; | 349 mojom::URLLoaderAssociatedPtr url_loader_proxy_; |
| 416 TestURLLoaderClient url_loader_client_; | 350 TestURLLoaderClient url_loader_client_; |
| 417 TestResourceController resource_controller_; | |
| 418 std::unique_ptr<TestBrowserContext> browser_context_; | 351 std::unique_ptr<TestBrowserContext> browser_context_; |
| 419 std::unique_ptr<net::TestDelegate> url_request_delegate_; | 352 net::TestDelegate url_request_delegate_; |
| 420 std::unique_ptr<net::URLRequest> request_; | 353 std::unique_ptr<net::URLRequest> request_; |
| 421 std::unique_ptr<MojoAsyncResourceHandlerWithCustomDataPipeOperations> | 354 std::unique_ptr<MojoAsyncResourceHandlerWithCustomDataPipeOperations> |
| 422 handler_; | 355 handler_; |
| 356 std::unique_ptr<MockResourceLoader> mock_loader_; | |
| 423 | 357 |
| 424 DISALLOW_COPY_AND_ASSIGN(MojoAsyncResourceHandlerTestBase); | 358 DISALLOW_COPY_AND_ASSIGN(MojoAsyncResourceHandlerTestBase); |
| 425 }; | 359 }; |
| 426 | 360 |
| 427 class MojoAsyncResourceHandlerTest : public MojoAsyncResourceHandlerTestBase, | 361 class MojoAsyncResourceHandlerTest : public MojoAsyncResourceHandlerTestBase, |
| 428 public ::testing::Test {}; | 362 public ::testing::Test {}; |
| 429 | 363 |
| 430 // This test class is parameterized with MojoAsyncResourceHandler's allocation | 364 // This test class is parameterized with MojoAsyncResourceHandler's allocation |
| 431 // size. | 365 // size. |
| 432 class MojoAsyncResourceHandlerWithAllocationSizeTest | 366 class MojoAsyncResourceHandlerWithAllocationSizeTest |
| 433 : public MojoAsyncResourceHandlerTestBase, | 367 : public MojoAsyncResourceHandlerTestBase, |
| 434 public ::testing::TestWithParam<size_t> { | 368 public ::testing::TestWithParam<size_t> { |
| 435 protected: | 369 protected: |
| 436 MojoAsyncResourceHandlerWithAllocationSizeTest() { | 370 MojoAsyncResourceHandlerWithAllocationSizeTest() { |
| 437 MojoAsyncResourceHandler::SetAllocationSizeForTesting(GetParam()); | 371 MojoAsyncResourceHandler::SetAllocationSizeForTesting(GetParam()); |
| 438 } | 372 } |
| 439 }; | 373 }; |
| 440 | 374 |
| 441 TEST_F(MojoAsyncResourceHandlerTest, InFlightRequests) { | 375 TEST_F(MojoAsyncResourceHandlerTest, InFlightRequests) { |
| 442 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 376 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
| 443 handler_ = nullptr; | 377 handler_ = nullptr; |
| 444 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 378 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
| 445 } | 379 } |
| 446 | 380 |
| 447 TEST_F(MojoAsyncResourceHandlerTest, OnWillStart) { | 381 TEST_F(MojoAsyncResourceHandlerTest, OnWillStart) { |
| 448 bool defer = false; | 382 EXPECT_EQ(MockResourceLoader::Status::IDLE, |
| 449 EXPECT_TRUE(handler_->OnWillStart(request_->url(), &defer)); | 383 mock_loader_->OnWillStart(request_->url())); |
| 450 EXPECT_FALSE(defer); | |
| 451 } | 384 } |
| 452 | 385 |
| 453 TEST_F(MojoAsyncResourceHandlerTest, OnResponseStarted) { | 386 TEST_F(MojoAsyncResourceHandlerTest, OnResponseStarted) { |
| 454 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 387 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
| 455 ASSERT_TRUE(CallOnWillStart()); | 388 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 389 mock_loader_->OnWillStart(request_->url())); | |
| 456 | 390 |
| 457 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 391 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
| 458 response->head.content_length = 99; | 392 response->head.content_length = 99; |
| 459 response->head.request_start = | 393 response->head.request_start = |
| 460 base::TimeTicks::UnixEpoch() + base::TimeDelta::FromDays(14); | 394 base::TimeTicks::UnixEpoch() + base::TimeDelta::FromDays(14); |
| 461 response->head.response_start = | 395 response->head.response_start = |
| 462 base::TimeTicks::UnixEpoch() + base::TimeDelta::FromDays(28); | 396 base::TimeTicks::UnixEpoch() + base::TimeDelta::FromDays(28); |
| 463 | 397 |
| 464 bool defer = false; | |
| 465 | |
| 466 EXPECT_EQ(0, rdh_delegate_.num_on_response_started_calls()); | 398 EXPECT_EQ(0, rdh_delegate_.num_on_response_started_calls()); |
| 467 base::TimeTicks now1 = base::TimeTicks::Now(); | 399 base::TimeTicks now1 = base::TimeTicks::Now(); |
| 468 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 400 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 401 mock_loader_->OnResponseStarted(response)); | |
| 469 base::TimeTicks now2 = base::TimeTicks::Now(); | 402 base::TimeTicks now2 = base::TimeTicks::Now(); |
| 470 | 403 |
| 471 EXPECT_FALSE(defer); | |
| 472 EXPECT_EQ(request_->creation_time(), response->head.request_start); | 404 EXPECT_EQ(request_->creation_time(), response->head.request_start); |
| 473 EXPECT_LE(now1, response->head.response_start); | 405 EXPECT_LE(now1, response->head.response_start); |
| 474 EXPECT_LE(response->head.response_start, now2); | 406 EXPECT_LE(response->head.response_start, now2); |
| 475 EXPECT_EQ(1, rdh_delegate_.num_on_response_started_calls()); | 407 EXPECT_EQ(1, rdh_delegate_.num_on_response_started_calls()); |
| 476 | 408 |
| 477 url_loader_client_.RunUntilResponseReceived(); | 409 url_loader_client_.RunUntilResponseReceived(); |
| 478 EXPECT_EQ(response->head.request_start, | 410 EXPECT_EQ(response->head.request_start, |
| 479 url_loader_client_.response_head().request_start); | 411 url_loader_client_.response_head().request_start); |
| 480 EXPECT_EQ(response->head.response_start, | 412 EXPECT_EQ(response->head.response_start, |
| 481 url_loader_client_.response_head().response_start); | 413 url_loader_client_.response_head().response_start); |
| 482 EXPECT_EQ(99, url_loader_client_.response_head().content_length); | 414 EXPECT_EQ(99, url_loader_client_.response_head().content_length); |
| 483 } | 415 } |
| 484 | 416 |
| 485 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndInFlightRequests) { | 417 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndInFlightRequests) { |
| 486 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 418 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 487 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 419 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
| 488 scoped_refptr<net::IOBuffer> io_buffer; | 420 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 489 int io_buffer_size = 0; | |
| 490 EXPECT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 491 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); | 421 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); |
| 492 handler_ = nullptr; | 422 handler_ = nullptr; |
| 493 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 423 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
| 494 } | 424 } |
| 495 | 425 |
| 496 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadWithInsufficientResource) { | 426 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadWithInsufficientResource) { |
| 497 rdh_.set_max_num_in_flight_requests_per_process(0); | 427 rdh_.set_max_num_in_flight_requests_per_process(0); |
| 498 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 428 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 499 | 429 |
| 500 scoped_refptr<net::IOBuffer> io_buffer; | 430 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead(-1)); |
| 501 int io_buffer_size = 0; | |
| 502 EXPECT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 503 EXPECT_FALSE(io_buffer); | |
| 504 EXPECT_EQ(0, io_buffer_size); | |
| 505 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); | 431 EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing()); |
| 506 EXPECT_TRUE(resource_controller_.is_cancel_with_error_called()); | 432 // TODO(mmenke): Should make sure the class is cancelling with |
| 507 EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, resource_controller_.error()); | 433 // ERR_INSUFFICIENT_RESOURCES here (Which it isn't currently doing). |
|
Randy Smith (Not in Mondays)
2017/01/10 23:07:47
I'm confused by this comment; it *looks* like Mojo
mmenke
2017/01/11 22:12:54
Oops. This CL was copied from the final CL in the
| |
| 508 handler_ = nullptr; | 434 handler_ = nullptr; |
| 509 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); | 435 EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing()); |
| 510 } | 436 } |
| 511 | 437 |
| 512 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndOnReadCompleted) { | 438 TEST_F(MojoAsyncResourceHandlerTest, OnWillReadAndOnReadCompleted) { |
| 513 bool defer = false; | |
| 514 scoped_refptr<net::IOBuffer> io_buffer; | |
| 515 int io_buffer_size = 0; | |
| 516 | |
| 517 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 439 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 518 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 440 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 519 ASSERT_TRUE(io_buffer); | |
| 520 // The buffer size that the mime sniffer requires implicitly. | 441 // The buffer size that the mime sniffer requires implicitly. |
| 521 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); | 442 ASSERT_GE(mock_loader_->io_buffer_size(), |
| 443 kSizeMimeSnifferRequiresForFirstOnWillRead); | |
| 522 | 444 |
| 523 url_loader_client_.RunUntilResponseBodyArrived(); | 445 url_loader_client_.RunUntilResponseBodyArrived(); |
| 524 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 446 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 525 | 447 |
| 526 io_buffer->data()[0] = 'A'; | 448 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 527 io_buffer->data()[1] = 'B'; | 449 mock_loader_->OnReadCompleted("AB")); |
| 528 ASSERT_TRUE(handler_->OnReadCompleted(2, &defer)); | |
| 529 EXPECT_FALSE(defer); | |
| 530 | 450 |
| 531 std::string contents; | 451 std::string contents; |
| 532 while (contents.size() < 2) { | 452 while (contents.size() < 2) { |
| 533 char buffer[16]; | 453 char buffer[16]; |
| 534 uint32_t read_size = sizeof(buffer); | 454 uint32_t read_size = sizeof(buffer); |
| 535 MojoResult result = | 455 MojoResult result = |
| 536 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 456 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
| 537 &read_size, MOJO_READ_DATA_FLAG_NONE); | 457 &read_size, MOJO_READ_DATA_FLAG_NONE); |
| 538 if (result == MOJO_RESULT_SHOULD_WAIT) { | 458 if (result == MOJO_RESULT_SHOULD_WAIT) { |
| 539 base::RunLoop().RunUntilIdle(); | 459 base::RunLoop().RunUntilIdle(); |
| 540 continue; | 460 continue; |
| 541 } | 461 } |
| 542 contents.append(buffer, read_size); | 462 contents.append(buffer, read_size); |
| 543 } | 463 } |
| 544 EXPECT_EQ("AB", contents); | 464 EXPECT_EQ("AB", contents); |
| 545 } | 465 } |
| 546 | 466 |
| 547 TEST_F(MojoAsyncResourceHandlerTest, | 467 TEST_F(MojoAsyncResourceHandlerTest, |
| 548 OnWillReadAndOnReadCompletedWithInsufficientInitialCapacity) { | 468 OnWillReadAndOnReadCompletedWithInsufficientInitialCapacity) { |
| 549 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); | 469 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); |
| 550 | 470 |
| 551 bool defer = false; | |
| 552 scoped_refptr<net::IOBuffer> io_buffer; | |
| 553 int io_buffer_size = 0; | |
| 554 | |
| 555 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 471 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 556 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 472 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 557 ASSERT_TRUE(io_buffer); | |
| 558 // The buffer size that the mime sniffer requires implicitly. | 473 // The buffer size that the mime sniffer requires implicitly. |
| 559 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); | 474 ASSERT_GE(mock_loader_->io_buffer_size(), |
| 475 kSizeMimeSnifferRequiresForFirstOnWillRead); | |
| 560 | 476 |
| 561 url_loader_client_.RunUntilResponseBodyArrived(); | 477 url_loader_client_.RunUntilResponseBodyArrived(); |
| 562 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 478 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 563 | 479 |
| 564 const std::string data("abcdefgh"); | 480 const std::string data("abcdefgh"); |
| 565 strcpy(io_buffer->data(), data.c_str()); | 481 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 566 ASSERT_TRUE(handler_->OnReadCompleted(data.size(), &defer)); | 482 mock_loader_->OnReadCompleted(data)); |
| 567 EXPECT_TRUE(defer); | |
| 568 | 483 |
| 569 std::string contents; | 484 std::string contents; |
| 570 while (contents.size() < data.size()) { | 485 while (contents.size() < data.size()) { |
| 571 // This is needed for Resume to be called. | 486 // This is needed for Resume to be called. |
| 572 base::RunLoop().RunUntilIdle(); | 487 base::RunLoop().RunUntilIdle(); |
| 573 char buffer[16]; | 488 char buffer[16]; |
| 574 uint32_t read_size = sizeof(buffer); | 489 uint32_t read_size = sizeof(buffer); |
| 575 MojoResult result = | 490 MojoResult result = |
| 576 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 491 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
| 577 &read_size, MOJO_READ_DATA_FLAG_NONE); | 492 &read_size, MOJO_READ_DATA_FLAG_NONE); |
| 578 if (result == MOJO_RESULT_SHOULD_WAIT) | 493 if (result == MOJO_RESULT_SHOULD_WAIT) |
| 579 continue; | 494 continue; |
| 580 ASSERT_EQ(MOJO_RESULT_OK, result); | 495 ASSERT_EQ(MOJO_RESULT_OK, result); |
| 581 contents.append(buffer, read_size); | 496 contents.append(buffer, read_size); |
| 582 } | 497 } |
| 583 EXPECT_EQ(data, contents); | 498 EXPECT_EQ(data, contents); |
| 584 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | 499 EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 500 mock_loader_->status()); | |
| 585 } | 501 } |
| 586 | 502 |
| 587 TEST_F(MojoAsyncResourceHandlerTest, | 503 TEST_F(MojoAsyncResourceHandlerTest, |
| 588 IOBufferFromOnWillReadShouldRemainValidEvenIfHandlerIsGone) { | 504 IOBufferFromOnWillReadShouldRemainValidEvenIfHandlerIsGone) { |
| 589 scoped_refptr<net::IOBuffer> io_buffer; | |
| 590 int io_buffer_size = 0; | |
| 591 | |
| 592 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 505 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 593 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 506 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 594 ASSERT_TRUE(io_buffer); | |
| 595 // The io_buffer size that the mime sniffer requires implicitly. | 507 // The io_buffer size that the mime sniffer requires implicitly. |
| 596 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); | 508 ASSERT_GE(mock_loader_->io_buffer_size(), |
| 509 kSizeMimeSnifferRequiresForFirstOnWillRead); | |
| 597 | 510 |
| 598 handler_ = nullptr; | 511 handler_ = nullptr; |
| 599 url_loader_client_.Unbind(); | 512 url_loader_client_.Unbind(); |
| 600 base::RunLoop().RunUntilIdle(); | 513 base::RunLoop().RunUntilIdle(); |
| 601 | 514 |
| 602 // Hopefully ASAN checks this operation's validity. | 515 // Hopefully ASAN checks this operation's validity. |
| 603 io_buffer->data()[0] = 'A'; | 516 mock_loader_->io_buffer()->data()[0] = 'A'; |
| 604 } | 517 } |
| 605 | 518 |
| 606 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted) { | 519 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted) { |
| 607 bool defer = false; | |
| 608 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 520 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 609 | 521 |
| 610 ResourceRequestInfoImpl::ForRequest(request_.get()) | 522 ResourceRequestInfoImpl::ForRequest(request_.get()) |
| 611 ->set_was_ignored_by_handler(false); | 523 ->set_was_ignored_by_handler(false); |
| 612 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 524 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
| 613 | 525 |
| 614 base::TimeTicks now1 = base::TimeTicks::Now(); | 526 base::TimeTicks now1 = base::TimeTicks::Now(); |
| 615 handler_->OnResponseCompleted(status, &defer); | 527 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 528 mock_loader_->OnResponseCompleted(status)); | |
| 616 base::TimeTicks now2 = base::TimeTicks::Now(); | 529 base::TimeTicks now2 = base::TimeTicks::Now(); |
| 617 EXPECT_FALSE(defer); | |
| 618 | 530 |
| 619 url_loader_client_.RunUntilComplete(); | 531 url_loader_client_.RunUntilComplete(); |
| 620 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 532 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
| 621 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 533 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
| 622 EXPECT_FALSE(url_loader_client_.completion_status().was_ignored_by_handler); | 534 EXPECT_FALSE(url_loader_client_.completion_status().was_ignored_by_handler); |
| 623 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); | 535 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); |
| 624 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); | 536 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); |
| 625 EXPECT_EQ(request_->GetTotalReceivedBytes(), | 537 EXPECT_EQ(request_->GetTotalReceivedBytes(), |
| 626 url_loader_client_.completion_status().encoded_data_length); | 538 url_loader_client_.completion_status().encoded_data_length); |
| 627 } | 539 } |
| 628 | 540 |
| 629 // This test case sets different status values from OnResponseCompleted. | 541 // This test case sets different status values from OnResponseCompleted. |
| 630 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted2) { | 542 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompleted2) { |
| 631 rdh_.SetDelegate(nullptr); | 543 rdh_.SetDelegate(nullptr); |
| 632 bool defer = false; | |
| 633 // Don't use CallOnWillStartAndOnResponseStarted as this test case manually | 544 // Don't use CallOnWillStartAndOnResponseStarted as this test case manually |
| 634 // sets the null delegate. | 545 // sets the null delegate. |
| 635 ASSERT_TRUE(CallOnWillStart()); | 546 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 547 mock_loader_->OnWillStart(request_->url())); | |
| 636 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 548 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
| 637 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 549 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 638 ASSERT_FALSE(defer); | 550 mock_loader_->OnResponseStarted(response)); |
| 639 ASSERT_FALSE(url_loader_client_.has_received_response()); | 551 ASSERT_FALSE(url_loader_client_.has_received_response()); |
| 640 url_loader_client_.RunUntilResponseReceived(); | 552 url_loader_client_.RunUntilResponseReceived(); |
| 641 | 553 |
| 642 ResourceRequestInfoImpl::ForRequest(request_.get()) | 554 ResourceRequestInfoImpl::ForRequest(request_.get()) |
| 643 ->set_was_ignored_by_handler(true); | 555 ->set_was_ignored_by_handler(true); |
| 644 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, | 556 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, |
| 645 net::ERR_ABORTED); | 557 net::ERR_ABORTED); |
| 646 | 558 |
| 647 base::TimeTicks now1 = base::TimeTicks::Now(); | 559 base::TimeTicks now1 = base::TimeTicks::Now(); |
| 648 handler_->OnResponseCompleted(status, &defer); | 560 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 561 mock_loader_->OnResponseCompleted(status)); | |
| 649 base::TimeTicks now2 = base::TimeTicks::Now(); | 562 base::TimeTicks now2 = base::TimeTicks::Now(); |
| 650 EXPECT_FALSE(defer); | |
| 651 | 563 |
| 652 url_loader_client_.RunUntilComplete(); | 564 url_loader_client_.RunUntilComplete(); |
| 653 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 565 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
| 654 EXPECT_EQ(net::ERR_ABORTED, | 566 EXPECT_EQ(net::ERR_ABORTED, |
| 655 url_loader_client_.completion_status().error_code); | 567 url_loader_client_.completion_status().error_code); |
| 656 EXPECT_TRUE(url_loader_client_.completion_status().was_ignored_by_handler); | 568 EXPECT_TRUE(url_loader_client_.completion_status().was_ignored_by_handler); |
| 657 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); | 569 EXPECT_LE(now1, url_loader_client_.completion_status().completion_time); |
| 658 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); | 570 EXPECT_LE(url_loader_client_.completion_status().completion_time, now2); |
| 659 EXPECT_EQ(request_->GetTotalReceivedBytes(), | 571 EXPECT_EQ(request_->GetTotalReceivedBytes(), |
| 660 url_loader_client_.completion_status().encoded_data_length); | 572 url_loader_client_.completion_status().encoded_data_length); |
| 661 } | 573 } |
| 662 | 574 |
| 663 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithCanceledTimedOut) { | 575 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithCanceledTimedOut) { |
| 664 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, | 576 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, |
| 665 net::ERR_TIMED_OUT); | 577 net::ERR_TIMED_OUT); |
| 666 bool defer = false; | |
| 667 | 578 |
| 668 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 579 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 669 handler_->OnResponseCompleted(status, &defer); | 580 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 670 EXPECT_FALSE(defer); | 581 mock_loader_->OnResponseCompleted(status)); |
| 671 | 582 |
| 672 url_loader_client_.RunUntilComplete(); | 583 url_loader_client_.RunUntilComplete(); |
| 673 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 584 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
| 674 EXPECT_EQ(net::ERR_TIMED_OUT, | 585 EXPECT_EQ(net::ERR_TIMED_OUT, |
| 675 url_loader_client_.completion_status().error_code); | 586 url_loader_client_.completion_status().error_code); |
| 676 } | 587 } |
| 677 | 588 |
| 678 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithFailedTimedOut) { | 589 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithFailedTimedOut) { |
| 679 net::URLRequestStatus status(net::URLRequestStatus::FAILED, | 590 net::URLRequestStatus status(net::URLRequestStatus::FAILED, |
| 680 net::ERR_TIMED_OUT); | 591 net::ERR_TIMED_OUT); |
| 681 bool defer = false; | |
| 682 | 592 |
| 683 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 593 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 684 handler_->OnResponseCompleted(status, &defer); | 594 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 685 EXPECT_FALSE(defer); | 595 mock_loader_->OnResponseCompleted(status)); |
| 686 | 596 |
| 687 url_loader_client_.RunUntilComplete(); | 597 url_loader_client_.RunUntilComplete(); |
| 688 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 598 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
| 689 EXPECT_EQ(net::ERR_TIMED_OUT, | 599 EXPECT_EQ(net::ERR_TIMED_OUT, |
| 690 url_loader_client_.completion_status().error_code); | 600 url_loader_client_.completion_status().error_code); |
| 691 } | 601 } |
| 692 | 602 |
| 693 TEST_F(MojoAsyncResourceHandlerTest, ResponseCompletionShouldCloseDataPipe) { | 603 TEST_F(MojoAsyncResourceHandlerTest, ResponseCompletionShouldCloseDataPipe) { |
| 694 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 604 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 695 | 605 |
| 696 scoped_refptr<net::IOBuffer> io_buffer; | 606 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 697 int io_buffer_size = 0; | |
| 698 bool defer = false; | |
| 699 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 700 url_loader_client_.RunUntilResponseBodyArrived(); | 607 url_loader_client_.RunUntilResponseBodyArrived(); |
| 701 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 608 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 702 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); | 609 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0)); |
| 703 EXPECT_FALSE(defer); | |
| 704 | 610 |
| 705 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 611 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
| 706 handler_->OnResponseCompleted(status, &defer); | 612 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 707 EXPECT_FALSE(defer); | 613 mock_loader_->OnResponseCompleted(status)); |
| 708 | 614 |
| 709 url_loader_client_.RunUntilComplete(); | 615 url_loader_client_.RunUntilComplete(); |
| 710 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 616 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
| 711 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 617 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
| 712 | 618 |
| 713 // This is needed because |*io_buffer| may keep the data producer alive. | 619 // This is needed because |*io_buffer| may keep the data producer alive. |
|
Randy Smith (Not in Mondays)
2017/01/10 23:07:47
Note that this comment (here and elsewhere) is no
| |
| 714 io_buffer = nullptr; | 620 mock_loader_->ReleaseIOBuffer(); |
|
Randy Smith (Not in Mondays)
2017/01/10 23:07:47
Sorry, there's something about this interface that
mmenke
2017/01/11 22:12:54
Ah, you're absolutely correct. I've removed the m
| |
| 715 | 621 |
| 716 while (true) { | 622 while (true) { |
| 717 char buffer[16]; | 623 char buffer[16]; |
| 718 uint32_t read_size = sizeof(buffer); | 624 uint32_t read_size = sizeof(buffer); |
| 719 MojoResult result = | 625 MojoResult result = |
| 720 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 626 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
| 721 &read_size, MOJO_READ_DATA_FLAG_NONE); | 627 &read_size, MOJO_READ_DATA_FLAG_NONE); |
| 722 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 628 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
| 723 break; | 629 break; |
| 724 ASSERT_EQ(result, MOJO_RESULT_SHOULD_WAIT); | 630 ASSERT_EQ(result, MOJO_RESULT_SHOULD_WAIT); |
| 725 } | 631 } |
| 726 } | 632 } |
| 727 | 633 |
| 728 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission) { | 634 TEST_F(MojoAsyncResourceHandlerTest, OutOfBandCancelDuringBodyTransmission) { |
| 729 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 635 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 730 | 636 |
| 731 scoped_refptr<net::IOBuffer> io_buffer; | 637 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 732 int io_buffer_size = 0; | |
| 733 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 734 url_loader_client_.RunUntilResponseBodyArrived(); | 638 url_loader_client_.RunUntilResponseBodyArrived(); |
| 735 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 639 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 736 ASSERT_GT(io_buffer_size, 0); | 640 std::string data(mock_loader_->io_buffer_size(), 'a'); |
| 737 memset(io_buffer->data(), 'a', io_buffer_size); | 641 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 738 bool defer = false; | 642 mock_loader_->OnReadCompleted(data)); |
| 739 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | |
| 740 // We don't care |defer|'s value here. | |
| 741 | 643 |
| 742 defer = false; | |
| 743 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); | 644 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); |
| 744 handler_->OnResponseCompleted(status, &defer); | 645 ASSERT_EQ( |
| 745 EXPECT_FALSE(defer); | 646 MockResourceLoader::Status::IDLE, |
| 647 mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel(status)); | |
| 746 | 648 |
| 747 url_loader_client_.RunUntilComplete(); | 649 url_loader_client_.RunUntilComplete(); |
| 748 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 650 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
| 749 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); | 651 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); |
| 750 | 652 |
| 751 // This is needed because |*io_buffer| may keep the data producer alive. | 653 // This is needed because |*io_buffer| may keep the data producer alive. |
| 752 io_buffer = nullptr; | 654 mock_loader_->ReleaseIOBuffer(); |
| 753 | 655 |
| 754 std::string actual; | 656 std::string actual; |
| 755 while (true) { | 657 while (true) { |
| 756 char buf[16]; | 658 char buf[16]; |
| 757 uint32_t read_size = sizeof(buf); | 659 uint32_t read_size = sizeof(buf); |
| 758 MojoResult result = | 660 MojoResult result = |
| 759 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 661 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
| 760 MOJO_READ_DATA_FLAG_NONE); | 662 MOJO_READ_DATA_FLAG_NONE); |
| 761 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 663 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
| 762 break; | 664 break; |
| 763 if (result == MOJO_RESULT_SHOULD_WAIT) { | 665 if (result == MOJO_RESULT_SHOULD_WAIT) { |
| 764 base::RunLoop().RunUntilIdle(); | 666 base::RunLoop().RunUntilIdle(); |
| 765 continue; | 667 continue; |
| 766 } | 668 } |
| 767 EXPECT_EQ(MOJO_RESULT_OK, result); | 669 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 768 actual.append(buf, read_size); | 670 actual.append(buf, read_size); |
| 769 } | 671 } |
| 770 EXPECT_EQ(std::string(io_buffer_size, 'a'), actual); | 672 EXPECT_EQ(data, actual); |
| 771 } | 673 } |
| 772 | 674 |
| 773 // In this case, an error is notified after OnWillRead, before OnReadCompleted. | 675 // In this case, an error is notified after OnWillRead, before OnReadCompleted. |
| 774 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission2) { | 676 TEST_F(MojoAsyncResourceHandlerTest, ResponseErrorDuringBodyTransmission2) { |
| 775 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 677 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 776 | 678 |
| 777 scoped_refptr<net::IOBuffer> io_buffer; | 679 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 778 int io_buffer_size = 0; | |
| 779 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 780 url_loader_client_.RunUntilResponseBodyArrived(); | 680 url_loader_client_.RunUntilResponseBodyArrived(); |
| 781 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 681 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 782 bool defer = false; | |
| 783 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); | 682 net::URLRequestStatus status(net::URLRequestStatus::FAILED, net::ERR_FAILED); |
| 784 handler_->OnResponseCompleted(status, &defer); | 683 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 785 EXPECT_FALSE(defer); | 684 mock_loader_->OnResponseCompleted(status)); |
| 786 | 685 |
| 787 url_loader_client_.RunUntilComplete(); | 686 url_loader_client_.RunUntilComplete(); |
| 788 EXPECT_TRUE(url_loader_client_.has_received_completion()); | 687 EXPECT_TRUE(url_loader_client_.has_received_completion()); |
| 789 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); | 688 EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code); |
| 790 | 689 |
| 791 // This is needed because |*io_buffer| may keep the data producer alive. | 690 // This is needed because |*io_buffer| may keep the data producer alive. |
| 792 io_buffer = nullptr; | 691 mock_loader_->ReleaseIOBuffer(); |
| 793 | 692 |
| 794 while (true) { | 693 while (true) { |
| 795 char buf[16]; | 694 char buf[16]; |
| 796 uint32_t read_size = sizeof(buf); | 695 uint32_t read_size = sizeof(buf); |
| 797 MojoResult result = | 696 MojoResult result = |
| 798 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 697 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
| 799 MOJO_READ_DATA_FLAG_NONE); | 698 MOJO_READ_DATA_FLAG_NONE); |
| 800 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 699 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
| 801 break; | 700 break; |
| 802 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, result); | 701 ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, result); |
| 803 base::RunLoop().RunUntilIdle(); | 702 base::RunLoop().RunUntilIdle(); |
| 804 } | 703 } |
| 805 } | 704 } |
| 806 | 705 |
| 807 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteFailsOnWillRead) { | 706 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteFailsOnWillRead) { |
| 808 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 707 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
| 809 scoped_refptr<net::IOBuffer> io_buffer; | 708 scoped_refptr<net::IOBuffer> io_buffer; |
| 810 int io_buffer_size = 0; | 709 int io_buffer_size = 0; |
| 811 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 710 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 812 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 711 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); |
| 813 EXPECT_FALSE(resource_controller_.is_cancel_with_error_called()); | |
| 814 } | 712 } |
| 815 | 713 |
| 816 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) { | 714 TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) { |
| 817 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 715 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 818 scoped_refptr<net::IOBuffer> io_buffer; | |
| 819 int io_buffer_size = 0; | |
| 820 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 716 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 821 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 717 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 822 EXPECT_TRUE(io_buffer); | |
| 823 EXPECT_GT(io_buffer_size, 0); | |
| 824 } | 718 } |
| 825 | 719 |
| 826 TEST_F(MojoAsyncResourceHandlerTest, | 720 TEST_F(MojoAsyncResourceHandlerTest, |
| 827 BeginWriteReturnsShouldWaitOnWillReadAndThenReturnsOK) { | 721 BeginWriteReturnsShouldWaitOnWillReadAndThenReturnsOK) { |
| 828 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 722 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 829 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 723 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 830 size_t written = 0; | 724 size_t written = 0; |
| 831 while (true) { | 725 while (true) { |
| 832 scoped_refptr<net::IOBuffer> io_buffer; | 726 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 833 int io_buffer_size = 0; | 727 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
| 834 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 728 std::string(mock_loader_->io_buffer_size(), 'X')); |
| 835 EXPECT_TRUE(io_buffer); | 729 written += mock_loader_->io_buffer_size(); |
| 836 EXPECT_GT(io_buffer_size, 0); | 730 if (result == MockResourceLoader::Status::CALLBACK_PENDING) |
| 837 memset(io_buffer->data(), 'X', io_buffer_size); | |
| 838 written += io_buffer_size; | |
| 839 bool defer = false; | |
| 840 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | |
| 841 if (defer) | |
| 842 break; | 731 break; |
| 732 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
| 843 } | 733 } |
| 844 | 734 |
| 845 url_loader_client_.RunUntilResponseBodyArrived(); | 735 url_loader_client_.RunUntilResponseBodyArrived(); |
| 846 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 736 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 847 handler_->ResetBeginWriteExpectation(); | 737 handler_->ResetBeginWriteExpectation(); |
| 848 handler_->OnWritableForTesting(); | 738 handler_->OnWritableForTesting(); |
| 849 | 739 |
| 850 std::string actual; | 740 std::string actual; |
| 851 while (actual.size() < written) { | 741 while (actual.size() < written) { |
| 852 char buf[16]; | 742 char buf[16]; |
| 853 uint32_t read_size = sizeof(buf); | 743 uint32_t read_size = sizeof(buf); |
| 854 MojoResult result = | 744 MojoResult result = |
| 855 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 745 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
| 856 MOJO_READ_DATA_FLAG_NONE); | 746 MOJO_READ_DATA_FLAG_NONE); |
| 857 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); | 747 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); |
| 858 if (result == MOJO_RESULT_OK) | 748 if (result == MOJO_RESULT_OK) |
| 859 actual.append(buf, read_size); | 749 actual.append(buf, read_size); |
| 860 base::RunLoop().RunUntilIdle(); | 750 base::RunLoop().RunUntilIdle(); |
| 861 } | 751 } |
| 862 | 752 |
| 863 EXPECT_EQ(std::string(written, 'X'), actual); | 753 EXPECT_EQ(std::string(written, 'X'), actual); |
| 864 EXPECT_EQ(1, resource_controller_.num_resume_calls()); | 754 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
| 865 } | 755 } |
| 866 | 756 |
| 867 TEST_F(MojoAsyncResourceHandlerTest, | 757 TEST_F(MojoAsyncResourceHandlerTest, |
| 868 EndWriteFailsOnWillReadWithInsufficientInitialCapacity) { | 758 EndWriteFailsOnWillReadWithInsufficientInitialCapacity) { |
| 869 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); | 759 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); |
| 870 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 760 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 871 handler_->set_end_write_expectation(MOJO_RESULT_UNKNOWN); | 761 handler_->set_end_write_expectation(MOJO_RESULT_UNKNOWN); |
| 872 scoped_refptr<net::IOBuffer> io_buffer; | 762 ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead(-1)); |
| 873 int io_buffer_size = 0; | |
| 874 ASSERT_FALSE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 875 } | 763 } |
| 876 | 764 |
| 877 TEST_F(MojoAsyncResourceHandlerTest, EndWriteFailsOnReadCompleted) { | 765 TEST_F(MojoAsyncResourceHandlerTest, EndWriteFailsOnReadCompleted) { |
| 878 scoped_refptr<net::IOBuffer> io_buffer; | |
| 879 int io_buffer_size = 0; | |
| 880 bool defer = false; | |
| 881 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 766 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 882 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 767 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 883 | 768 |
| 884 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 769 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 885 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 770 ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
| 771 mock_loader_->OnReadCompleted( | |
| 772 std::string(mock_loader_->io_buffer_size(), 'w'))); | |
| 886 } | 773 } |
| 887 | 774 |
| 888 TEST_F(MojoAsyncResourceHandlerTest, | 775 TEST_F(MojoAsyncResourceHandlerTest, |
| 889 EndWriteFailsOnReadCompletedWithInsufficientInitialCapacity) { | 776 EndWriteFailsOnReadCompletedWithInsufficientInitialCapacity) { |
| 890 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); | 777 MojoAsyncResourceHandler::SetAllocationSizeForTesting(2); |
| 891 scoped_refptr<net::IOBuffer> io_buffer; | |
| 892 int io_buffer_size = 0; | |
| 893 bool defer = false; | |
| 894 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 778 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 895 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 779 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 896 | 780 |
| 897 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 781 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 898 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 782 ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
| 783 mock_loader_->OnReadCompleted( | |
| 784 std::string(mock_loader_->io_buffer_size(), 'w'))); | |
| 899 } | 785 } |
| 900 | 786 |
| 901 TEST_F(MojoAsyncResourceHandlerTest, | 787 TEST_F(MojoAsyncResourceHandlerTest, |
| 902 EndWriteFailsOnResumeWithInsufficientInitialCapacity) { | 788 EndWriteFailsOnResumeWithInsufficientInitialCapacity) { |
| 903 MojoAsyncResourceHandler::SetAllocationSizeForTesting(8); | 789 MojoAsyncResourceHandler::SetAllocationSizeForTesting(8); |
| 904 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 790 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 905 scoped_refptr<net::IOBuffer> io_buffer; | 791 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 906 int io_buffer_size = 0; | |
| 907 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 908 url_loader_client_.RunUntilResponseBodyArrived(); | 792 url_loader_client_.RunUntilResponseBodyArrived(); |
| 909 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 793 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 910 | 794 |
| 911 while (true) { | 795 while (true) { |
| 912 bool defer = false; | 796 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
| 913 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 797 std::string(mock_loader_->io_buffer_size(), 'A')); |
| 914 ASSERT_GE(io_buffer_size, 0); | 798 if (result == MockResourceLoader::Status::CALLBACK_PENDING) |
| 915 if (defer) | |
| 916 break; | 799 break; |
| 917 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 800 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); |
| 801 | |
| 802 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); | |
| 918 } | 803 } |
| 919 | 804 |
| 920 while (true) { | 805 while (true) { |
| 921 char buf[16]; | 806 char buf[16]; |
| 922 uint32_t read_size = sizeof(buf); | 807 uint32_t read_size = sizeof(buf); |
| 923 MojoResult result = | 808 MojoResult result = |
| 924 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 809 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
| 925 MOJO_READ_DATA_FLAG_NONE); | 810 MOJO_READ_DATA_FLAG_NONE); |
| 926 if (result == MOJO_RESULT_SHOULD_WAIT) | 811 if (result == MOJO_RESULT_SHOULD_WAIT) |
| 927 break; | 812 break; |
| 928 ASSERT_EQ(MOJO_RESULT_OK, result); | 813 ASSERT_EQ(MOJO_RESULT_OK, result); |
| 929 } | 814 } |
| 930 | 815 |
| 931 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 816 handler_->set_end_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 932 resource_controller_.RunUntilCancelWithErrorCalled(); | 817 mock_loader_->WaitUntilIdleOrCanceled(); |
| 933 EXPECT_FALSE(url_loader_client_.has_received_completion()); | 818 EXPECT_FALSE(url_loader_client_.has_received_completion()); |
| 934 EXPECT_TRUE(resource_controller_.is_cancel_with_error_called()); | 819 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status()); |
| 935 EXPECT_EQ(net::ERR_FAILED, resource_controller_.error()); | 820 EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); |
| 936 } | 821 } |
| 937 | 822 |
| 938 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 823 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 939 OnWillReadWithLongContents) { | 824 OnWillReadWithLongContents) { |
| 940 bool defer = false; | |
| 941 scoped_refptr<net::IOBuffer> io_buffer; | |
| 942 int io_buffer_size = 0; | |
| 943 | |
| 944 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 825 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 945 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 826 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 946 ASSERT_TRUE(io_buffer); | |
| 947 // The io_buffer size that the mime sniffer requires implicitly. | |
| 948 ASSERT_GE(io_buffer_size, kSizeMimeSnifferRequiresForFirstOnWillRead); | |
| 949 std::string expected; | 827 std::string expected; |
| 950 for (int i = 0; i < 3 * io_buffer_size + 2; ++i) | 828 for (int i = 0; i < 3 * mock_loader_->io_buffer_size() + 2; ++i) |
| 951 expected += ('A' + i % 26); | 829 expected += ('A' + i % 26); |
| 952 | 830 |
| 953 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); | 831 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0)); |
| 954 ASSERT_FALSE(defer); | |
| 955 | 832 |
| 956 url_loader_client_.RunUntilResponseBodyArrived(); | 833 url_loader_client_.RunUntilResponseBodyArrived(); |
| 957 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 834 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 958 | 835 |
| 959 size_t written = 0; | 836 size_t written = 0; |
| 960 std::string actual; | 837 std::string actual; |
| 961 while (actual.size() < expected.size()) { | 838 while (actual.size() < expected.size()) { |
| 962 while (written < expected.size() && !defer) { | 839 while (written < expected.size() && |
| 963 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 840 mock_loader_->status() == MockResourceLoader::Status::IDLE) { |
| 964 const size_t to_be_written = std::min(static_cast<size_t>(io_buffer_size), | 841 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 965 expected.size() - written); | 842 const size_t to_be_written = |
| 966 memcpy(io_buffer->data(), &expected[written], to_be_written); | 843 std::min(static_cast<size_t>(mock_loader_->io_buffer_size()), |
| 967 ASSERT_TRUE(handler_->OnReadCompleted(to_be_written, &defer)); | 844 expected.size() - written); |
| 845 | |
| 846 // Request should be resumed or paused. | |
| 847 ASSERT_NE(MockResourceLoader::Status::CANCELED, | |
| 848 mock_loader_->OnReadCompleted( | |
| 849 expected.substr(written, to_be_written))); | |
| 850 | |
| 968 written += to_be_written; | 851 written += to_be_written; |
| 969 } | 852 } |
| 970 | 853 |
| 971 char buf[16]; | 854 char buf[16]; |
| 972 uint32_t read_size = sizeof(buf); | 855 uint32_t read_size = sizeof(buf); |
| 973 MojoResult result = | 856 MojoResult result = |
| 974 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 857 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
| 975 MOJO_READ_DATA_FLAG_NONE); | 858 MOJO_READ_DATA_FLAG_NONE); |
| 976 if (result != MOJO_RESULT_SHOULD_WAIT) { | 859 if (result != MOJO_RESULT_SHOULD_WAIT) { |
| 977 ASSERT_EQ(MOJO_RESULT_OK, result); | 860 ASSERT_EQ(MOJO_RESULT_OK, result); |
| 978 actual.append(buf, read_size); | 861 actual.append(buf, read_size); |
| 979 } | 862 } |
| 980 int resume_count = resource_controller_.num_resume_calls(); | 863 |
| 864 // Give mojo a chance pass data back and forth, and to request more data | |
| 865 // from the handler. | |
| 981 base::RunLoop().RunUntilIdle(); | 866 base::RunLoop().RunUntilIdle(); |
| 982 // Continue writing if controller->Resume() is called. | |
| 983 defer = (resume_count == resource_controller_.num_resume_calls()); | |
| 984 } | 867 } |
| 985 EXPECT_EQ(expected, actual); | 868 EXPECT_EQ(expected, actual); |
| 986 } | 869 } |
| 987 | 870 |
| 988 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 871 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 989 BeginWriteFailsOnReadCompleted) { | 872 BeginWriteFailsOnReadCompleted) { |
| 990 scoped_refptr<net::IOBuffer> io_buffer; | |
| 991 int io_buffer_size = 0; | |
| 992 bool defer = false; | |
| 993 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 873 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 994 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 874 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 995 | 875 |
| 996 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 876 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
| 997 ASSERT_FALSE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 877 ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
| 878 mock_loader_->OnReadCompleted( | |
| 879 std::string(mock_loader_->io_buffer_size(), 'A'))); | |
| 998 } | 880 } |
| 999 | 881 |
| 1000 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 882 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1001 BeginWriteReturnsShouldWaitOnReadCompleted) { | 883 BeginWriteReturnsShouldWaitOnReadCompleted) { |
| 1002 scoped_refptr<net::IOBuffer> io_buffer; | |
| 1003 int io_buffer_size = 0; | |
| 1004 bool defer = false; | |
| 1005 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 884 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 1006 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 885 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 1007 | 886 |
| 1008 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); | 887 handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT); |
| 1009 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 888 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 1010 EXPECT_TRUE(defer); | 889 mock_loader_->OnReadCompleted( |
| 890 std::string(mock_loader_->io_buffer_size(), 'A'))); | |
| 1011 } | 891 } |
| 1012 | 892 |
| 1013 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 893 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1014 BeginWriteFailsOnResume) { | 894 BeginWriteFailsOnResume) { |
| 1015 bool defer = false; | |
| 1016 int io_buffer_size = 0; | |
| 1017 scoped_refptr<net::IOBuffer> io_buffer; | |
| 1018 | |
| 1019 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 895 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 1020 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 896 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 1021 ASSERT_TRUE(handler_->OnReadCompleted(0, &defer)); | 897 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0)); |
| 1022 ASSERT_FALSE(defer); | |
| 1023 url_loader_client_.RunUntilResponseBodyArrived(); | 898 url_loader_client_.RunUntilResponseBodyArrived(); |
| 1024 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 899 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 1025 | 900 |
| 1026 while (!defer) { | 901 while (true) { |
| 1027 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 902 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 1028 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 903 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
| 904 std::string(mock_loader_->io_buffer_size(), 'A')); | |
| 905 if (result == MockResourceLoader::Status::CALLBACK_PENDING) | |
| 906 break; | |
| 907 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
| 1029 } | 908 } |
| 1030 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); | 909 handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN); |
| 1031 | 910 |
| 1032 while (!resource_controller_.is_cancel_with_error_called()) { | 911 while (mock_loader_->status() != MockResourceLoader::Status::CANCELED) { |
| 1033 char buf[256]; | 912 char buf[256]; |
| 1034 uint32_t read_size = sizeof(buf); | 913 uint32_t read_size = sizeof(buf); |
| 1035 MojoResult result = | 914 MojoResult result = |
| 1036 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, | 915 mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size, |
| 1037 MOJO_READ_DATA_FLAG_NONE); | 916 MOJO_READ_DATA_FLAG_NONE); |
| 1038 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); | 917 ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT); |
| 1039 base::RunLoop().RunUntilIdle(); | 918 base::RunLoop().RunUntilIdle(); |
| 1040 } | 919 } |
| 1041 | 920 |
| 1042 EXPECT_FALSE(url_loader_client_.has_received_completion()); | 921 EXPECT_FALSE(url_loader_client_.has_received_completion()); |
| 1043 EXPECT_EQ(net::ERR_FAILED, resource_controller_.error()); | 922 EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code()); |
| 1044 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | |
| 1045 } | 923 } |
| 1046 | 924 |
| 1047 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) { | 925 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) { |
| 1048 bool defer = false; | |
| 1049 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); | 926 ASSERT_TRUE(CallOnWillStartAndOnResponseStarted()); |
| 1050 | 927 |
| 1051 while (!defer) { | 928 while (true) { |
| 1052 scoped_refptr<net::IOBuffer> io_buffer; | 929 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 1053 int io_buffer_size = 0; | 930 MockResourceLoader::Status result = mock_loader_->OnReadCompleted( |
| 1054 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | 931 std::string(mock_loader_->io_buffer_size(), 'A')); |
| 1055 ASSERT_TRUE(handler_->OnReadCompleted(io_buffer_size, &defer)); | 932 if (result == MockResourceLoader::Status::CALLBACK_PENDING) |
| 933 break; | |
| 934 ASSERT_EQ(MockResourceLoader::Status::IDLE, result); | |
| 1056 } | 935 } |
| 1057 | 936 |
| 1058 url_loader_client_.RunUntilResponseBodyArrived(); | 937 url_loader_client_.RunUntilResponseBodyArrived(); |
| 1059 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 938 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 1060 | 939 |
| 1061 defer = false; | |
| 1062 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, | 940 net::URLRequestStatus status(net::URLRequestStatus::CANCELED, |
| 1063 net::ERR_ABORTED); | 941 net::ERR_ABORTED); |
| 1064 handler_->OnResponseCompleted(status, &defer); | 942 ASSERT_EQ( |
| 943 MockResourceLoader::Status::IDLE, | |
| 944 mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel(status)); | |
| 1065 | 945 |
| 1066 ASSERT_FALSE(url_loader_client_.has_received_completion()); | 946 ASSERT_FALSE(url_loader_client_.has_received_completion()); |
| 1067 url_loader_client_.RunUntilComplete(); | 947 url_loader_client_.RunUntilComplete(); |
| 1068 EXPECT_EQ(net::ERR_ABORTED, | 948 EXPECT_EQ(net::ERR_ABORTED, |
| 1069 url_loader_client_.completion_status().error_code); | 949 url_loader_client_.completion_status().error_code); |
| 1070 | 950 |
| 1071 while (true) { | 951 while (true) { |
| 1072 char buffer[16]; | 952 char buffer[16]; |
| 1073 uint32_t read_size = sizeof(buffer); | 953 uint32_t read_size = sizeof(buffer); |
| 1074 MojoResult result = | 954 MojoResult result = |
| 1075 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 955 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
| 1076 &read_size, MOJO_READ_DATA_FLAG_NONE); | 956 &read_size, MOJO_READ_DATA_FLAG_NONE); |
| 1077 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 957 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
| 1078 break; | 958 break; |
| 1079 base::RunLoop().RunUntilIdle(); | 959 base::RunLoop().RunUntilIdle(); |
| 1080 DCHECK(result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_OK); | 960 DCHECK(result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_OK); |
| 1081 } | 961 } |
| 1082 | 962 |
| 1083 base::RunLoop().RunUntilIdle(); | 963 base::RunLoop().RunUntilIdle(); |
| 1084 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | |
| 1085 } | 964 } |
| 1086 | 965 |
| 1087 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, RedirectHandling) { | 966 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, RedirectHandling) { |
| 1088 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 967 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
| 1089 bool defer = false; | |
| 1090 | 968 |
| 1091 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); | 969 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1092 ASSERT_FALSE(defer); | 970 mock_loader_->OnWillStart(request_->url())); |
| 971 | |
| 1093 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 972 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
| 1094 net::RedirectInfo redirect_info; | 973 net::RedirectInfo redirect_info; |
| 1095 redirect_info.status_code = 301; | 974 redirect_info.status_code = 301; |
| 1096 ASSERT_TRUE( | 975 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 1097 handler_->OnRequestRedirected(redirect_info, response.get(), &defer)); | 976 mock_loader_->OnRequestRedirected(redirect_info, response)); |
| 1098 ASSERT_TRUE(defer); | |
| 1099 | 977 |
| 1100 ASSERT_FALSE(url_loader_client_.has_received_response()); | 978 ASSERT_FALSE(url_loader_client_.has_received_response()); |
| 1101 ASSERT_FALSE(url_loader_client_.has_received_redirect()); | 979 ASSERT_FALSE(url_loader_client_.has_received_redirect()); |
| 1102 url_loader_client_.RunUntilRedirectReceived(); | 980 url_loader_client_.RunUntilRedirectReceived(); |
| 1103 | 981 |
| 1104 ASSERT_FALSE(url_loader_client_.has_received_response()); | 982 ASSERT_FALSE(url_loader_client_.has_received_response()); |
| 1105 ASSERT_TRUE(url_loader_client_.has_received_redirect()); | 983 ASSERT_TRUE(url_loader_client_.has_received_redirect()); |
| 1106 EXPECT_EQ(301, url_loader_client_.redirect_info().status_code); | 984 EXPECT_EQ(301, url_loader_client_.redirect_info().status_code); |
| 1107 | 985 |
| 1108 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | 986 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 987 mock_loader_->status()); | |
| 1109 handler_->FollowRedirect(); | 988 handler_->FollowRedirect(); |
| 1110 EXPECT_EQ(1, resource_controller_.num_resume_calls()); | 989 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
| 1111 | 990 |
| 1112 url_loader_client_.ClearHasReceivedRedirect(); | 991 url_loader_client_.ClearHasReceivedRedirect(); |
| 1113 // Redirect once more. | 992 // Redirect once more. |
| 1114 defer = false; | |
| 1115 redirect_info.status_code = 302; | 993 redirect_info.status_code = 302; |
| 1116 ASSERT_TRUE( | 994 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 1117 handler_->OnRequestRedirected(redirect_info, response.get(), &defer)); | 995 mock_loader_->OnRequestRedirected(redirect_info, response)); |
| 1118 ASSERT_TRUE(defer); | |
| 1119 | 996 |
| 1120 ASSERT_FALSE(url_loader_client_.has_received_response()); | 997 ASSERT_FALSE(url_loader_client_.has_received_response()); |
| 1121 ASSERT_FALSE(url_loader_client_.has_received_redirect()); | 998 ASSERT_FALSE(url_loader_client_.has_received_redirect()); |
| 1122 url_loader_client_.RunUntilRedirectReceived(); | 999 url_loader_client_.RunUntilRedirectReceived(); |
| 1123 | 1000 |
| 1124 ASSERT_FALSE(url_loader_client_.has_received_response()); | 1001 ASSERT_FALSE(url_loader_client_.has_received_response()); |
| 1125 ASSERT_TRUE(url_loader_client_.has_received_redirect()); | 1002 ASSERT_TRUE(url_loader_client_.has_received_redirect()); |
| 1126 EXPECT_EQ(302, url_loader_client_.redirect_info().status_code); | 1003 EXPECT_EQ(302, url_loader_client_.redirect_info().status_code); |
| 1127 | 1004 |
| 1128 EXPECT_EQ(1, resource_controller_.num_resume_calls()); | 1005 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| 1006 mock_loader_->status()); | |
| 1129 handler_->FollowRedirect(); | 1007 handler_->FollowRedirect(); |
| 1130 EXPECT_EQ(2, resource_controller_.num_resume_calls()); | 1008 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
| 1131 | 1009 |
| 1132 // Give the final response. | 1010 // Give the final response. |
| 1133 defer = false; | 1011 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1134 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 1012 mock_loader_->OnResponseStarted(response)); |
| 1135 ASSERT_FALSE(defer); | |
| 1136 | 1013 |
| 1137 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 1014 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
| 1138 handler_->OnResponseCompleted(status, &defer); | 1015 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1139 ASSERT_FALSE(defer); | 1016 mock_loader_->OnResponseCompleted(status)); |
| 1140 | 1017 |
| 1141 ASSERT_FALSE(url_loader_client_.has_received_completion()); | 1018 ASSERT_FALSE(url_loader_client_.has_received_completion()); |
| 1142 url_loader_client_.RunUntilComplete(); | 1019 url_loader_client_.RunUntilComplete(); |
| 1143 | 1020 |
| 1144 ASSERT_TRUE(url_loader_client_.has_received_response()); | 1021 ASSERT_TRUE(url_loader_client_.has_received_response()); |
| 1145 ASSERT_TRUE(url_loader_client_.has_received_completion()); | 1022 ASSERT_TRUE(url_loader_client_.has_received_completion()); |
| 1146 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 1023 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
| 1147 } | 1024 } |
| 1148 | 1025 |
| 1026 // Test the case where th other process tells the ResourceHandler to follow a | |
| 1027 // redirect, despite the fact that no redirect has been received yet. | |
| 1149 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1028 TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1150 MalformedFollowRedirectRequest) { | 1029 MalformedFollowRedirectRequest) { |
| 1151 handler_->FollowRedirect(); | 1030 handler_->FollowRedirect(); |
| 1152 | 1031 |
| 1153 EXPECT_TRUE(handler_->has_received_bad_message()); | 1032 EXPECT_TRUE(handler_->has_received_bad_message()); |
| 1154 EXPECT_EQ(0, resource_controller_.num_resume_calls()); | |
| 1155 } | 1033 } |
| 1156 | 1034 |
| 1157 // Typically ResourceHandler methods are called in this order. | 1035 // Typically ResourceHandler methods are called in this order. |
| 1158 TEST_P( | 1036 TEST_P( |
| 1159 MojoAsyncResourceHandlerWithAllocationSizeTest, | 1037 MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1160 OnWillStartThenOnResponseStartedThenOnWillReadThenOnReadCompletedThenOnRespo nseCompleted) { | 1038 OnWillStartThenOnResponseStartedThenOnWillReadThenOnReadCompletedThenOnRespo nseCompleted) { |
| 1161 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 1039 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
| 1162 bool defer = false; | |
| 1163 | 1040 |
| 1164 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); | 1041 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1165 ASSERT_FALSE(defer); | 1042 mock_loader_->OnWillStart(request_->url())); |
| 1166 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 1043 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
| 1167 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 1044 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1168 ASSERT_FALSE(defer); | 1045 mock_loader_->OnResponseStarted(response)); |
| 1169 | 1046 |
| 1170 ASSERT_FALSE(url_loader_client_.has_received_response()); | 1047 ASSERT_FALSE(url_loader_client_.has_received_response()); |
| 1171 url_loader_client_.RunUntilResponseReceived(); | 1048 url_loader_client_.RunUntilResponseReceived(); |
| 1172 | 1049 |
| 1173 int io_buffer_size = 0; | 1050 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 1174 scoped_refptr<net::IOBuffer> io_buffer; | |
| 1175 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 1176 ASSERT_TRUE(io_buffer); | |
| 1177 ASSERT_GT(io_buffer_size, 0); | |
| 1178 io_buffer->data()[0] = 'A'; | |
| 1179 | 1051 |
| 1180 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); | 1052 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); |
| 1181 url_loader_client_.RunUntilResponseBodyArrived(); | 1053 url_loader_client_.RunUntilResponseBodyArrived(); |
| 1182 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 1054 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 1183 | 1055 |
| 1184 ASSERT_TRUE(handler_->OnReadCompleted(1, &defer)); | 1056 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1185 ASSERT_FALSE(defer); | 1057 mock_loader_->OnReadCompleted("A")); |
| 1186 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 1058 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
| 1187 handler_->OnResponseCompleted(status, &defer); | 1059 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1188 ASSERT_FALSE(defer); | 1060 mock_loader_->OnResponseCompleted(status)); |
| 1189 | 1061 |
| 1190 ASSERT_FALSE(url_loader_client_.has_received_completion()); | 1062 ASSERT_FALSE(url_loader_client_.has_received_completion()); |
| 1191 url_loader_client_.RunUntilComplete(); | 1063 url_loader_client_.RunUntilComplete(); |
| 1192 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 1064 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
| 1193 | 1065 |
| 1194 // This is needed because |*io_buffer| may keep the data producer alive. | 1066 // This is needed because |*io_buffer| may keep the data producer alive. |
| 1195 io_buffer = nullptr; | 1067 mock_loader_->ReleaseIOBuffer(); |
| 1196 | 1068 |
| 1197 std::string body; | 1069 std::string body; |
| 1198 while (true) { | 1070 while (true) { |
| 1199 char buffer[16]; | 1071 char buffer[16]; |
| 1200 uint32_t read_size = sizeof(buffer); | 1072 uint32_t read_size = sizeof(buffer); |
| 1201 MojoResult result = | 1073 MojoResult result = |
| 1202 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 1074 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
| 1203 &read_size, MOJO_READ_DATA_FLAG_NONE); | 1075 &read_size, MOJO_READ_DATA_FLAG_NONE); |
| 1204 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 1076 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
| 1205 break; | 1077 break; |
| 1206 if (result == MOJO_RESULT_SHOULD_WAIT) { | 1078 if (result == MOJO_RESULT_SHOULD_WAIT) { |
| 1207 base::RunLoop().RunUntilIdle(); | 1079 base::RunLoop().RunUntilIdle(); |
| 1208 } else { | 1080 } else { |
| 1209 ASSERT_EQ(result, MOJO_RESULT_OK); | 1081 ASSERT_EQ(result, MOJO_RESULT_OK); |
| 1210 body.append(buffer, read_size); | 1082 body.append(buffer, read_size); |
| 1211 } | 1083 } |
| 1212 } | 1084 } |
| 1213 EXPECT_EQ("A", body); | 1085 EXPECT_EQ("A", body); |
| 1214 } | 1086 } |
| 1215 | 1087 |
| 1216 // MimeResourceHandler calls delegated ResourceHandler's methods in this order. | 1088 // MimeResourceHandler calls delegated ResourceHandler's methods in this order. |
| 1217 TEST_P( | 1089 TEST_P( |
| 1218 MojoAsyncResourceHandlerWithAllocationSizeTest, | 1090 MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1219 OnWillStartThenOnWillReadThenOnResponseStartedThenOnReadCompletedThenOnRespo nseCompleted) { | 1091 OnWillStartThenOnWillReadThenOnResponseStartedThenOnReadCompletedThenOnRespo nseCompleted) { |
| 1220 rdh_delegate_.set_num_on_response_started_calls_expectation(1); | 1092 rdh_delegate_.set_num_on_response_started_calls_expectation(1); |
| 1221 bool defer = false; | |
| 1222 | 1093 |
| 1223 ASSERT_TRUE(handler_->OnWillStart(request_->url(), &defer)); | 1094 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1224 ASSERT_FALSE(defer); | 1095 mock_loader_->OnWillStart(request_->url())); |
| 1225 | 1096 |
| 1226 int io_buffer_size = 0; | 1097 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead(-1)); |
| 1227 scoped_refptr<net::IOBuffer> io_buffer; | |
| 1228 ASSERT_TRUE(handler_->OnWillRead(&io_buffer, &io_buffer_size, -1)); | |
| 1229 ASSERT_TRUE(io_buffer); | |
| 1230 ASSERT_GT(io_buffer_size, 0); | |
| 1231 io_buffer->data()[0] = 'B'; | |
| 1232 | 1098 |
| 1233 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); | 1099 ASSERT_FALSE(url_loader_client_.response_body().is_valid()); |
| 1234 url_loader_client_.RunUntilResponseBodyArrived(); | 1100 url_loader_client_.RunUntilResponseBodyArrived(); |
| 1235 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); | 1101 ASSERT_TRUE(url_loader_client_.response_body().is_valid()); |
| 1236 | 1102 |
| 1237 scoped_refptr<ResourceResponse> response = new ResourceResponse(); | 1103 scoped_refptr<ResourceResponse> response = new ResourceResponse(); |
| 1238 ASSERT_TRUE(handler_->OnResponseStarted(response.get(), &defer)); | 1104 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1239 ASSERT_FALSE(defer); | 1105 mock_loader_->OnResponseStarted(response)); |
| 1240 | 1106 |
| 1241 ASSERT_FALSE(url_loader_client_.has_received_response()); | 1107 ASSERT_FALSE(url_loader_client_.has_received_response()); |
| 1242 url_loader_client_.RunUntilResponseReceived(); | 1108 url_loader_client_.RunUntilResponseReceived(); |
| 1243 | 1109 |
| 1244 ASSERT_TRUE(handler_->OnReadCompleted(1, &defer)); | 1110 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1245 ASSERT_FALSE(defer); | 1111 mock_loader_->OnReadCompleted("B")); |
| 1246 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); | 1112 net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, net::OK); |
| 1247 handler_->OnResponseCompleted(status, &defer); | 1113 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| 1248 ASSERT_FALSE(defer); | 1114 mock_loader_->OnResponseCompleted(status)); |
| 1249 | 1115 |
| 1250 ASSERT_FALSE(url_loader_client_.has_received_completion()); | 1116 ASSERT_FALSE(url_loader_client_.has_received_completion()); |
| 1251 url_loader_client_.RunUntilComplete(); | 1117 url_loader_client_.RunUntilComplete(); |
| 1252 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); | 1118 EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code); |
| 1253 | 1119 |
| 1254 // This is needed because |*io_buffer| may keep the data producer alive. | 1120 // This is needed because |*io_buffer| may keep the data producer alive. |
| 1255 io_buffer = nullptr; | 1121 mock_loader_->ReleaseIOBuffer(); |
| 1256 | 1122 |
| 1257 std::string body; | 1123 std::string body; |
| 1258 while (true) { | 1124 while (true) { |
| 1259 char buffer[16]; | 1125 char buffer[16]; |
| 1260 uint32_t read_size = sizeof(buffer); | 1126 uint32_t read_size = sizeof(buffer); |
| 1261 MojoResult result = | 1127 MojoResult result = |
| 1262 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, | 1128 mojo::ReadDataRaw(url_loader_client_.response_body(), buffer, |
| 1263 &read_size, MOJO_READ_DATA_FLAG_NONE); | 1129 &read_size, MOJO_READ_DATA_FLAG_NONE); |
| 1264 if (result == MOJO_RESULT_FAILED_PRECONDITION) | 1130 if (result == MOJO_RESULT_FAILED_PRECONDITION) |
| 1265 break; | 1131 break; |
| 1266 if (result == MOJO_RESULT_SHOULD_WAIT) { | 1132 if (result == MOJO_RESULT_SHOULD_WAIT) { |
| 1267 base::RunLoop().RunUntilIdle(); | 1133 base::RunLoop().RunUntilIdle(); |
| 1268 } else { | 1134 } else { |
| 1269 ASSERT_EQ(result, MOJO_RESULT_OK); | 1135 ASSERT_EQ(result, MOJO_RESULT_OK); |
| 1270 body.append(buffer, read_size); | 1136 body.append(buffer, read_size); |
| 1271 } | 1137 } |
| 1272 } | 1138 } |
| 1273 EXPECT_EQ("B", body); | 1139 EXPECT_EQ("B", body); |
| 1274 } | 1140 } |
| 1275 | 1141 |
| 1276 INSTANTIATE_TEST_CASE_P(MojoAsyncResourceHandlerWithAllocationSizeTest, | 1142 INSTANTIATE_TEST_CASE_P(MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1277 MojoAsyncResourceHandlerWithAllocationSizeTest, | 1143 MojoAsyncResourceHandlerWithAllocationSizeTest, |
| 1278 ::testing::Values(8, 32 * 2014)); | 1144 ::testing::Values(8, 32 * 2014)); |
| 1279 } // namespace | 1145 } // namespace |
| 1280 } // namespace content | 1146 } // namespace content |
| OLD | NEW |