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