1 // Copyright 2012 The Chromium Authors 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 #include <vector> 16 17 #include "base/compiler_specific.h" 18 #include "base/memory/raw_ptr.h" 19 #include "base/memory/scoped_refptr.h" 20 #include "base/path_service.h" 21 #include "base/strings/string_util.h" 22 #include "base/strings/utf_string_conversions.h" 23 #include "base/task/single_thread_task_runner.h" 24 #include "net/base/io_buffer.h" 25 #include "net/base/load_timing_info.h" 26 #include "net/base/net_errors.h" 27 #include "net/base/network_delegate_impl.h" 28 #include "net/base/request_priority.h" 29 #include "net/base/transport_info.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/cookies/cookie_setting_override.h" 34 #include "net/disk_cache/disk_cache.h" 35 #include "net/first_party_sets/first_party_set_metadata.h" 36 #include "net/first_party_sets/first_party_sets_cache_filter.h" 37 #include "net/http/http_auth_handler_factory.h" 38 #include "net/http/http_cache.h" 39 #include "net/http/http_network_layer.h" 40 #include "net/http/http_network_session.h" 41 #include "net/http/http_request_headers.h" 42 #include "net/ssl/ssl_config_service_defaults.h" 43 #include "net/test/embedded_test_server/default_handlers.h" 44 #include "net/test/embedded_test_server/embedded_test_server.h" 45 #include "net/test/embedded_test_server/embedded_test_server_connection_listener.h" 46 #include "net/url_request/redirect_info.h" 47 #include "net/url_request/url_request.h" 48 #include "net/url_request/url_request_context.h" 49 #include "net/url_request/url_request_context_getter.h" 50 #include "net/url_request/url_request_interceptor.h" 51 #include "third_party/abseil-cpp/absl/types/optional.h" 52 #include "url/url_util.h" 53 54 namespace net { 55 56 class URLRequestContextBuilder; 57 58 //----------------------------------------------------------------------------- 59 60 // Creates a URLRequestContextBuilder with some members configured for the 61 // testing purpose. 62 std::unique_ptr<URLRequestContextBuilder> CreateTestURLRequestContextBuilder(); 63 64 //----------------------------------------------------------------------------- 65 // Used to return a dummy context, which lives on the message loop 66 // given in the constructor. 67 class TestURLRequestContextGetter : public URLRequestContextGetter { 68 public: 69 // |network_task_runner| must not be NULL. 70 explicit TestURLRequestContextGetter( 71 const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner); 72 73 // Use to pass a pre-initialized |context|. 74 TestURLRequestContextGetter( 75 const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner, 76 std::unique_ptr<URLRequestContext> context); 77 78 // URLRequestContextGetter implementation. 79 URLRequestContext* GetURLRequestContext() override; 80 scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner() 81 const override; 82 83 // see NotifyContextShuttingDown() in the base class. 84 void NotifyContextShuttingDown(); 85 86 protected: 87 ~TestURLRequestContextGetter() override; 88 89 private: 90 const scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; 91 std::unique_ptr<URLRequestContext> context_; 92 bool is_shut_down_ = false; 93 }; 94 95 //----------------------------------------------------------------------------- 96 97 class TestDelegate : public URLRequest::Delegate { 98 public: 99 TestDelegate(); 100 ~TestDelegate() override; 101 102 // Helpers to create a RunLoop, set |on_<event>| from it, then Run() it. 103 void RunUntilComplete(); 104 void RunUntilRedirect(); 105 // Enables quitting the message loop in response to auth requests, as opposed 106 // to returning credentials or cancelling the request. 107 void RunUntilAuthRequired(); 108 109 // Sets the closure to be run on completion, for tests which need more fine- 110 // grained control than RunUntilComplete(). set_on_complete(base::OnceClosure on_complete)111 void set_on_complete(base::OnceClosure on_complete) { 112 use_legacy_on_complete_ = false; 113 on_complete_ = std::move(on_complete); 114 } 115 116 // Sets the result returned by subsequent calls to OnConnected(). set_on_connected_result(int result)117 void set_on_connected_result(int result) { on_connected_result_ = result; } 118 set_cancel_in_received_redirect(bool val)119 void set_cancel_in_received_redirect(bool val) { cancel_in_rr_ = val; } set_cancel_in_response_started(bool val)120 void set_cancel_in_response_started(bool val) { cancel_in_rs_ = val; } set_cancel_in_received_data(bool val)121 void set_cancel_in_received_data(bool val) { cancel_in_rd_ = val; } set_cancel_in_received_data_pending(bool val)122 void set_cancel_in_received_data_pending(bool val) { 123 cancel_in_rd_pending_ = val; 124 } 125 set_allow_certificate_errors(bool val)126 void set_allow_certificate_errors(bool val) { 127 allow_certificate_errors_ = val; 128 } set_credentials(const AuthCredentials & credentials)129 void set_credentials(const AuthCredentials& credentials) { 130 credentials_ = credentials; 131 } 132 133 // If true, the delegate will asynchronously run the callback passed in from 134 // URLRequest with `on_connected_result_` set_on_connected_run_callback(bool run_callback)135 void set_on_connected_run_callback(bool run_callback) { 136 on_connected_run_callback_ = run_callback; 137 } 138 139 // Returns the list of arguments with which OnConnected() was called. 140 // The arguments are listed in the same order as the calls were received. transports()141 const std::vector<TransportInfo>& transports() const { return transports_; } 142 143 // query state data_received()144 const std::string& data_received() const { return data_received_; } bytes_received()145 int bytes_received() const { return static_cast<int>(data_received_.size()); } response_started_count()146 int response_started_count() const { return response_started_count_; } received_bytes_count()147 int received_bytes_count() const { return received_bytes_count_; } received_redirect_count()148 int received_redirect_count() const { return received_redirect_count_; } received_data_before_response()149 bool received_data_before_response() const { 150 return received_data_before_response_; 151 } redirect_info()152 RedirectInfo redirect_info() { return redirect_info_; } request_failed()153 bool request_failed() const { return request_failed_; } have_certificate_errors()154 bool have_certificate_errors() const { return have_certificate_errors_; } certificate_errors_are_fatal()155 bool certificate_errors_are_fatal() const { 156 return certificate_errors_are_fatal_; 157 } certificate_net_error()158 int certificate_net_error() const { return certificate_net_error_; } auth_required_called()159 bool auth_required_called() const { return auth_required_; } response_completed()160 bool response_completed() const { return response_completed_; } request_status()161 int request_status() const { return request_status_; } 162 163 // URLRequest::Delegate: 164 int OnConnected(URLRequest* request, 165 const TransportInfo& info, 166 CompletionOnceCallback callback) override; 167 void OnReceivedRedirect(URLRequest* request, 168 const RedirectInfo& redirect_info, 169 bool* defer_redirect) override; 170 void OnAuthRequired(URLRequest* request, 171 const AuthChallengeInfo& auth_info) override; 172 // NOTE: |fatal| causes |certificate_errors_are_fatal_| to be set to true. 173 // (Unit tests use this as a post-condition.) But for policy, this method 174 // consults |allow_certificate_errors_|. 175 void OnSSLCertificateError(URLRequest* request, 176 int net_error, 177 const SSLInfo& ssl_info, 178 bool fatal) override; 179 void OnResponseStarted(URLRequest* request, int net_error) override; 180 void OnReadCompleted(URLRequest* request, int bytes_read) override; 181 182 private: 183 static const int kBufferSize = 4096; 184 185 virtual void OnResponseCompleted(URLRequest* request); 186 187 // options for controlling behavior 188 int on_connected_result_ = OK; 189 bool cancel_in_rr_ = false; 190 bool cancel_in_rs_ = false; 191 bool cancel_in_rd_ = false; 192 bool cancel_in_rd_pending_ = false; 193 bool allow_certificate_errors_ = false; 194 AuthCredentials credentials_; 195 196 // True if legacy on-complete behaviour, using QuitCurrent*Deprecated(), is 197 // enabled. This is cleared if any of the Until*() APIs are used. 198 bool use_legacy_on_complete_ = true; 199 200 // Used to register RunLoop quit closures, to implement the Until*() closures. 201 base::OnceClosure on_complete_; 202 base::OnceClosure on_redirect_; 203 base::OnceClosure on_auth_required_; 204 205 // tracks status of callbacks 206 std::vector<TransportInfo> transports_; 207 int response_started_count_ = 0; 208 int received_bytes_count_ = 0; 209 int received_redirect_count_ = 0; 210 bool received_data_before_response_ = false; 211 bool request_failed_ = false; 212 bool have_certificate_errors_ = false; 213 bool certificate_errors_are_fatal_ = false; 214 int certificate_net_error_ = 0; 215 bool auth_required_ = false; 216 std::string data_received_; 217 bool response_completed_ = false; 218 219 // tracks status of request 220 int request_status_ = ERR_IO_PENDING; 221 222 // our read buffer 223 scoped_refptr<IOBuffer> buf_; 224 225 RedirectInfo redirect_info_; 226 227 bool on_connected_run_callback_ = false; 228 }; 229 230 //----------------------------------------------------------------------------- 231 232 class TestNetworkDelegate : public NetworkDelegateImpl { 233 public: 234 enum Options { 235 NO_GET_COOKIES = 1 << 0, 236 NO_SET_COOKIE = 1 << 1, 237 }; 238 239 TestNetworkDelegate(); 240 ~TestNetworkDelegate() override; 241 242 // Writes the LoadTimingInfo during the most recent call to OnBeforeRedirect. 243 bool GetLoadTimingInfoBeforeRedirect( 244 LoadTimingInfo* load_timing_info_before_redirect) const; 245 246 // Will redirect once to the given URL when the next set of headers are 247 // received. set_redirect_on_headers_received_url(GURL redirect_on_headers_received_url)248 void set_redirect_on_headers_received_url( 249 GURL redirect_on_headers_received_url) { 250 redirect_on_headers_received_url_ = redirect_on_headers_received_url; 251 } 252 253 // Adds a X-Network-Delegate header to the first OnHeadersReceived call, but 254 // not subsequent ones. set_add_header_to_first_response(bool add_header_to_first_response)255 void set_add_header_to_first_response(bool add_header_to_first_response) { 256 add_header_to_first_response_ = add_header_to_first_response; 257 } 258 set_preserve_fragment_on_redirect_url(const absl::optional<GURL> & preserve_fragment_on_redirect_url)259 void set_preserve_fragment_on_redirect_url( 260 const absl::optional<GURL>& preserve_fragment_on_redirect_url) { 261 preserve_fragment_on_redirect_url_ = preserve_fragment_on_redirect_url; 262 } 263 set_cookie_options(int o)264 void set_cookie_options(int o) {cookie_options_bit_mask_ = o; } 265 last_error()266 int last_error() const { return last_error_; } error_count()267 int error_count() const { return error_count_; } created_requests()268 int created_requests() const { return created_requests_; } destroyed_requests()269 int destroyed_requests() const { return destroyed_requests_; } completed_requests()270 int completed_requests() const { return completed_requests_; } canceled_requests()271 int canceled_requests() const { return canceled_requests_; } blocked_annotate_cookies_count()272 int blocked_annotate_cookies_count() const { 273 return blocked_annotate_cookies_count_; 274 } blocked_set_cookie_count()275 int blocked_set_cookie_count() const { return blocked_set_cookie_count_; } set_cookie_count()276 int set_cookie_count() const { return set_cookie_count_; } 277 set_cancel_request_with_policy_violating_referrer(bool val)278 void set_cancel_request_with_policy_violating_referrer(bool val) { 279 cancel_request_with_policy_violating_referrer_ = val; 280 } 281 before_start_transaction_count()282 int before_start_transaction_count() const { 283 return before_start_transaction_count_; 284 } 285 headers_received_count()286 int headers_received_count() const { return headers_received_count_; } 287 set_before_start_transaction_fails()288 void set_before_start_transaction_fails() { 289 before_start_transaction_fails_ = true; 290 } 291 set_fps_cache_filter(FirstPartySetsCacheFilter cache_filter)292 void set_fps_cache_filter(FirstPartySetsCacheFilter cache_filter) { 293 fps_cache_filter_ = std::move(cache_filter); 294 } 295 cookie_setting_overrides_records()296 const std::vector<CookieSettingOverrides>& cookie_setting_overrides_records() 297 const { 298 return cookie_setting_overrides_records_; 299 } 300 301 protected: 302 // NetworkDelegate: 303 int OnBeforeURLRequest(URLRequest* request, 304 CompletionOnceCallback callback, 305 GURL* new_url) override; 306 int OnBeforeStartTransaction( 307 URLRequest* request, 308 const HttpRequestHeaders& headers, 309 OnBeforeStartTransactionCallback callback) override; 310 int OnHeadersReceived( 311 URLRequest* request, 312 CompletionOnceCallback callback, 313 const HttpResponseHeaders* original_response_headers, 314 scoped_refptr<HttpResponseHeaders>* override_response_headers, 315 const IPEndPoint& endpoint, 316 absl::optional<GURL>* preserve_fragment_on_redirect_url) override; 317 void OnBeforeRedirect(URLRequest* request, const GURL& new_location) override; 318 void OnResponseStarted(URLRequest* request, int net_error) override; 319 void OnCompleted(URLRequest* request, bool started, int net_error) override; 320 void OnURLRequestDestroyed(URLRequest* request) override; 321 bool OnAnnotateAndMoveUserBlockedCookies( 322 const URLRequest& request, 323 const net::FirstPartySetMetadata& first_party_set_metadata, 324 net::CookieAccessResultList& maybe_included_cookies, 325 net::CookieAccessResultList& excluded_cookies) override; 326 NetworkDelegate::PrivacySetting OnForcePrivacyMode( 327 const URLRequest& request) const override; 328 bool OnCanSetCookie(const URLRequest& request, 329 const net::CanonicalCookie& cookie, 330 CookieOptions* options) override; 331 bool OnCancelURLRequestWithPolicyViolatingReferrerHeader( 332 const URLRequest& request, 333 const GURL& target_url, 334 const GURL& referrer_url) const override; 335 absl::optional<FirstPartySetsCacheFilter::MatchInfo> 336 OnGetFirstPartySetsCacheFilterMatchInfoMaybeAsync( 337 const SchemefulSite& request_site, 338 base::OnceCallback<void(FirstPartySetsCacheFilter::MatchInfo)> callback) 339 const override; 340 341 void InitRequestStatesIfNew(int request_id); 342 343 // Gets a request ID if it already has one, assigns a new one and returns that 344 // if not. 345 int GetRequestId(URLRequest* request); 346 RecordCookieSettingOverrides(CookieSettingOverrides overrides)347 void RecordCookieSettingOverrides(CookieSettingOverrides overrides) const { 348 cookie_setting_overrides_records_.push_back(overrides); 349 } 350 351 GURL redirect_on_headers_received_url_; 352 // URL to mark as retaining its fragment if redirected to at the 353 // OnHeadersReceived() stage. 354 absl::optional<GURL> preserve_fragment_on_redirect_url_; 355 356 int last_error_ = 0; 357 int error_count_ = 0; 358 int created_requests_ = 0; 359 int destroyed_requests_ = 0; 360 int completed_requests_ = 0; 361 int canceled_requests_ = 0; 362 int cookie_options_bit_mask_ = 0; 363 int blocked_annotate_cookies_count_ = 0; 364 int blocked_set_cookie_count_ = 0; 365 int set_cookie_count_ = 0; 366 int before_start_transaction_count_ = 0; 367 int headers_received_count_ = 0; 368 369 // NetworkDelegate callbacks happen in a particular order (e.g. 370 // OnBeforeURLRequest is always called before OnBeforeStartTransaction). 371 // This bit-set indicates for each request id (key) what events may be sent 372 // next. 373 std::map<int, int> next_states_; 374 375 // A log that records for each request id (key) the order in which On... 376 // functions were called. 377 std::map<int, std::string> event_order_; 378 379 LoadTimingInfo load_timing_info_before_redirect_; 380 bool has_load_timing_info_before_redirect_ = false; 381 382 bool cancel_request_with_policy_violating_referrer_ = 383 false; // false by default 384 bool before_start_transaction_fails_ = false; 385 bool add_header_to_first_response_ = false; 386 int next_request_id_ = 0; 387 388 FirstPartySetsCacheFilter fps_cache_filter_; 389 390 mutable std::vector<CookieSettingOverrides> cookie_setting_overrides_records_; 391 }; 392 393 // ---------------------------------------------------------------------------- 394 395 class FilteringTestNetworkDelegate : public TestNetworkDelegate { 396 public: 397 FilteringTestNetworkDelegate(); 398 ~FilteringTestNetworkDelegate() override; 399 400 bool OnCanSetCookie(const URLRequest& request, 401 const net::CanonicalCookie& cookie, 402 CookieOptions* options) override; 403 SetCookieFilter(std::string filter)404 void SetCookieFilter(std::string filter) { 405 cookie_name_filter_ = std::move(filter); 406 } 407 set_cookie_called_count()408 int set_cookie_called_count() { return set_cookie_called_count_; } 409 blocked_set_cookie_count()410 int blocked_set_cookie_count() { return blocked_set_cookie_count_; } 411 ResetSetCookieCalledCount()412 void ResetSetCookieCalledCount() { set_cookie_called_count_ = 0; } 413 ResetBlockedSetCookieCount()414 void ResetBlockedSetCookieCount() { blocked_set_cookie_count_ = 0; } 415 416 bool OnAnnotateAndMoveUserBlockedCookies( 417 const URLRequest& request, 418 const net::FirstPartySetMetadata& first_party_set_metadata, 419 net::CookieAccessResultList& maybe_included_cookies, 420 net::CookieAccessResultList& excluded_cookies) override; 421 422 NetworkDelegate::PrivacySetting OnForcePrivacyMode( 423 const URLRequest& request) const override; 424 set_block_annotate_cookies()425 void set_block_annotate_cookies() { block_annotate_cookies_ = true; } 426 unset_block_annotate_cookies()427 void unset_block_annotate_cookies() { block_annotate_cookies_ = false; } 428 annotate_cookies_called_count()429 int annotate_cookies_called_count() const { 430 return annotate_cookies_called_count_; 431 } 432 blocked_annotate_cookies_count()433 int blocked_annotate_cookies_count() const { 434 return blocked_annotate_cookies_count_; 435 } 436 ResetAnnotateCookiesCalledCount()437 void ResetAnnotateCookiesCalledCount() { annotate_cookies_called_count_ = 0; } 438 ResetBlockedAnnotateCookiesCount()439 void ResetBlockedAnnotateCookiesCount() { 440 blocked_annotate_cookies_count_ = 0; 441 } 442 set_block_get_cookies_by_name(bool block)443 void set_block_get_cookies_by_name(bool block) { 444 block_get_cookies_by_name_ = block; 445 } 446 set_force_privacy_mode(bool enabled)447 void set_force_privacy_mode(bool enabled) { force_privacy_mode_ = enabled; } 448 set_partitioned_state_allowed(bool allowed)449 void set_partitioned_state_allowed(bool allowed) { 450 partitioned_state_allowed_ = allowed; 451 } 452 453 private: 454 std::string cookie_name_filter_ = ""; 455 int set_cookie_called_count_ = 0; 456 int blocked_set_cookie_count_ = 0; 457 458 bool block_annotate_cookies_ = false; 459 int annotate_cookies_called_count_ = 0; 460 int blocked_annotate_cookies_count_ = 0; 461 bool block_get_cookies_by_name_ = false; 462 463 bool force_privacy_mode_ = false; 464 bool partitioned_state_allowed_ = false; 465 }; 466 467 // ---------------------------------------------------------------------------- 468 469 // Less verbose way of running a simple testserver. 470 class HttpTestServer : public EmbeddedTestServer { 471 public: HttpTestServer(const base::FilePath & document_root)472 explicit HttpTestServer(const base::FilePath& document_root) { 473 AddDefaultHandlers(document_root); 474 } 475 HttpTestServer()476 HttpTestServer() { RegisterDefaultHandlers(this); } 477 }; 478 //----------------------------------------------------------------------------- 479 480 class TestScopedURLInterceptor { 481 public: 482 // Sets up a URLRequestInterceptor that intercepts a single request for |url|, 483 // returning the provided job. 484 // 485 // On destruction, cleans makes sure the job was removed, and cleans up the 486 // interceptor. Other interceptors for the same URL may not be created until 487 // the interceptor is deleted. 488 TestScopedURLInterceptor(const GURL& url, 489 std::unique_ptr<URLRequestJob> intercept_job); 490 ~TestScopedURLInterceptor(); 491 492 private: 493 class TestRequestInterceptor; 494 495 GURL url_; 496 497 // This is owned by the URLFilter. 498 raw_ptr<TestRequestInterceptor> interceptor_ = nullptr; 499 }; 500 501 } // namespace net 502 503 #endif // NET_URL_REQUEST_URL_REQUEST_TEST_UTIL_H_ 504