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