network_delegate_error_observer_unittest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "net/proxy/network_delegate_error_observer.h"
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "base/bind.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "base/bind_helpers.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "base/message_loop/message_loop_proxy.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "base/threading/thread.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "net/base/net_errors.h"
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "net/base/network_delegate.h"
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "testing/gtest/include/gtest/gtest.h"
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace net {
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace {
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass TestNetworkDelegate : public net::NetworkDelegate {
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov public:
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestNetworkDelegate() : got_pac_error_(false) {}
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual ~TestNetworkDelegate() {}
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bool got_pac_error() const { return got_pac_error_; }
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov private:
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // net::NetworkDelegate implementation.
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual int OnBeforeURLRequest(URLRequest* request,
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                 const CompletionCallback& callback,
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                 GURL* new_url) OVERRIDE {
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return OK;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual int OnBeforeSendHeaders(URLRequest* request,
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  const CompletionCallback& callback,
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                  HttpRequestHeaders* headers) OVERRIDE {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return OK;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void OnSendHeaders(URLRequest* request,
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                             const HttpRequestHeaders& headers) OVERRIDE {}
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual int OnHeadersReceived(
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      URLRequest* request,
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      const CompletionCallback& callback,
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      const HttpResponseHeaders* original_response_headers,
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE {
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return net::OK;
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void OnBeforeRedirect(URLRequest* request,
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                const GURL& new_location) OVERRIDE {}
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void OnResponseStarted(URLRequest* request) OVERRIDE {}
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void OnRawBytesRead(const URLRequest& request,
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              int bytes_read) OVERRIDE {}
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void OnCompleted(URLRequest* request, bool started) OVERRIDE {}
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void OnURLRequestDestroyed(URLRequest* request) OVERRIDE {}
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void OnPACScriptError(int line_number,
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                const base::string16& error) OVERRIDE {
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    got_pac_error_ = true;
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual AuthRequiredResponse OnAuthRequired(
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      URLRequest* request,
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      const AuthChallengeInfo& auth_info,
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      const AuthCallback& callback,
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      AuthCredentials* credentials) OVERRIDE {
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return AUTH_REQUIRED_RESPONSE_NO_ACTION;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual bool OnCanGetCookies(const URLRequest& request,
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                               const CookieList& cookie_list) OVERRIDE {
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return true;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual bool OnCanSetCookie(const URLRequest& request,
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              const std::string& cookie_line,
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              CookieOptions* options) OVERRIDE {
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return true;
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual bool OnCanAccessFile(const net::URLRequest& request,
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                               const base::FilePath& path) const OVERRIDE {
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return true;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual bool OnCanThrottleRequest(const URLRequest& request) const OVERRIDE {
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return false;
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual int OnBeforeSocketStreamConnect(
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      SocketStream* stream,
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      const CompletionCallback& callback) OVERRIDE {
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return OK;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual void OnRequestWaitStateChange(const net::URLRequest& request,
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                        RequestWaitState state) OVERRIDE {
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  bool got_pac_error_;
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}  // namespace
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Check that the OnPACScriptError method can be called from an arbitrary
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// thread.
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST(NetworkDelegateErrorObserverTest, CallOnThread) {
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  base::Thread thread("test_thread");
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  thread.Start();
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TestNetworkDelegate network_delegate;
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  NetworkDelegateErrorObserver
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      observer(&network_delegate,
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               base::MessageLoopProxy::current());
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  thread.message_loop()->PostTask(
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FROM_HERE,
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      base::Bind(&NetworkDelegateErrorObserver::OnPACScriptError,
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 base::Unretained(&observer), 42, base::string16()));
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  thread.Stop();
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  base::MessageLoop::current()->RunUntilIdle();
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ASSERT_TRUE(network_delegate.got_pac_error());
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Check that passing a NULL network delegate works.
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTEST(NetworkDelegateErrorObserverTest, NoDelegate) {
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  base::Thread thread("test_thread");
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  thread.Start();
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  NetworkDelegateErrorObserver
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      observer(NULL, base::MessageLoopProxy::current());
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  thread.message_loop()->PostTask(
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FROM_HERE,
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      base::Bind(&NetworkDelegateErrorObserver::OnPACScriptError,
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 base::Unretained(&observer), 42, base::string16()));
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  thread.Stop();
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  base::MessageLoop::current()->RunUntilIdle();
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // Shouldn't have crashed until here...
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}  // namespace net
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov