1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file.
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef NET_URL_REQUEST_URL_REQUEST_TEST_UTIL_H_
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define NET_URL_REQUEST_URL_REQUEST_TEST_UTIL_H_
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#pragma once
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <stdlib.h>
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <sstream>
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <string>
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/path_service.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/process_util.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/string_util.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/string16.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/time.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/utf_string_conversions.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/cert_verifier.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/cookie_monster.h"
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/cookie_policy.h"
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/host_resolver.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/io_buffer.h"
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/net_errors.h"
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/network_delegate.h"
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/ssl_config_service_defaults.h"
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/disk_cache/disk_cache.h"
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/ftp/ftp_network_layer.h"
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/http/http_auth_handler_factory.h"
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/http/http_cache.h"
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/http/http_network_layer.h"
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/test/test_server.h"
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/url_request/url_request.h"
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/url_request/url_request_context.h"
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/url_request/url_request_context_storage.h"
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/proxy/proxy_service.h"
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "testing/gtest/include/gtest/gtest.h"
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "googleurl/src/url_util.h"
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenusing base::TimeDelta;
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//-----------------------------------------------------------------------------
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass TestCookiePolicy : public net::CookiePolicy {
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  enum Options {
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NO_GET_COOKIES = 1 << 0,
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NO_SET_COOKIE  = 1 << 1,
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    FORCE_SESSION  = 1 << 2,
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit TestCookiePolicy(int options_bit_mask);
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~TestCookiePolicy();
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // net::CookiePolicy:
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int CanGetCookies(const GURL& url, const GURL& first_party) const;
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int CanSetCookie(const GURL& url,
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           const GURL& first_party,
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           const std::string& cookie_line) const;
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int options_;
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//-----------------------------------------------------------------------------
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass TestURLRequestContext : public net::URLRequestContext {
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TestURLRequestContext();
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit TestURLRequestContext(const std::string& proxy);
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TestURLRequestContext(const std::string& proxy,
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        net::HostResolver* host_resolver);
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected:
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~TestURLRequestContext();
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void Init();
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  net::URLRequestContextStorage context_storage_;
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//-----------------------------------------------------------------------------
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass TestURLRequest : public net::URLRequest {
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TestURLRequest(const GURL& url, Delegate* delegate);
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~TestURLRequest();
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//-----------------------------------------------------------------------------
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass TestDelegate : public net::URLRequest::Delegate {
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TestDelegate();
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~TestDelegate();
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_cancel_in_received_redirect(bool val) { cancel_in_rr_ = val; }
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_cancel_in_response_started(bool val) { cancel_in_rs_ = val; }
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_cancel_in_received_data(bool val) { cancel_in_rd_ = val; }
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_cancel_in_received_data_pending(bool val) {
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cancel_in_rd_pending_ = val;
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_cancel_in_get_cookies_blocked(bool val) {
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cancel_in_getcookiesblocked_ = val;
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_cancel_in_set_cookie_blocked(bool val) {
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cancel_in_setcookieblocked_ = val;
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_quit_on_complete(bool val) { quit_on_complete_ = val; }
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_quit_on_redirect(bool val) { quit_on_redirect_ = val; }
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_allow_certificate_errors(bool val) {
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    allow_certificate_errors_ = val;
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_username(const string16& u) { username_ = u; }
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_password(const string16& p) { password_ = p; }
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // query state
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& data_received() const { return data_received_; }
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int bytes_received() const { return static_cast<int>(data_received_.size()); }
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int response_started_count() const { return response_started_count_; }
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int received_redirect_count() const { return received_redirect_count_; }
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int blocked_get_cookies_count() const { return blocked_get_cookies_count_; }
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int blocked_set_cookie_count() const { return blocked_set_cookie_count_; }
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int set_cookie_count() const { return set_cookie_count_; }
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool received_data_before_response() const {
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return received_data_before_response_;
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool request_failed() const { return request_failed_; }
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool have_certificate_errors() const { return have_certificate_errors_; }
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // net::URLRequest::Delegate:
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnReceivedRedirect(net::URLRequest* request, const GURL& new_url,
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  bool* defer_redirect);
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnAuthRequired(net::URLRequest* request,
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              net::AuthChallengeInfo* auth_info);
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnSSLCertificateError(net::URLRequest* request,
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     int cert_error,
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                     net::X509Certificate* cert);
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnGetCookies(net::URLRequest* request, bool blocked_by_policy);
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnSetCookie(net::URLRequest* request,
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           const std::string& cookie_line,
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           const net::CookieOptions& options,
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                           bool blocked_by_policy);
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnResponseStarted(net::URLRequest* request);
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnReadCompleted(net::URLRequest* request, int bytes_read);
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static const int kBufferSize = 4096;
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnResponseCompleted(net::URLRequest* request);
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // options for controlling behavior
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool cancel_in_rr_;
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool cancel_in_rs_;
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool cancel_in_rd_;
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool cancel_in_rd_pending_;
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool cancel_in_getcookiesblocked_;
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool cancel_in_setcookieblocked_;
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool quit_on_complete_;
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool quit_on_redirect_;
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool allow_certificate_errors_;
164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 username_;
166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 password_;
167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // tracks status of callbacks
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int response_started_count_;
170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int received_bytes_count_;
171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int received_redirect_count_;
172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int blocked_get_cookies_count_;
173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int blocked_set_cookie_count_;
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int set_cookie_count_;
175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool received_data_before_response_;
176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool request_failed_;
177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool have_certificate_errors_;
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string data_received_;
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // our read buffer
181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  scoped_refptr<net::IOBuffer> buf_;
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//-----------------------------------------------------------------------------
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass TestNetworkDelegate : public net::NetworkDelegate {
187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TestNetworkDelegate();
189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~TestNetworkDelegate();
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int last_os_error() const { return last_os_error_; }
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int error_count() const { return error_count_; }
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int created_requests() const { return created_requests_; }
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int destroyed_requests() const { return destroyed_requests_; }
195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected:
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // net::NetworkDelegate:
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int OnBeforeURLRequest(net::URLRequest* request,
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 net::CompletionCallback* callback,
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 GURL* new_url);
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int OnBeforeSendHeaders(uint64 request_id,
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  net::CompletionCallback* callback,
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  net::HttpRequestHeaders* headers);
204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnResponseStarted(net::URLRequest* request);
205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnReadCompleted(net::URLRequest* request, int bytes_read);
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnURLRequestDestroyed(net::URLRequest* request);
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual net::URLRequestJob* OnMaybeCreateURLRequestJob(
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::URLRequest* request);
209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int last_os_error_;
211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int error_count_;
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int created_requests_;
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int destroyed_requests_;
214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // NET_URL_REQUEST_URL_REQUEST_TEST_UTIL_H_
217