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