url_request_unittest.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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 "build/build_config.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shlobj.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_util.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/capturing_net_log.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info_test_util.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_unittest.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_module.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_data_directory.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_bytes_element_reader.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_data_stream.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_file_element_reader.h" 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/ev_root_ca_metadata.h" 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/test_root_certs.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store_test_helpers.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_network_layer.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ocsp/nss_ocsp.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_connection_status_flags.h" 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/test/cert_test_util.h" 60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/data_protocol_handler.h" 62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/file_protocol_handler.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/ftp_protocol_handler.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/static_http_user_agent_settings.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_file_dir_job.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_http_job.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_redirect_job.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_job.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_com_initializer.h" 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/win/scoped_comptr.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kChrome(ASCIIToUTF16("chrome")); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kSecret(ASCIIToUTF16("secret")); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kUser(ASCIIToUTF16("user")); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests load timing information in the case a fresh connection was used, with 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// no proxy. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info, 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int connect_timing_flags) { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info.request_start, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.connect_timing.connect_start); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connect_timing_flags); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info.connect_timing.connect_end, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.send_start); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but with proxy times. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestLoadTimingNotReusedWithProxy( 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::LoadTimingInfo& load_timing_info, 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int connect_timing_flags) { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.request_start, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.proxy_resolve_start); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.proxy_resolve_start, 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.proxy_resolve_end); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.proxy_resolve_end, 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.connect_timing.connect_start); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing_flags); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.connect_timing.connect_end, 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.send_start); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but with a reused socket and proxy times. 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestLoadTimingReusedWithProxy( 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const net::LoadTimingInfo& load_timing_info) { 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(load_timing_info.socket_reused); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.request_start, 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.proxy_resolve_start); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.proxy_resolve_start, 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.proxy_resolve_end); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.proxy_resolve_end, 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_info.send_start); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests load timing information in the case of a cache hit, when no cache 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// validation request was sent over the wire. 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestLoadTimingCacheHitNoNetwork( 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const net::LoadTimingInfo& load_timing_info) { 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LE(load_timing_info.request_start, load_timing_info.send_start); 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end); 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end); 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests load timing in the case that there is no HTTP response. This can be 17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// used to test in the case of errors or non-HTTP requests. 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestLoadTimingNoHttpResponse( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const net::LoadTimingInfo& load_timing_info) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only the request times should be non-null. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start_time.is_null()); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.request_start.is_null()); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null()); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null()); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.send_start.is_null()); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.send_end.is_null()); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(load_timing_info.receive_headers_end.is_null()); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::StringPiece TestNetResourceProvider(int key) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "header"; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do a case-insensitive search through |haystack| for |needle|. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContainsString(const std::string& haystack, const char* needle) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string::const_iterator it = 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::search(haystack.begin(), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) haystack.end(), 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needle, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needle + strlen(needle), 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::CaseInsensitiveCompare<char>()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it != haystack.end(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FillBuffer(char* buffer, size_t len) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool called = false; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!called) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called = true; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int>(Time::Now().ToInternalValue()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < len; i++) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer[i] = static_cast<char>(rand()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buffer[i]) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer[i] = 'g'; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadDataStream* CreateSimpleUploadData(const char* data) { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<UploadElementReader> reader( 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new UploadBytesElementReader(data, strlen(data))); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return UploadDataStream::CreateWithReader(reader.Pass(), 0); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the SSLInfo of a successful SSL connection has valid values. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckSSLInfo(const SSLInfo& ssl_info) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow ChromeFrame fake SSLInfo to get through. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_info.cert.get() && 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.cert.get()->issuer().GetDisplayName() == "Chrome Internal") { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // -1 means unknown. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ssl_info.security_bits, -1); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // -1 means unknown. 0 means no encryption. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(ssl_info.security_bits, 0); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cipher_suite = SSLConnectionStatusToCipherSuite( 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_info.connection_status); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, cipher_suite); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FingerprintsEqual(const HashValueVector& a, const HashValueVector& b) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size = a.size(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size != b.size()) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < size; ++i) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!a[i].Equals(b[i])) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A network delegate that allows the user to choose a subset of request stages 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to block in. When blocking, the delegate can do one of the following: 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * synchronously return a pre-specified error code, or 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * asynchronously return that value via an automatically called callback, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * block and wait for the user to do a callback. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additionally, the user may also specify a redirect URL -- then each request 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with the current URL different from the redirect target will be redirected 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to that target, in the on-before-URL-request stage, independent of whether 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the delegate blocks in ON_BEFORE_URL_REQUEST or not. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockingNetworkDelegate : public TestNetworkDelegate { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stages in which the delegate can block. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Stage { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOT_BLOCKED = 0, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_BEFORE_URL_REQUEST = 1 << 0, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_BEFORE_SEND_HEADERS = 1 << 1, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_HEADERS_RECEIVED = 1 << 2, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_AUTH_REQUIRED = 1 << 3 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Behavior during blocked stages. During other stages, just 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns net::OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum BlockMode { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SYNCHRONOUS, // No callback, returns specified return values. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AUTO_CALLBACK, // |this| posts a task to run the callback using the 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified return codes. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USER_CALLBACK, // User takes care of doing a callback. |retval_| and 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |auth_retval_| are ignored. In every blocking stage the 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop is quit. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a delegate which does not block at all. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit BlockingNetworkDelegate(BlockMode block_mode); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For users to trigger a callback returning |response|. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Side-effects: resets |stage_blocked_for_callback_| and stored callbacks. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only call if |block_mode_| == USER_CALLBACK. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoCallback(int response); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoAuthCallback(NetworkDelegate::AuthRequiredResponse response); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setters. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_retval(int retval) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(USER_CALLBACK, block_mode_); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(ERR_IO_PENDING, retval); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(OK, retval); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval_ = retval; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |auth_retval| == AUTH_REQUIRED_RESPONSE_SET_AUTH, then 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |auth_credentials_| will be passed with the response. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_auth_retval(AuthRequiredResponse auth_retval) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(USER_CALLBACK, block_mode_); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_retval_ = auth_retval; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_auth_credentials(const AuthCredentials& auth_credentials) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_credentials_ = auth_credentials; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_redirect_url(const GURL& url) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_url_ = url; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_block_on(int block_on) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_on_ = block_on; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the user to check in which state did we block. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stage stage_blocked_for_callback() const { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(USER_CALLBACK, block_mode_); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stage_blocked_for_callback_; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunCallback(int response, const CompletionCallback& callback); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunAuthCallback(AuthRequiredResponse response, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TestNetworkDelegate implementation. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeURLRequest(URLRequest* request, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url) OVERRIDE; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnBeforeSendHeaders(URLRequest* request, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders* headers) OVERRIDE; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnHeadersReceived( 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* original_response_headers, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired( 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthChallengeInfo& auth_info, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* credentials) OVERRIDE; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resets the callbacks and |stage_blocked_for_callback_|. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether we should block in |stage|. If yes, returns an error code 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and optionally sets up callback based on |block_mode_|. If no, returns OK. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int MaybeBlockStage(Stage stage, const CompletionCallback& callback); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Configuration parameters, can be adjusted by public methods: 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockMode block_mode_; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Values returned on blocking stages when mode is SYNCHRONOUS or 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int retval_; // To be returned in non-auth stages. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthRequiredResponse auth_retval_; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL redirect_url_; // Used if non-empty. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int block_on_; // Bit mask: in which stages to block. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |auth_credentials_| will be copied to |*target_auth_credential_| on 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials auth_credentials_; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* target_auth_credentials_; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal variables, not set by not the user: 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Last blocked stage waiting for user callback (unused if |block_mode_| != 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // USER_CALLBACK). 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stage stage_blocked_for_callback_; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback objects stored during blocking stages. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback_; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCallback auth_callback_; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BlockingNetworkDelegate::BlockingNetworkDelegate(BlockMode block_mode) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : block_mode_(block_mode), 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval_(OK), 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION), 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) block_on_(0), 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_auth_credentials_(NULL), 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stage_blocked_for_callback_(NOT_BLOCKED), 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::DoCallback(int response) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(USER_CALLBACK, block_mode_); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(NOT_BLOCKED, stage_blocked_for_callback_); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(ON_AUTH_REQUIRED, stage_blocked_for_callback_); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback = callback_; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunCallback(response, callback); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::DoAuthCallback( 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AuthRequiredResponse response) { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(USER_CALLBACK, block_mode_); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(ON_AUTH_REQUIRED, stage_blocked_for_callback_); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCallback auth_callback = auth_callback_; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAuthCallback(response, auth_callback); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::RunCallback(int response, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(response); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(target_auth_credentials_ != NULL); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *target_auth_credentials_ = auth_credentials_; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(response); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnBeforeURLRequest( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (redirect_url_ == request->url()) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; // We've already seen this request and redirected elsewhere. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!redirect_url_.is_empty()) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *new_url = redirect_url_; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnBeforeSendHeaders( 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders* headers) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnHeadersReceived( 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* original_response_headers, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders>* override_response_headers) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate::OnHeadersReceived( 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request, callback, original_response_headers, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_response_headers); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MaybeBlockStage(ON_HEADERS_RECEIVED, callback); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired( 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthChallengeInfo& auth_info, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AuthCallback& callback, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials* credentials) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate::OnAuthRequired(request, auth_info, callback, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) credentials); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the user has provided callback for the previous blocked stage. 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((block_on_ & ON_AUTH_REQUIRED) == 0) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AUTH_REQUIRED_RESPONSE_NO_ACTION; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_auth_credentials_ = credentials; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (block_mode_) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SYNCHRONOUS: 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *target_auth_credentials_ = auth_credentials_; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return auth_retval_; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AUTO_CALLBACK: 50590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&BlockingNetworkDelegate::RunAuthCallback, 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), auth_retval_, callback)); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AUTH_REQUIRED_RESPONSE_IO_PENDING; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case USER_CALLBACK: 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_callback_ = callback; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stage_blocked_for_callback_ = ON_AUTH_REQUIRED; 51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AUTH_REQUIRED_RESPONSE_IO_PENDING; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AUTH_REQUIRED_RESPONSE_NO_ACTION; // Dummy value. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::Reset() { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(NOT_BLOCKED, stage_blocked_for_callback_); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stage_blocked_for_callback_ = NOT_BLOCKED; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Reset(); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_callback_.Reset(); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::MaybeBlockStage( 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::Stage stage, 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the user has provided callback for the previous blocked stage. 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((block_on_ & stage) == 0) { 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (block_mode_) { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SYNCHRONOUS: 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(OK, retval_); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval_; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case AUTO_CALLBACK: 54590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&BlockingNetworkDelegate::RunCallback, 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_factory_.GetWeakPtr(), retval_, callback)); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_IO_PENDING; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case USER_CALLBACK: 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_ = callback; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stage_blocked_for_callback_ = stage; 55490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_IO_PENDING; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestURLRequestContextWithProxy : public TestURLRequestContext { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does not own |delegate|. 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy(const std::string& proxy, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* delegate) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TestURLRequestContext(true) { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy)); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_network_delegate(delegate); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestURLRequestContextWithProxy() {} 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inherit PlatformTest since we require the autorelease pool on Mac OS X. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTest : public PlatformTest { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestTest() : default_context_(true) { 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&default_network_delegate_); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_context_.set_net_log(&net_log_); 583b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory_.SetProtocolHandler("data", new DataProtocolHandler); 584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory_.SetProtocolHandler("file", new FileProtocolHandler); 585b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) default_context_.set_job_factory(&job_factory_); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.Init(); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~URLRequestTest() {} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the TestJobInterceptor to the default context. 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestJobInterceptor* AddTestInterceptor() { 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestJobInterceptor* protocol_handler_ = new TestJobInterceptor(); 593b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory_.SetProtocolHandler("http", NULL); 594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) job_factory_.SetProtocolHandler("http", protocol_handler_); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return protocol_handler_; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CapturingNetLog net_log_; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 601b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) URLRequestJobFactoryImpl job_factory_; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext default_context_; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, AboutBlankTest) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("about:blank"), &d, &default_context_); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), 0); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", r.GetSocketAddress().host()); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.GetSocketAddress().port()); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DataURLImageTest) { 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use our nice little Chrome logo. 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL( 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "data:image/png;base64," 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUBBjG3" 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQxIEVxitD" 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI5MpCVdW0gO7t" 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "vNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKzMx1+fg9bAgK6zHq9" 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7CkIMDxQpF7r/MWq12UctI1" 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0WYUqt57yWf2McHTObYPbVD+Z" 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2HQQcm43XwmtoYM6vVKleh0uoWvnzW" 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nkDFHF9ZS+uYVjRUasMeHUmyLYtcklTvzW" 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GFZnNOXczThvpKIzjcahSqIzkvDLayDq6D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTb" 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xXX1T5xsV9tm9r4TQwHLiZw/pdDZJea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5" 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "MrVvMzNaI3+ERHfrFzPKQukrQGI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gV" 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Md6q5c8GdosynKmSeRuGzpjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq" 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/uxxZKzNiZFGD0wRC3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7F" 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Ux1qLnV7MGF40smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufB" 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "JbsysjjW4kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJM" 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nlm2O34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfm" 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "moRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV5En" 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="), 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), 911); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", r.GetSocketAddress().host()); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.GetSocketAddress().port()); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTest) { 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::FILE_EXE, &app_path); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL app_url = FilePathToFileURL(app_path); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(app_url, &d, &default_context_); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = -1; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::GetFileSize(app_path, &file_size)); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", r.GetSocketAddress().host()); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.GetSocketAddress().port()); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, FileTestCancel) { 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PathService::Get(base::FILE_EXE, &app_path); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL app_url = FilePathToFileURL(app_path); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(app_url, &d, &default_context_); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(r.is_pending()); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Cancel(); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Async cancelation should be safe even when URLRequest has been already 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destroyed. 70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestFullSpecifiedRange) { 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t buffer_size = 4000; 709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buffer(new char[buffer_size]); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillBuffer(buffer.get(), buffer_size); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_path; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL temp_url = FilePathToFileURL(temp_path); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t first_byte_position = 500; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t last_byte_position = buffer_size - first_byte_position; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t content_length = last_byte_position - first_byte_position + 1; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partial_buffer_string(buffer.get() + first_byte_position, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.get() + last_byte_position + 1); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(temp_url, &d, &default_context_); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kRange, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf( 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bytes=%" PRIuS "-%" PRIuS, 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_byte_position, last_byte_position)); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.SetExtraRequestHeaders(headers); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(content_length), d.bytes_received()); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed. 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(partial_buffer_string == d.data_received()); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::Delete(temp_path, false)); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t buffer_size = 4000; 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buffer(new char[buffer_size]); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillBuffer(buffer.get(), buffer_size); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_path; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL temp_url = FilePathToFileURL(temp_path); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t first_byte_position = 500; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t last_byte_position = buffer_size - 1; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t content_length = last_byte_position - first_byte_position + 1; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string partial_buffer_string(buffer.get() + first_byte_position, 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.get() + last_byte_position + 1); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(temp_url, &d, &default_context_); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kRange, 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("bytes=%" PRIuS "-", 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_byte_position)); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.SetExtraRequestHeaders(headers); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(content_length), d.bytes_received()); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed. 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(partial_buffer_string == d.data_received()); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::Delete(temp_path, false)); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestMultipleRanges) { 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t buffer_size = 400000; 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buffer(new char[buffer_size]); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillBuffer(buffer.get(), buffer_size); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_path; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path)); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL temp_url = FilePathToFileURL(temp_path); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size)); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size; 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size)); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(temp_url, &d, &default_context_); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kRange, 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bytes=0-0,10-200,200-300"); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.SetExtraRequestHeaders(headers); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.request_failed()); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::Delete(temp_path, false)); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InvalidUrlTest) { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("invalid url"), &d, &default_context_); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.request_failed()); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, ResolveShortcutTest) { 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("net"); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("data"); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("url_request_unittest"); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("with-headers.html"); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring lnk_path = app_path.value() + L".lnk"; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedCOMInitializer com_initializer; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporarily create a shortcut for test 852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::ScopedComPtr<IShellLink> shell; 854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(SUCCEEDED(shell.CreateInstance(CLSID_ShellLink, NULL, 855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CLSCTX_INPROC_SERVER))); 856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::ScopedComPtr<IPersistFile> persist; 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(SUCCEEDED(shell.QueryInterface(persist.Receive()))); 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str()))); 859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest"))); 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE))); 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(FilePathToFileURL(base::FilePath(lnk_path)), &d, 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &default_context_); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIN32_FILE_ATTRIBUTE_DATA data; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFileAttributesEx(app_path.value().c_str(), 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFileExInfoStandard, &data); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ, 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SHARE_READ, NULL, OPEN_EXISTING, 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_ATTRIBUTE_NORMAL, NULL); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(INVALID_HANDLE_VALUE, file); 880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buffer(new char[data.nFileSizeLow]); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD read_size; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL result; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = ReadFile(file, buffer.get(), data.nFileSizeLow, 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &read_size, NULL); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string content(buffer.get(), read_size); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseHandle(file); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!r.is_pending()); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(content, d.data_received()); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean the shortcut 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteFile(lnk_path.c_str()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirCancelTest) { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put in mock resource provider. 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetModule::SetResourceProvider(TestNetResourceProvider); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &file_path); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_path = file_path.Append(FILE_PATH_LITERAL("net")); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_path = file_path.Append(FILE_PATH_LITERAL("data")); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(FilePathToFileURL(file_path), &d, &default_context_); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.is_pending()); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_cancel_in_received_data_pending(true); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Take out mock resource provider. 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetModule::SetResourceProvider(NULL); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirRedirectNoCrash) { 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is an implicit redirect when loading a file path that matches a 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // directory and does not end with a slash. Ensure that following such 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // redirects does not crash. See http://crbug.com/18686. 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("net")); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("data")); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(FilePathToFileURL(path), &d, &default_context_); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 93690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, d.received_redirect_count()); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(0, d.bytes_received()); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(d.request_failed()); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(req.status().is_success()); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't accept the url "file:///" on windows. See http://crbug.com/1474. 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirRedirectSingleSlash) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("file:///"), &d, &default_context_); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, d.received_redirect_count()); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(req.status().is_success()); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Custom URLRequestJobs for use with interceptor tests 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestartTestJob : public URLRequestTestJob { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : URLRequestTestJob(request, network_delegate, true) {} 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StartAsync() OVERRIDE { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->NotifyRestartRequired(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~RestartTestJob() {} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelTestJob : public URLRequestTestJob { 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : URLRequestTestJob(request, network_delegate, true) {} 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StartAsync() OVERRIDE { 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->Cancel(); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~CancelTestJob() {} 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelThenRestartTestJob : public URLRequestTestJob { 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CancelThenRestartTestJob(URLRequest* request, 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : URLRequestTestJob(request, network_delegate, true) { 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StartAsync() OVERRIDE { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_->Cancel(); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->NotifyRestartRequired(); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~CancelThenRestartTestJob() {} 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An Interceptor for use with interceptor tests 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInterceptor : URLRequest::Interceptor { 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor() 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : intercept_main_request_(false), restart_main_request_(false), 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_main_request_(false), cancel_then_restart_main_request_(false), 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) simulate_main_network_error_(false), 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_redirect_(false), cancel_redirect_request_(false), 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_final_response_(false), cancel_final_request_(false), 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_main_(false), did_restart_main_(false), 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_main_(false), did_cancel_then_restart_main_(false), 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_simulate_error_main_(false), 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_redirect_(false), did_cancel_redirect_(false), 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_final_(false), did_cancel_final_(false) { 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest::Deprecated::RegisterRequestInterceptor(this); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestInterceptor() { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest::Deprecated::UnregisterRequestInterceptor(this); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual URLRequestJob* MaybeIntercept( 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest* request, 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkDelegate* network_delegate) OVERRIDE { 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (restart_main_request_) { 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) restart_main_request_ = false; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_restart_main_ = true; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new RestartTestJob(request, network_delegate); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_main_request_) { 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_main_request_ = false; 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_main_ = true; 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CancelTestJob(request, network_delegate); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_then_restart_main_request_) { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_then_restart_main_request_ = false; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_then_restart_main_ = true; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CancelThenRestartTestJob(request, network_delegate); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (simulate_main_network_error_) { 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) simulate_main_network_error_ = false; 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_simulate_error_main_ = true; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will error since the requeted url is not one of its canned urls 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new URLRequestTestJob(request, network_delegate, true); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intercept_main_request_) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_main_request_ = false; 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_main_ = true; 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequestTestJob* job = new URLRequestTestJob(request, 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_delegate, 1048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_headers_, 1049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) main_data_, 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) true); 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job->set_load_timing_info(main_request_load_timing_info_); 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return job; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual URLRequestJob* MaybeInterceptRedirect( 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& location) OVERRIDE { 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_redirect_request_) { 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_redirect_request_ = false; 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_redirect_ = true; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CancelTestJob(request, network_delegate); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intercept_redirect_) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_redirect_ = false; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_redirect_ = true; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new URLRequestTestJob(request, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate, 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_headers_, 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_data_, 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual URLRequestJob* MaybeInterceptResponse( 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest* request, NetworkDelegate* network_delegate) OVERRIDE { 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cancel_final_request_) { 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancel_final_request_ = false; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_cancel_final_ = true; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new CancelTestJob(request, network_delegate); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intercept_final_response_) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intercept_final_response_ = false; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_intercept_final_ = true; 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new URLRequestTestJob(request, 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate, 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_headers_, 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_data_, 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Whether to intercept the main request, and if so the response to return and 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the LoadTimingInfo to use. 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool intercept_main_request_; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string main_headers_; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string main_data_; 1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo main_request_load_timing_info_; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other actions we take at MaybeIntercept time 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restart_main_request_; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel_main_request_; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel_then_restart_main_request_; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool simulate_main_network_error_; 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether to intercept redirects, and if so the response to return. 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool intercept_redirect_; 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_headers_; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string redirect_data_; 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other actions we can take at MaybeInterceptRedirect time 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel_redirect_request_; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether to intercept final response, and if so the response to return. 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool intercept_final_response_; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string final_headers_; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string final_data_; 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other actions we can take at MaybeInterceptResponse time 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel_final_request_; 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we did something or not 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_intercept_main_; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_restart_main_; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_cancel_main_; 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_cancel_then_restart_main_; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_simulate_error_main_; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_intercept_redirect_; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_cancel_redirect_; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_intercept_final_; 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_cancel_final_; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Static getters for canned response header and data strings 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string ok_data() { 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return URLRequestTestJob::test_data_1(); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string ok_headers() { 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return URLRequestTestJob::test_headers(); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string redirect_data() { 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string redirect_headers() { 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return URLRequestTestJob::test_redirect_headers(); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string error_data() { 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string("ohhh nooooo mr. bill!"); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string error_headers() { 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return URLRequestTestJob::test_error_headers(); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, Intercept) { 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and respond with a simple response 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::ok_headers(); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::ok_data(); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data(); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data(); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data(); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetUserData(NULL, user_data0); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetUserData(&user_data1, user_data1); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetUserData(&user_data2, user_data2); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 117890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we can retrieve our specific user data 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(user_data0, req.GetUserData(NULL)); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(user_data1, req.GetUserData(&user_data1)); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(user_data2, req.GetUserData(&user_data2)); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we got one good response 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRedirect) { 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and respond with a redirect 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::redirect_headers(); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::redirect_data(); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept that redirect and respond a final OK response 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_redirect_ = true; 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.redirect_headers_ = TestInterceptor::ok_headers(); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.redirect_data_ = TestInterceptor::ok_data(); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 121390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_redirect_); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we got one good response 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (req.status().is_success()) { 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptServerError) { 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request to generate a server error response 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::error_headers(); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::error_data(); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept that error and respond with an OK response 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 124690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_final_); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we got one good response 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptNetworkError) { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request to simulate a network error 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.simulate_main_network_error_ = true; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept that error and respond with an OK response 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 127590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_simulate_error_main_); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_final_); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we received one good response 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRestartRequired) { 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // restart the main request 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.restart_main_request_ = true; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then intercept the new main request and respond with an OK response 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::ok_headers(); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::ok_data(); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 130490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_restart_main_); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we received one good response 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.status().is_success()); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (req.status().is_success()) { 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, req.response_headers()->response_code()); 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TestInterceptor::ok_data(), d.data_received()); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelMain) { 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and cancel from within the restarted job 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.cancel_main_request_ = true; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup to intercept final response and override it with an OK response 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 133590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_cancel_main_); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(interceptor.did_intercept_final_); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a canceled request 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelRedirect) { 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and respond with a redirect 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_main_request_ = true; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_headers_ = TestInterceptor::redirect_headers(); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.main_data_ = TestInterceptor::redirect_data(); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the redirect and cancel from within that job 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.cancel_redirect_request_ = true; 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup to intercept final response and override it with an OK response 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 136690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_intercept_main_); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_cancel_redirect_); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(interceptor.did_intercept_final_); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a canceled request 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelFinal) { 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request to simulate a network error 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.simulate_main_network_error_ = true; 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup to intercept final response and cancel from within that job 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.cancel_final_request_ = true; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 139190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_simulate_error_main_); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_cancel_final_); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a canceled request 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelInRestart) { 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestInterceptor interceptor; 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // intercept the main request and cancel then restart from within that job 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.cancel_then_restart_main_request_ = true; 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setup to intercept final response and override it with an OK response 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.intercept_final_response_ = true; 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_headers_ = TestInterceptor::ok_headers(); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interceptor.final_data_ = TestInterceptor::ok_data(); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 141790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the interceptor got called as expected 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(interceptor.did_cancel_then_restart_main_); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(interceptor.did_intercept_final_); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a canceled request 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing, 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequestContext* context) { 1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestInterceptor interceptor; 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) interceptor.intercept_main_request_ = true; 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) interceptor.main_request_load_timing_info_ = job_load_timing; 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestDelegate d; 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, context); 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.Start(); 143690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo resulting_load_timing; 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.GetLoadTimingInfo(&resulting_load_timing); 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // None of these should be modified by the URLRequest. 1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused); 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id); 1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start); 1445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end); 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.receive_headers_end, 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resulting_load_timing.receive_headers_end); 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return resulting_load_timing; 1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// "Normal" LoadTimingInfo as returned by a job. Everything is in order, not 1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// reused. |connect_time_flags| is used to indicate if there should be dns 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// or SSL times, and |used_proxy| is used for proxy times. 1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now, 1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int connect_time_flags, 1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool used_proxy) { 1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing; 1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.socket_log_id = 1; 1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (used_proxy) { 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); 1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing; 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) { 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.dns_start = now + base::TimeDelta::FromDays(3); 1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.dns_end = now + base::TimeDelta::FromDays(4); 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.connect_start = now + base::TimeDelta::FromDays(5); 1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) { 1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.ssl_start = now + base::TimeDelta::FromDays(6); 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.ssl_end = now + base::TimeDelta::FromDays(7); 1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connect_timing.connect_end = now + base::TimeDelta::FromDays(8); 1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.send_start = now + base::TimeDelta::FromDays(9); 1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.send_end = now + base::TimeDelta::FromDays(10); 1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return load_timing; 1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but in the case of a reused socket. 1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now, 1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool used_proxy) { 1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing; 1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.socket_log_id = 1; 1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.socket_reused = true; 1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (used_proxy) { 1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1); 1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2); 1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.send_start = now + base::TimeDelta::FromDays(9); 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.send_end = now + base::TimeDelta::FromDays(10); 1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11); 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return load_timing; 1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Basic test that the intercept + load timing tests work. 1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTiming) { 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false); 1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Nothing should have been changed by the URLRequest. 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.proxy_resolve_start, 1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_start); 1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.proxy_resolve_end, 1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_end); 1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.dns_start, 1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_start); 1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.dns_end, 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_end); 1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.connect_start, 1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.connect_end, 1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.ssl_start, 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_start); 1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.ssl_end, 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_end); 1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Redundant sanity check. 1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES); 1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Another basic test, with proxy and SSL times, but no DNS times. 1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingProxy) { 1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true); 1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Nothing should have been changed by the URLRequest. 1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.proxy_resolve_start, 1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_start); 1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.proxy_resolve_end, 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_end); 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.dns_start, 1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_start); 1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.dns_end, 1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_end); 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.connect_start, 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.connect_end, 1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.ssl_start, 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_start); 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(job_load_timing.connect_timing.ssl_end, 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_end); 1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Redundant sanity check. 1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReusedWithProxy(load_timing_result, 1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONNECT_TIMING_HAS_SSL_TIMES); 1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts proxy times when they're before 1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to already having a connected socket. This happens in 1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the case of reusing a SPDY session or HTTP pipeline. The connected socket is 1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// not considered reused in this test (May be a preconnect). 1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// To mix things up from the test above, assumes DNS times but no SSL times. 1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) { 1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true); 1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6); 1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5); 1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4); 1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3); 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_start = 1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(2); 1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_end = 1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(1); 1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Proxy times, connect times, and DNS times should all be replaced with 1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // request_start. 1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_start); 1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_end); 1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_start); 1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.dns_end); 1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Other times should have been left null. 1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReusedWithProxy(load_timing_result, 1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONNECT_TIMING_HAS_DNS_TIMES); 1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but in the reused case. 1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) { 1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true); 1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4); 1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3); 1613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Proxy times and connect times should all be replaced with request_start. 1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_start); 1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.proxy_resolve_end); 1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Other times should have been left null. 1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingReusedWithProxy(load_timing_result); 1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts connect times when they're before 1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to reusing a connected socket. The connected socket is 1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// not considered reused in this test (May be a preconnect). 1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// To mix things up, the request has SSL times, but no DNS times. 1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) { 1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false); 1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_start = 1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(1); 1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2); 1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3); 1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_end = 1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(4); 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connect times, and SSL times should be replaced with request_start. 1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_start); 1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.ssl_end); 1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.request_start, 1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Other times should have been left null. 1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES); 1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts connect times when they're before 1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to reusing a connected socket in the case that there 1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// are also proxy times. The connected socket is not considered reused in this 1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// test (May be a preconnect). 1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// In this test, there are no SSL or DNS times. 1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) { 1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo job_load_timing = 1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true); 1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_start = 1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(1); 1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) job_load_timing.connect_timing.connect_end = 1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) now - base::TimeDelta::FromDays(2); 1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing, 1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connect times should be replaced with proxy_resolve_end. 1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.proxy_resolve_end, 1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_start); 1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(load_timing_result.proxy_resolve_end, 1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) load_timing_result.connect_timing.connect_end); 1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Other times should have been left null. 1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestLoadTimingNotReusedWithProxy(load_timing_result, 1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); 1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that two different URL requests have different identifiers. 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, Identifiers) { 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context; 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLRequest req(GURL("http://example.com"), &d, &context, NULL); 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLRequest other_req(GURL("http://example.com"), &d, &context, NULL); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(req.identifier(), other_req.identifier()); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that a failure to connect to the proxy is reported to the network 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate. 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, NetworkDelegateProxyError) { 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver host_resolver; 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver.rules()->AddSimulatedFailure("*"); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequests. 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context("myproxy:70", &network_delegate); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("http://example.com"), &d, &context); 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("GET"); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 171390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we see a failed request. 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.status().is_success()); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, req.status().error()); 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.error_count()); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, network_delegate.last_error()); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that net::NetworkDelegate::NotifyCompleted is called if 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content is empty. 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, RequestCompletionForEmptyResponse) { 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(GURL("data:,"), &d, &default_context_); 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 173190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", d.data_received()); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, default_network_delegate_.completed_requests()); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that SetPriority actually sets the URLRequest's priority 17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// correctly, both before and after start. 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetPriorityBasic) { 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(LOW); 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, req.priority()); 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, req.priority()); 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(MEDIUM); 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(MEDIUM, req.priority()); 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest calls SetPriority on a job before calling 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Start on it. 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) { 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestTestJob> job = 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new URLRequestTestJob(&req, &default_network_delegate_); 1762868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job.get()); 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DEFAULT_PRIORITY, job->priority()); 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(LOW); 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, job->priority()); 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest passes on its priority updates to its 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// job. 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetJobPriority) { 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_); 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestTestJob> job = 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new URLRequestTestJob(&req, &default_network_delegate_); 1779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job.get()); 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(LOW); 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, job->priority()); 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(MEDIUM); 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(MEDIUM, req.priority()); 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(MEDIUM, job->priority()); 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(droger): Support SpawnedTestServer on iOS (see http://crbug.com/148666). 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS) 1792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A subclass of SpawnedTestServer that uses a statically-configured hostname. 1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is to work around mysterious failures in chrome_frame_net_tests. See: 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114369 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LocalHttpTestServer : public SpawnedTestServer { 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit LocalHttpTestServer(const base::FilePath& document_root) 1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCustomUrlRequestTestHttpHost::value(), 1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) document_root) {} 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer() 1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP, 1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedCustomUrlRequestTestHttpHost::value(), 1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath()) {} 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, DelayedCookieCallback) { 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context; 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<DelayedCookieMonster> delayed_cm = 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new DelayedCookieMonster(); 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CookieStore> cookie_store = delayed_cm; 1815868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context.set_cookie_store(delayed_cm.get()); 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("set-cookie?CookieToNotSend=1"), &d, &context); 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 182590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.set_cookie_count()); 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("echoheader?Cookie"), &d, &context); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 183890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies) { 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 186090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 187390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set. 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_load_flags(LOAD_DO_NOT_SEND_COOKIES); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 189090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies. 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies) { 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 191490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.set_cookie_count()); 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to set-up another cookie and update the previous cookie. 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_load_flags(LOAD_DO_NOT_SAVE_COOKIES); 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 193390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie. 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.set_cookie_count()); 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the cookies weren't saved or updated. 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 194990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.set_cookie_count()); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) { 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 197590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 198990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie isn't sent. 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 200790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.blocked_get_cookies_count()); 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) { 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 203090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to set-up another cookie and update the previous cookie. 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE); 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, network_delegate.blocked_set_cookie_count()); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the cookies weren't saved or updated. 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 206290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveEmptyCookies) { 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up an empty cookie. 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie"), &d, &default_context_); 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 208590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.set_cookie_count()); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) { 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 210690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 212090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSend=1") 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie isn't sent. 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 213890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1") 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.blocked_get_cookies_count()); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) { 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie. 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"), 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 216190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to set-up another cookie and update the previous cookie. 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, network_delegate.blocked_set_cookie_count()); 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the cookies weren't saved or updated. 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 219390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotSave=1") 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == std::string::npos); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2") 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_get_cookies_count()); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.blocked_set_cookie_count()); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FixedDateNetworkDelegate swaps out the server's HTTP Date response header 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value for the |fixed_date| argument given to the constructor. 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FixedDateNetworkDelegate : public TestNetworkDelegate { 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FixedDateNetworkDelegate(const std::string& fixed_date) 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : fixed_date_(fixed_date) {} 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FixedDateNetworkDelegate() {} 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::NetworkDelegate implementation 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnHeadersReceived( 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE; 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string fixed_date_; 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FixedDateNetworkDelegate::OnHeadersReceived( 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback, 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers) { 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseHeaders* new_response_headers = 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::HttpResponseHeaders(original_response_headers->raw_headers()); 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_response_headers->RemoveHeader("Date"); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_response_headers->AddHeader("Date: " + fixed_date_); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *override_response_headers = new_response_headers; 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TestNetworkDelegate::OnHeadersReceived(request, 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback, 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_response_headers, 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_response_headers); 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cookie expiration times are adjusted for server/client clock 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// headers by defaulting to GMT. (crbug.com/135131) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) { 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up an expired cookie. 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL( 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"), 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 226290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is not set. 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 227290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos); 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier. 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC"); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server.GetURL( 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"), 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 228690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cookie is set. 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNetworkDelegate network_delegate; 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&network_delegate); 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Cookie"), &d, &default_context_); 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 229690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that it is impossible to change the referrer in the extra headers of 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an URLRequest. 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotOverrideReferrer) { 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server; 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If extra headers contain referer and the request contains a referer, 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only the latter shall be respected. 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Referer"), &d, &default_context_); 2315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("http://foo.com/"); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/"); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 232290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://foo.com/", d.data_received()); 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If extra headers contain a referer but the request does not, no referer 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shall be sent in the header. 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("echoheader?Referer"), &d, &default_context_); 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/"); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_load_flags(LOAD_VALIDATE_CACHE); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 234090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("None", d.data_received()); 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTestHTTP : public URLRequestTest { 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestTestHTTP() 23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : test_server_(base::FilePath(FILE_PATH_LITERAL( 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "net/data/url_request_unittest"))) { 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests |redirect_url|, which must return a HTTP 3xx redirect. 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |request_method| is the method to use for the initial request. 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |redirect_method| is the method that is expected to be used for the second 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request, after redirection. 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |include_data| is true, data is uploaded with the request. The 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response body is expected to match it exactly, if and only if 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |request_method| == |redirect_method|. 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HTTPRedirectMethodTest(const GURL& redirect_url, 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& request_method, 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& redirect_method, 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool include_data) { 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kData[] = "hello world"; 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(redirect_url, &d, &default_context_); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method(request_method); 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (include_data) { 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kContentLength, 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UintToString(arraysize(kData) - 1)); 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 237790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(redirect_method, req.method()); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, req.status().error()); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (include_data) { 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (request_method == redirect_method) { 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData, d.data_received()); 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(kData, d.data_received()); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasFailure()) 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Request method was: " << request_method; 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HTTPUploadDataOperationTest(const std::string& method) { 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kMsgSize = 20000; // multiple of 10 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kIterations = 50; 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* uploadBytes = new char[kMsgSize+1]; 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* ptr = uploadBytes; 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char marker = 'a'; 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int idx = 0; idx < kMsgSize/10; idx++) { 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(ptr, "----------", 10); 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr += 10; 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (idx % 100 == 0) { 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr--; 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ptr++ = marker; 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (++marker > 'z') 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) marker = 'a'; 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uploadBytes[kMsgSize] = '\0'; 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kIterations; ++i) { 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method(method.c_str()); 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_upload(make_scoped_ptr(CreateSimpleUploadData(uploadBytes))); 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, d.response_started_count()) 24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "request failed: " << r.status().status() 24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", os error: " << r.status().error(); 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(uploadBytes, d.data_received()); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete[] uploadBytes; 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddChunksToUpload(URLRequest* r) { 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("a", 1, false); 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("bcd", 3, false); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("this is a longer chunk than before.", 35, false); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("\r\n\r\n", 4, false); 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("0", 1, false); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r->AppendChunkToUpload("2323", 4, true); 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) { 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should match the chunks sent by AddChunksToUpload(). 24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string expected_data = 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "abcdthis is a longer chunk than before.\r\n\r\n02323"; 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, d->response_started_count()) 24472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "request failed: " << r->status().status() 24482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", os error: " << r->status().error(); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received())); 24532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_data, d->data_received()); 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DoManyCookiesRequest(int num_cookies) { 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("set-many-cookies?" + 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString(num_cookies)), 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 246690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_success = r.status().is_success(); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_success) { 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests handled by ChromeFrame send a less precise error message, 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ERR_CONNECTION_ABORTED. 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.status().error() == ERR_RESPONSE_HEADERS_TOO_BIG || 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.status().error() == ERR_CONNECTION_ABORTED); 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The test server appears to be unable to handle subsequent requests 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after this error is triggered. Force it to restart. 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_server_.Stop()); 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(test_server_.Start()); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_success; 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalHttpTestServer test_server_; 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this unit test, we're using the HTTPTestServer as a proxy server and 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// issuing a CONNECT request with the magic host name "www.redirect.com". 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HTTPTestServer will return a 302 response, which we should not 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follow. 24912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) { 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("https://www.redirect.com/"), &d, &context); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 250590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not have followed the redirect. 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the same as the previous test, but checks that the network delegate 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// registers the error. 25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) { 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("https://www.redirect.com/"), &d, &context); 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 253190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not have followed the redirect. 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.received_redirect_count()); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.error_count()); 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, network_delegate.last_error()); 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can block and asynchronously return OK in various stages. 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) { 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const BlockingNetworkDelegate::Stage blocking_stages[] = { 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_HEADERS_RECEIVED 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t blocking_stages_length = arraysize(blocking_stages); 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on( 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST | 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS | 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("empty.html"), &d, &context); 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < blocking_stages_length; ++i) { 257290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(blocking_stages[i], 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.DoCallback(OK); 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 257790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and cancel a request. 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) { 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_retval(ERR_EMPTY_RESPONSE); 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &context); 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 260490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_EMPTY_RESPONSE, r.status().error()); 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function for NetworkDelegateCancelRequestAsynchronously and 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate operating in |block_mode| and a request for |url|. It blocks the 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT. 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode, 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::Stage stage, 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate(block_mode); 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT); 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(stage); 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 263490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, r.status().error()); 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following 3 tests check that the network delegate can cancel a request 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// synchronously in various stages of the request. 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) { 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) { 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) { 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS, 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 2664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following 3 tests check that the network delegate can cancel a request 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// asynchronously in various stages of the request. 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) { 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 2673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) { 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 2680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) { 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK, 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 2687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL(std::string())); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and redirect a request to a new 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL. 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) { 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL redirect_url(test_server_.GetURL("simple.html")); 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_redirect_url(redirect_url); 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url(test_server_.GetURL("empty.html")); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(original_url, &d, &context); 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 271190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(redirect_url, r.url()); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, r.original_url()); 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, r.url_chain().size()); 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and redirect a request to a new 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL by setting a redirect_url and returning in OnBeforeURLRequest directly. 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) { 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::SYNCHRONOUS); 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL redirect_url(test_server_.GetURL("simple.html")); 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_redirect_url(redirect_url); 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url(test_server_.GetURL("empty.html")); 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(original_url, &d, &context); 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 274490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(redirect_url, r.url()); 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, r.original_url()); 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, r.url_chain().size()); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that redirects caused by the network delegate preserve POST data. 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) { 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello world"; 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL redirect_url(test_server_.GetURL("echo")); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_redirect_url(redirect_url); 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url(test_server_.GetURL("empty.html")); 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(original_url, &d, &context); 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kContentLength, 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UintToString(arraysize(kData) - 1)); 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.SetExtraRequestHeaders(headers); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 278490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(redirect_url, r.url()); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, r.original_url()); 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, r.url_chain().size()); 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("POST", r.method()); 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData, d.data_received()); 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by taking no action. This indicates that the NetworkDelegate does not want to 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handle the challenge, and is passing the buck along to the 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate. 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) { 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::SYNCHRONOUS); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 282090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.auth_required_called()); 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by setting credentials. 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) { 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::SYNCHRONOUS); 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_retval( 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret)); 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 285490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.auth_required_called()); 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by cancelling authentication. 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) { 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::SYNCHRONOUS); 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_retval( 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH); 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 288690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, r.status().error()); 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(401, r.GetResponseCode()); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.auth_required_called()); 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by taking no action. This indicates that the NetworkDelegate does not want 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to handle the challenge, and is passing the buck along to the 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate. 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) { 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 292090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.auth_required_called()); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by setting credentials. 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) { 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_retval( 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH); 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthCredentials auth_credentials(kUser, kSecret); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_credentials(auth_credentials); 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 295590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, r.status().error()); 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(200, r.GetResponseCode()); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.auth_required_called()); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by cancelling authentication. 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) { 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::AUTO_CALLBACK); 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_auth_retval( 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH); 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(test_server_.GetURL("auth-basic")); 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &context); 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 298890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, r.status().error()); 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(401, r.GetResponseCode()); 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.auth_required_called()); 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate. 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback. 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) { 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST); 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &context); 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 301990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST, 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.completed_requests()); 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel before callback. 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that network delegate is notified. 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_ABORTED, r.status().error()); 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate. 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 2: Request is cancelled while waiting for OnBeforeSendHeaders callback. 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) { 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on( 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS); 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &context); 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 305590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS, 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.completed_requests()); 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel before callback. 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that network delegate is notified. 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_ABORTED, r.status().error()); 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate. 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 3: Request is cancelled while waiting for OnHeadersReceived callback. 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) { 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED); 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &context); 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 309090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED, 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.completed_requests()); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel before callback. 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that network delegate is notified. 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_ABORTED, r.status().error()); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate. 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 4: Request is cancelled while waiting for OnAuthRequired callback. 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) { 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate network_delegate( 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockingNetworkDelegate::USER_CALLBACK); 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED); 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &context); 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 312590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED, 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) network_delegate.stage_blocked_for_callback()); 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.completed_requests()); 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel before callback. 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that network delegate is notified. 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.completed_requests()); 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_ABORTED, r.status().error()); 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.created_requests()); 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, network_delegate.destroyed_requests()); 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, network_delegate.destroyed_requests()); 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this unit test, we're using the HTTPTestServer as a proxy server and 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// issuing a CONNECT request with the magic host name "www.server-auth.com". 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HTTPTestServer will return a 401 response, which we should balk at. 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) { 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContextWithProxy context( 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.host_port_pair().ToString(), 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &network_delegate); 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("https://www.server-auth.com/"), &d, &context); 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error()); 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTest_NoCache) { 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 317690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(eroman): Add back the NetLog tests... 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test has the server send a large number of cookies to the client. 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To ensure that no number of cookies causes a crash, a galloping binary 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// search is used to estimate that maximum number of cookies that are accepted 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the browser. Beyond the maximum number, the request will fail with 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ERR_RESPONSE_HEADERS_TOO_BIG. 31952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 31962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/177916 31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies 31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 31992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies 32002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_WIN) 32012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) { 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int lower_bound = 0; 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int upper_bound = 1; 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Double the number of cookies until the response header limits are 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exceeded. 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (DoManyCookiesRequest(upper_bound)) { 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lower_bound = upper_bound; 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upper_bound *= 2; 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LT(upper_bound, 1000000); 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tolerance = upper_bound * 0.005; 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tolerance < 2) 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tolerance = 2; 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Perform a binary search to find the highest possible number of cookies, 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // within the desired tolerance. 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (upper_bound - lower_bound >= tolerance) { 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_cookies = (lower_bound + upper_bound) / 2; 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DoManyCookiesRequest(num_cookies)) 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lower_bound = num_cookies; 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upper_bound = num_cookies; 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Success: the test did not crash. 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTest) { 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 324290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTestLoadTiming) { 32552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 32562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 32582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 32602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 32622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(r.is_pending()); 32632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 326490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 32652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 32672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetLoadTimingInfo(&load_timing_info); 32682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 32692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 32712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 32722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 32732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 32742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetSocketAddress().host()); 32752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 32762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetSocketAddress().port()); 32772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 32782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 32792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetZippedTest) { 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameter that specifies the Content-Length field in the response: 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // C - Compressed length. 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // U - Uncompressed length. 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // L - Large length (larger than both C & U). 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // M - Medium length (between C & U). 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // S - Small length (smaller than both C & U). 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char test_parameters[] = "CULMS"; 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int num_tests = arraysize(test_parameters)- 1; // Skip NULL. 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // C & U should be OK. 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // L & M are larger than the data sent, and show an error. 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // S has too little data, but we seem to accept it. 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool test_expect_success[num_tests] = 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { true, true, false, false, true }; 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_tests ; i++) { 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_file = 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPrintf("compressedfiles/BullRunSpeech.txt?%c", 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_parameters[i]); 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL(test_file), &d, &context); 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 331390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << " Received " << d.bytes_received() << " bytes" 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " status = " << r.status().status() 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " error = " << r.status().error(); 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_expect_success[i]) { 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()) 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " Parameter = \"" << test_file << "\""; 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, r.status().error()) 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " Parameter = \"" << test_file << "\""; 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, HTTPSToHTTPRedirectNoRefererTest) { 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer https_test_server( 3336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, SpawnedTestServer::kLocalhost, 33372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_test_server.Start()); 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An https server is sent a request with an https referer, 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and responds with a redirect to an http url. The http 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // server should not be sent the referer. 3343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL http_destination = test_server_.GetURL(std::string()); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(https_test_server.GetURL( 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "server-redirect?" + http_destination.spec()), &d, &default_context_); 3347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("https://www.referrer.com/"); 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 334990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(http_destination, req.url()); 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(), req.referrer()); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectLoadTiming) { 33582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 33592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL destination_url = test_server_.GetURL(std::string()); 3361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL original_url = 3362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL("server-redirect?" + destination_url.spec()); 33632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 33642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(original_url, &d, &default_context_); 33652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 336690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 33672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 33692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 33702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(destination_url, req.url()); 33712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(original_url, req.original_url()); 33722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2U, req.url_chain().size()); 33732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(original_url, req.url_chain()[0]); 33742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(destination_url, req.url_chain()[1]); 33752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info_before_redirect; 33772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect( 33782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &load_timing_info_before_redirect)); 33792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info_before_redirect, 33802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONNECT_TIMING_HAS_DNS_TIMES); 33812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 33832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.GetLoadTimingInfo(&load_timing_info); 33842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 33852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that a new socket was used on redirect, since the server does not 33872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // supposed keep-alive sockets, and that the times before the redirect are 33882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before the ones recorded for the second request. 33892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(load_timing_info_before_redirect.socket_log_id, 33902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.socket_log_id); 33912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info_before_redirect.receive_headers_end, 33922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.connect_timing.connect_start); 33932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, MultipleRedirectTest) { 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL destination_url = test_server_.GetURL(std::string()); 3399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL middle_redirect_url = 3400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL("server-redirect?" + destination_url.spec()); 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url = test_server_.GetURL( 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "server-redirect?" + middle_redirect_url.spec()); 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(original_url, &d, &default_context_); 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 340690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, d.received_redirect_count()); 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(destination_url, req.url()); 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, req.original_url()); 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, req.url_chain().size()); 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_url, req.url_chain()[0]); 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(middle_redirect_url, req.url_chain()[1]); 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(destination_url, req.url_chain()[2]); 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtraHeader[] = "Allow-Snafu"; 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtraValue[] = "fubar"; 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RedirectWithAdditionalHeadersDelegate : public TestDelegate { 34242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnReceivedRedirect(net::URLRequest* request, 34252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& new_url, 34262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* defer_redirect) OVERRIDE { 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false); 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) { 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL destination_url = test_server_.GetURL( 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "echoheader?" + std::string(kExtraHeader)); 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL original_url = test_server_.GetURL( 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "server-redirect?" + destination_url.spec()); 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RedirectWithAdditionalHeadersDelegate d; 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(original_url, &d, &default_context_); 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 344490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpRequestHeaders& headers = req.extra_request_headers(); 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value)); 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kExtraValue, value); 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.is_pending()); 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.is_redirecting()); 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kExtraValue, d.data_received()); 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 34562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExtraHeaderToRemove[] = "To-Be-Removed"; 34582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RedirectWithHeaderRemovalDelegate : public TestDelegate { 34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnReceivedRedirect(net::URLRequest* request, 34612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& new_url, 34622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* defer_redirect) OVERRIDE { 34632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect); 34642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request->RemoveRequestHeaderByName(kExtraHeaderToRemove); 34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 34662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 34672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 34692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) { 34712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 34722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL destination_url = test_server_.GetURL( 34742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "echoheader?" + std::string(kExtraHeaderToRemove)); 34752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL original_url = test_server_.GetURL( 34762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "server-redirect?" + destination_url.spec()); 34772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RedirectWithHeaderRemovalDelegate d; 34782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(original_url, &d, &default_context_); 34792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false); 34802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 348190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 34822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string value; 34842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const HttpRequestHeaders& headers = req.extra_request_headers(); 34852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value)); 34862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(req.is_pending()); 34872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(req.is_redirecting()); 34882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("None", d.data_received()); 34892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest) { 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(GURL("http://www.google.com/"), &d, &default_context_); 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 350190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We expect to receive OnResponseStarted even though the request has been 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cancelled. 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest2) { 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_cancel_in_response_started(true); 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest3) { 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_cancel_in_received_data(true); 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 354490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no guarantee about how much data was received 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the cancel was issued. It could have been 0 bytes, 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or it could have been all the bytes. 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EXPECT_EQ(0, d.bytes_received()); 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest4) { 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_); 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The request will be implicitly canceled when it is destroyed. The 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test delegate must not post a quit message when this happens because 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this test doesn't actually have a message loop. The quit message would 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get put on this thread's message queue and the next test would exit 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // early, causing problems. 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_quit_on_complete(false); 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expect things to just cleanup properly. 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we won't actually get a received reponse here because we've never run the 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest5) { 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // populate cache 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_); 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 358990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status()); 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cancel read from cache (see bug 990242) 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_); 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Cancel(); 359990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status()); 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostTest) { 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPUploadDataOperationTest("POST"); 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PutTest) { 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPUploadDataOperationTest("PUT"); 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostEmptyTest) { 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, d.response_started_count()) 36322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "request failed: " << r.status().status() 36332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", error: " << r.status().error(); 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().empty()); 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostFileTest) { 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dir; 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_EXE, &dir); 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::SetCurrentDirectory(dir); 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<UploadElementReader> element_readers; 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("net")); 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("data")); 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 36607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) element_readers.push_back( 36617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) new UploadFileElementReader(base::MessageLoopProxy::current().get(), 36627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) path, 36637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 36647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kuint64max, 36657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time())); 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This file should just be ignored in the upload stream. 36682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element_readers.push_back(new UploadFileElementReader( 36697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::MessageLoopProxy::current().get(), 36702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL( 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "c:\\path\\to\\non\\existant\\file.randomness.12345")), 36727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 36737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) kuint64max, 36747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Time())); 36752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_upload(make_scoped_ptr(new UploadDataStream(&element_readers, 0))); 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 368090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int64 size = 0; 36832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(true, file_util::GetFileSize(path, &size)); 3684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> buf(new char[size]); 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(size, file_util::ReadFile(path, buf.get(), size)); 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1, d.response_started_count()) 36892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "request failed: " << r.status().status() 36902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", error: " << r.status().error(); 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(size, d.bytes_received()); 36952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(std::string(&buf[0], size), d.data_received()); 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) { 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.EnableChunkedUpload(); 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChunksToUpload(&r); 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 371190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyReceivedDataMatchesChunks(&r, &d); 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) { 37182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 37212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 37222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 37232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.EnableChunkedUpload(); 37242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_method("POST"); 37252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 37262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(r.is_pending()); 37272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChunksToUpload(&r); 372890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 37292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VerifyReceivedDataMatchesChunks(&r, &d); 37312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 37322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 37332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) { 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("echo"), &d, &default_context_); 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.EnableChunkedUpload(); 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_method("POST"); 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 374590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChunksToUpload(&r); 374790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyReceivedDataMatchesChunks(&r, &d); 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ResponseHeadersTest) { 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/with-headers.html"), &d, &default_context_); 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 376090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HttpResponseHeaders* headers = req.response_headers(); 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simple sanity check that response_info() accesses the same data. 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(headers, req.response_info().headers.get()); 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string header; 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header)); 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("private", header); 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header.clear(); 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header)); 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("text/html; charset=ISO-8859-1", header); 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The response has two "X-Multiple-Entries" headers. 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This verfies our output has them concatenated together. 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header.clear(); 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header)); 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a, b", header); 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTS) { 3783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 3784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer https_test_server( 3785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options, 37872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_test_server.Start()); 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest request( 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_test_server.GetURL("files/hsts-headers.html"), 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.Start(); 379690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState* security_state = 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.transport_security_state(); 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool sni_available = true; 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState::DomainState domain_state; 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(security_state->GetDomainState( 3803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.upgrade_mode); 38067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(domain_state.sts_include_subdomains); 38077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.pkp_include_subdomains); 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTSOnce) { 3811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 3812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer https_test_server( 3813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options, 38152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(https_test_server.Start()); 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest request( 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) https_test_server.GetURL("files/hsts-multiple-headers.html"), 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request.Start(); 382490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have set parameters from the first header, not the second. 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState* security_state = 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.transport_security_state(); 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool sni_available = true; 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState::DomainState domain_state; 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(security_state->GetDomainState( 3832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.upgrade_mode); 38357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.sts_include_subdomains); 38367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.pkp_include_subdomains); 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) { 3840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 3841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer https_test_server( 3842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 3843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 3844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 3845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(https_test_server.Start()); 3846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestDelegate d; 3848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest request( 3849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) https_test_server.GetURL("files/hsts-and-hpkp-headers.html"), 3850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &d, 3851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &default_context_); 3852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request.Start(); 385390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 3854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We should have set parameters from the first header, not the second. 3856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TransportSecurityState* security_state = 3857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default_context_.transport_security_state(); 3858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool sni_available = true; 3859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TransportSecurityState::DomainState domain_state; 3860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(security_state->GetDomainState( 3861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::kLocalhost, sni_available, &domain_state)); 3862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS, 3863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) domain_state.upgrade_mode); 3864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID) 3865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Android's CertVerifyProc does not (yet) handle pins. 3866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 3867c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(domain_state.HasPublicKeyPins()); 3868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 3869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE(domain_state.upgrade_expiry, 3870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) domain_state.dynamic_spki_hashes_expiry); 3871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Even though there is an HSTS header asserting includeSubdomains, it is 38737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the *second* such header, and we MUST process only the first. 38747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.sts_include_subdomains); 38757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // includeSubdomains does not occur in the test HPKP header. 38767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(domain_state.pkp_include_subdomains); 3877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) { 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL( 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/content-type-normalization.html"), &d, &default_context_); 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 388690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type; 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.GetMimeType(&mime_type); 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("text/html", mime_type); 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string charset; 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.GetCharset(&charset); 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("utf-8", charset); 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Cancel(); 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3898b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictRedirects) { 3899b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget(). 3900b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL file_url("file:///foo.txt"); 3901b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) GURL data_url("data:,foo"); 3902b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FileProtocolHandler file_protocol_handler; 3903b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url)); 3904b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DataProtocolHandler data_protocol_handler; 3905b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(data_protocol_handler.IsSafeRedirectTarget(data_url)); 3906b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3907b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget(). 3908b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(job_factory_.IsSafeRedirectTarget(file_url)); 3909b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(job_factory_.IsSafeRedirectTarget(data_url)); 3910b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 3911b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RestrictRedirects) { 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL( 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/redirect-to-file.html"), &d, &default_context_); 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 391990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().error()); 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) { 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL( 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "files/redirect-to-invalid-url.html"), &d, &default_context_); 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 393290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, req.status().status()); 39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_INVALID_URL, req.status().error()); 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) { 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 3944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("http://user:pass@foo.com/"); 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 394690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("http://foo.com/"), d.data_received()); 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) { 3952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 3953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestDelegate d; 3955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest req( 3956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 3957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("http://foo.com/test#fragment"); 3958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.Start(); 395990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 3960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("http://foo.com/test"), d.data_received()); 3962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) { 3965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 3966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestDelegate d; 3968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest req( 3969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_server_.GetURL("echoheader?Referer"), &d, &default_context_); 3970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer("http://foo.com/test#fragment"); 3971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.SetReferrer(""); 3972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) req.Start(); 397390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 3974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string("None"), d.data_received()); 3976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelRedirect) { 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_cancel_in_received_redirect(true); 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/redirect-test.html"), &d, &default_context_); 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 398790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DeferredRedirect) { 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_quit_on_redirect(true); 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/redirect-test.html"), &d, &default_context_); 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 400590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.FollowDeferredRedirect(); 401090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status()); 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("net")); 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("data")); 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("url_request_unittest")); 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = path.Append(FILE_PATH_LITERAL("with-headers.html")); 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(file_util::ReadFileToString(path, &contents)); 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(contents, d.data_received()); 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) { 40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_quit_on_redirect(true); 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/redirect-test.html"), &d, &default_context_); 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 403890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.received_redirect_count()); 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Cancel(); 404390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status()); 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, VaryHeader) { 40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Populate the cache. 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader("foo", "1"); 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 406490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 406590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 406690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadTimingInfo load_timing_info; 406790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) req.GetLoadTimingInfo(&load_timing_info); 406890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 407190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Expect a cache hit. 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader("foo", "1"); 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 408090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(req.was_cached()); 408390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 408490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadTimingInfo load_timing_info; 408590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) req.GetLoadTimingInfo(&load_timing_info); 408690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingCacheHitNoNetwork(load_timing_info); 40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 408990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Expect a cache miss. 40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheadercache?foo"), &d, &default_context_); 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader("foo", "2"); 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 409890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(req.was_cached()); 410190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 410290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadTimingInfo load_timing_info; 410390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) req.GetLoadTimingInfo(&load_timing_info); 410490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuth) { 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // populate the cache 41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 411990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // repeat request with end-to-end validation. since auth-basic results in a 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cachable page, we expect this test to result in a 304. in which case, the 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // response should be fetched from the cache. 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.set_load_flags(LOAD_VALIDATE_CACHE); 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 413590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be the same cached document. 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.was_cached()); 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that Set-Cookie headers in 401 responses are respected. 41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/6450 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) { 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_requiring_auth = 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("auth-basic?set-cookie-if-challenged"); 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request a page that will give a 401 containing a Set-Cookie header. 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that when the transaction is restarted, it includes the new cookie. 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 41552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url_requiring_auth, &d, &context); 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 416690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we sent the cookie in the restarted transaction. 41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true") 41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same test as above, except this time the restart is initiated earlier 41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (without user intervention since identity is embedded in the URL). 41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 41782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL::Replacements replacements; 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string username("user2"); 41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string password("secret"); 41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetUsernameStr(username); 41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) replacements.SetPasswordStr(password); 41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements); 41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url_with_identity, &d, &context); 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 419590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos); 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we sent the cookie in the restarted transaction. 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true") 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) != std::string::npos); 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that load timing works as expected with auth and the cache. 42062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) { 42072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 42082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // populate the cache 42102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 42112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 42122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 42132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 42152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 42162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 421790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 42182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 42202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info_before_auth; 42222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth( 42232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &load_timing_info_before_auth)); 42242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info_before_auth, 42252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONNECT_TIMING_HAS_DNS_TIMES); 42262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 42282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetLoadTimingInfo(&load_timing_info); 42292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The test server does not support keep alive sockets, so the second 42302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // request with auth should use a new socket. 42312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 42322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(load_timing_info_before_auth.socket_log_id, 42332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.socket_log_id); 42342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LE(load_timing_info_before_auth.receive_headers_end, 42352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_timing_info.connect_timing.connect_start); 42362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 42372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 423890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Repeat request with end-to-end validation. Since auth-basic results in a 423990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // cachable page, we expect this test to result in a 304. In which case, the 42402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // response should be fetched from the cache. 42412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 42422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 42432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d.set_credentials(AuthCredentials(kUser, kSecret)); 42442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_); 42462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.set_load_flags(LOAD_VALIDATE_CACHE); 42472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.Start(); 42482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 424990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 42502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos); 42522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should be the same cached document. 42542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(r.was_cached()); 42552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Since there was a request that went over the wire, the load timing 425790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // information should include connection times. 42582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 42592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetLoadTimingInfo(&load_timing_info); 426090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); 42612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 42622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 42632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this test, we do a POST which the server will 302 redirect. 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The subsequent transaction should use GET, and should not send the 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Content-Type header. 42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/chromium/issues/detail?id=843 42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Post302RedirectGet) { 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello world"; 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("files/redirect-to-echoall"), &d, &default_context_); 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("POST"); 42772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set headers (some of which are specific to the POST). 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.AddHeadersFromString( 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-Type: multipart/form-data; " 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n" 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9," 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "text/plain;q=0.8,image/png,*/*;q=0.5\r\n" 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept-Language: en-US,en\r\n" 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Accept-Charset: ISO-8859-1,*,utf-8\r\n" 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-Length: 11\r\n" 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Origin: http://localhost:1337/"); 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 429290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type; 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.GetMimeType(&mime_type); 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("text/html", mime_type); 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data = d.data_received(); 42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the post-specific headers were stripped: 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsString(data, "Content-Length:")); 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsString(data, "Content-Type:")); 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsString(data, "Origin:")); 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These extra request headers should not have been stripped. 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(data, "Accept:")); 43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(data, "Accept-Language:")); 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(data, "Accept-Charset:")); 43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following tests check that we handle mutating the request method for 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTP redirects as expected. 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/56373 and http://crbug.com/102130. 43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect301Tests) { 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url = test_server_.GetURL("files/redirect301-to-echo"); 43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "POST", "GET", true); 43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "PUT", "PUT", true); 43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect302Tests) { 43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url = test_server_.GetURL("files/redirect302-to-echo"); 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "POST", "GET", true); 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "PUT", "PUT", true); 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect303Tests) { 43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url = test_server_.GetURL("files/redirect303-to-echo"); 43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "POST", "GET", true); 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "PUT", "GET", true); 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect307Tests) { 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url = test_server_.GetURL("files/redirect307-to-echo"); 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "POST", "POST", true); 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "PUT", "PUT", true); 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPRedirectMethodTest(url, "HEAD", "HEAD", false); 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) { 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello world"; 43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("POST"); 43632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kContentLength, 43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UintToString(arraysize(kData) - 1)); 43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestRedirectJob* job = new URLRequestRedirectJob( 43702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &req, &default_network_delegate_, test_server_.GetURL("echo"), 43712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestRedirectJob::REDIRECT_302_FOUND); 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job); 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 437590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("GET", req.method()); 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) { 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kData[] = "hello world"; 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.set_method("POST"); 43872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kContentLength, 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::UintToString(arraysize(kData) - 1)); 43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestRedirectJob* job = new URLRequestRedirectJob( 43942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &req, &default_network_delegate_, test_server_.GetURL("echo"), 43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT); 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job); 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 439990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("POST", req.method()); 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData, d.data_received()); 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default A-L header is sent. 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) { 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StaticHttpUserAgentSettings settings("en", EmptyString()); 44092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequests. 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_http_user_agent_settings(&settings); 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheader?Accept-Language"), &d, &context); 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 441990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en", d.data_received()); 44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that an empty A-L header is not sent. http://crbug.com/77365. 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) { 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StaticHttpUserAgentSettings settings(EmptyString(), EmptyString()); 44282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequests. 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We override the language after initialization because empty entries 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get overridden by Init(). 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_http_user_agent_settings(&settings); 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req( 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURL("echoheader?Accept-Language"), &d, &context); 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 444090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("None", d.data_received()); 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the A-L header, the default is not appended. 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/20894 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) { 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?Accept-Language"), 44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru"); 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 445790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("ru"), d.data_received()); 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default A-E header is sent. 44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) { 44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"), 44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 447290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(d.data_received(), "gzip")); 44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the A-E header, the default is not appended. 44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/47381 44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) { 44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"), 44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity"); 44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 448990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsString(d.data_received(), "gzip")); 44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsString(d.data_received(), "identity")); 44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that setting the A-C header sends the proper header. 44952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, SetAcceptCharset) { 44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?Accept-Charset"), 45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r"); 45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 450690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("koi-8r"), d.data_received()); 45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default User-Agent header is sent. 45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultUserAgent) { 45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?User-Agent"), 45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 451990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(req.context()->GetUserAgent(req.url()), d.data_received()); 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the User-Agent header, 45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the default is not appended. 45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideUserAgent) { 45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL("echoheader?User-Agent"), 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpRequestHeaders headers; 45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)"); 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.SetExtraRequestHeaders(headers); 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 453690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the net tests are being run with ChromeFrame then we need to allow for 45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the 'chromeframe' suffix which is added to the user agent before the 45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closing parentheses. 45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(d.data_received(), "Lynx (textmode", true)); 45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that a NULL HttpUserAgentSettings causes the corresponding empty 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// User-Agent header to be sent but does not send the Accept-Language and 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Accept-Charset headers. 45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) { 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequests. 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We override the HttpUserAgentSettings after initialization because empty 45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entries get overridden by Init(). 45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_http_user_agent_settings(NULL); 45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* request; 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_response; 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { { "echoheader?Accept-Language", "None" }, 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "echoheader?Accept-Charset", "None" }, 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "echoheader?User-Agent", "" } }; 45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); i++) { 45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest req(test_server_.GetURL(tests[i].request), &d, &context); 45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.Start(); 456890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_response, d.data_received()) 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " Request = \"" << tests[i].request << "\""; 45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest passes on its priority updates to 45752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// newly-created jobs after the first one. 45762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) { 45772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 45782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 45802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_); 45812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(DEFAULT_PRIORITY, req.priority()); 45822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestRedirectJob> redirect_job = 45842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new URLRequestRedirectJob( 45852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &req, &default_network_delegate_, test_server_.GetURL("echo"), 45862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestRedirectJob::REDIRECT_302_FOUND); 4587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(redirect_job.get()); 45882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.SetPriority(LOW); 45902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 45912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(req.is_pending()); 45922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestTestJob> job = 45942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new URLRequestTestJob(&req, &default_network_delegate_); 4595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddTestInterceptor()->set_main_intercept_job(job.get()); 45962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should trigger |job| to be started. 459890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 45992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(LOW, job->priority()); 46002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 46012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSRequestTest : public testing::Test { 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPSRequestTest() : default_context_(true) { 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_network_delegate(&default_network_delegate_); 46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.Init(); 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HTTPSRequestTest() {} 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 46112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest. 46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext default_context_; 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSGetTest) { 4616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::kLocalhost, 4619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSSLInfo(r.ssl_info()); 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server.host_port_pair().host(), 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server.host_port_pair().port(), 46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) { 4642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 4644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err_allowed = true; 46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) { 46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(err_allowed); 4655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 466090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.have_certificate_errors()); 46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err_allowed) { 46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSSLInfo(r.ssl_info()); 46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSExpiredTest) { 4676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_EXPIRED); 4678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterate from false to true, just so that we do the opposite of the 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous test in order to increase test coverage. 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool err_allowed = false; 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) { 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(err_allowed); 4691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 469690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.have_certificate_errors()); 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (err_allowed) { 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckSSLInfo(r.ssl_info()); 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests TLSv1.1 -> TLSv1 fallback. Verifies that we don't fall back more 47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than necessary. 47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, TLSv1Fallback) { 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16 default_version_max = SSLConfigService::default_version_max(); 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The OpenSSL library in use may not support TLS 1.1. 47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_OPENSSL) 47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(default_version_max, SSL_PROTOCOL_VERSION_TLS1); 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_version_max <= SSL_PROTOCOL_VERSION_TLS1) 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_OK); 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.tls_intolerant = 4725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1; 4726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(true); 4736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &context); 47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 473990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_TLS1), 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConnectionStatusToVersion(r.ssl_info().connection_status)); 47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK); 47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a load of www.google.com with a certificate error sets 47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the |certificate_errors_are_fatal| flag correctly. This flag will cause 47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the interstitial to be fatal. 47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) { 4752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 4754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We require that the URL be www.google.com in order to pick up the 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preloaded HSTS entries in the TransportSecurityState. This means that we 47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have to use a MockHostResolver in order to direct www.google.com to the 47632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // testserver. By default, MockHostResolver maps all hosts to 127.0.0.1. 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver host_resolver; 47662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_host_resolver(&host_resolver); 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState transport_security_state; 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_transport_security_state(&transport_security_state); 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 47752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 47762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server.host_port_pair().port())), 47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &context); 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 478390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.have_certificate_errors()); 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.certificate_errors_are_fatal()); 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that cached HTTPS page loads do not cause any updates to the 47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TransportSecurityState. 47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) { 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't 47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matter. It just has to be any error. 4796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME); 4798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We require that the URL be www.google.com in order to pick up the 48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preloaded and dynamic HSTS and public key pin entries in the 48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TransportSecurityState. This means that we have to use a 48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MockHostResolver in order to direct www.google.com to the testserver. 48082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // By default, MockHostResolver maps all hosts to 127.0.0.1. 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver host_resolver; 48112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_network_delegate(&network_delegate); 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_host_resolver(&host_resolver); 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState transport_security_state; 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState::DomainState domain_state; 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true, 48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &domain_state)); 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.set_transport_security_state(&transport_security_state); 48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 48232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d", 48242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server.host_port_pair().port())), 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &context); 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 483190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.have_certificate_errors()); 48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(d.certificate_errors_are_fatal()); 48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a fresh copy of the state, and check that it hasn't been updated. 48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportSecurityState::DomainState new_domain_state; 48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true, 48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &new_domain_state)); 48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_domain_state.upgrade_mode, domain_state.upgrade_mode); 48437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(new_domain_state.sts_include_subdomains, 48447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) domain_state.sts_include_subdomains); 48457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(new_domain_state.pkp_include_subdomains, 48467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) domain_state.pkp_include_subdomains); 48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FingerprintsEqual(new_domain_state.static_spki_hashes, 48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.static_spki_hashes)); 48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FingerprintsEqual(new_domain_state.dynamic_spki_hashes, 48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.dynamic_spki_hashes)); 48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FingerprintsEqual(new_domain_state.bad_static_spki_hashes, 48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) domain_state.bad_static_spki_hashes)); 48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure HSTS preserves a POST request's method and body. 48562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HTTPSRequestTest, HSTSPreservesPosts) { 48572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const char kData[] = "hello world"; 48582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_OK); 4861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 48652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server.Start()); 48662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Per spec, TransportSecurityState expects a domain name, rather than an IP 48692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // address, so a MockHostResolver is needed to redirect www.somewhere.com to 4870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the SpawnedTestServer. By default, MockHostResolver maps all hosts 4871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to 127.0.0.1. 48722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockHostResolver host_resolver; 48732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force https for www.somewhere.com. 48752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransportSecurityState transport_security_state; 48762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000); 48772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool include_subdomains = false; 48782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transport_security_state.AddHSTS("www.somewhere.com", expiry, 48792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) include_subdomains); 48802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestNetworkDelegate network_delegate; // Must outlive URLRequest. 48822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLRequestContext context(true); 48842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context.set_host_resolver(&host_resolver); 48852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context.set_transport_security_state(&transport_security_state); 48862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context.set_network_delegate(&network_delegate); 48872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context.Init(); 48882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestDelegate d; 48902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will 48912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // cause a certificate error. Ignore the error. 48922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) d.set_allow_certificate_errors(true); 48932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest req(GURL(base::StringPrintf("http://www.somewhere.com:%d/echo", 48952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_server.host_port_pair().port())), 48962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &d, 48972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &context); 48982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_method("POST"); 48992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData))); 49002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 49012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) req.Start(); 490290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 49032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 49042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("https", req.url().scheme()); 49052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("POST", req.method()); 49062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kData, d.data_received()); 49072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 49082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, SSLv3Fallback) { 4910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 4911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_OK); 4912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.tls_intolerant = 4913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL; 4914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context(true); 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context.Init(); 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(true); 4924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &context); 49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_SSL3), 49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConnectionStatusToVersion(r.ssl_info().connection_status)); 49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK); 49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLClientAuthTestDelegate : public TestDelegate { 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) { 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCertificateRequested( 49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest* request, 49442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SSLCertRequestInfo* cert_request_info) OVERRIDE { 49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_certificate_requested_count_++; 494690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int on_certificate_requested_count() { 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return on_certificate_requested_count_; 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int on_certificate_requested_count_; 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(davidben): Test the rest of the code. Specifically, 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Filtering which certificates to select. 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Sending a certificate back. 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Getting a certificate request in an SSL renegotiation sending the 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTP request. 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, ClientAuthTest) { 4963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.request_client_certificate = true; 4965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 4966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 4967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 4968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientAuthTestDelegate d; 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &default_context_); 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 497890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.on_certificate_requested_count()); 49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, d.bytes_received()); 49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send no certificate. 49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(davidben): Get temporary client cert import (with keys) working on 49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all platforms so we can test sending a cert as well. 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.ContinueWithCertificate(NULL); 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 498990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, d.bytes_received()); 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, ResumeTest) { 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that we attempt a session resume when making two connections to the 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same host. 5000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.record_resume = true; 5002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientSocket::ClearSessionCache(); 50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("ssl-session-cache"), &d, &default_context_); 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 501890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())-> 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseAllConnections(); 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("ssl-session-cache"), &d, &default_context_); 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 503490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The response will look like; 50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // insert abc 50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lookup abc 50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // insert xyz 50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With a newline at the end which makes the split think that there are 50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // four lines. 50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> lines; 50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(d.data_received(), '\n', &lines); 50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4u, lines.size()) << d.data_received(); 50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_id; 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < 2; i++) { 50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> parts; 50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(lines[i], '\t', &parts); 50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, parts.size()); 50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == 0) { 50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("insert", parts[0]); 50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id = parts[1]; 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("lookup", parts[0]); 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(session_id, parts[1]); 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) { 50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that sessions aren't resumed when the value of ssl_session_cache_shard 50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // differs. 5069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options; 50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_options.record_resume = true; 5071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLClientSocket::ClearSessionCache(); 50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("ssl-session-cache"), &d, &default_context_); 50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 508790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now create a new HttpCache with a different ssl_session_cache_shard value. 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpNetworkSession::Params params; 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.host_resolver = default_context_.host_resolver(); 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.cert_verifier = default_context_.cert_verifier(); 50967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) params.transport_security_state = default_context_.transport_security_state(); 50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.proxy_service = default_context_.proxy_service(); 50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_config_service = default_context_.ssl_config_service(); 50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.http_auth_handler_factory = 51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.http_auth_handler_factory(); 51012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.network_delegate = &default_network_delegate_; 51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.http_server_properties = default_context_.http_server_properties(); 51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ssl_session_cache_shard = "alternate"; 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::HttpCache> cache(new net::HttpCache( 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::HttpNetworkSession(params), 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpCache::DefaultBackend::InMemory(0))); 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_http_transaction_factory(cache.get()); 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server.GetURL("ssl-session-cache"), &d, &default_context_); 51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 511990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The response will look like; 51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // insert abc 51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // insert xyz 51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With a newline at the end which makes the split think that there are 51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // three lines. 51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> lines; 51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(d.data_received(), '\n', &lines); 51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u, lines.size()); 51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string session_id; 51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < 2; i++) { 51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> parts; 51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(lines[i], '\t', &parts); 51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, parts.size()); 51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("insert", parts[0]); 51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == 0) { 51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id = parts[1]; 51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(session_id, parts[1]); 51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSSLConfigService : public SSLConfigService { 51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSSLConfigService(bool ev_enabled, bool online_rev_checking) 51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ev_enabled_(ev_enabled), 51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) online_rev_checking_(online_rev_checking) { 51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SSLConfigService: 51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetSSLConfig(SSLConfig* config) OVERRIDE { 51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *config = SSLConfig(); 51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->rev_checking_enabled = online_rev_checking_; 51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->verify_ev_cert = ev_enabled_; 51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestSSLConfigService() {} 51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool ev_enabled_; 51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool online_rev_checking_; 51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This the fingerprint of the "Testing CA" certificate used by the testserver. 51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See net/data/ssl/certificates/ocsp-test-root.pem. 51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const SHA1HashValue kOCSPTestCertFingerprint = 51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { { 0xf1, 0xad, 0xf6, 0xce, 0x42, 0xac, 0xe7, 0xb4, 0xf4, 0x24, 51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xdb, 0x1a, 0xf7, 0xa0, 0x9f, 0x09, 0xa1, 0xea, 0xf1, 0x5c } }; 51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the policy OID contained in the certificates that testserver 51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generates. 51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1"; 51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSOCSPTest : public HTTPSRequestTest { 51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTTPSOCSPTest() 51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : context_(true), 51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev_test_policy_( 51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(), 51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOCSPTestCertFingerprint, 51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOCSPTestCertPolicy)) { 51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupContext(&context_); 51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_.Init(); 51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::X509Certificate> root_cert = 51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem"); 51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert); 5197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) test_root_.reset(new ScopedTestRoot(root_cert.get())); 51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_NSS) || defined(OS_IOS) 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetURLRequestContextForNSSHttpIO(&context_); 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureNSSHttpIOInit(); 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options, 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus* out_cert_status) { 52072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We always overwrite out_cert_status. 52082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out_cert_status = 0; 5209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server( 5210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::TYPE_HTTPS, 5211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options, 5212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server.Start()); 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_allow_certificate_errors(true); 5217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRequest r(test_server.GetURL(std::string()), &d, &context_); 52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_cert_status = r.ssl_info().cert_status; 52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~HTTPSOCSPTest() { 52272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_NSS) || defined(OS_IOS) 52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShutdownNSSHttpIO(); 52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetupContext configures the URLRequestContext that will be used for making 52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // connetions to testserver. This can be overridden in test subclasses for 52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different behaviour. 52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetupContext(URLRequestContext* context) { 52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->set_ssl_config_service( 52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TestSSLConfigService(true /* check for EV */, 52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true /* online revocation checking */)); 52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScopedTestRoot> test_root_; 52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext context_; 52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ScopedTestEVPolicy> ev_test_policy_; 52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() { 52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't 52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have that ability on other platforms. 52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION; 52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SystemUsesChromiumEVMetadata returns true iff the current operating system 52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then 52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// several tests are effected because our testing EV certificate won't be 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recognised as EV. 52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SystemUsesChromiumEVMetadata() { 52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_OPENSSL) 52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/117478 - OpenSSL does not support EV validation. 52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 52652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) && !defined(OS_IOS) 52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On OS X, we use the system to tell us whether a certificate is EV or not 52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the system won't recognise our testing root. 52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SystemSupportsOCSP() { 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_OPENSSL) 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/117478 - OpenSSL does not support OCSP. 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::win::GetVersion() >= base::win::VERSION_VISTA; 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID) 52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported. 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Valid) { 52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Revoked) { 53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !(defined(OS_MACOSX) && !defined(OS_IOS)) 53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Doesn't pass on OS X yet for reasons that need to be investigated. 53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS); 53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Invalid) { 53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_status & CERT_STATUS_ALL_ERRORS); 53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Without a positive OCSP response, we shouldn't show the EV status. 53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSEVCRLSetTest : public HTTPSOCSPTest { 53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetupContext(URLRequestContext* context) OVERRIDE { 53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->set_ssl_config_service( 53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TestSSLConfigService(true /* check for EV */, 53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* online revocation checking */)); 53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) { 53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_status & CERT_STATUS_ALL_ERRORS); 53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) { 53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK; 53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>()); 53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) { 54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet( 54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(), 54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cert_status & CERT_STATUS_ALL_ERRORS); 54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED)); 54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, FreshCRLSet) { 5428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet( 54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet>(CRLSet::EmptyCRLSetForTesting())); 54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With a valid, fresh CRLSet the bad OCSP response shouldn't matter because 54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we wont check it. 54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SystemUsesChromiumEVMetadata(), 54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<bool>(cert_status & CERT_STATUS_IS_EV)); 54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) { 54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that when EV verification is requested, but online revocation 54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // checking is disabled, and the leaf certificate is not in fact EV, that 54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no revocation checking actually happens. 54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SystemSupportsOCSP()) { 54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Skipping test because system doesn't support OCSP"; 54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unmark the certificate's OID as EV, which should disable revocation 54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // checking (as per the user preference) 54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ev_test_policy_.reset(); 54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED; 54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet( 54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CertStatus cert_status; 54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSCRLSetTest : public HTTPSOCSPTest { 54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetupContext(URLRequestContext* context) OVERRIDE { 54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context->set_ssl_config_service( 54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TestSSLConfigService(false /* check for EV */, 54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false /* online revocation checking */)); 54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) { 5485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions ssl_options( 5486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer::SSLOptions::CERT_AUTO); 5487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID; 54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLConfigService::SetCRLSet( 54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting())); 54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CertStatus cert_status; 54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoConnection(ssl_options, &cert_status); 54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're not trying EV verification then, even if the CRLSet has expired, 54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we don't fall back to online revocation checks. 54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS); 54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV); 54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED); 54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_IOS) 55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_FTP_SUPPORT) 55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTestFTP : public URLRequestTest { 55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestTestFTP() 5506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : test_server_(SpawnedTestServer::TYPE_FTP, SpawnedTestServer::kLocalhost, 55072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath()) { 55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 5511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpawnedTestServer test_server_; 55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure an FTP request using an unsafe ports fails. 55152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestFTP, UnsafePort) { 55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestJobFactoryImpl job_factory; 5519b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FtpNetworkLayer ftp_transaction_factory(default_context_.host_resolver()); 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("ftp://127.0.0.1:7"); 55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_factory.SetProtocolHandler( 55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ftp", 5524b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) new FtpProtocolHandler(&ftp_transaction_factory)); 55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_context_.set_job_factory(&job_factory); 55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(url, &d, &default_context_); 55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 553390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestStatus::FAILED, r.status().status()); 55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_UNSAFE_PORT, r.status().error()); 55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPDirectoryListing) { 55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("/"), &d, &default_context_); 55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(0, d.bytes_received()); 55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPGetTestAnonymous) { 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("/LICENSE"), &d, &default_context_); 55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 557790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPGetTest) { 55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"), 56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 560990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().host(), 56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().host()); 56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(test_server_.host_port_pair().port(), 56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.GetSocketAddress().port()); 56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 56222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 56232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 56242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) r.GetLoadTimingInfo(&load_timing_info); 562590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TestLoadTimingNoHttpResponse(load_timing_info); 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPassword) { 56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome", 56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_password"), 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 564790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), 0); 56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPasswordRestart) { 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set correct login credentials. The delegate will be asked for them when 56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the initial login with wrong credentials will fail. 56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kChrome, kChrome)); 56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome", 56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_password"), 56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 568090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUser) { 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_user", 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome"), 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 571090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), 0); 57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUserRestart) { 57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate d; 57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set correct login credentials. The delegate will be asked for them when 57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the initial login with wrong credentials will fail. 57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.set_credentials(AuthCredentials(kChrome, kChrome)); 57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_user", 57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome"), 57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &d, 57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 574390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d.response_started_count()); 57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d.received_data_before_response()); 57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size)); 57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCacheURLCredentials) { 57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestDelegate> d(new TestDelegate); 57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass correct login identity in the URL. 57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome", 57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome"), 57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.get(), 57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 577590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d->response_started_count()); 57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.reset(new TestDelegate); 57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This request should use cached identity from previous request. 57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_); 57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 579390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d->response_started_count()); 58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045. 58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCacheLoginBoxCredentials) { 58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &app_path); 58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_path = app_path.AppendASCII("LICENSE"); 58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestDelegate> d(new TestDelegate); 58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set correct login credentials. The delegate will be asked for them when 58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the initial login with wrong credentials will fail. 58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d->set_credentials(AuthCredentials(kChrome, kChrome)); 58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r( 58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_server_.GetURLWithUserAndPassword("/LICENSE", 58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "chrome", 58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "wrong_password"), 58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.get(), 58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &default_context_); 58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d->response_started_count()); 58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a new delegate without explicit credentials. The cached ones should be 58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used. 58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d.reset(new TestDelegate); 58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't pass wrong credentials in the URL, they would override valid cached 58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ones. 58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_); 58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r.Start(); 58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(r.is_pending()); 58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 584890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 file_size = 0; 58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::GetFileSize(app_path, &file_size); 58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(r.is_pending()); 58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, d->response_started_count()); 58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(d->received_data_before_response()); 58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size)); 58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(DISABLE_FTP_SUPPORT) 58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 5862