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() {
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AssertNoURLRequests();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestContextStorage storage_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get a file:// url relative to net/data/proxy/proxy_script_fetcher_unittest.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetTestFileUrl(const std::string& relpath) {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &path);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("net");
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("data");
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("proxy_script_fetcher_unittest");
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL base_url = FilePathToFileURL(path);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(base_url.spec() + "/" + relpath);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // !defined(DISABLE_FILE_SUPPORT)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Really simple NetworkDelegate so we can allow local file access on ChromeOS
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// without introducing layering violations.  Also causes a test failure if a
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// request is seen that doesn't set a load flag to bypass revocation checking.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BasicNetworkDelegate : public NetworkDelegate {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BasicNetworkDelegate() {}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BasicNetworkDelegate() {}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeURLRequest(URLRequest* request,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const CompletionCallback& callback,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 GURL* new_url) OVERRIDE {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(request->load_flags() & LOAD_DISABLE_CERT_REVOCATION_CHECKING);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeSendHeaders(URLRequest* request,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const CompletionCallback& callback,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  HttpRequestHeaders* headers) OVERRIDE {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSendHeaders(URLRequest* request,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const HttpRequestHeaders& headers) OVERRIDE {}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnHeadersReceived(
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CompletionCallback& callback,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HttpResponseHeaders* original_response_headers,
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      scoped_refptr<HttpResponseHeaders>* override_response_headers,
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      GURL* allowed_unsafe_redirect_url) OVERRIDE {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBeforeRedirect(URLRequest* request,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const GURL& new_location) OVERRIDE {}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnResponseStarted(URLRequest* request) OVERRIDE {}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnRawBytesRead(const URLRequest& request,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int bytes_read) OVERRIDE {}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCompleted(URLRequest* request, bool started) OVERRIDE {}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnURLRequestDestroyed(URLRequest* request) OVERRIDE {}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPACScriptError(int line_number,
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const base::string16& error) OVERRIDE {}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AuthChallengeInfo& auth_info,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AuthCallback& callback,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AuthCredentials* credentials) OVERRIDE {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnCanGetCookies(const URLRequest& request,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const CookieList& cookie_list) OVERRIDE {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnCanSetCookie(const URLRequest& request,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& cookie_line,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              CookieOptions* options) OVERRIDE {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnCanAccessFile(const net::URLRequest& request,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::FilePath& path) const OVERRIDE {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnCanThrottleRequest(const URLRequest& request) const OVERRIDE {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeSocketStreamConnect(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SocketStream* stream,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CompletionCallback& callback) OVERRIDE {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BasicNetworkDelegate);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyScriptFetcherImplTest : public PlatformTest {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImplTest()
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : test_server_(SpawnedTestServer::TYPE_HTTP,
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     net::SpawnedTestServer::kLocalhost,
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kDocRoot)) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_.set_network_delegate(&network_delegate_);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BasicNetworkDelegate network_delegate_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RequestContext context_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, FileUrl) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a non-existent file.
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(GetTestFileUrl("does-not-exist"),
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &text, callback.callback());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_FILE_NOT_FOUND, callback.WaitForResult());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a file that exists.
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(GetTestFileUrl("pac.txt"),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &text, callback.callback());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.txt-\n"), text);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif  // !defined(DISABLE_FILE_SUPPORT)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that all mime types are allowed for PAC file, to be consistent
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with other browsers.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, HttpMimeType) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC with mime type "text/plain"
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.txt"));
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.txt-\n"), text);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC with mime type "text/html"
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.html"));
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.html-\n"), text);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC with mime type "application/x-ns-proxy-autoconfig"
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.nsproxy"));
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, HttpStatusCode) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC which gives a 500 -- FAIL
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/500.pac"));
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, callback.WaitForResult());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Fetch a PAC which gives a 404 -- FAIL
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/404.pac"));
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_PAC_STATUS_NOT_OK, callback.WaitForResult());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, ContentDisposition) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetch PAC scripts via HTTP with a Content-Disposition header -- should
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have no effect.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server_.GetURL("files/downloadable.pac"));
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::string16 text;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = pac_fetcher.Fetch(url, &text, callback.callback());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, result);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("-downloadable.pac-\n"), text);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that PAC scripts are not being cached.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, NoCache) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetch a PAC script whose HTTP headers make it cacheable for 1 hour.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server_.GetURL("files/cacheable_1hr.pac"));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-cacheable_1hr.pac-\n"), text);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Kill the HTTP server.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Stop());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to fetch the file again. Since the server is not running anymore, the
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // call should fail, thus indicating that the file was not fetched from the
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // local cache.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Expect any error. The exact error varies by platform.
3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_NE(OK, callback.WaitForResult());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, TooLarge) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the maximum response size to 50 bytes.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int prev_size = pac_fetcher.SetSizeConstraint(50);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These two URLs are the same file, but are http:// vs file://
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL urls[] = {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_server_.GetURL("files/large-pac.nsproxy"),
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(DISABLE_FILE_SUPPORT)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetTestFileUrl("large-pac.nsproxy")
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try fetching URLs that are 101 bytes large. We should abort the request
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after 50 bytes have been read, and fail with a too large error.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(urls); ++i) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url = urls[i];
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_FILE_TOO_BIG, callback.WaitForResult());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore the original size bound.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pac_fetcher.SetSizeConstraint(prev_size);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Make sure we can still fetch regular URLs.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.nsproxy"));
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, Hang) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the timeout period to 0.5 seconds.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta prev_timeout = pac_fetcher.SetTimeoutConstraint(
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(500));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try fetching a URL which takes 1.2 seconds. We should abort the request
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after 500 ms, and fail with a timeout error.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("slow/proxy.pac?1.2"));
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TIMED_OUT, callback.WaitForResult());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(text.empty());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Restore the original timeout period.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pac_fetcher.SetTimeoutConstraint(prev_timeout);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { // Make sure we can still fetch regular URLs.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/pac.nsproxy"));
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("-pac.nsproxy-\n"), text);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ProxyScriptFetcher should decode any content-codings
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (like gzip, bzip, etc.), and apply any charset conversions to yield
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UTF8.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, Encodings) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test a response that is gzip-encoded -- should get inflated.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/gzipped_pac"));
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("This data was gzipped.\n"), text);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test a response that was served as UTF-16 (BE). It should
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be converted to UTF8.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("files/utf16be_pac"));
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, result);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, callback.WaitForResult());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("This was encoded as UTF-16BE.\n"), text);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProxyScriptFetcherImplTest, DataURLs) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyScriptFetcherImpl pac_fetcher(&context_);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kEncodedUrl[] =
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R"
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "m9yVVJMKHVybCwgaG9zdCkgewogIGlmIChob3N0ID09ICdmb29iYXIuY29tJykKICAgIHJl"
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "dHVybiAnUFJPWFkgYmxhY2tob2xlOjgwJzsKICByZXR1cm4gJ0RJUkVDVCc7Cn0=";
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kPacScript[] =
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "function FindProxyForURL(url, host) {\n"
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  if (host == 'foobar.com')\n"
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    return 'PROXY blackhole:80';\n"
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return 'DIRECT';\n"
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test fetching a "data:"-url containing a base64 encoded PAC script.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(kEncodedUrl);
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, result);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(kPacScript), text);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kEncodedUrlBroken[] =
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "data:application/x-ns-proxy-autoconfig;base64,ZnVuY3Rpb24gRmluZFByb3h5R";
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test a broken "data:"-url containing a base64 encoded PAC script.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(kEncodedUrlBroken);
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::string16 text;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestCompletionCallback callback;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = pac_fetcher.Fetch(url, &text, callback.callback());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_FAILED, result);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
494