windows_system_proxy_resolver_mojo_unittest.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/network/windows_system_proxy_resolver_mojo.h"
  5. #include <memory>
  6. #include <string>
  7. #include <utility>
  8. #include "base/bind.h"
  9. #include "base/callback_helpers.h"
  10. #include "base/run_loop.h"
  11. #include "base/task/sequenced_task_runner.h"
  12. #include "base/task/task_runner.h"
  13. #include "base/test/task_environment.h"
  14. #include "base/threading/sequenced_task_runner_handle.h"
  15. #include "mojo/public/cpp/bindings/pending_remote.h"
  16. #include "mojo/public/cpp/bindings/remote.h"
  17. #include "mojo/public/cpp/bindings/self_owned_receiver.h"
  18. #include "net/log/net_log_with_source.h"
  19. #include "net/proxy_resolution/proxy_list.h"
  20. #include "net/proxy_resolution/win/windows_system_proxy_resolution_request.h"
  21. #include "net/proxy_resolution/win/winhttp_status.h"
  22. #include "services/proxy_resolver_win/public/mojom/proxy_resolver_win.mojom.h"
  23. #include "testing/gtest/include/gtest/gtest.h"
  24. #include "url/gurl.h"
  25. namespace network {
  26. namespace {
  27. class MockWindowsSystemProxyResolver
  28. : public proxy_resolver_win::mojom::WindowsSystemProxyResolver {
  29. public:
  30. MockWindowsSystemProxyResolver() = default;
  31. ~MockWindowsSystemProxyResolver() override = default;
  32. // proxy_resolver_win::mojom::WindowsSystemProxyResolver implementation:
  33. void GetProxyForUrl(const GURL& url,
  34. GetProxyForUrlCallback callback) override {
  35. // Simulate asynchronous nature of this call by posting a task to run the
  36. // callback.
  37. base::SequencedTaskRunnerHandle::Get()->PostTask(
  38. FROM_HERE, base::BindOnce(std::move(callback), net::ProxyList(),
  39. net::WinHttpStatus::kOk, 0));
  40. }
  41. };
  42. class MockWindowsSystemProxyResolutionRequest
  43. : public net::WindowsSystemProxyResolutionRequest {
  44. public:
  45. MockWindowsSystemProxyResolutionRequest(
  46. net::WindowsSystemProxyResolver* resolver)
  47. : net::WindowsSystemProxyResolutionRequest(nullptr,
  48. GURL(),
  49. std::string(),
  50. nullptr,
  51. base::DoNothing(),
  52. net::NetLogWithSource(),
  53. resolver) {
  54. EXPECT_TRUE(GetProxyResolutionRequestForTesting());
  55. }
  56. ~MockWindowsSystemProxyResolutionRequest() override = default;
  57. void WaitForProxyResolutionComplete() { loop_.Run(); }
  58. void ProxyResolutionComplete(const net::ProxyList& proxy_list,
  59. net::WinHttpStatus winhttp_status,
  60. int windows_error) override {
  61. EXPECT_TRUE(GetProxyResolutionRequestForTesting());
  62. DeleteRequest();
  63. loop_.Quit();
  64. }
  65. void DeleteRequest() { ResetProxyResolutionRequestForTesting(); }
  66. private:
  67. base::RunLoop loop_;
  68. };
  69. } // namespace
  70. class WindowsSystemProxyResolverMojoTest : public testing::Test {
  71. public:
  72. void SetUp() override {
  73. mojo::PendingRemote<proxy_resolver_win::mojom::WindowsSystemProxyResolver>
  74. remote;
  75. mojo::MakeSelfOwnedReceiver(
  76. std::make_unique<MockWindowsSystemProxyResolver>(),
  77. remote.InitWithNewPipeAndPassReceiver());
  78. windows_system_proxy_resolver_mojo_ =
  79. std::make_unique<WindowsSystemProxyResolverMojo>(std::move(remote));
  80. }
  81. net::WindowsSystemProxyResolver* proxy_resolver() {
  82. return windows_system_proxy_resolver_mojo_.get();
  83. }
  84. void RunUntilIdle() { task_environment_.RunUntilIdle(); }
  85. private:
  86. base::test::TaskEnvironment task_environment_;
  87. std::unique_ptr<net::WindowsSystemProxyResolver>
  88. windows_system_proxy_resolver_mojo_;
  89. };
  90. TEST_F(WindowsSystemProxyResolverMojoTest, ProxyResolutionBasic) {
  91. MockWindowsSystemProxyResolutionRequest request(proxy_resolver());
  92. request.WaitForProxyResolutionComplete();
  93. }
  94. TEST_F(WindowsSystemProxyResolverMojoTest, ProxyResolutionCanceled) {
  95. MockWindowsSystemProxyResolutionRequest request(proxy_resolver());
  96. request.DeleteRequest();
  97. // This shouldn't crash and there should never be a callback to
  98. // ProxyResolutionComplete().
  99. RunUntilIdle();
  100. }
  101. } // namespace network