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 |