1 // Copyright (c) 2012 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
5 #include "net/proxy_resolution/network_delegate_error_observer.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/location.h"
10 #include "base/optional.h"
11 #include "base/run_loop.h"
12 #include "base/single_thread_task_runner.h"
13 #include "base/test/task_environment.h"
14 #include "base/threading/thread.h"
15 #include "base/threading/thread_task_runner_handle.h"
16 #include "net/base/net_errors.h"
17 #include "net/base/network_delegate_impl.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace net {
21
22 namespace {
23
24 class TestNetworkDelegate : public NetworkDelegateImpl {
25 public:
TestNetworkDelegate()26 TestNetworkDelegate() : got_pac_error_(false) {}
27 ~TestNetworkDelegate() override = default;
28
got_pac_error() const29 bool got_pac_error() const { return got_pac_error_; }
30
31 private:
32 // NetworkDelegate implementation.
OnBeforeURLRequest(URLRequest * request,CompletionOnceCallback callback,GURL * new_url)33 int OnBeforeURLRequest(URLRequest* request,
34 CompletionOnceCallback callback,
35 GURL* new_url) override {
36 return OK;
37 }
OnBeforeStartTransaction(URLRequest * request,CompletionOnceCallback callback,HttpRequestHeaders * headers)38 int OnBeforeStartTransaction(URLRequest* request,
39 CompletionOnceCallback callback,
40 HttpRequestHeaders* headers) override {
41 return OK;
42 }
OnHeadersReceived(URLRequest * request,CompletionOnceCallback callback,const HttpResponseHeaders * original_response_headers,scoped_refptr<HttpResponseHeaders> * override_response_headers,const net::IPEndPoint & endpoint,base::Optional<GURL> * preserve_fragment_on_redirect_url)43 int OnHeadersReceived(
44 URLRequest* request,
45 CompletionOnceCallback callback,
46 const HttpResponseHeaders* original_response_headers,
47 scoped_refptr<HttpResponseHeaders>* override_response_headers,
48 const net::IPEndPoint& endpoint,
49 base::Optional<GURL>* preserve_fragment_on_redirect_url) override {
50 return OK;
51 }
OnBeforeRedirect(URLRequest * request,const GURL & new_location)52 void OnBeforeRedirect(URLRequest* request,
53 const GURL& new_location) override {}
OnResponseStarted(URLRequest * request,int net_error)54 void OnResponseStarted(URLRequest* request, int net_error) override {}
OnCompleted(URLRequest * request,bool started,int net_error)55 void OnCompleted(URLRequest* request, bool started, int net_error) override {}
OnURLRequestDestroyed(URLRequest * request)56 void OnURLRequestDestroyed(URLRequest* request) override {}
57
OnPACScriptError(int line_number,const base::string16 & error)58 void OnPACScriptError(int line_number, const base::string16& error) override {
59 got_pac_error_ = true;
60 }
OnCanGetCookies(const URLRequest & request,const CookieList & cookie_list,bool allowed_from_caller)61 bool OnCanGetCookies(const URLRequest& request,
62 const CookieList& cookie_list,
63 bool allowed_from_caller) override {
64 return allowed_from_caller;
65 }
OnCanSetCookie(const URLRequest & request,const net::CanonicalCookie & cookie,CookieOptions * options,bool allowed_from_caller)66 bool OnCanSetCookie(const URLRequest& request,
67 const net::CanonicalCookie& cookie,
68 CookieOptions* options,
69 bool allowed_from_caller) override {
70 return allowed_from_caller;
71 }
72
73 bool got_pac_error_;
74 };
75
76 // Check that the OnPACScriptError method can be called from an arbitrary
77 // thread.
TEST(NetworkDelegateErrorObserverTest,CallOnThread)78 TEST(NetworkDelegateErrorObserverTest, CallOnThread) {
79 base::test::TaskEnvironment task_environment;
80 base::Thread thread("test_thread");
81 thread.Start();
82 TestNetworkDelegate network_delegate;
83 NetworkDelegateErrorObserver observer(
84 &network_delegate, base::ThreadTaskRunnerHandle::Get().get());
85 thread.task_runner()->PostTask(
86 FROM_HERE,
87 base::BindOnce(&NetworkDelegateErrorObserver::OnPACScriptError,
88 base::Unretained(&observer), 42, base::string16()));
89 thread.Stop();
90 base::RunLoop().RunUntilIdle();
91 ASSERT_TRUE(network_delegate.got_pac_error());
92 }
93
94 // Check that passing a NULL network delegate works.
TEST(NetworkDelegateErrorObserverTest,NoDelegate)95 TEST(NetworkDelegateErrorObserverTest, NoDelegate) {
96 base::test::TaskEnvironment task_environment;
97 base::Thread thread("test_thread");
98 thread.Start();
99 NetworkDelegateErrorObserver observer(
100 nullptr, base::ThreadTaskRunnerHandle::Get().get());
101 thread.task_runner()->PostTask(
102 FROM_HERE,
103 base::BindOnce(&NetworkDelegateErrorObserver::OnPACScriptError,
104 base::Unretained(&observer), 42, base::string16()));
105 thread.Stop();
106 base::RunLoop().RunUntilIdle();
107 // Shouldn't have crashed until here...
108 }
109
110 } // namespace
111
112 } // namespace net
113