| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "net/proxy/proxy_resolver_mojo.h" | 5 #include "net/proxy/proxy_resolver_mojo.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <queue> | 9 #include <queue> |
| 10 #include <string> | 10 #include <string> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/memory/scoped_vector.h" | 14 #include "base/memory/scoped_vector.h" |
| 15 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
| 16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
| 17 #include "mojo/common/common_type_converters.h" | 17 #include "mojo/common/common_type_converters.h" |
| 18 #include "net/base/net_errors.h" | 18 #include "net/base/net_errors.h" |
| 19 #include "net/base/test_completion_callback.h" | 19 #include "net/base/test_completion_callback.h" |
| 20 #include "net/log/net_log.h" | 20 #include "net/log/net_log.h" |
| 21 #include "net/proxy/mojo_proxy_resolver_factory.h" |
| 21 #include "net/proxy/mojo_proxy_type_converters.h" | 22 #include "net/proxy/mojo_proxy_type_converters.h" |
| 22 #include "net/proxy/proxy_info.h" | 23 #include "net/proxy/proxy_info.h" |
| 23 #include "net/proxy/proxy_resolver_script_data.h" | 24 #include "net/proxy/proxy_resolver_script_data.h" |
| 24 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 25 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" | 26 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" |
| 26 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" | 27 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" |
| 27 #include "url/gurl.h" | 28 #include "url/gurl.h" |
| 28 | 29 |
| 29 namespace net { | 30 namespace net { |
| 30 | 31 |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 break; | 396 break; |
| 396 case CreateProxyResolverAction::WAIT_FOR_CLIENT_DISCONNECT: | 397 case CreateProxyResolverAction::WAIT_FOR_CLIENT_DISCONNECT: |
| 397 ASSERT_FALSE(client.WaitForIncomingMethodCall()); | 398 ASSERT_FALSE(client.WaitForIncomingMethodCall()); |
| 398 break; | 399 break; |
| 399 } | 400 } |
| 400 WakeWaiter(); | 401 WakeWaiter(); |
| 401 } | 402 } |
| 402 | 403 |
| 403 } // namespace | 404 } // namespace |
| 404 | 405 |
| 405 class ProxyResolverMojoTest : public testing::Test { | 406 class ProxyResolverMojoTest : public testing::Test, |
| 407 public MojoProxyResolverFactory { |
| 406 public: | 408 public: |
| 407 void SetUp() override { | 409 void SetUp() override { |
| 408 mock_proxy_resolver_factory_.reset(new MockMojoProxyResolverFactory( | 410 mock_proxy_resolver_factory_.reset(new MockMojoProxyResolverFactory( |
| 409 &mock_proxy_resolver_, mojo::GetProxy(&factory_ptr_))); | 411 &mock_proxy_resolver_, mojo::GetProxy(&factory_ptr_))); |
| 410 proxy_resolver_factory_mojo_.reset( | 412 proxy_resolver_factory_mojo_.reset( |
| 411 new ProxyResolverFactoryMojo(factory_ptr_.get(), nullptr)); | 413 new ProxyResolverFactoryMojo(this, nullptr)); |
| 412 } | 414 } |
| 413 | 415 |
| 414 scoped_ptr<Request> MakeRequest(const GURL& url) { | 416 scoped_ptr<Request> MakeRequest(const GURL& url) { |
| 415 return make_scoped_ptr(new Request(proxy_resolver_mojo_.get(), url)); | 417 return make_scoped_ptr(new Request(proxy_resolver_mojo_.get(), url)); |
| 416 } | 418 } |
| 417 | 419 |
| 420 scoped_ptr<base::ScopedClosureRunner> CreateResolver( |
| 421 const mojo::String& pac_script, |
| 422 mojo::InterfaceRequest<interfaces::ProxyResolver> req, |
| 423 interfaces::HostResolverPtr host_resolver, |
| 424 interfaces::ProxyResolverFactoryRequestClientPtr client) override { |
| 425 factory_ptr_->CreateResolver(pac_script, req.Pass(), host_resolver.Pass(), |
| 426 client.Pass()); |
| 427 return make_scoped_ptr( |
| 428 new base::ScopedClosureRunner(on_delete_callback_.closure())); |
| 429 } |
| 430 |
| 418 mojo::Array<interfaces::ProxyServerPtr> ProxyServersFromPacString( | 431 mojo::Array<interfaces::ProxyServerPtr> ProxyServersFromPacString( |
| 419 const std::string& pac_string) { | 432 const std::string& pac_string) { |
| 420 ProxyInfo proxy_info; | 433 ProxyInfo proxy_info; |
| 421 proxy_info.UsePacString(pac_string); | 434 proxy_info.UsePacString(pac_string); |
| 422 | 435 |
| 423 return mojo::Array<interfaces::ProxyServerPtr>::From( | 436 return mojo::Array<interfaces::ProxyServerPtr>::From( |
| 424 proxy_info.proxy_list().GetAll()); | 437 proxy_info.proxy_list().GetAll()); |
| 425 } | 438 } |
| 426 | 439 |
| 427 void CreateProxyResolver() { | 440 void CreateProxyResolver() { |
| 428 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( | 441 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( |
| 429 CreateProxyResolverAction::ReturnResult(kScriptData, OK)); | 442 CreateProxyResolverAction::ReturnResult(kScriptData, OK)); |
| 430 TestCompletionCallback callback; | 443 TestCompletionCallback callback; |
| 431 scoped_refptr<ProxyResolverScriptData> pac_script( | 444 scoped_refptr<ProxyResolverScriptData> pac_script( |
| 432 ProxyResolverScriptData::FromUTF8(kScriptData)); | 445 ProxyResolverScriptData::FromUTF8(kScriptData)); |
| 433 scoped_ptr<ProxyResolverFactory::Request> request; | 446 scoped_ptr<ProxyResolverFactory::Request> request; |
| 434 ASSERT_EQ( | 447 ASSERT_EQ( |
| 435 OK, | 448 OK, |
| 436 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( | 449 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( |
| 437 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); | 450 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); |
| 438 EXPECT_TRUE(request); | 451 EXPECT_TRUE(request); |
| 439 ASSERT_TRUE(proxy_resolver_mojo_); | 452 ASSERT_TRUE(proxy_resolver_mojo_); |
| 440 } | 453 } |
| 441 | 454 |
| 455 void DeleteProxyResolverCallback(const CompletionCallback& callback, |
| 456 int result) { |
| 457 proxy_resolver_mojo_.reset(); |
| 458 callback.Run(result); |
| 459 } |
| 460 |
| 442 scoped_ptr<MockMojoProxyResolverFactory> mock_proxy_resolver_factory_; | 461 scoped_ptr<MockMojoProxyResolverFactory> mock_proxy_resolver_factory_; |
| 443 interfaces::ProxyResolverFactoryPtr factory_ptr_; | 462 interfaces::ProxyResolverFactoryPtr factory_ptr_; |
| 444 scoped_ptr<ProxyResolverFactory> proxy_resolver_factory_mojo_; | 463 scoped_ptr<ProxyResolverFactory> proxy_resolver_factory_mojo_; |
| 445 | 464 |
| 446 MockMojoProxyResolver mock_proxy_resolver_; | 465 MockMojoProxyResolver mock_proxy_resolver_; |
| 447 scoped_ptr<ProxyResolver> proxy_resolver_mojo_; | 466 scoped_ptr<ProxyResolver> proxy_resolver_mojo_; |
| 467 TestClosure on_delete_callback_; |
| 448 }; | 468 }; |
| 449 | 469 |
| 450 TEST_F(ProxyResolverMojoTest, CreateProxyResolver) { | 470 TEST_F(ProxyResolverMojoTest, CreateProxyResolver) { |
| 451 CreateProxyResolver(); | 471 CreateProxyResolver(); |
| 452 } | 472 } |
| 453 | 473 |
| 454 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_Empty) { | 474 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_Empty) { |
| 455 TestCompletionCallback callback; | 475 TestCompletionCallback callback; |
| 456 scoped_refptr<ProxyResolverScriptData> pac_script( | 476 scoped_refptr<ProxyResolverScriptData> pac_script( |
| 457 ProxyResolverScriptData::FromUTF8("")); | 477 ProxyResolverScriptData::FromUTF8("")); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 482 | 502 |
| 483 TestCompletionCallback callback; | 503 TestCompletionCallback callback; |
| 484 scoped_refptr<ProxyResolverScriptData> pac_script( | 504 scoped_refptr<ProxyResolverScriptData> pac_script( |
| 485 ProxyResolverScriptData::FromUTF8(kScriptData)); | 505 ProxyResolverScriptData::FromUTF8(kScriptData)); |
| 486 scoped_ptr<ProxyResolverFactory::Request> request; | 506 scoped_ptr<ProxyResolverFactory::Request> request; |
| 487 EXPECT_EQ( | 507 EXPECT_EQ( |
| 488 ERR_PAC_STATUS_NOT_OK, | 508 ERR_PAC_STATUS_NOT_OK, |
| 489 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( | 509 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( |
| 490 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); | 510 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); |
| 491 EXPECT_TRUE(request); | 511 EXPECT_TRUE(request); |
| 512 on_delete_callback_.WaitForResult(); |
| 492 | 513 |
| 493 // A second attempt succeeds. | 514 // A second attempt succeeds. |
| 494 CreateProxyResolver(); | 515 CreateProxyResolver(); |
| 495 } | 516 } |
| 496 | 517 |
| 497 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_BothDisconnected) { | 518 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_BothDisconnected) { |
| 498 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( | 519 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( |
| 499 CreateProxyResolverAction::DropBoth(kScriptData)); | 520 CreateProxyResolverAction::DropBoth(kScriptData)); |
| 500 | 521 |
| 501 scoped_refptr<ProxyResolverScriptData> pac_script( | 522 scoped_refptr<ProxyResolverScriptData> pac_script( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 530 | 551 |
| 531 scoped_refptr<ProxyResolverScriptData> pac_script( | 552 scoped_refptr<ProxyResolverScriptData> pac_script( |
| 532 ProxyResolverScriptData::FromUTF8(kScriptData)); | 553 ProxyResolverScriptData::FromUTF8(kScriptData)); |
| 533 scoped_ptr<ProxyResolverFactory::Request> request; | 554 scoped_ptr<ProxyResolverFactory::Request> request; |
| 534 TestCompletionCallback callback; | 555 TestCompletionCallback callback; |
| 535 EXPECT_EQ( | 556 EXPECT_EQ( |
| 536 ERR_PAC_SCRIPT_TERMINATED, | 557 ERR_PAC_SCRIPT_TERMINATED, |
| 537 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( | 558 callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver( |
| 538 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); | 559 pac_script, &proxy_resolver_mojo_, callback.callback(), &request))); |
| 539 EXPECT_TRUE(request); | 560 EXPECT_TRUE(request); |
| 561 on_delete_callback_.WaitForResult(); |
| 540 } | 562 } |
| 541 | 563 |
| 542 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_Cancel) { | 564 TEST_F(ProxyResolverMojoTest, CreateProxyResolver_Cancel) { |
| 543 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( | 565 mock_proxy_resolver_factory_->AddCreateProxyResolverAction( |
| 544 CreateProxyResolverAction::WaitForClientDisconnect(kScriptData)); | 566 CreateProxyResolverAction::WaitForClientDisconnect(kScriptData)); |
| 545 | 567 |
| 546 scoped_refptr<ProxyResolverScriptData> pac_script( | 568 scoped_refptr<ProxyResolverScriptData> pac_script( |
| 547 ProxyResolverScriptData::FromUTF8(kScriptData)); | 569 ProxyResolverScriptData::FromUTF8(kScriptData)); |
| 548 scoped_ptr<ProxyResolverFactory::Request> request; | 570 scoped_ptr<ProxyResolverFactory::Request> request; |
| 549 TestCompletionCallback callback; | 571 TestCompletionCallback callback; |
| 550 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_factory_mojo_->CreateProxyResolver( | 572 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_factory_mojo_->CreateProxyResolver( |
| 551 pac_script, &proxy_resolver_mojo_, | 573 pac_script, &proxy_resolver_mojo_, |
| 552 callback.callback(), &request)); | 574 callback.callback(), &request)); |
| 553 ASSERT_TRUE(request); | 575 ASSERT_TRUE(request); |
| 554 request.reset(); | 576 request.reset(); |
| 555 | 577 |
| 556 // The Mojo request is still made. | 578 // The Mojo request is still made. |
| 557 mock_proxy_resolver_factory_->WaitForNextRequest(); | 579 mock_proxy_resolver_factory_->WaitForNextRequest(); |
| 580 on_delete_callback_.WaitForResult(); |
| 558 } | 581 } |
| 559 | 582 |
| 560 TEST_F(ProxyResolverMojoTest, GetProxyForURL) { | 583 TEST_F(ProxyResolverMojoTest, GetProxyForURL) { |
| 561 mock_proxy_resolver_.AddGetProxyAction(GetProxyForUrlAction::ReturnServers( | 584 mock_proxy_resolver_.AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
| 562 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); | 585 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); |
| 563 CreateProxyResolver(); | 586 CreateProxyResolver(); |
| 564 | 587 |
| 565 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | 588 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); |
| 566 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | 589 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); |
| 567 EXPECT_EQ(OK, request->WaitForResult()); | 590 EXPECT_EQ(OK, request->WaitForResult()); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 mock_proxy_resolver_.AddGetProxyAction( | 689 mock_proxy_resolver_.AddGetProxyAction( |
| 667 GetProxyForUrlAction::DropRequest(GURL(kExampleUrl))); | 690 GetProxyForUrlAction::DropRequest(GURL(kExampleUrl))); |
| 668 CreateProxyResolver(); | 691 CreateProxyResolver(); |
| 669 | 692 |
| 670 scoped_ptr<Request> request1(MakeRequest(GURL(kExampleUrl))); | 693 scoped_ptr<Request> request1(MakeRequest(GURL(kExampleUrl))); |
| 671 EXPECT_EQ(ERR_IO_PENDING, request1->Resolve()); | 694 EXPECT_EQ(ERR_IO_PENDING, request1->Resolve()); |
| 672 | 695 |
| 673 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request1->WaitForResult()); | 696 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request1->WaitForResult()); |
| 674 } | 697 } |
| 675 | 698 |
| 699 TEST_F(ProxyResolverMojoTest, GetProxyForURL_DeleteInCallback) { |
| 700 mock_proxy_resolver_.AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
| 701 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); |
| 702 CreateProxyResolver(); |
| 703 |
| 704 ProxyInfo results; |
| 705 TestCompletionCallback callback; |
| 706 ProxyResolver::RequestHandle handle; |
| 707 BoundNetLog net_log; |
| 708 EXPECT_EQ(OK, |
| 709 callback.GetResult(proxy_resolver_mojo_->GetProxyForURL( |
| 710 GURL(kExampleUrl), &results, |
| 711 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, |
| 712 base::Unretained(this), callback.callback()), |
| 713 &handle, net_log))); |
| 714 on_delete_callback_.WaitForResult(); |
| 715 } |
| 716 |
| 717 TEST_F(ProxyResolverMojoTest, GetProxyForURL_DeleteInCallbackFromDisconnect) { |
| 718 mock_proxy_resolver_.AddGetProxyAction( |
| 719 GetProxyForUrlAction::Disconnect(GURL(kExampleUrl))); |
| 720 CreateProxyResolver(); |
| 721 |
| 722 ProxyInfo results; |
| 723 TestCompletionCallback callback; |
| 724 ProxyResolver::RequestHandle handle; |
| 725 BoundNetLog net_log; |
| 726 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, |
| 727 callback.GetResult(proxy_resolver_mojo_->GetProxyForURL( |
| 728 GURL(kExampleUrl), &results, |
| 729 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, |
| 730 base::Unretained(this), callback.callback()), |
| 731 &handle, net_log))); |
| 732 on_delete_callback_.WaitForResult(); |
| 733 } |
| 734 |
| 735 TEST_F(ProxyResolverMojoTest, DeleteResolver) { |
| 736 CreateProxyResolver(); |
| 737 proxy_resolver_mojo_.reset(); |
| 738 on_delete_callback_.WaitForResult(); |
| 739 } |
| 676 } // namespace net | 740 } // namespace net |
| OLD | NEW |