1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef NET_URL_REQUEST_URL_REQUEST_TEST_UTIL_H_
6 #define NET_URL_REQUEST_URL_REQUEST_TEST_UTIL_H_
7 
8 #include <stdint.h>
9 #include <stdlib.h>
10 
11 #include <map>
12 #include <memory>
13 #include <string>
14 #include <utility>
15 
16 #include "base/compiler_specific.h"
17 #include "base/memory/ref_counted.h"
18 #include "base/optional.h"
19 #include "base/path_service.h"
20 #include "base/single_thread_task_runner.h"
21 #include "base/strings/string16.h"
22 #include "base/strings/string_util.h"
23 #include "base/strings/utf_string_conversions.h"
24 #include "base/time/time.h"
25 #include "net/base/io_buffer.h"
26 #include "net/base/load_timing_info.h"
27 #include "net/base/net_errors.h"
28 #include "net/base/network_delegate_impl.h"
29 #include "net/base/request_priority.h"
30 #include "net/cert/cert_verifier.h"
31 #include "net/cert/ct_policy_enforcer.h"
32 #include "net/cookies/cookie_monster.h"
33 #include "net/disk_cache/disk_cache.h"
34 #include "net/ftp/ftp_network_layer.h"
35 #include "net/http/http_auth_handler_factory.h"
36 #include "net/http/http_cache.h"
37 #include "net/http/http_network_layer.h"
38 #include "net/http/http_network_session.h"
39 #include "net/http/http_request_headers.h"
40 #include "net/ssl/ssl_config_service_defaults.h"
41 #include "net/url_request/redirect_info.h"
42 #include "net/url_request/url_request.h"
43 #include "net/url_request/url_request_context.h"
44 #include "net/url_request/url_request_context_getter.h"
45 #include "net/url_request/url_request_context_storage.h"
46 #include "net/url_request/url_request_job_factory.h"
47 #include "url/url_util.h"
48 
49 namespace net {
50 
51 //-----------------------------------------------------------------------------
52 
53 class TestURLRequestContext : public URLRequestContext {
54  public:
55   TestURLRequestContext();
56   // Default constructor like TestURLRequestContext() but does not call
57   // Init() in case |delay_initialization| is true. This allows modifying the
58   // URLRequestContext before it is constructed completely. If
59   // |delay_initialization| is true, Init() needs be be called manually.
60   explicit TestURLRequestContext(bool delay_initialization);
61   ~TestURLRequestContext() override;
62 
63   void Init();
64 
client_socket_factory()65   ClientSocketFactory* client_socket_factory() {
66     return client_socket_factory_;
67   }
set_client_socket_factory(ClientSocketFactory * factory)68   void set_client_socket_factory(ClientSocketFactory* factory) {
69     client_socket_factory_ = factory;
70   }
71 
set_http_network_session_params(std::unique_ptr<HttpNetworkSession::Params> session_params)72   void set_http_network_session_params(
73       std::unique_ptr<HttpNetworkSession::Params> session_params) {
74     http_network_session_params_ = std::move(session_params);
75   }
76 
set_http_network_session_context(std::unique_ptr<HttpNetworkSession::Context> session_context)77   void set_http_network_session_context(
78       std::unique_ptr<HttpNetworkSession::Context> session_context) {
79     http_network_session_context_ = std::move(session_context);
80   }
81 
SetCTPolicyEnforcer(std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer)82   void SetCTPolicyEnforcer(
83       std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer) {
84     context_storage_.set_ct_policy_enforcer(std::move(ct_policy_enforcer));
85   }
86 
set_create_default_http_user_agent_settings(bool value)87   void set_create_default_http_user_agent_settings(bool value) {
88     create_default_http_user_agent_settings_ = value;
89   }
90 
91   // Like CreateRequest, but also updates |site_for_cookies| to give the request
92   // a 1st-party context.
93   std::unique_ptr<URLRequest> CreateFirstPartyRequest(
94       const GURL& url,
95       RequestPriority priority,
96       URLRequest::Delegate* delegate,
97       NetworkTrafficAnnotationTag traffic_annotation) const;
98 
99  private:
100   bool initialized_ = false;
101 
102   // Optional parameters to override default values.  Note that values in the
103   // HttpNetworkSession::Context that point to other objects the
104   // TestURLRequestContext creates will be overwritten.
105   std::unique_ptr<HttpNetworkSession::Params> http_network_session_params_;
106   std::unique_ptr<HttpNetworkSession::Context> http_network_session_context_;
107 
108   // Not owned:
109   ClientSocketFactory* client_socket_factory_ = nullptr;
110 
111   bool create_default_http_user_agent_settings_ = true;
112 
113  protected:
114   URLRequestContextStorage context_storage_;
115 };
116 
117 //-----------------------------------------------------------------------------
118 
119 // Used to return a dummy context, which lives on the message loop
120 // given in the constructor.
121 class TestURLRequestContextGetter : public URLRequestContextGetter {
122  public:
123   // |network_task_runner| must not be NULL.
124   explicit TestURLRequestContextGetter(
125       const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner);
126 
127   // Use to pass a pre-initialized |context|.
128   TestURLRequestContextGetter(
129       const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner,
130       std::unique_ptr<TestURLRequestContext> context);
131 
132   // URLRequestContextGetter implementation.
133   TestURLRequestContext* GetURLRequestContext() override;
134   scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
135       const override;
136 
137   // see NotifyContextShuttingDown() in the base class.
138   void NotifyContextShuttingDown();
139 
140  protected:
141   ~TestURLRequestContextGetter() override;
142 
143  private:
144   const scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
145   std::unique_ptr<TestURLRequestContext> context_;
146   bool is_shut_down_ = false;
147 };
148 
149 //-----------------------------------------------------------------------------
150 
151 class TestDelegate : public URLRequest::Delegate {
152  public:
153   TestDelegate();
154   ~TestDelegate() override;
155 
156   // Helpers to create a RunLoop, set |on_<event>| from it, then Run() it.
157   void RunUntilComplete();
158   void RunUntilRedirect();
159   // Enables quitting the message loop in response to auth requests, as opposed
160   // to returning credentials or cancelling the request.
161   void RunUntilAuthRequired();
162 
163   // Sets the closure to be run on completion, for tests which need more fine-
164   // grained control than RunUntilComplete().
set_on_complete(base::OnceClosure on_complete)165   void set_on_complete(base::OnceClosure on_complete) {
166     use_legacy_on_complete_ = false;
167     on_complete_ = std::move(on_complete);
168   }
169 
set_cancel_in_received_redirect(bool val)170   void set_cancel_in_received_redirect(bool val) { cancel_in_rr_ = val; }
set_cancel_in_response_started(bool val)171   void set_cancel_in_response_started(bool val) { cancel_in_rs_ = val; }
set_cancel_in_received_data(bool val)172   void set_cancel_in_received_data(bool val) { cancel_in_rd_ = val; }
set_cancel_in_received_data_pending(bool val)173   void set_cancel_in_received_data_pending(bool val) {
174     cancel_in_rd_pending_ = val;
175   }
176 
set_allow_certificate_errors(bool val)177   void set_allow_certificate_errors(bool val) {
178     allow_certificate_errors_ = val;
179   }
set_credentials(const AuthCredentials & credentials)180   void set_credentials(const AuthCredentials& credentials) {
181     credentials_ = credentials;
182   }
183 
184   // query state
data_received()185   const std::string& data_received() const { return data_received_; }
bytes_received()186   int bytes_received() const { return static_cast<int>(data_received_.size()); }
response_started_count()187   int response_started_count() const { return response_started_count_; }
received_bytes_count()188   int received_bytes_count() const { return received_bytes_count_; }
received_redirect_count()189   int received_redirect_count() const { return received_redirect_count_; }
received_data_before_response()190   bool received_data_before_response() const {
191     return received_data_before_response_;
192   }
redirect_info()193   RedirectInfo redirect_info() { return redirect_info_; }
request_failed()194   bool request_failed() const { return request_failed_; }
have_certificate_errors()195   bool have_certificate_errors() const { return have_certificate_errors_; }
certificate_errors_are_fatal()196   bool certificate_errors_are_fatal() const {
197     return certificate_errors_are_fatal_;
198   }
certificate_net_error()199   int certificate_net_error() const { return certificate_net_error_; }
auth_required_called()200   bool auth_required_called() const { return auth_required_; }
response_completed()201   bool response_completed() const { return response_completed_; }
request_status()202   int request_status() const { return request_status_; }
203 
204   // URLRequest::Delegate:
205   void OnReceivedRedirect(URLRequest* request,
206                           const RedirectInfo& redirect_info,
207                           bool* defer_redirect) override;
208   void OnAuthRequired(URLRequest* request,
209                       const AuthChallengeInfo& auth_info) override;
210   // NOTE: |fatal| causes |certificate_errors_are_fatal_| to be set to true.
211   // (Unit tests use this as a post-condition.) But for policy, this method
212   // consults |allow_certificate_errors_|.
213   void OnSSLCertificateError(URLRequest* request,
214                              int net_error,
215                              const SSLInfo& ssl_info,
216                              bool fatal) override;
217   void OnResponseStarted(URLRequest* request, int net_error) override;
218   void OnReadCompleted(URLRequest* request, int bytes_read) override;
219 
220  private:
221   static const int kBufferSize = 4096;
222 
223   virtual void OnResponseCompleted(URLRequest* request);
224 
225   // options for controlling behavior
226   bool cancel_in_rr_ = false;
227   bool cancel_in_rs_ = false;
228   bool cancel_in_rd_ = false;
229   bool cancel_in_rd_pending_ = false;
230   bool allow_certificate_errors_ = false;
231   AuthCredentials credentials_;
232 
233   // True if legacy on-complete behaviour, using QuitCurrent*Deprecated(), is
234   // enabled. This is cleared if any of the Until*() APIs are used.
235   bool use_legacy_on_complete_ = true;
236 
237   // Used to register RunLoop quit closures, to implement the Until*() closures.
238   base::OnceClosure on_complete_;
239   base::OnceClosure on_redirect_;
240   base::OnceClosure on_auth_required_;
241 
242   // tracks status of callbacks
243   int response_started_count_ = 0;
244   int received_bytes_count_ = 0;
245   int received_redirect_count_ = 0;
246   bool received_data_before_response_ = false;
247   bool request_failed_ = false;
248   bool have_certificate_errors_ = false;
249   bool certificate_errors_are_fatal_ = false;
250   int certificate_net_error_ = 0;
251   bool auth_required_ = false;
252   std::string data_received_;
253   bool response_completed_ = false;
254 
255   // tracks status of request
256   int request_status_ = ERR_IO_PENDING;
257 
258   // our read buffer
259   scoped_refptr<IOBuffer> buf_;
260 
261   RedirectInfo redirect_info_;
262 };
263 
264 //-----------------------------------------------------------------------------
265 
266 class TestNetworkDelegate : public NetworkDelegateImpl {
267  public:
268   enum Options {
269     NO_GET_COOKIES = 1 << 0,
270     NO_SET_COOKIE  = 1 << 1,
271   };
272 
273   TestNetworkDelegate();
274   ~TestNetworkDelegate() override;
275 
276   // Writes the LoadTimingInfo during the most recent call to OnBeforeRedirect.
277   bool GetLoadTimingInfoBeforeRedirect(
278       LoadTimingInfo* load_timing_info_before_redirect) const;
279 
280   // Will redirect once to the given URL when the next set of headers are
281   // received.
set_redirect_on_headers_received_url(GURL redirect_on_headers_received_url)282   void set_redirect_on_headers_received_url(
283       GURL redirect_on_headers_received_url) {
284     redirect_on_headers_received_url_ = redirect_on_headers_received_url;
285   }
286 
287   // Adds a X-Network-Delegate header to the first OnHeadersReceived call, but
288   // not subsequent ones.
set_add_header_to_first_response(bool add_header_to_first_response)289   void set_add_header_to_first_response(bool add_header_to_first_response) {
290     add_header_to_first_response_ = add_header_to_first_response;
291   }
292 
set_preserve_fragment_on_redirect_url(const base::Optional<GURL> & preserve_fragment_on_redirect_url)293   void set_preserve_fragment_on_redirect_url(
294       const base::Optional<GURL>& preserve_fragment_on_redirect_url) {
295     preserve_fragment_on_redirect_url_ = preserve_fragment_on_redirect_url;
296   }
297 
set_cookie_options(int o)298   void set_cookie_options(int o) {cookie_options_bit_mask_ = o; }
299 
last_error()300   int last_error() const { return last_error_; }
error_count()301   int error_count() const { return error_count_; }
created_requests()302   int created_requests() const { return created_requests_; }
destroyed_requests()303   int destroyed_requests() const { return destroyed_requests_; }
completed_requests()304   int completed_requests() const { return completed_requests_; }
canceled_requests()305   int canceled_requests() const { return canceled_requests_; }
blocked_get_cookies_count()306   int blocked_get_cookies_count() const { return blocked_get_cookies_count_; }
blocked_set_cookie_count()307   int blocked_set_cookie_count() const { return blocked_set_cookie_count_; }
set_cookie_count()308   int set_cookie_count() const { return set_cookie_count_; }
309 
set_experimental_cookie_features_enabled(bool val)310   void set_experimental_cookie_features_enabled(bool val) {
311     experimental_cookie_features_enabled_ = val;
312   }
313 
set_cancel_request_with_policy_violating_referrer(bool val)314   void set_cancel_request_with_policy_violating_referrer(bool val) {
315     cancel_request_with_policy_violating_referrer_ = val;
316   }
317 
before_start_transaction_count()318   int before_start_transaction_count() const {
319     return before_start_transaction_count_;
320   }
321 
headers_received_count()322   int headers_received_count() const { return headers_received_count_; }
323 
set_before_start_transaction_fails()324   void set_before_start_transaction_fails() {
325     before_start_transaction_fails_ = true;
326   }
327 
328  protected:
329   // NetworkDelegate:
330   int OnBeforeURLRequest(URLRequest* request,
331                          CompletionOnceCallback callback,
332                          GURL* new_url) override;
333   int OnBeforeStartTransaction(URLRequest* request,
334                                CompletionOnceCallback callback,
335                                HttpRequestHeaders* headers) override;
336   int OnHeadersReceived(
337       URLRequest* request,
338       CompletionOnceCallback callback,
339       const HttpResponseHeaders* original_response_headers,
340       scoped_refptr<HttpResponseHeaders>* override_response_headers,
341       const IPEndPoint& endpoint,
342       base::Optional<GURL>* preserve_fragment_on_redirect_url) override;
343   void OnBeforeRedirect(URLRequest* request, const GURL& new_location) override;
344   void OnResponseStarted(URLRequest* request, int net_error) override;
345   void OnCompleted(URLRequest* request, bool started, int net_error) override;
346   void OnURLRequestDestroyed(URLRequest* request) override;
347   void OnPACScriptError(int line_number, const base::string16& error) override;
348   bool OnCanGetCookies(const URLRequest& request,
349                        const CookieList& cookie_list,
350                        bool allowed_from_caller) override;
351   bool OnCanSetCookie(const URLRequest& request,
352                       const net::CanonicalCookie& cookie,
353                       CookieOptions* options,
354                       bool allowed_from_caller) override;
355   bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
356       const URLRequest& request,
357       const GURL& target_url,
358       const GURL& referrer_url) const override;
359 
360   void InitRequestStatesIfNew(int request_id);
361 
362   // Gets a request ID if it already has one, assigns a new one and returns that
363   // if not.
364   int GetRequestId(URLRequest* request);
365 
366   GURL redirect_on_headers_received_url_;
367   // URL to mark as retaining its fragment if redirected to at the
368   // OnHeadersReceived() stage.
369   base::Optional<GURL> preserve_fragment_on_redirect_url_;
370 
371   int last_error_;
372   int error_count_;
373   int created_requests_;
374   int destroyed_requests_;
375   int completed_requests_;
376   int canceled_requests_;
377   int cookie_options_bit_mask_;
378   int blocked_get_cookies_count_;
379   int blocked_set_cookie_count_;
380   int set_cookie_count_;
381   int before_start_transaction_count_;
382   int headers_received_count_;
383 
384   // NetworkDelegate callbacks happen in a particular order (e.g.
385   // OnBeforeURLRequest is always called before OnBeforeStartTransaction).
386   // This bit-set indicates for each request id (key) what events may be sent
387   // next.
388   std::map<int, int> next_states_;
389 
390   // A log that records for each request id (key) the order in which On...
391   // functions were called.
392   std::map<int, std::string> event_order_;
393 
394   LoadTimingInfo load_timing_info_before_redirect_;
395   bool has_load_timing_info_before_redirect_;
396 
397   bool experimental_cookie_features_enabled_;           // false by default
398   bool cancel_request_with_policy_violating_referrer_;  // false by default
399   bool before_start_transaction_fails_;
400   bool add_header_to_first_response_;
401   int next_request_id_;
402 };
403 
404 //-----------------------------------------------------------------------------
405 
406 // A simple ProtocolHandler that returns a pre-built URLRequestJob only once.
407 class TestJobInterceptor : public URLRequestJobFactory::ProtocolHandler {
408  public:
409   TestJobInterceptor();
410   ~TestJobInterceptor() override;
411 
412   URLRequestJob* MaybeCreateJob(
413       URLRequest* request,
414       NetworkDelegate* network_delegate) const override;
415   void set_main_intercept_job(std::unique_ptr<URLRequestJob> job);
416 
417  private:
418   mutable std::unique_ptr<URLRequestJob> main_intercept_job_;
419 };
420 
421 }  // namespace net
422 
423 #endif  // NET_URL_REQUEST_URL_REQUEST_TEST_UTIL_H_
424