15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_script_fetcher_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_flags.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_server_properties_impl.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/http/transport_security_state.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service_defaults.h"
24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_storage.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_file_job.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT)
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "net/url_request/file_protocol_handler.h"
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(eroman):
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   - Test canceling an outstanding request.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   - Test deleting ProxyScriptFetcher while a request is in progress.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDocRoot[] =
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("net/data/proxy_script_fetcher_unittest");
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FetchResult {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int code;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 text;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// A non-mock URL request which can access http:// and file:// urls, in the case
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// the tests were built with file support.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequestContext : public URLRequestContext {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RequestContext() : storage_(this) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProxyConfig no_proxy;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage_.set_host_resolver(scoped_ptr<HostResolver>(new MockHostResolver));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage_.set_cert_verifier(new MockCertVerifier);
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    storage_.set_transport_security_state(new TransportSecurityState);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage_.set_proxy_service(ProxyService::CreateFixed(no_proxy));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage_.set_ssl_config_service(new SSLConfigServiceDefaults);
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    storage_.set_http_server_properties(
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        scoped_ptr<HttpServerProperties>(new HttpServerPropertiesImpl()));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpNetworkSession::Params params;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.host_resolver = host_resolver();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.cert_verifier = cert_verifier();
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    params.transport_security_state = transport_security_state();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.proxy_service = proxy_service();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.ssl_config_service = ssl_config_service();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.http_server_properties = http_server_properties();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<HttpNetworkSession> network_session(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new HttpNetworkSession(params));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    storage_.set_http_transaction_factory(new HttpCache(
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        network_session.get(), HttpCache::DefaultBackend::InMemory(0)));
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    URLRequestJobFactoryImpl* job_factory = new URLRequestJobFactoryImpl();
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT)
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    job_factory->SetProtocolHandler(
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        "file", new FileProtocolHandler(base::MessageLoopProxy::current()));
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    storage_.set_job_factory(job_factory);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RequestContext() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestContextStorage storage_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get a file:// url relative to net/data/proxy/proxy_script_fetcher_unittest.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetTestFileUrl(const std::string& relpath) {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &path);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("net");
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("data");
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("proxy_script_fetcher_unittest");
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL base_url = FilePathToFileURL(path);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(base_url.spec() + "/" + relpath);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // !defined(DISABLE_FILE_SUPPORT)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Really simple NetworkDelegate so we can allow local file access on ChromeOS
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// without introducing layering violations.  Also causes a test failure if a
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// request is seen that doesn't set a load flag to bypass revocation checking.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BasicNetworkDelegate : public NetworkDelegate {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BasicNetworkDelegate() {}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BasicNetworkDelegate() {}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeURLRequest(URLRequest* request,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const CompletionCallback& callback,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 GURL* new_url) OVERRIDE {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(request->load_flags() & LOAD_DISABLE_CERT_REVOCATION_CHECKING);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeSendHeaders(URLRequest* request,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const CompletionCallback& callback,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  HttpRequestHeaders* headers) OVERRIDE {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSendHeaders(URLRequest* request,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const HttpRequestHeaders& headers) OVERRIDE {}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnHeadersReceived(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CompletionCallback& callback,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HttpResponseHeaders* original_response_headers,
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      scoped_refptr<HttpResponseHeaders>* override_response_headers,
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL* allowed_unsafe_redirect_url) OVERRIDE {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBeforeRedirect(URLRequest* request,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const GURL& new_location) OVERRIDE {}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnResponseStarted(URLRequest* request) OVERRIDE {}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnRawBytesRead(const URLRequest& request,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int bytes_read) OVERRIDE {}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCompleted(URLRequest* request, bool started) OVERRIDE {}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnURLRequestDestroyed(URLRequest* request) OVERRIDE {}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPACScriptError(int line_number,
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const base::string16& error) OVERRIDE {}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AuthChallengeInfo& auth_info,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AuthCallback& callback,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AuthCredentials* credentials) OVERRIDE {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnCanGetCookies(const URLRequest& request,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const CookieList& cookie_list) OVERRIDE {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnCanSetCookie(const URLRequest& request,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& cookie_line,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieOptions* options) OVERRIDE {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnCanAccessFile(const net::URLRequest& request,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::FilePath& path) const OVERRIDE {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnCanThrottleRequest(const URLRequest& request) const OVERRIDE {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeSocketStreamConnect(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SocketStream* stream,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CompletionCallback& callback) OVERRIDE {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyScriptFetcherImplTest : public PlatformTest {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImplTest()
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : test_server_(SpawnedTestServer::TYPE_HTTP,
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     net::SpawnedTestServer::kLocalhost,
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kDocRoot)) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_.set_network_delegate(&network_delegate_);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BasicNetworkDelegate network_delegate_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RequestContext context_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, FileUrl) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a non-existent file.
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(GetTestFileUrl("does-not-exist"),
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &text, callback.callback());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_FILE_NOT_FOUND, callback.WaitForResult());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a file that exists.
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(GetTestFileUrl("pac.txt"),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &text, callback.callback());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.txt-\n"), text);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif  // !defined(DISABLE_FILE_SUPPORT)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that all mime types are allowed for PAC file, to be consistent
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with other browsers.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, HttpMimeType) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC with mime type "text/plain"
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.txt"));
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.txt-\n"), text);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC with mime type "text/html"
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.html"));
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.html-\n"), text);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC with mime type "application/x-ns-proxy-autoconfig"
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.nsproxy"));
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, HttpStatusCode) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC which gives a 500 -- FAIL
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/500.pac"));
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, callback.WaitForResult());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC which gives a 404 -- FAIL
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/404.pac"));
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, callback.WaitForResult());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, ContentDisposition) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetch PAC scripts via HTTP with a Content-Disposition header -- should
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have no effect.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server_.GetURL("files/downloadable.pac"));
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 text;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = pac_fetcher.Fetch(url, &text, callback.callback());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, result);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("-downloadable.pac-\n"), text);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that PAC scripts are not being cached.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, NoCache) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetch a PAC script whose HTTP headers make it cacheable for 1 hour.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server_.GetURL("files/cacheable_1hr.pac"));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-cacheable_1hr.pac-\n"), text);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Kill the HTTP server.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Stop());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to fetch the file again. Since the server is not running anymore, the
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // call should fail, thus indicating that the file was not fetched from the
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // local cache.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Expect any error. The exact error varies by platform.
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_NE(OK, callback.WaitForResult());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, TooLarge) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the maximum response size to 50 bytes.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prev_size = pac_fetcher.SetSizeConstraint(50);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These two URLs are the same file, but are http:// vs file://
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL urls[] = {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_server_.GetURL("files/large-pac.nsproxy"),
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTestFileUrl("large-pac.nsproxy")
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try fetching URLs that are 101 bytes large. We should abort the request
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after 50 bytes have been read, and fail with a too large error.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(urls); ++i) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url = urls[i];
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_FILE_TOO_BIG, callback.WaitForResult());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore the original size bound.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pac_fetcher.SetSizeConstraint(prev_size);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Make sure we can still fetch regular URLs.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.nsproxy"));
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, Hang) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the timeout period to 0.5 seconds.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta prev_timeout = pac_fetcher.SetTimeoutConstraint(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(500));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try fetching a URL which takes 1.2 seconds. We should abort the request
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after 500 ms, and fail with a timeout error.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("slow/proxy.pac?1.2"));
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TIMED_OUT, callback.WaitForResult());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore the original timeout period.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pac_fetcher.SetTimeoutConstraint(prev_timeout);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Make sure we can still fetch regular URLs.
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.nsproxy"));
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ProxyScriptFetcher should decode any content-codings
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (like gzip, bzip, etc.), and apply any charset conversions to yield
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UTF8.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, Encodings) {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test a response that is gzip-encoded -- should get inflated.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/gzipped_pac"));
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("This data was gzipped.\n"), text);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test a response that was served as UTF-16 (BE). It should
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be converted to UTF8.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/utf16be_pac"));
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("This was encoded as UTF-16BE.\n"), text);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, DataURLs) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kEncodedUrl[] =
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R"
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "m9yVVJMKHVybCwgaG9zdCkgewogIGlmIChob3N0ID09ICdmb29iYXIuY29tJykKICAgIHJl"
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "dHVybiAnUFJPWFkgYmxhY2tob2xlOjgwJzsKICByZXR1cm4gJ0RJUkVDVCc7Cn0=";
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kPacScript[] =
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "function FindProxyForURL(url, host) {\n"
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  if (host == 'foobar.com')\n"
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    return 'PROXY blackhole:80';\n"
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return 'DIRECT';\n"
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test fetching a "data:"-url containing a base64 encoded PAC script.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(kEncodedUrl);
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, result);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(kPacScript), text);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kEncodedUrlBroken[] =
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R";
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test a broken "data:"-url containing a base64 encoded PAC script.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(kEncodedUrlBroken);
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_FAILED, result);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
493