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> |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
27 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" | 27 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" |
28 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" | 28 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" |
29 #include "url/gurl.h" | 29 #include "url/gurl.h" |
30 | 30 |
31 namespace net { | 31 namespace net { |
32 | 32 |
33 namespace { | 33 namespace { |
34 | 34 |
35 const char kScriptData[] = "FooBarBaz"; | 35 const char kScriptData[] = "FooBarBaz"; |
36 const char kScriptData2[] = "BlahBlahBlah"; | |
37 const char kExampleUrl[] = "http://www.example.com"; | 36 const char kExampleUrl[] = "http://www.example.com"; |
38 | 37 |
39 struct SetPacScriptAction { | 38 struct SetPacScriptAction { |
40 enum Action { | 39 enum Action { |
41 COMPLETE, | 40 COMPLETE, |
42 DISCONNECT, | 41 DISCONNECT, |
43 }; | 42 }; |
44 | 43 |
45 static SetPacScriptAction ReturnResult(Error error) { | 44 static SetPacScriptAction ReturnResult(Error error) { |
46 SetPacScriptAction result; | 45 SetPacScriptAction result; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 break; | 244 break; |
246 case GetProxyForUrlAction::SEND_LOAD_STATE_AND_BLOCK: | 245 case GetProxyForUrlAction::SEND_LOAD_STATE_AND_BLOCK: |
247 client->LoadStateChanged(LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT); | 246 client->LoadStateChanged(LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT); |
248 blocked_clients_.push_back( | 247 blocked_clients_.push_back( |
249 new interfaces::ProxyResolverRequestClientPtr(client.Pass())); | 248 new interfaces::ProxyResolverRequestClientPtr(client.Pass())); |
250 break; | 249 break; |
251 } | 250 } |
252 WakeWaiter(); | 251 WakeWaiter(); |
253 } | 252 } |
254 | 253 |
255 class TestMojoProxyResolverFactory : public MojoProxyResolverFactory { | |
256 public: | |
257 TestMojoProxyResolverFactory(); | |
258 ~TestMojoProxyResolverFactory() override; | |
259 | |
260 // Overridden from MojoProxyResolverFactory: | |
261 void Create(mojo::InterfaceRequest<interfaces::ProxyResolver> req, | |
262 interfaces::HostResolverPtr host_resolver) override; | |
263 | |
264 MockMojoProxyResolver& GetMockResolver() { return *mock_proxy_resolver_; } | |
265 | |
266 void AddFuturePacScriptAction(int creation, SetPacScriptAction action); | |
267 void AddFutureGetProxyAction(int creation, GetProxyForUrlAction action); | |
268 | |
269 int num_create_calls() const { return num_create_calls_; } | |
270 void FailNextCreate() { fail_next_create_ = true; } | |
271 | |
272 private: | |
273 int num_create_calls_; | |
274 std::map<int, std::list<SetPacScriptAction>> pac_script_actions_; | |
275 std::map<int, std::list<GetProxyForUrlAction>> get_proxy_actions_; | |
276 bool fail_next_create_; | |
277 | |
278 scoped_ptr<MockMojoProxyResolver> mock_proxy_resolver_; | |
279 }; | |
280 | |
281 TestMojoProxyResolverFactory::TestMojoProxyResolverFactory() | |
282 : num_create_calls_(0), fail_next_create_(false) { | |
283 } | |
284 | |
285 TestMojoProxyResolverFactory::~TestMojoProxyResolverFactory() { | |
286 } | |
287 | |
288 void TestMojoProxyResolverFactory::Create( | |
289 mojo::InterfaceRequest<interfaces::ProxyResolver> req, | |
290 interfaces::HostResolverPtr host_resolver) { | |
291 if (fail_next_create_) { | |
292 req = nullptr; | |
293 fail_next_create_ = false; | |
294 } else { | |
295 mock_proxy_resolver_.reset(new MockMojoProxyResolver(req.Pass())); | |
296 | |
297 for (const auto& action : pac_script_actions_[num_create_calls_]) | |
298 mock_proxy_resolver_->AddPacScriptAction(action); | |
299 | |
300 for (const auto& action : get_proxy_actions_[num_create_calls_]) | |
301 mock_proxy_resolver_->AddGetProxyAction(action); | |
302 } | |
303 num_create_calls_++; | |
304 } | |
305 | |
306 void TestMojoProxyResolverFactory::AddFuturePacScriptAction( | |
307 int creation, | |
308 SetPacScriptAction action) { | |
309 pac_script_actions_[creation].push_back(action); | |
310 } | |
311 | |
312 void TestMojoProxyResolverFactory::AddFutureGetProxyAction( | |
313 int creation, | |
314 GetProxyForUrlAction action) { | |
315 get_proxy_actions_[creation].push_back(action); | |
316 } | |
317 | |
318 class Request { | 254 class Request { |
319 public: | 255 public: |
320 Request(ProxyResolverMojo* resolver, const GURL& url); | 256 Request(ProxyResolverMojo* resolver, const GURL& url); |
321 | 257 |
322 int Resolve(); | 258 int Resolve(); |
323 void Cancel(); | 259 void Cancel(); |
324 int WaitForResult(); | 260 int WaitForResult(); |
325 | 261 |
326 int error() const { return error_; } | 262 int error() const { return error_; } |
327 const ProxyInfo& results() const { return results_; } | 263 const ProxyInfo& results() const { return results_; } |
(...skipping 26 matching lines...) Expand all Loading... |
354 int Request::WaitForResult() { | 290 int Request::WaitForResult() { |
355 error_ = callback_.WaitForResult(); | 291 error_ = callback_.WaitForResult(); |
356 return error_; | 292 return error_; |
357 } | 293 } |
358 | 294 |
359 } // namespace | 295 } // namespace |
360 | 296 |
361 class ProxyResolverMojoTest : public testing::Test { | 297 class ProxyResolverMojoTest : public testing::Test { |
362 public: | 298 public: |
363 void SetUp() override { | 299 void SetUp() override { |
364 proxy_resolver_mojo_.reset(new ProxyResolverMojo( | 300 interfaces::ProxyResolverPtr proxy_resolver_ptr; |
365 &mojo_proxy_resolver_factory_, &mock_host_resolver_)); | 301 mock_proxy_resolver_.reset( |
| 302 new MockMojoProxyResolver(mojo::GetProxy(&proxy_resolver_ptr))); |
| 303 proxy_resolver_mojo_.reset( |
| 304 new ProxyResolverMojo(proxy_resolver_ptr.Pass(), |
| 305 make_scoped_ptr(new base::ScopedClosureRunner( |
| 306 resolver_destruction_closure_.closure())))); |
366 } | 307 } |
367 | 308 |
368 scoped_ptr<Request> MakeRequest(const GURL& url) { | 309 scoped_ptr<Request> MakeRequest(const GURL& url) { |
369 return make_scoped_ptr(new Request(proxy_resolver_mojo_.get(), url)); | 310 return make_scoped_ptr(new Request(proxy_resolver_mojo_.get(), url)); |
370 } | 311 } |
371 | 312 |
372 mojo::Array<interfaces::ProxyServerPtr> ProxyServersFromPacString( | 313 mojo::Array<interfaces::ProxyServerPtr> ProxyServersFromPacString( |
373 const std::string& pac_string) { | 314 const std::string& pac_string) { |
374 ProxyInfo proxy_info; | 315 ProxyInfo proxy_info; |
375 proxy_info.UsePacString(pac_string); | 316 proxy_info.UsePacString(pac_string); |
376 | 317 |
377 return mojo::Array<interfaces::ProxyServerPtr>::From( | 318 return mojo::Array<interfaces::ProxyServerPtr>::From( |
378 proxy_info.proxy_list().GetAll()); | 319 proxy_info.proxy_list().GetAll()); |
379 } | 320 } |
380 | 321 |
381 void SetPacScript(int instance) { | |
382 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | |
383 instance, SetPacScriptAction::ReturnResult(OK)); | |
384 TestCompletionCallback callback; | |
385 scoped_refptr<ProxyResolverScriptData> pac_script( | |
386 ProxyResolverScriptData::FromUTF8(kScriptData)); | |
387 EXPECT_EQ(OK, callback.GetResult(proxy_resolver_mojo_->SetPacScript( | |
388 pac_script, callback.callback()))); | |
389 } | |
390 | |
391 void RunCallbackAndSetPacScript(const net::CompletionCallback& callback, | |
392 const net::CompletionCallback& pac_callback, | |
393 int instance, | |
394 int result) { | |
395 callback.Run(result); | |
396 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | |
397 instance, SetPacScriptAction::ReturnResult(OK)); | |
398 scoped_refptr<ProxyResolverScriptData> pac_script( | |
399 ProxyResolverScriptData::FromUTF8(kScriptData)); | |
400 EXPECT_EQ(ERR_IO_PENDING, | |
401 proxy_resolver_mojo_->SetPacScript(pac_script, pac_callback)); | |
402 } | |
403 | |
404 void DeleteProxyResolverCallback(const CompletionCallback& callback, | 322 void DeleteProxyResolverCallback(const CompletionCallback& callback, |
405 int result) { | 323 int result) { |
406 proxy_resolver_mojo_.reset(); | 324 proxy_resolver_mojo_.reset(); |
407 callback.Run(result); | 325 callback.Run(result); |
408 } | 326 } |
409 | 327 |
410 MockHostResolver mock_host_resolver_; | 328 MockHostResolver mock_host_resolver_; |
411 TestMojoProxyResolverFactory mojo_proxy_resolver_factory_; | 329 TestClosure resolver_destruction_closure_; |
412 scoped_ptr<ProxyResolverMojo> proxy_resolver_mojo_; | 330 scoped_ptr<ProxyResolverMojo> proxy_resolver_mojo_; |
| 331 scoped_ptr<MockMojoProxyResolver> mock_proxy_resolver_; |
413 }; | 332 }; |
414 | 333 |
415 TEST_F(ProxyResolverMojoTest, SetPacScript) { | 334 TEST_F(ProxyResolverMojoTest, SetPacScript) { |
416 SetPacScript(0); | 335 mock_proxy_resolver_->AddPacScriptAction( |
417 EXPECT_EQ(kScriptData, | 336 SetPacScriptAction::ReturnResult(OK)); |
418 mojo_proxy_resolver_factory_.GetMockResolver().pac_script_data()); | 337 TestCompletionCallback callback; |
| 338 scoped_refptr<ProxyResolverScriptData> pac_script( |
| 339 ProxyResolverScriptData::FromUTF8(kScriptData)); |
| 340 EXPECT_EQ(OK, callback.GetResult(proxy_resolver_mojo_->SetPacScript( |
| 341 pac_script, callback.callback()))); |
| 342 EXPECT_EQ(kScriptData, mock_proxy_resolver_->pac_script_data()); |
419 } | 343 } |
420 | 344 |
421 TEST_F(ProxyResolverMojoTest, SetPacScript_Empty) { | 345 TEST_F(ProxyResolverMojoTest, SetPacScript_Empty) { |
422 TestCompletionCallback callback; | 346 TestCompletionCallback callback; |
423 scoped_refptr<ProxyResolverScriptData> pac_script( | 347 scoped_refptr<ProxyResolverScriptData> pac_script( |
424 ProxyResolverScriptData::FromUTF8("")); | 348 ProxyResolverScriptData::FromUTF8("")); |
425 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, | 349 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, |
426 callback.GetResult(proxy_resolver_mojo_->SetPacScript( | 350 callback.GetResult(proxy_resolver_mojo_->SetPacScript( |
427 pac_script, callback.callback()))); | 351 pac_script, callback.callback()))); |
428 } | 352 } |
429 | 353 |
430 TEST_F(ProxyResolverMojoTest, SetPacScript_Url) { | 354 TEST_F(ProxyResolverMojoTest, SetPacScript_Url) { |
431 TestCompletionCallback callback; | 355 TestCompletionCallback callback; |
432 scoped_refptr<ProxyResolverScriptData> pac_script( | 356 scoped_refptr<ProxyResolverScriptData> pac_script( |
433 ProxyResolverScriptData::FromURL(GURL(kExampleUrl))); | 357 ProxyResolverScriptData::FromURL(GURL(kExampleUrl))); |
434 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, | 358 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, |
435 callback.GetResult(proxy_resolver_mojo_->SetPacScript( | 359 callback.GetResult(proxy_resolver_mojo_->SetPacScript( |
436 pac_script, callback.callback()))); | 360 pac_script, callback.callback()))); |
437 } | 361 } |
438 | 362 |
439 TEST_F(ProxyResolverMojoTest, SetPacScript_Failed) { | 363 TEST_F(ProxyResolverMojoTest, SetPacScript_Failed) { |
440 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | 364 mock_proxy_resolver_->AddPacScriptAction( |
441 0, SetPacScriptAction::ReturnResult(ERR_PAC_STATUS_NOT_OK)); | 365 SetPacScriptAction::ReturnResult(ERR_PAC_STATUS_NOT_OK)); |
442 | 366 |
443 TestCompletionCallback callback; | 367 TestCompletionCallback callback; |
444 scoped_refptr<ProxyResolverScriptData> pac_script( | 368 scoped_refptr<ProxyResolverScriptData> pac_script( |
445 ProxyResolverScriptData::FromUTF8(kScriptData)); | 369 ProxyResolverScriptData::FromUTF8(kScriptData)); |
446 EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, | 370 EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, |
447 callback.GetResult(proxy_resolver_mojo_->SetPacScript( | 371 callback.GetResult(proxy_resolver_mojo_->SetPacScript( |
448 pac_script, callback.callback()))); | 372 pac_script, callback.callback()))); |
449 } | 373 } |
450 | 374 |
451 TEST_F(ProxyResolverMojoTest, SetPacScript_Disconnected) { | 375 TEST_F(ProxyResolverMojoTest, SetPacScript_Disconnected) { |
452 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | 376 mock_proxy_resolver_->AddPacScriptAction(SetPacScriptAction::Disconnect()); |
453 0, SetPacScriptAction::Disconnect()); | |
454 | 377 |
455 scoped_refptr<ProxyResolverScriptData> pac_script( | 378 scoped_refptr<ProxyResolverScriptData> pac_script( |
456 ProxyResolverScriptData::FromUTF8(kScriptData)); | 379 ProxyResolverScriptData::FromUTF8(kScriptData)); |
457 TestCompletionCallback callback; | 380 TestCompletionCallback callback; |
458 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( | 381 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( |
459 pac_script, callback.callback())); | 382 pac_script, callback.callback())); |
460 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, callback.GetResult(ERR_IO_PENDING)); | 383 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, callback.GetResult(ERR_IO_PENDING)); |
461 } | 384 } |
462 | 385 |
463 TEST_F(ProxyResolverMojoTest, SetPacScript_SuccessThenDisconnect) { | |
464 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | |
465 0, SetPacScriptAction::ReturnResult(OK)); | |
466 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | |
467 0, SetPacScriptAction::Disconnect()); | |
468 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | |
469 1, SetPacScriptAction::ReturnResult(ERR_FAILED)); | |
470 { | |
471 scoped_refptr<ProxyResolverScriptData> pac_script( | |
472 ProxyResolverScriptData::FromUTF8(kScriptData)); | |
473 TestCompletionCallback callback; | |
474 EXPECT_EQ(OK, callback.GetResult(proxy_resolver_mojo_->SetPacScript( | |
475 pac_script, callback.callback()))); | |
476 EXPECT_EQ(kScriptData, | |
477 mojo_proxy_resolver_factory_.GetMockResolver().pac_script_data()); | |
478 } | |
479 | |
480 { | |
481 scoped_refptr<ProxyResolverScriptData> pac_script( | |
482 ProxyResolverScriptData::FromUTF8(kScriptData2)); | |
483 TestCompletionCallback callback; | |
484 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( | |
485 pac_script, callback.callback())); | |
486 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, callback.GetResult(ERR_IO_PENDING)); | |
487 } | |
488 | |
489 { | |
490 scoped_refptr<ProxyResolverScriptData> pac_script( | |
491 ProxyResolverScriptData::FromUTF8(kScriptData2)); | |
492 TestCompletionCallback callback; | |
493 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( | |
494 pac_script, callback.callback())); | |
495 EXPECT_EQ(ERR_FAILED, callback.GetResult(ERR_IO_PENDING)); | |
496 } | |
497 | |
498 // The service should have been recreated on the last SetPacScript call. | |
499 EXPECT_EQ(2, mojo_proxy_resolver_factory_.num_create_calls()); | |
500 } | |
501 | |
502 TEST_F(ProxyResolverMojoTest, SetPacScript_Cancel) { | 386 TEST_F(ProxyResolverMojoTest, SetPacScript_Cancel) { |
503 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | 387 mock_proxy_resolver_->AddPacScriptAction( |
504 0, SetPacScriptAction::ReturnResult(OK)); | 388 SetPacScriptAction::ReturnResult(OK)); |
505 | 389 |
506 scoped_refptr<ProxyResolverScriptData> pac_script( | 390 scoped_refptr<ProxyResolverScriptData> pac_script( |
507 ProxyResolverScriptData::FromUTF8(kScriptData)); | 391 ProxyResolverScriptData::FromUTF8(kScriptData)); |
508 TestCompletionCallback callback; | 392 TestCompletionCallback callback; |
509 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( | 393 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( |
510 pac_script, callback.callback())); | 394 pac_script, callback.callback())); |
511 proxy_resolver_mojo_->CancelSetPacScript(); | 395 proxy_resolver_mojo_->CancelSetPacScript(); |
512 | 396 |
513 // The Mojo request is still made. | 397 // The Mojo request is still made. |
514 mojo_proxy_resolver_factory_.GetMockResolver().WaitForNextRequest(); | 398 mock_proxy_resolver_->WaitForNextRequest(); |
515 } | 399 } |
516 | 400 |
517 TEST_F(ProxyResolverMojoTest, SetPacScript_CancelAndSetAgain) { | 401 TEST_F(ProxyResolverMojoTest, SetPacScript_CancelAndSetAgain) { |
518 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | 402 mock_proxy_resolver_->AddPacScriptAction( |
519 0, SetPacScriptAction::ReturnResult(ERR_FAILED)); | 403 SetPacScriptAction::ReturnResult(ERR_FAILED)); |
520 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | 404 mock_proxy_resolver_->AddPacScriptAction( |
521 0, SetPacScriptAction::ReturnResult(ERR_UNEXPECTED)); | 405 SetPacScriptAction::ReturnResult(ERR_UNEXPECTED)); |
522 | 406 |
523 scoped_refptr<ProxyResolverScriptData> pac_script( | 407 scoped_refptr<ProxyResolverScriptData> pac_script( |
524 ProxyResolverScriptData::FromUTF8(kScriptData)); | 408 ProxyResolverScriptData::FromUTF8(kScriptData)); |
525 TestCompletionCallback callback1; | 409 TestCompletionCallback callback1; |
526 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( | 410 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( |
527 pac_script, callback1.callback())); | 411 pac_script, callback1.callback())); |
528 proxy_resolver_mojo_->CancelSetPacScript(); | 412 proxy_resolver_mojo_->CancelSetPacScript(); |
529 | 413 |
530 TestCompletionCallback callback2; | 414 TestCompletionCallback callback2; |
531 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( | 415 EXPECT_EQ(ERR_IO_PENDING, proxy_resolver_mojo_->SetPacScript( |
532 pac_script, callback2.callback())); | 416 pac_script, callback2.callback())); |
533 EXPECT_EQ(ERR_UNEXPECTED, callback2.GetResult(ERR_IO_PENDING)); | 417 EXPECT_EQ(ERR_UNEXPECTED, callback2.GetResult(ERR_IO_PENDING)); |
534 } | 418 } |
535 | 419 |
536 TEST_F(ProxyResolverMojoTest, SetPacScript_DeleteInCallback) { | 420 TEST_F(ProxyResolverMojoTest, SetPacScript_DeleteInCallback) { |
537 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | 421 mock_proxy_resolver_->AddPacScriptAction( |
538 0, SetPacScriptAction::ReturnResult(OK)); | 422 SetPacScriptAction::ReturnResult(OK)); |
539 scoped_refptr<ProxyResolverScriptData> pac_script( | 423 scoped_refptr<ProxyResolverScriptData> pac_script( |
540 ProxyResolverScriptData::FromUTF8(kScriptData)); | 424 ProxyResolverScriptData::FromUTF8(kScriptData)); |
541 TestCompletionCallback callback; | 425 TestCompletionCallback callback; |
542 EXPECT_EQ(OK, | 426 EXPECT_EQ(OK, |
543 callback.GetResult(proxy_resolver_mojo_->SetPacScript( | 427 callback.GetResult(proxy_resolver_mojo_->SetPacScript( |
544 pac_script, | 428 pac_script, |
545 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, | 429 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, |
546 base::Unretained(this), callback.callback())))); | 430 base::Unretained(this), callback.callback())))); |
547 EXPECT_EQ(1, mojo_proxy_resolver_factory_.num_create_calls()); | 431 resolver_destruction_closure_.WaitForResult(); |
548 } | 432 } |
549 | 433 |
550 TEST_F(ProxyResolverMojoTest, SetPacScript_DeleteInCallbackFromDisconnect) { | 434 TEST_F(ProxyResolverMojoTest, SetPacScript_DeleteInCallbackFromDisconnect) { |
551 mojo_proxy_resolver_factory_.AddFuturePacScriptAction( | 435 mock_proxy_resolver_->AddPacScriptAction(SetPacScriptAction::Disconnect()); |
552 0, SetPacScriptAction::Disconnect()); | |
553 scoped_refptr<ProxyResolverScriptData> pac_script( | 436 scoped_refptr<ProxyResolverScriptData> pac_script( |
554 ProxyResolverScriptData::FromUTF8(kScriptData)); | 437 ProxyResolverScriptData::FromUTF8(kScriptData)); |
555 TestCompletionCallback callback; | 438 TestCompletionCallback callback; |
556 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, | 439 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, |
557 callback.GetResult(proxy_resolver_mojo_->SetPacScript( | 440 callback.GetResult(proxy_resolver_mojo_->SetPacScript( |
558 pac_script, | 441 pac_script, |
559 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, | 442 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, |
560 base::Unretained(this), callback.callback())))); | 443 base::Unretained(this), callback.callback())))); |
561 EXPECT_EQ(1, mojo_proxy_resolver_factory_.num_create_calls()); | 444 resolver_destruction_closure_.WaitForResult(); |
562 } | 445 } |
563 | 446 |
564 TEST_F(ProxyResolverMojoTest, GetProxyForURL) { | 447 TEST_F(ProxyResolverMojoTest, GetProxyForURL) { |
565 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 448 mock_proxy_resolver_->AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
566 0, GetProxyForUrlAction::ReturnServers( | 449 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); |
567 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); | |
568 SetPacScript(0); | |
569 | 450 |
570 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | 451 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); |
571 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | 452 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); |
572 EXPECT_EQ(OK, request->WaitForResult()); | 453 EXPECT_EQ(OK, request->WaitForResult()); |
573 | 454 |
574 EXPECT_EQ("DIRECT", request->results().ToPacString()); | 455 EXPECT_EQ("DIRECT", request->results().ToPacString()); |
575 } | 456 } |
576 | 457 |
577 TEST_F(ProxyResolverMojoTest, GetProxyForURL_WithoutSetPacScript) { | |
578 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | |
579 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request->Resolve()); | |
580 } | |
581 | |
582 TEST_F(ProxyResolverMojoTest, GetProxyForURL_LoadState) { | 458 TEST_F(ProxyResolverMojoTest, GetProxyForURL_LoadState) { |
583 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 459 mock_proxy_resolver_->AddGetProxyAction( |
584 0, GetProxyForUrlAction::SendLoadStateChanged(GURL(kExampleUrl))); | 460 GetProxyForUrlAction::SendLoadStateChanged(GURL(kExampleUrl))); |
585 SetPacScript(0); | |
586 | 461 |
587 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | 462 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); |
588 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | 463 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); |
589 EXPECT_EQ(LOAD_STATE_RESOLVING_PROXY_FOR_URL, request->load_state()); | 464 EXPECT_EQ(LOAD_STATE_RESOLVING_PROXY_FOR_URL, request->load_state()); |
590 while (request->load_state() == LOAD_STATE_RESOLVING_PROXY_FOR_URL) | 465 while (request->load_state() == LOAD_STATE_RESOLVING_PROXY_FOR_URL) |
591 base::RunLoop().RunUntilIdle(); | 466 base::RunLoop().RunUntilIdle(); |
592 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT, request->load_state()); | 467 EXPECT_EQ(LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT, request->load_state()); |
593 mojo_proxy_resolver_factory_.GetMockResolver().ClearBlockedClients(); | 468 mock_proxy_resolver_->ClearBlockedClients(); |
594 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request->WaitForResult()); | 469 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request->WaitForResult()); |
595 } | 470 } |
596 | 471 |
597 TEST_F(ProxyResolverMojoTest, GetProxyForURL_MultipleResults) { | 472 TEST_F(ProxyResolverMojoTest, GetProxyForURL_MultipleResults) { |
598 static const char kPacString[] = | 473 static const char kPacString[] = |
599 "PROXY foo1:80;DIRECT;SOCKS foo2:1234;" | 474 "PROXY foo1:80;DIRECT;SOCKS foo2:1234;" |
600 "SOCKS5 foo3:1080;HTTPS foo4:443;QUIC foo6:8888"; | 475 "SOCKS5 foo3:1080;HTTPS foo4:443;QUIC foo6:8888"; |
601 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 476 mock_proxy_resolver_->AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
602 0, GetProxyForUrlAction::ReturnServers( | 477 GURL(kExampleUrl), ProxyServersFromPacString(kPacString))); |
603 GURL(kExampleUrl), ProxyServersFromPacString(kPacString))); | |
604 SetPacScript(0); | |
605 | 478 |
606 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | 479 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); |
607 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | 480 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); |
608 EXPECT_EQ(OK, request->WaitForResult()); | 481 EXPECT_EQ(OK, request->WaitForResult()); |
609 | 482 |
610 EXPECT_EQ(kPacString, request->results().ToPacString()); | 483 EXPECT_EQ(kPacString, request->results().ToPacString()); |
611 } | 484 } |
612 | 485 |
613 TEST_F(ProxyResolverMojoTest, GetProxyForURL_Error) { | 486 TEST_F(ProxyResolverMojoTest, GetProxyForURL_Error) { |
614 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 487 mock_proxy_resolver_->AddGetProxyAction( |
615 0, GetProxyForUrlAction::ReturnError(GURL(kExampleUrl), ERR_UNEXPECTED)); | 488 GetProxyForUrlAction::ReturnError(GURL(kExampleUrl), ERR_UNEXPECTED)); |
616 SetPacScript(0); | |
617 | 489 |
618 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | 490 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); |
619 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | 491 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); |
620 EXPECT_EQ(ERR_UNEXPECTED, request->WaitForResult()); | 492 EXPECT_EQ(ERR_UNEXPECTED, request->WaitForResult()); |
621 | 493 |
622 EXPECT_TRUE(request->results().is_empty()); | 494 EXPECT_TRUE(request->results().is_empty()); |
623 } | 495 } |
624 | 496 |
625 TEST_F(ProxyResolverMojoTest, GetProxyForURL_Cancel) { | 497 TEST_F(ProxyResolverMojoTest, GetProxyForURL_Cancel) { |
626 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 498 mock_proxy_resolver_->AddGetProxyAction( |
627 0, GetProxyForUrlAction::WaitForClientDisconnect(GURL(kExampleUrl))); | 499 GetProxyForUrlAction::WaitForClientDisconnect(GURL(kExampleUrl))); |
628 SetPacScript(0); | |
629 | 500 |
630 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | 501 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); |
631 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | 502 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); |
632 request->Cancel(); | 503 request->Cancel(); |
633 | 504 |
634 // The Mojo request is still made. | 505 // The Mojo request is still made. |
635 mojo_proxy_resolver_factory_.GetMockResolver().WaitForNextRequest(); | 506 mock_proxy_resolver_->WaitForNextRequest(); |
636 } | 507 } |
637 | 508 |
638 TEST_F(ProxyResolverMojoTest, GetProxyForURL_MultipleRequests) { | 509 TEST_F(ProxyResolverMojoTest, GetProxyForURL_MultipleRequests) { |
639 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 510 mock_proxy_resolver_->AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
640 0, GetProxyForUrlAction::ReturnServers( | 511 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); |
641 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); | 512 mock_proxy_resolver_->AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
642 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 513 GURL("https://www.chromium.org"), |
643 0, GetProxyForUrlAction::ReturnServers( | 514 ProxyServersFromPacString("HTTPS foo:443"))); |
644 GURL("https://www.chromium.org"), | |
645 ProxyServersFromPacString("HTTPS foo:443"))); | |
646 SetPacScript(0); | |
647 | 515 |
648 scoped_ptr<Request> request1(MakeRequest(GURL(kExampleUrl))); | 516 scoped_ptr<Request> request1(MakeRequest(GURL(kExampleUrl))); |
649 EXPECT_EQ(ERR_IO_PENDING, request1->Resolve()); | 517 EXPECT_EQ(ERR_IO_PENDING, request1->Resolve()); |
650 scoped_ptr<Request> request2(MakeRequest(GURL("https://www.chromium.org"))); | 518 scoped_ptr<Request> request2(MakeRequest(GURL("https://www.chromium.org"))); |
651 EXPECT_EQ(ERR_IO_PENDING, request2->Resolve()); | 519 EXPECT_EQ(ERR_IO_PENDING, request2->Resolve()); |
652 | 520 |
653 EXPECT_EQ(OK, request1->WaitForResult()); | 521 EXPECT_EQ(OK, request1->WaitForResult()); |
654 EXPECT_EQ(OK, request2->WaitForResult()); | 522 EXPECT_EQ(OK, request2->WaitForResult()); |
655 | 523 |
656 EXPECT_EQ("DIRECT", request1->results().ToPacString()); | 524 EXPECT_EQ("DIRECT", request1->results().ToPacString()); |
657 EXPECT_EQ("HTTPS foo:443", request2->results().ToPacString()); | 525 EXPECT_EQ("HTTPS foo:443", request2->results().ToPacString()); |
658 } | 526 } |
659 | 527 |
660 TEST_F(ProxyResolverMojoTest, GetProxyForURL_Disconnect) { | 528 TEST_F(ProxyResolverMojoTest, GetProxyForURL_Disconnect) { |
661 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 529 mock_proxy_resolver_->AddGetProxyAction( |
662 0, GetProxyForUrlAction::Disconnect(GURL(kExampleUrl))); | 530 GetProxyForUrlAction::Disconnect(GURL(kExampleUrl))); |
663 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | |
664 1, GetProxyForUrlAction::ReturnServers( | |
665 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); | |
666 { | 531 { |
667 SetPacScript(0); | |
668 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | 532 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); |
669 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | 533 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); |
670 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request->WaitForResult()); | 534 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request->WaitForResult()); |
671 EXPECT_TRUE(request->results().is_empty()); | 535 EXPECT_TRUE(request->results().is_empty()); |
672 } | 536 } |
673 | |
674 { | |
675 // Calling GetProxyForURL without first setting the pac script should fail. | |
676 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | |
677 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request->Resolve()); | |
678 } | |
679 | |
680 { | |
681 SetPacScript(1); | |
682 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | |
683 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | |
684 EXPECT_EQ(OK, request->WaitForResult()); | |
685 EXPECT_EQ("DIRECT", request->results().ToPacString()); | |
686 } | |
687 | |
688 EXPECT_EQ(2, mojo_proxy_resolver_factory_.num_create_calls()); | |
689 } | 537 } |
690 | 538 |
691 TEST_F(ProxyResolverMojoTest, GetProxyForURL_ClientClosed) { | 539 TEST_F(ProxyResolverMojoTest, GetProxyForURL_ClientClosed) { |
692 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 540 mock_proxy_resolver_->AddGetProxyAction( |
693 0, GetProxyForUrlAction::DropRequest(GURL(kExampleUrl))); | 541 GetProxyForUrlAction::DropRequest(GURL(kExampleUrl))); |
694 SetPacScript(0); | |
695 | 542 |
696 scoped_ptr<Request> request1(MakeRequest(GURL(kExampleUrl))); | 543 scoped_ptr<Request> request1(MakeRequest(GURL(kExampleUrl))); |
697 EXPECT_EQ(ERR_IO_PENDING, request1->Resolve()); | 544 EXPECT_EQ(ERR_IO_PENDING, request1->Resolve()); |
698 | 545 |
699 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request1->WaitForResult()); | 546 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request1->WaitForResult()); |
700 EXPECT_EQ(1, mojo_proxy_resolver_factory_.num_create_calls()); | |
701 } | |
702 | |
703 TEST_F(ProxyResolverMojoTest, DisconnectAndFailCreate) { | |
704 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | |
705 0, GetProxyForUrlAction::Disconnect(GURL(kExampleUrl))); | |
706 | |
707 { | |
708 SetPacScript(0); | |
709 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | |
710 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | |
711 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, request->WaitForResult()); | |
712 EXPECT_TRUE(request->results().is_empty()); | |
713 } | |
714 | |
715 // The service should attempt to create a new connection, but that should | |
716 // fail. | |
717 { | |
718 scoped_refptr<ProxyResolverScriptData> pac_script( | |
719 ProxyResolverScriptData::FromUTF8(kScriptData)); | |
720 TestCompletionCallback callback; | |
721 mojo_proxy_resolver_factory_.FailNextCreate(); | |
722 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, | |
723 callback.GetResult(proxy_resolver_mojo_->SetPacScript( | |
724 pac_script, callback.callback()))); | |
725 } | |
726 | |
727 // A third attempt should succeed. | |
728 SetPacScript(2); | |
729 | |
730 EXPECT_EQ(3, mojo_proxy_resolver_factory_.num_create_calls()); | |
731 } | |
732 | |
733 TEST_F(ProxyResolverMojoTest, DisconnectAndReconnectInCallback) { | |
734 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | |
735 0, GetProxyForUrlAction::Disconnect(GURL(kExampleUrl))); | |
736 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | |
737 1, GetProxyForUrlAction::ReturnServers( | |
738 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); | |
739 | |
740 // In this first resolve request, the Mojo service is disconnected causing the | |
741 // request to return ERR_PAC_SCRIPT_TERMINATED. In the request callback, form | |
742 // a new connection to a Mojo resolver service by calling SetPacScript(). | |
743 SetPacScript(0); | |
744 ProxyInfo results; | |
745 TestCompletionCallback resolve_callback; | |
746 TestCompletionCallback pac_callback; | |
747 ProxyResolver::RequestHandle handle; | |
748 BoundNetLog net_log; | |
749 int error = proxy_resolver_mojo_->GetProxyForURL( | |
750 GURL(kExampleUrl), &results, | |
751 base::Bind(&ProxyResolverMojoTest::RunCallbackAndSetPacScript, | |
752 base::Unretained(this), resolve_callback.callback(), | |
753 pac_callback.callback(), 1), | |
754 &handle, net_log); | |
755 EXPECT_EQ(ERR_IO_PENDING, error); | |
756 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, resolve_callback.WaitForResult()); | |
757 EXPECT_EQ(OK, pac_callback.WaitForResult()); | |
758 | |
759 // Setting the PAC script above should have been successful and let us send a | |
760 // resolve request. | |
761 scoped_ptr<Request> request(MakeRequest(GURL(kExampleUrl))); | |
762 EXPECT_EQ(ERR_IO_PENDING, request->Resolve()); | |
763 EXPECT_EQ(OK, request->WaitForResult()); | |
764 EXPECT_EQ("DIRECT", request->results().ToPacString()); | |
765 | |
766 EXPECT_EQ(2, mojo_proxy_resolver_factory_.num_create_calls()); | |
767 } | 547 } |
768 | 548 |
769 TEST_F(ProxyResolverMojoTest, GetProxyForURL_DeleteInCallback) { | 549 TEST_F(ProxyResolverMojoTest, GetProxyForURL_DeleteInCallback) { |
770 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 550 mock_proxy_resolver_->AddGetProxyAction(GetProxyForUrlAction::ReturnServers( |
771 0, GetProxyForUrlAction::ReturnServers( | 551 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); |
772 GURL(kExampleUrl), ProxyServersFromPacString("DIRECT"))); | |
773 SetPacScript(0); | |
774 ProxyInfo results; | 552 ProxyInfo results; |
775 TestCompletionCallback callback; | 553 TestCompletionCallback callback; |
776 ProxyResolver::RequestHandle handle; | 554 ProxyResolver::RequestHandle handle; |
777 BoundNetLog net_log; | 555 BoundNetLog net_log; |
778 EXPECT_EQ(OK, | 556 EXPECT_EQ(OK, |
779 callback.GetResult(proxy_resolver_mojo_->GetProxyForURL( | 557 callback.GetResult(proxy_resolver_mojo_->GetProxyForURL( |
780 GURL(kExampleUrl), &results, | 558 GURL(kExampleUrl), &results, |
781 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, | 559 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, |
782 base::Unretained(this), callback.callback()), | 560 base::Unretained(this), callback.callback()), |
783 &handle, net_log))); | 561 &handle, net_log))); |
| 562 resolver_destruction_closure_.WaitForResult(); |
784 } | 563 } |
785 | 564 |
786 TEST_F(ProxyResolverMojoTest, GetProxyForURL_DeleteInCallbackFromDisconnect) { | 565 TEST_F(ProxyResolverMojoTest, GetProxyForURL_DeleteInCallbackFromDisconnect) { |
787 mojo_proxy_resolver_factory_.AddFutureGetProxyAction( | 566 mock_proxy_resolver_->AddGetProxyAction( |
788 0, GetProxyForUrlAction::Disconnect(GURL(kExampleUrl))); | 567 GetProxyForUrlAction::Disconnect(GURL(kExampleUrl))); |
789 SetPacScript(0); | |
790 ProxyInfo results; | 568 ProxyInfo results; |
791 TestCompletionCallback callback; | 569 TestCompletionCallback callback; |
792 ProxyResolver::RequestHandle handle; | 570 ProxyResolver::RequestHandle handle; |
793 BoundNetLog net_log; | 571 BoundNetLog net_log; |
794 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, | 572 EXPECT_EQ(ERR_PAC_SCRIPT_TERMINATED, |
795 callback.GetResult(proxy_resolver_mojo_->GetProxyForURL( | 573 callback.GetResult(proxy_resolver_mojo_->GetProxyForURL( |
796 GURL(kExampleUrl), &results, | 574 GURL(kExampleUrl), &results, |
797 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, | 575 base::Bind(&ProxyResolverMojoTest::DeleteProxyResolverCallback, |
798 base::Unretained(this), callback.callback()), | 576 base::Unretained(this), callback.callback()), |
799 &handle, net_log))); | 577 &handle, net_log))); |
| 578 resolver_destruction_closure_.WaitForResult(); |
800 } | 579 } |
801 | 580 |
| 581 TEST_F(ProxyResolverMojoTest, DeleteResolver) { |
| 582 proxy_resolver_mojo_.reset(); |
| 583 resolver_destruction_closure_.WaitForResult(); |
| 584 } |
802 } // namespace net | 585 } // namespace net |
OLD | NEW |