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"
219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/strings/string_util.h"
279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/strings/stringprintf.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/capturing_net_log.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info_test_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_unittest.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_module.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_data_directory.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_bytes_element_reader.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_data_stream.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_file_element_reader.h"
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/ev_root_ca_metadata.h"
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/test_root_certs.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store_test_helpers.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_network_layer.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ocsp/nss_ocsp.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h"
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_connection_status_flags.h"
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/test/cert_test_util.h"
59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/data_protocol_handler.h"
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/file_protocol_handler.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/ftp_protocol_handler.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/static_http_user_agent_settings.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_file_dir_job.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_http_job.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_redirect_job.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_job.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_com_initializer.h"
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/win/scoped_comptr.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kChrome(ASCIIToUTF16("chrome"));
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kSecret(ASCIIToUTF16("secret"));
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kUser(ASCIIToUTF16("user"));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests load timing information in the case a fresh connection was used, with
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// no proxy.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             int connect_timing_flags) {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.socket_reused);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info.request_start,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            load_timing_info.connect_timing.connect_start);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              connect_timing_flags);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info.connect_timing.connect_end,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            load_timing_info.send_start);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but with proxy times.
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestLoadTimingNotReusedWithProxy(
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const net::LoadTimingInfo& load_timing_info,
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int connect_timing_flags) {
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.socket_reused);
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.request_start,
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.proxy_resolve_start);
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.proxy_resolve_start,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.proxy_resolve_end);
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.proxy_resolve_end,
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.connect_timing.connect_start);
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              connect_timing_flags);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.connect_timing.connect_end,
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.send_start);
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but with a reused socket and proxy times.
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestLoadTimingReusedWithProxy(
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const net::LoadTimingInfo& load_timing_info) {
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.socket_reused);
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.request_start,
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.proxy_resolve_start);
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.proxy_resolve_start,
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.proxy_resolve_end);
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.proxy_resolve_end,
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.send_start);
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests load timing information in the case of a cache hit, when no cache
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// validation request was sent over the wire.
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestLoadTimingCacheHitNoNetwork(
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const net::LoadTimingInfo& load_timing_info) {
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.socket_reused);
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_LE(load_timing_info.request_start, load_timing_info.send_start);
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests load timing in the case that there is no HTTP response.  This can be
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// used to test in the case of errors or non-HTTP requests.
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestLoadTimingNoHttpResponse(
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const net::LoadTimingInfo& load_timing_info) {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.socket_reused);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only the request times should be non-null.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.send_start.is_null());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.send_end.is_null());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.receive_headers_end.is_null());
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::StringPiece TestNetResourceProvider(int key) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "header";
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do a case-insensitive search through |haystack| for |needle|.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContainsString(const std::string& haystack, const char* needle) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string::const_iterator it =
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::search(haystack.begin(),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  haystack.end(),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  needle,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  needle + strlen(needle),
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::CaseInsensitiveCompare<char>());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return it != haystack.end();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FillBuffer(char* buffer, size_t len) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool called = false;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!called) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    called = true;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int seed = static_cast<int>(Time::Now().ToInternalValue());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    srand(seed);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < len; i++) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[i] = static_cast<char>(rand());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!buffer[i])
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer[i] = 'g';
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadDataStream* CreateSimpleUploadData(const char* data) {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<UploadElementReader> reader(
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new UploadBytesElementReader(data, strlen(data)));
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return UploadDataStream::CreateWithReader(reader.Pass(), 0);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the SSLInfo of a successful SSL connection has valid values.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckSSLInfo(const SSLInfo& ssl_info) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow ChromeFrame fake SSLInfo to get through.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ssl_info.cert.get() &&
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_info.cert.get()->issuer().GetDisplayName() == "Chrome Internal") {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -1 means unknown.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ssl_info.security_bits, -1);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -1 means unknown.  0 means no encryption.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(ssl_info.security_bits, 0);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cipher_suite = SSLConnectionStatusToCipherSuite(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_info.connection_status);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, cipher_suite);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid CheckFullRequestHeaders(const HttpRequestHeaders& headers,
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             const GURL& host_url) {
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string sent_value;
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(headers.GetHeader("Host", &sent_value));
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(GetHostAndOptionalPort(host_url), sent_value);
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(headers.GetHeader("Connection", &sent_value));
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("keep-alive", sent_value);
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FingerprintsEqual(const HashValueVector& a, const HashValueVector& b) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size = a.size();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size != b.size())
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < size; ++i) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!a[i].Equals(b[i]))
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A network delegate that allows the user to choose a subset of request stages
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to block in. When blocking, the delegate can do one of the following:
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  * synchronously return a pre-specified error code, or
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  * asynchronously return that value via an automatically called callback,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    or
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  * block and wait for the user to do a callback.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additionally, the user may also specify a redirect URL -- then each request
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with the current URL different from the redirect target will be redirected
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to that target, in the on-before-URL-request stage, independent of whether
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the delegate blocks in ON_BEFORE_URL_REQUEST or not.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockingNetworkDelegate : public TestNetworkDelegate {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stages in which the delegate can block.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Stage {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOT_BLOCKED = 0,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_BEFORE_URL_REQUEST = 1 << 0,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_BEFORE_SEND_HEADERS = 1 << 1,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_HEADERS_RECEIVED = 1 << 2,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_AUTH_REQUIRED = 1 << 3
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Behavior during blocked stages.  During other stages, just
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns net::OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum BlockMode {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SYNCHRONOUS,    // No callback, returns specified return values.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AUTO_CALLBACK,  // |this| posts a task to run the callback using the
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // specified return codes.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    USER_CALLBACK,  // User takes care of doing a callback.  |retval_| and
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // |auth_retval_| are ignored. In every blocking stage the
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // message loop is quit.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a delegate which does not block at all.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit BlockingNetworkDelegate(BlockMode block_mode);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For users to trigger a callback returning |response|.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Side-effects: resets |stage_blocked_for_callback_| and stored callbacks.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only call if |block_mode_| == USER_CALLBACK.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoCallback(int response);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoAuthCallback(NetworkDelegate::AuthRequiredResponse response);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setters.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_retval(int retval) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(USER_CALLBACK, block_mode_);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(ERR_IO_PENDING, retval);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(OK, retval);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    retval_ = retval;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |auth_retval| == AUTH_REQUIRED_RESPONSE_SET_AUTH, then
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |auth_credentials_| will be passed with the response.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_auth_retval(AuthRequiredResponse auth_retval) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(USER_CALLBACK, block_mode_);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auth_retval_ = auth_retval;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_auth_credentials(const AuthCredentials& auth_credentials) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auth_credentials_ = auth_credentials;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_redirect_url(const GURL& url) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    redirect_url_ = url;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_block_on(int block_on) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    block_on_ = block_on;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows the user to check in which state did we block.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stage stage_blocked_for_callback() const {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(USER_CALLBACK, block_mode_);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return stage_blocked_for_callback_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunCallback(int response, const CompletionCallback& callback);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunAuthCallback(AuthRequiredResponse response,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const AuthCallback& callback);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TestNetworkDelegate implementation.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeURLRequest(URLRequest* request,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const CompletionCallback& callback,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 GURL* new_url) OVERRIDE;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeSendHeaders(URLRequest* request,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const CompletionCallback& callback,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  HttpRequestHeaders* headers) OVERRIDE;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnHeadersReceived(
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CompletionCallback& callback,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HttpResponseHeaders* original_response_headers,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired(
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AuthChallengeInfo& auth_info,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AuthCallback& callback,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AuthCredentials* credentials) OVERRIDE;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets the callbacks and |stage_blocked_for_callback_|.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether we should block in |stage|. If yes, returns an error code
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and optionally sets up callback based on |block_mode_|. If no, returns OK.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int MaybeBlockStage(Stage stage, const CompletionCallback& callback);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configuration parameters, can be adjusted by public methods:
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BlockMode block_mode_;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values returned on blocking stages when mode is SYNCHRONOUS or
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int retval_;  // To be returned in non-auth stages.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthRequiredResponse auth_retval_;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL redirect_url_;  // Used if non-empty.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int block_on_;  // Bit mask: in which stages to block.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |auth_credentials_| will be copied to |*target_auth_credential_| on
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCredentials auth_credentials_;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCredentials* target_auth_credentials_;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal variables, not set by not the user:
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last blocked stage waiting for user callback (unused if |block_mode_| !=
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // USER_CALLBACK).
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stage stage_blocked_for_callback_;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback objects stored during blocking stages.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback_;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCallback auth_callback_;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BlockingNetworkDelegate::BlockingNetworkDelegate(BlockMode block_mode)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : block_mode_(block_mode),
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      retval_(OK),
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION),
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      block_on_(0),
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_auth_credentials_(NULL),
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stage_blocked_for_callback_(NOT_BLOCKED),
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::DoCallback(int response) {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(USER_CALLBACK, block_mode_);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(NOT_BLOCKED, stage_blocked_for_callback_);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(ON_AUTH_REQUIRED, stage_blocked_for_callback_);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback = callback_;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunCallback(response, callback);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::DoAuthCallback(
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetworkDelegate::AuthRequiredResponse response) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(USER_CALLBACK, block_mode_);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ON_AUTH_REQUIRED, stage_blocked_for_callback_);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCallback auth_callback = auth_callback_;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAuthCallback(response, auth_callback);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::RunCallback(int response,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const CompletionCallback& callback) {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(response);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const AuthCallback& callback) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(target_auth_credentials_ != NULL);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *target_auth_credentials_ = auth_credentials_;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(response);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnBeforeURLRequest(
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL* new_url) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (redirect_url_ == request->url())
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;  // We've already seen this request and redirected elsewhere.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!redirect_url_.is_empty())
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *new_url = redirect_url_;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnBeforeSendHeaders(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders* headers) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnHeadersReceived(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HttpResponseHeaders* original_response_headers,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<HttpResponseHeaders>* override_response_headers) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkDelegate::OnHeadersReceived(
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request, callback, original_response_headers,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      override_response_headers);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MaybeBlockStage(ON_HEADERS_RECEIVED, callback);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired(
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AuthChallengeInfo& auth_info,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AuthCallback& callback,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AuthCredentials* credentials) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkDelegate::OnAuthRequired(request, auth_info, callback,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      credentials);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the user has provided callback for the previous blocked stage.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((block_on_ & ON_AUTH_REQUIRED) == 0) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return AUTH_REQUIRED_RESPONSE_NO_ACTION;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_auth_credentials_ = credentials;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (block_mode_) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SYNCHRONOUS:
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *target_auth_credentials_ = auth_credentials_;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return auth_retval_;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case AUTO_CALLBACK:
51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BlockingNetworkDelegate::RunAuthCallback,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     weak_factory_.GetWeakPtr(), auth_retval_, callback));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return AUTH_REQUIRED_RESPONSE_IO_PENDING;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case USER_CALLBACK:
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      auth_callback_ = callback;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stage_blocked_for_callback_ = ON_AUTH_REQUIRED;
52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostTask(FROM_HERE,
52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                             base::MessageLoop::QuitClosure());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return AUTH_REQUIRED_RESPONSE_IO_PENDING;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AUTH_REQUIRED_RESPONSE_NO_ACTION;  // Dummy value.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::Reset() {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(NOT_BLOCKED, stage_blocked_for_callback_);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stage_blocked_for_callback_ = NOT_BLOCKED;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_.Reset();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auth_callback_.Reset();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::MaybeBlockStage(
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlockingNetworkDelegate::Stage stage,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the user has provided callback for the previous blocked stage.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((block_on_ & stage) == 0) {
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (block_mode_) {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SYNCHRONOUS:
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(OK, retval_);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return retval_;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case AUTO_CALLBACK:
55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BlockingNetworkDelegate::RunCallback,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     weak_factory_.GetWeakPtr(), retval_, callback));
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ERR_IO_PENDING;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case USER_CALLBACK:
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_ = callback;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stage_blocked_for_callback_ = stage;
56490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostTask(FROM_HERE,
56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                             base::MessageLoop::QuitClosure());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ERR_IO_PENDING;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestURLRequestContextWithProxy : public TestURLRequestContext {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does not own |delegate|.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy(const std::string& proxy,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 NetworkDelegate* delegate)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TestURLRequestContext(true) {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_network_delegate(delegate);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Init();
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestURLRequestContextWithProxy() {}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inherit PlatformTest since we require the autorelease pool on Mac OS X.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTest : public PlatformTest {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestTest() : default_context_(true) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&default_network_delegate_);
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_context_.set_net_log(&net_log_);
593b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    job_factory_.SetProtocolHandler("data", new DataProtocolHandler);
594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    job_factory_.SetProtocolHandler("file", new FileProtocolHandler);
595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    default_context_.set_job_factory(&job_factory_);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.Init();
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~URLRequestTest() {}
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds the TestJobInterceptor to the default context.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestJobInterceptor* AddTestInterceptor() {
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestJobInterceptor* protocol_handler_ = new TestJobInterceptor();
603b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    job_factory_.SetProtocolHandler("http", NULL);
604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    job_factory_.SetProtocolHandler("http", protocol_handler_);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return protocol_handler_;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog net_log_;
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate default_network_delegate_;  // Must outlive URLRequest.
611b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  URLRequestJobFactoryImpl job_factory_;
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext default_context_;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, AboutBlankTest) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("about:blank"), &d, &default_context_);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), 0);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("", r.GetSocketAddress().host());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.GetSocketAddress().port());
630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HttpRequestHeaders headers;
632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(r.GetFullRequestHeaders(&headers));
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DataURLImageTest) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use our nice little Chrome logo.
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL(
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "data:image/png;base64,"
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUBBjG3"
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQxIEVxitD"
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI5MpCVdW0gO7t"
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "vNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKzMx1+fg9bAgK6zHq9"
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7CkIMDxQpF7r/MWq12UctI1"
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0WYUqt57yWf2McHTObYPbVD+Z"
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "wbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2HQQcm43XwmtoYM6vVKleh0uoWvnzW"
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nkDFHF9ZS+uYVjRUasMeHUmyLYtcklTvzW"
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GFZnNOXczThvpKIzjcahSqIzkvDLayDq6D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTb"
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "xXX1T5xsV9tm9r4TQwHLiZw/pdDZJea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5"
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "MrVvMzNaI3+ERHfrFzPKQukrQGI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gV"
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Md6q5c8GdosynKmSeRuGzpjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq"
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "/uxxZKzNiZFGD0wRC3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7F"
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Ux1qLnV7MGF40smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufB"
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "JbsysjjW4kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJM"
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "nlm2O34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfm"
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "moRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV5En"
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "hORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="),
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), 911);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("", r.GetSocketAddress().host());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.GetSocketAddress().port());
673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HttpRequestHeaders headers;
675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(r.GetFullRequestHeaders(&headers));
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTest) {
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::FILE_EXE, &app_path);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL app_url = FilePathToFileURL(app_path);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(app_url, &d, &default_context_);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = -1;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(file_util::GetFileSize(app_path, &file_size));
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("", r.GetSocketAddress().host());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.GetSocketAddress().port());
702eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HttpRequestHeaders headers;
704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(r.GetFullRequestHeaders(&headers));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, FileTestCancel) {
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PathService::Get(base::FILE_EXE, &app_path);
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL app_url = FilePathToFileURL(app_path);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(app_url, &d, &default_context_);
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(r.is_pending());
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Cancel();
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
721eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Async cancellation should be safe even when URLRequest has been already
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // destroyed.
72390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestFullSpecifiedRange) {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t buffer_size = 4000;
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char[]> buffer(new char[buffer_size]);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillBuffer(buffer.get(), buffer_size);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath temp_path;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL temp_url = FilePathToFileURL(temp_path);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size;
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t first_byte_position = 500;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t last_byte_position = buffer_size - first_byte_position;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t content_length = last_byte_position - first_byte_position + 1;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string partial_buffer_string(buffer.get() + first_byte_position,
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    buffer.get() + last_byte_position + 1);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(temp_url, &d, &default_context_);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kRange,
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      base::StringPrintf(
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "bytes=%" PRIuS "-%" PRIuS,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           first_byte_position, last_byte_position));
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.SetExtraRequestHeaders(headers);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(partial_buffer_string == d.data_received());
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::DeleteFile(temp_path, false));
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) {
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t buffer_size = 4000;
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char[]> buffer(new char[buffer_size]);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillBuffer(buffer.get(), buffer_size);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath temp_path;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL temp_url = FilePathToFileURL(temp_path);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t first_byte_position = 500;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t last_byte_position = buffer_size - 1;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t content_length = last_byte_position - first_byte_position + 1;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string partial_buffer_string(buffer.get() + first_byte_position,
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    buffer.get() + last_byte_position + 1);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(temp_url, &d, &default_context_);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kRange,
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      base::StringPrintf("bytes=%" PRIuS "-",
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         first_byte_position));
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.SetExtraRequestHeaders(headers);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(partial_buffer_string == d.data_received());
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::DeleteFile(temp_path, false));
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestMultipleRanges) {
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t buffer_size = 400000;
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char[]> buffer(new char[buffer_size]);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillBuffer(buffer.get(), buffer_size);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath temp_path;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL temp_url = FilePathToFileURL(temp_path);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(temp_url, &d, &default_context_);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kRange,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "bytes=0-0,10-200,200-300");
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.SetExtraRequestHeaders(headers);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.request_failed());
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::DeleteFile(temp_path, false));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InvalidUrlTest) {
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("invalid url"), &d, &default_context_);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.request_failed());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, ResolveShortcutTest) {
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("net");
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("data");
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("url_request_unittest");
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("with-headers.html");
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring lnk_path = app_path.value() + L".lnk";
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedCOMInitializer com_initializer;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily create a shortcut for test
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::win::ScopedComPtr<IShellLink> shell;
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(SUCCEEDED(shell.CreateInstance(CLSID_ShellLink, NULL,
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                               CLSCTX_INPROC_SERVER)));
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::win::ScopedComPtr<IPersistFile> persist;
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(SUCCEEDED(shell.QueryInterface(persist.Receive())));
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str())));
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest")));
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE)));
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(FilePathToFileURL(base::FilePath(lnk_path)), &d,
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &default_context_);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WIN32_FILE_ATTRIBUTE_DATA data;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetFileAttributesEx(app_path.value().c_str(),
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GetFileExInfoStandard, &data);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ,
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             FILE_SHARE_READ, NULL, OPEN_EXISTING,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             FILE_ATTRIBUTE_NORMAL, NULL);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(INVALID_HANDLE_VALUE, file);
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<char[]> buffer(new char[data.nFileSizeLow]);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD read_size;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL result;
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = ReadFile(file, buffer.get(), data.nFileSizeLow,
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      &read_size, NULL);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string content(buffer.get(), read_size);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CloseHandle(file);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.received_redirect_count());
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content, d.data_received());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clean the shortcut
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteFile(lnk_path.c_str());
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirCancelTest) {
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put in mock resource provider.
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetModule::SetResourceProvider(TestNetResourceProvider);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_path = file_path.Append(FILE_PATH_LITERAL("net"));
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_path = file_path.Append(FILE_PATH_LITERAL("data"));
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(FilePathToFileURL(file_path), &d, &default_context_);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(req.is_pending());
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_cancel_in_received_data_pending(true);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Take out mock resource provider.
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetModule::SetResourceProvider(NULL);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirRedirectNoCrash) {
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is an implicit redirect when loading a file path that matches a
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // directory and does not end with a slash.  Ensure that following such
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // redirects does not crash.  See http://crbug.com/18686.
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &path);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.Append(FILE_PATH_LITERAL("net"));
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.Append(FILE_PATH_LITERAL("data"));
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(FilePathToFileURL(path), &d, &default_context_);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
95590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, d.received_redirect_count());
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(0, d.bytes_received());
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(d.request_failed());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(req.status().is_success());
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't accept the url "file:///" on windows. See http://crbug.com/1474.
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirRedirectSingleSlash) {
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("file:///"), &d, &default_context_);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
96990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, d.received_redirect_count());
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(req.status().is_success());
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Custom URLRequestJobs for use with interceptor tests
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestartTestJob : public URLRequestTestJob {
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : URLRequestTestJob(request, network_delegate, true) {}
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartAsync() OVERRIDE {
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this->NotifyRestartRequired();
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RestartTestJob() {}
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelTestJob : public URLRequestTestJob {
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : URLRequestTestJob(request, network_delegate, true) {}
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartAsync() OVERRIDE {
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_->Cancel();
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CancelTestJob() {}
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelThenRestartTestJob : public URLRequestTestJob {
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit CancelThenRestartTestJob(URLRequest* request,
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NetworkDelegate* network_delegate)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : URLRequestTestJob(request, network_delegate, true) {
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartAsync() OVERRIDE {
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_->Cancel();
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this->NotifyRestartRequired();
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CancelThenRestartTestJob() {}
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An Interceptor for use with interceptor tests
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInterceptor : URLRequest::Interceptor {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor()
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : intercept_main_request_(false), restart_main_request_(false),
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cancel_main_request_(false), cancel_then_restart_main_request_(false),
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        simulate_main_network_error_(false),
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        intercept_redirect_(false), cancel_redirect_request_(false),
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        intercept_final_response_(false), cancel_final_request_(false),
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_intercept_main_(false), did_restart_main_(false),
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_cancel_main_(false), did_cancel_then_restart_main_(false),
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_simulate_error_main_(false),
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_intercept_redirect_(false), did_cancel_redirect_(false),
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_intercept_final_(false), did_cancel_final_(false) {
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest::Deprecated::RegisterRequestInterceptor(this);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestInterceptor() {
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest::Deprecated::UnregisterRequestInterceptor(this);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual URLRequestJob* MaybeIntercept(
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      URLRequest* request,
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkDelegate* network_delegate) OVERRIDE {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (restart_main_request_) {
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restart_main_request_ = false;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_restart_main_ = true;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new RestartTestJob(request, network_delegate);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancel_main_request_) {
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_main_request_ = false;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_cancel_main_ = true;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CancelTestJob(request, network_delegate);
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancel_then_restart_main_request_) {
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_then_restart_main_request_ = false;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_cancel_then_restart_main_ = true;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CancelThenRestartTestJob(request, network_delegate);
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (simulate_main_network_error_) {
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      simulate_main_network_error_ = false;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_simulate_error_main_ = true;
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // will error since the requeted url is not one of its canned urls
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new URLRequestTestJob(request, network_delegate, true);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!intercept_main_request_)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intercept_main_request_ = false;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    did_intercept_main_ = true;
1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequestTestJob* job =  new URLRequestTestJob(request,
1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    network_delegate,
1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    main_headers_,
1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    main_data_,
1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    true);
1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    job->set_load_timing_info(main_request_load_timing_info_);
1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return job;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual URLRequestJob* MaybeInterceptRedirect(
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate* network_delegate,
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& location) OVERRIDE {
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancel_redirect_request_) {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_redirect_request_ = false;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_cancel_redirect_ = true;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CancelTestJob(request, network_delegate);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!intercept_redirect_)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intercept_redirect_ = false;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    did_intercept_redirect_ = true;
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new URLRequestTestJob(request,
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 network_delegate,
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 redirect_headers_,
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 redirect_data_,
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual URLRequestJob* MaybeInterceptResponse(
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      URLRequest* request, NetworkDelegate* network_delegate) OVERRIDE {
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancel_final_request_) {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_final_request_ = false;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_cancel_final_ = true;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CancelTestJob(request, network_delegate);
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!intercept_final_response_)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intercept_final_response_ = false;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    did_intercept_final_ = true;
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new URLRequestTestJob(request,
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 network_delegate,
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 final_headers_,
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 final_data_,
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whether to intercept the main request, and if so the response to return and
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the LoadTimingInfo to use.
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool intercept_main_request_;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string main_headers_;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string main_data_;
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo main_request_load_timing_info_;
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other actions we take at MaybeIntercept time
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool restart_main_request_;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancel_main_request_;
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancel_then_restart_main_request_;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool simulate_main_network_error_;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether to intercept redirects, and if so the response to return.
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool intercept_redirect_;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string redirect_headers_;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string redirect_data_;
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other actions we can take at MaybeInterceptRedirect time
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancel_redirect_request_;
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether to intercept final response, and if so the response to return.
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool intercept_final_response_;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string final_headers_;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string final_data_;
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other actions we can take at MaybeInterceptResponse time
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancel_final_request_;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we did something or not
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_intercept_main_;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_restart_main_;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_cancel_main_;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_cancel_then_restart_main_;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_simulate_error_main_;
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_intercept_redirect_;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_cancel_redirect_;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_intercept_final_;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_cancel_final_;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Static getters for canned response header and data strings
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string ok_data() {
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return URLRequestTestJob::test_data_1();
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string ok_headers() {
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return URLRequestTestJob::test_headers();
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string redirect_data() {
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string redirect_headers() {
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return URLRequestTestJob::test_redirect_headers();
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string error_data() {
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string("ohhh nooooo mr. bill!");
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string error_headers() {
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return URLRequestTestJob::test_error_headers();
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, Intercept) {
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and respond with a simple response
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::ok_headers();
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::ok_data();
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data();
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data();
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data();
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetUserData(NULL, user_data0);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetUserData(&user_data1, user_data1);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetUserData(&user_data2, user_data2);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
119790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we can retrieve our specific user data
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(user_data0, req.GetUserData(NULL));
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(user_data1, req.GetUserData(&user_data1));
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(user_data2, req.GetUserData(&user_data2));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we got one good response
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, req.response_headers()->response_code());
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRedirect) {
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and respond with a redirect
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::redirect_headers();
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::redirect_data();
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept that redirect and respond a final OK response
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_redirect_ = true;
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.redirect_headers_ =  TestInterceptor::ok_headers();
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.redirect_data_ = TestInterceptor::ok_data();
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
123290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_redirect_);
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we got one good response
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (req.status().is_success()) {
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, req.response_headers()->response_code());
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptServerError) {
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request to generate a server error response
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::error_headers();
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::error_data();
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept that error and respond with an OK response
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
126590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_final_);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we got one good response
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, req.response_headers()->response_code());
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptNetworkError) {
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request to simulate a network error
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.simulate_main_network_error_ = true;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept that error and respond with an OK response
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
129490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_simulate_error_main_);
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_final_);
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we received one good response
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, req.response_headers()->response_code());
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRestartRequired) {
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // restart the main request
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.restart_main_request_ = true;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then intercept the new main request and respond with an OK response
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::ok_headers();
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::ok_data();
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
132390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_restart_main_);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we received one good response
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (req.status().is_success()) {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, req.response_headers()->response_code());
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelMain) {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and cancel from within the restarted job
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.cancel_main_request_ = true;
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setup to intercept final response and override it with an OK response
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_cancel_main_);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(interceptor.did_intercept_final_);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a canceled request
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelRedirect) {
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and respond with a redirect
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::redirect_headers();
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::redirect_data();
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the redirect and cancel from within that job
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.cancel_redirect_request_ = true;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setup to intercept final response and override it with an OK response
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
138590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_cancel_redirect_);
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(interceptor.did_intercept_final_);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a canceled request
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelFinal) {
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request to simulate a network error
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.simulate_main_network_error_ = true;
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setup to intercept final response and cancel from within that job
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.cancel_final_request_ = true;
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
141090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_simulate_error_main_);
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_cancel_final_);
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a canceled request
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelInRestart) {
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and cancel then restart from within that job
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.cancel_then_restart_main_request_ = true;
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setup to intercept final response and override it with an OK response
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
143690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_cancel_then_restart_main_);
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(interceptor.did_intercept_final_);
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a canceled request
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing,
1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 URLRequestContext* context) {
1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestInterceptor interceptor;
1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  interceptor.intercept_main_request_ = true;
1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  interceptor.main_request_load_timing_info_ = job_load_timing;
1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestDelegate d;
1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, context);
1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.Start();
145590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo resulting_load_timing;
1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.GetLoadTimingInfo(&resulting_load_timing);
1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // None of these should be modified by the URLRequest.
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused);
1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id);
1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start);
1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end);
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.receive_headers_end,
1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            resulting_load_timing.receive_headers_end);
1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return resulting_load_timing;
1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// "Normal" LoadTimingInfo as returned by a job.  Everything is in order, not
1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// reused.  |connect_time_flags| is used to indicate if there should be dns
1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// or SSL times, and |used_proxy| is used for proxy times.
1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now,
1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    int connect_time_flags,
1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    bool used_proxy) {
1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing;
1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.socket_log_id = 1;
1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (used_proxy) {
1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing;
1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) {
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connect_timing.dns_start = now + base::TimeDelta::FromDays(3);
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connect_timing.dns_end = now + base::TimeDelta::FromDays(4);
1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connect_timing.connect_start = now + base::TimeDelta::FromDays(5);
1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) {
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connect_timing.ssl_start = now + base::TimeDelta::FromDays(6);
1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connect_timing.ssl_end = now + base::TimeDelta::FromDays(7);
1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connect_timing.connect_end = now + base::TimeDelta::FromDays(8);
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.send_start = now + base::TimeDelta::FromDays(9);
1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.send_end = now + base::TimeDelta::FromDays(10);
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return load_timing;
1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but in the case of a reused socket.
1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now,
1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          bool used_proxy) {
1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing;
1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.socket_log_id = 1;
1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.socket_reused = true;
1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (used_proxy) {
1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.send_start = now + base::TimeDelta::FromDays(9);
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.send_end = now + base::TimeDelta::FromDays(10);
1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return load_timing;
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Basic test that the intercept + load timing tests work.
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTiming) {
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false);
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Nothing should have been changed by the URLRequest.
1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.proxy_resolve_start,
1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_start);
1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.proxy_resolve_end,
1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_end);
1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.dns_start,
1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_start);
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.dns_end,
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_end);
1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.connect_start,
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.connect_end,
1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_start);
1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_end);
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Redundant sanity check.
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES);
1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Another basic test, with proxy and SSL times, but no DNS times.
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingProxy) {
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true);
1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Nothing should have been changed by the URLRequest.
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.proxy_resolve_start,
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_start);
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.proxy_resolve_end,
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_end);
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.dns_start,
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_start);
1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.dns_end,
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_end);
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.connect_start,
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.connect_end,
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_start);
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_end);
1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Redundant sanity check.
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReusedWithProxy(load_timing_result,
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   CONNECT_TIMING_HAS_SSL_TIMES);
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts proxy times when they're before
1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to already having a connected socket.  This happens in
1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the case of reusing a SPDY session or HTTP pipeline.  The connected socket is
1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// not considered reused in this test (May be a preconnect).
1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// To mix things up from the test above, assumes DNS times but no SSL times.
1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) {
1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true);
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6);
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5);
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4);
1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3);
1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_start =
1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(2);
1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_end =
1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(1);
1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Proxy times, connect times, and DNS times should all be replaced with
1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // request_start.
1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_start);
1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_end);
1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_start);
1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_end);
1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Other times should have been left null.
1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReusedWithProxy(load_timing_result,
1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   CONNECT_TIMING_HAS_DNS_TIMES);
1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but in the reused case.
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) {
1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true);
1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4);
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3);
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Proxy times and connect times should all be replaced with request_start.
1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_start);
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_end);
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Other times should have been left null.
1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingReusedWithProxy(load_timing_result);
1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts connect times when they're before
1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to reusing a connected socket.  The connected socket is
1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// not considered reused in this test (May be a preconnect).
1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// To mix things up, the request has SSL times, but no DNS times.
1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) {
1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false);
1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_start =
1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(1);
1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2);
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3);
1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_end =
1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(4);
1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Connect times, and SSL times should be replaced with request_start.
1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_start);
1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_end);
1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Other times should have been left null.
1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES);
1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts connect times when they're before
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to reusing a connected socket in the case that there
1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// are also proxy times.  The connected socket is not considered reused in this
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// test (May be a preconnect).
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// In this test, there are no SSL or DNS times.
1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) {
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true);
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_start =
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(1);
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_end =
1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(2);
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Connect times should be replaced with proxy_resolve_end.
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.proxy_resolve_end,
1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.proxy_resolve_end,
1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Other times should have been left null.
1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReusedWithProxy(load_timing_result,
1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that two different URL requests have different identifiers.
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, Identifiers) {
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context;
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestURLRequest req(GURL("http://example.com"), &d, &context, NULL);
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestURLRequest other_req(GURL("http://example.com"), &d, &context, NULL);
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(req.identifier(), other_req.identifier());
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that a failure to connect to the proxy is reported to the network
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate.
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, NetworkDelegateProxyError) {
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHostResolver host_resolver;
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver.rules()->AddSimulatedFailure("*");
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context("myproxy:70", &network_delegate);
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://example.com"), &d, &context);
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
173290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a failed request.
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, req.status().error());
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.error_count());
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, network_delegate.last_error());
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.completed_requests());
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that net::NetworkDelegate::NotifyCompleted is called if
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content is empty.
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, RequestCompletionForEmptyResponse) {
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("data:,"), &d, &default_context_);
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
175090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", d.data_received());
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, default_network_delegate_.completed_requests());
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that SetPriority actually sets the URLRequest's priority
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// correctly, both before and after start.
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetPriorityBasic) {
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(LOW);
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, req.priority());
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, req.priority());
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(MEDIUM);
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(MEDIUM, req.priority());
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest calls SetPriority on a job before calling
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Start on it.
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) {
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<URLRequestTestJob> job =
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new URLRequestTestJob(&req, &default_network_delegate_);
1781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job.get());
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DEFAULT_PRIORITY, job->priority());
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(LOW);
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, job->priority());
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest passes on its priority updates to its
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// job.
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetJobPriority) {
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<URLRequestTestJob> job =
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new URLRequestTestJob(&req, &default_network_delegate_);
1798868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job.get());
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(LOW);
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, job->priority());
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(MEDIUM);
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(MEDIUM, req.priority());
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(MEDIUM, job->priority());
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(droger): Support SpawnedTestServer on iOS (see http://crbug.com/148666).
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS)
1811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A subclass of SpawnedTestServer that uses a statically-configured hostname.
1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is to work around mysterious failures in chrome_frame_net_tests. See:
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114369
1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LocalHttpTestServer : public SpawnedTestServer {
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit LocalHttpTestServer(const base::FilePath& document_root)
1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP,
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          ScopedCustomUrlRequestTestHttpHost::value(),
1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          document_root) {}
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer()
1821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP,
1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          ScopedCustomUrlRequestTestHttpHost::value(),
1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          base::FilePath()) {}
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, DelayedCookieCallback) {
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context;
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<DelayedCookieMonster> delayed_cm =
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DelayedCookieMonster();
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieStore> cookie_store = delayed_cm;
1834868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  context.set_cookie_store(delayed_cm.get());
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.set_network_delegate(&network_delegate);
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("set-cookie?CookieToNotSend=1"), &d, &context);
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
184490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.set_cookie_count());
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.set_network_delegate(&network_delegate);
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("echoheader?Cookie"), &d, &context);
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
185790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
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)
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies) {
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
187990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
189290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
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)  // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set.
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.set_load_flags(LOAD_DO_NOT_SEND_COOKIES);
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
190990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies.
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies) {
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
193390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.set_cookie_count());
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to set-up another cookie and update the previous cookie.
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.set_load_flags(LOAD_DO_NOT_SAVE_COOKIES);
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie.
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.set_cookie_count());
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the cookies weren't saved or updated.
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
196890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.set_cookie_count());
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) {
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
199490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
200890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie isn't sent.
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
202690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) {
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
204990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to set-up another cookie and update the previous cookie.
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the cookies weren't saved or updated.
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
208190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveEmptyCookies) {
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up an empty 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"), &d, &default_context_);
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
210490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.set_cookie_count());
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) {
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
212590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
213990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie isn't sent.
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
215790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) {
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
218090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to set-up another cookie and update the previous cookie.
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the cookies weren't saved or updated.
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
221290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FixedDateNetworkDelegate swaps out the server's HTTP Date response header
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value for the |fixed_date| argument given to the constructor.
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FixedDateNetworkDelegate : public TestNetworkDelegate {
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FixedDateNetworkDelegate(const std::string& fixed_date)
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : fixed_date_(fixed_date) {}
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FixedDateNetworkDelegate() {}
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::NetworkDelegate implementation
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnHeadersReceived(
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CompletionCallback& callback,
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HttpResponseHeaders* original_response_headers,
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<net::HttpResponseHeaders>* override_response_headers)
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE;
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string fixed_date_;
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate);
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FixedDateNetworkDelegate::OnHeadersReceived(
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CompletionCallback& callback,
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::HttpResponseHeaders* original_response_headers,
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders>* override_response_headers) {
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpResponseHeaders* new_response_headers =
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(original_response_headers->raw_headers());
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_response_headers->RemoveHeader("Date");
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_response_headers->AddHeader("Date: " + fixed_date_);
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *override_response_headers = new_response_headers;
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TestNetworkDelegate::OnHeadersReceived(request,
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                callback,
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                original_response_headers,
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                override_response_headers);
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cookie expiration times are adjusted for server/client clock
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// headers by defaulting to GMT. (crbug.com/135131)
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) {
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up an expired cookie.
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL(
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
228190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is not set.
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
229190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos);
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier.
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC");
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL(
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
230590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
231590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos);
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that it is impossible to change the referrer in the extra headers of
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an URLRequest.
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotOverrideReferrer) {
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If extra headers contain referer and the request contains a referer,
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only the latter shall be respected.
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Referer"), &d, &default_context_);
2334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    req.SetReferrer("http://foo.com/");
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
234190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://foo.com/", d.data_received());
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If extra headers contain a referer but the request does not, no referer
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // shall be sent in the header.
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Referer"), &d, &default_context_);
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.set_load_flags(LOAD_VALIDATE_CACHE);
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
235990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("None", d.data_received());
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTestHTTP : public URLRequestTest {
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestTestHTTP()
23682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : test_server_(base::FilePath(FILE_PATH_LITERAL(
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  "net/data/url_request_unittest"))) {
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests |redirect_url|, which must return a HTTP 3xx redirect.
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |request_method| is the method to use for the initial request.
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |redirect_method| is the method that is expected to be used for the second
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request, after redirection.
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |include_data| is true, data is uploaded with the request.  The
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // response body is expected to match it exactly, if and only if
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |request_method| == |redirect_method|.
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HTTPRedirectMethodTest(const GURL& redirect_url,
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& request_method,
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& redirect_method,
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool include_data) {
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const char kData[] = "hello world";
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(redirect_url, &d, &default_context_);
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.set_method(request_method);
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (include_data) {
23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpRequestHeaders headers;
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      headers.SetHeader(HttpRequestHeaders::kContentLength,
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::UintToString(arraysize(kData) - 1));
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      req.SetExtraRequestHeaders(headers);
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
239690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(redirect_method, req.method());
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, req.status().error());
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (include_data) {
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (request_method == redirect_method) {
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(kData, d.data_received());
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(kData, d.data_received());
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFailure())
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Request method was: " << request_method;
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HTTPUploadDataOperationTest(const std::string& method) {
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int kMsgSize = 20000;  // multiple of 10
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int kIterations = 50;
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char* uploadBytes = new char[kMsgSize+1];
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char* ptr = uploadBytes;
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char marker = 'a';
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int idx = 0; idx < kMsgSize/10; idx++) {
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(ptr, "----------", 10);
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ptr += 10;
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (idx % 100 == 0) {
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ptr--;
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *ptr++ = marker;
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (++marker > 'z')
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          marker = 'a';
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uploadBytes[kMsgSize] = '\0';
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < kIterations; ++i) {
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestDelegate d;
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.set_method(method.c_str());
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      r.set_upload(make_scoped_ptr(CreateSimpleUploadData(uploadBytes)));
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.Start();
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.is_pending());
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASSERT_EQ(1, d.response_started_count())
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          << "request failed: " << r.status().status()
24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          << ", os error: " << r.status().error();
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(d.received_data_before_response());
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(uploadBytes, d.data_received());
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete[] uploadBytes;
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddChunksToUpload(URLRequest* r) {
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("a", 1, false);
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("bcd", 3, false);
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("this is a longer chunk than before.", 35, false);
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("\r\n\r\n", 4, false);
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("0", 1, false);
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("2323", 4, true);
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) {
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This should match the chunks sent by AddChunksToUpload().
24622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string expected_data =
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "abcdthis is a longer chunk than before.\r\n\r\n02323";
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1, d->response_started_count())
24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "request failed: " << r->status().status()
24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << ", os error: " << r->status().error();
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received()));
24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_data, d->data_received());
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoManyCookiesRequest(int num_cookies) {
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("set-many-cookies?" +
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::IntToString(num_cookies)),
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &d,
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &default_context_);
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_success = r.status().is_success();
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_success) {
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Requests handled by ChromeFrame send a less precise error message,
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // ERR_CONNECTION_ABORTED.
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.status().error() == ERR_RESPONSE_HEADERS_TOO_BIG ||
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r.status().error() == ERR_CONNECTION_ABORTED);
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The test server appears to be unable to handle subsequent requests
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // after this error is triggered. Force it to restart.
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(test_server_.Stop());
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(test_server_.Start());
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return is_success;
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server_;
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this unit test, we're using the HTTPTestServer as a proxy server and
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// issuing a CONNECT request with the magic host name "www.redirect.com".
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HTTPTestServer will return a 302 response, which we should not
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follow.
25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) {
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("https://www.redirect.com/"), &d, &context);
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should not have followed the redirect.
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.received_redirect_count());
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the same as the previous test, but checks that the network delegate
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// registers the error.
25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) {
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("https://www.redirect.com/"), &d, &context);
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should not have followed the redirect.
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.received_redirect_count());
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.error_count());
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, network_delegate.last_error());
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can block and asynchronously return OK in various stages.
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) {
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const BlockingNetworkDelegate::Stage blocking_stages[] = {
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlockingNetworkDelegate::ON_HEADERS_RECEIVED
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t blocking_stages_length = arraysize(blocking_stages);
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST |
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS |
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("empty.html"), &d, &context);
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < blocking_stages_length; ++i) {
259190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(blocking_stages[i],
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                network_delegate.stage_blocked_for_callback());
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_delegate.DoCallback(OK);
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
259690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and cancel a request.
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) {
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_retval(ERR_EMPTY_RESPONSE);
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
262390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_EMPTY_RESPONSE, r.status().error());
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function for NetworkDelegateCancelRequestAsynchronously and
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate operating in |block_mode| and a request for |url|. It blocks the
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT.
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode,
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BlockingNetworkDelegate::Stage stage,
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const GURL& url) {
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(block_mode);
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT);
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(stage);
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
265390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, r.status().error());
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following 3 tests check that the network delegate can cancel a request
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// synchronously in various stages of the request.
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) {
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
2669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) {
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
2676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) {
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
2683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following 3 tests check that the network delegate can cancel a request
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// asynchronously in various stages of the request.
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) {
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
2692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) {
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
2699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) {
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
2706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and redirect a request to a new
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL.
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) {
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL redirect_url(test_server_.GetURL("simple.html"));
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_redirect_url(redirect_url);
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL original_url(test_server_.GetURL("empty.html"));
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(original_url, &d, &context);
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
273090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(redirect_url, r.url());
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(original_url, r.original_url());
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, r.url_chain().size());
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and redirect a request to a new
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL by setting a redirect_url and returning in OnBeforeURLRequest directly.
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) {
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::SYNCHRONOUS);
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL redirect_url(test_server_.GetURL("simple.html"));
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_redirect_url(redirect_url);
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL original_url(test_server_.GetURL("empty.html"));
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(original_url, &d, &context);
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
276390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(redirect_url, r.url());
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(original_url, r.original_url());
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, r.url_chain().size());
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that redirects caused by the network delegate preserve POST data.
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) {
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello world";
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL redirect_url(test_server_.GetURL("echo"));
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_redirect_url(redirect_url);
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL original_url(test_server_.GetURL("empty.html"));
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(original_url, &d, &context);
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kContentLength,
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      base::UintToString(arraysize(kData) - 1));
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.SetExtraRequestHeaders(headers);
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
280390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(redirect_url, r.url());
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(original_url, r.original_url());
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, r.url_chain().size());
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("POST", r.method());
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kData, d.data_received());
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by taking no action. This indicates that the NetworkDelegate does not want to
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handle the challenge, and is passing the buck along to the
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate.
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) {
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::SYNCHRONOUS);
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_credentials(AuthCredentials(kUser, kSecret));
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
2839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
2841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0, r.status().error());
2844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(200, r.GetResponseCode());
2845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(d.auth_required_called());
2846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, network_delegate.created_requests());
2847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0, network_delegate.destroyed_requests());
2848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, network_delegate.destroyed_requests());
2850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP,
2853eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetworkDelegateOnAuthRequiredSyncNoAction_GetFullRequestHeaders) {
2854eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server_.Start());
2855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
2857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BlockingNetworkDelegate network_delegate(
2858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BlockingNetworkDelegate::SYNCHRONOUS);
2859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestURLRequestContext context(true);
2861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context.set_network_delegate(&network_delegate);
2862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context.Init();
2863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  d.set_credentials(AuthCredentials(kUser, kSecret));
2865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
2867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL url(test_server_.GetURL("auth-basic"));
2868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest r(url, &d, &context);
2869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    r.Start();
2870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    {
2872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      HttpRequestHeaders headers;
2873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_TRUE(r.GetFullRequestHeaders(&headers));
2874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_FALSE(headers.HasHeader("Authorization"));
2875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
2876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
287790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.auth_required_called());
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by setting credentials.
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) {
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::SYNCHRONOUS);
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_retval(
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
291190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.auth_required_called());
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Same as above, but also tests that GetFullRequestHeaders returns the proper
2924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// headers (for the first or second request) when called at the proper times.
2925eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP,
2926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetworkDelegateOnAuthRequiredSyncSetAuth_GetFullRequestHeaders) {
2927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server_.Start());
2928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
2930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BlockingNetworkDelegate network_delegate(
2931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BlockingNetworkDelegate::SYNCHRONOUS);
2932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
2933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  network_delegate.set_auth_retval(
2934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
2935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
2937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestURLRequestContext context(true);
2939eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context.set_network_delegate(&network_delegate);
2940eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context.Init();
2941eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
2943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL url(test_server_.GetURL("auth-basic"));
2944eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest r(url, &d, &context);
2945eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    r.Start();
2946eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
2947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0, r.status().error());
2950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(200, r.GetResponseCode());
2951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(d.auth_required_called());
2952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, network_delegate.created_requests());
2953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0, network_delegate.destroyed_requests());
2954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    {
2956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      HttpRequestHeaders headers;
2957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_TRUE(r.GetFullRequestHeaders(&headers));
2958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_TRUE(headers.HasHeader("Authorization"));
2959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
2960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, network_delegate.destroyed_requests());
2962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by cancelling authentication.
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) {
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::SYNCHRONOUS);
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_retval(
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
298490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, r.status().error());
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(401, r.GetResponseCode());
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.auth_required_called());
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by taking no action. This indicates that the NetworkDelegate does not want
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to handle the challenge, and is passing the buck along to the
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate.
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) {
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_credentials(AuthCredentials(kUser, kSecret));
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
301890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.auth_required_called());
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by setting credentials.
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) {
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_retval(
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCredentials auth_credentials(kUser, kSecret);
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_credentials(auth_credentials);
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
305390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.auth_required_called());
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by cancelling authentication.
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) {
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_retval(
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
308690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, r.status().error());
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(401, r.GetResponseCode());
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.auth_required_called());
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate.
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback.
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) {
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
311790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_delegate.stage_blocked_for_callback());
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.completed_requests());
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel before callback.
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that network delegate is notified.
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.completed_requests());
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_ABORTED, r.status().error());
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate.
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 2: Request is cancelled while waiting for OnBeforeSendHeaders callback.
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) {
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS);
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
315390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_delegate.stage_blocked_for_callback());
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.completed_requests());
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel before callback.
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that network delegate is notified.
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.completed_requests());
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_ABORTED, r.status().error());
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate.
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 3: Request is cancelled while waiting for OnHeadersReceived callback.
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) {
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
318890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_delegate.stage_blocked_for_callback());
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.completed_requests());
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel before callback.
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that network delegate is notified.
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.completed_requests());
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_ABORTED, r.status().error());
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate.
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 4: Request is cancelled while waiting for OnAuthRequired callback.
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) {
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &context);
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
322390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED,
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_delegate.stage_blocked_for_callback());
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.completed_requests());
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel before callback.
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that network delegate is notified.
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.completed_requests());
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_ABORTED, r.status().error());
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this unit test, we're using the HTTPTestServer as a proxy server and
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// issuing a CONNECT request with the magic host name "www.server-auth.com".
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HTTPTestServer will return a 401 response, which we should balk at.
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) {
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("https://www.server-auth.com/"), &d, &context);
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTest_NoCache) {
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
327490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(eroman): Add back the NetLog tests...
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test has the server send a large number of cookies to the client.
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To ensure that no number of cookies causes a crash, a galloping binary
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// search is used to estimate that maximum number of cookies that are accepted
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the browser. Beyond the maximum number, the request will fail with
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ERR_RESPONSE_HEADERS_TOO_BIG.
32932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
32942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/177916
32952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies
32962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
32972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies
32982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_WIN)
32992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) {
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int lower_bound = 0;
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int upper_bound = 1;
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Double the number of cookies until the response header limits are
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exceeded.
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (DoManyCookiesRequest(upper_bound)) {
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lower_bound = upper_bound;
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upper_bound *= 2;
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LT(upper_bound, 1000000);
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tolerance = upper_bound * 0.005;
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tolerance < 2)
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tolerance = 2;
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perform a binary search to find the highest possible number of cookies,
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // within the desired tolerance.
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (upper_bound - lower_bound >= tolerance) {
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num_cookies = (lower_bound + upper_bound) / 2;
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (DoManyCookiesRequest(num_cookies))
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lower_bound = num_cookies;
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      upper_bound = num_cookies;
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Success: the test did not crash.
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTest) {
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
334090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, GetTest_GetFullRequestHeaders) {
3353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server_.Start());
3354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
3356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
3357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL test_url(test_server_.GetURL(std::string()));
3358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest r(test_url, &d, &default_context_);
3359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HttpRequestHeaders headers;
3361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(r.GetFullRequestHeaders(&headers));
3362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    r.Start();
3364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(r.is_pending());
3365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
3367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, d.response_started_count());
3369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(d.received_data_before_response());
3370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_NE(0, d.bytes_received());
3371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_server_.host_port_pair().host(),
3372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              r.GetSocketAddress().host());
3373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_server_.host_port_pair().port(),
3374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              r.GetSocketAddress().port());
3375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(d.have_full_request_headers());
3377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CheckFullRequestHeaders(d.full_request_headers(), test_url);
3378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
3379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
3380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTestLoadTiming) {
33822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
33832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
33852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
33872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
33892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(r.is_pending());
33902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
339190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
33922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info;
33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.GetLoadTimingInfo(&load_timing_info);
33952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
33962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
33982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
33992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
34002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
34012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              r.GetSocketAddress().host());
34022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
34032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              r.GetSocketAddress().port());
34042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
34052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
34062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetZippedTest) {
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parameter that specifies the Content-Length field in the response:
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // C - Compressed length.
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // U - Uncompressed length.
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // L - Large length (larger than both C & U).
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // M - Medium length (between C & U).
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // S - Small length (smaller than both C & U).
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char test_parameters[] = "CULMS";
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int num_tests = arraysize(test_parameters)- 1;  // Skip NULL.
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // C & U should be OK.
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // L & M are larger than the data sent, and show an error.
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // S has too little data, but we seem to accept it.
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool test_expect_success[num_tests] =
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { true, true, false, false, true };
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < num_tests ; i++) {
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string test_file =
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::StringPrintf("compressedfiles/BullRunSpeech.txt?%c",
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             test_parameters[i]);
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestURLRequestContext context(true);
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.set_network_delegate(&network_delegate);
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.Init();
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest r(test_server_.GetURL(test_file), &d, &context);
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.Start();
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.is_pending());
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
344090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1, d.response_started_count());
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(d.received_data_before_response());
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << " Received " << d.bytes_received() << " bytes"
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << " status = " << r.status().status()
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << " error = " << r.status().error();
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (test_expect_success[i]) {
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status())
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            << " Parameter = \"" << test_file << "\"";
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, r.status().error())
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            << " Parameter = \"" << test_file << "\"";
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, HTTPSToHTTPRedirectNoRefererTest) {
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer https_test_server(
3463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS, SpawnedTestServer::kLocalhost,
34642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An https server is sent a request with an https referer,
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and responds with a redirect to an http url. The http
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // server should not be sent the referer.
3470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL http_destination = test_server_.GetURL(std::string());
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(https_test_server.GetURL(
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "server-redirect?" + http_destination.spec()), &d, &default_context_);
3474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("https://www.referrer.com/");
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
347690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.received_redirect_count());
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(http_destination, req.url());
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), req.referrer());
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectLoadTiming) {
34852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
34862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL destination_url = test_server_.GetURL(std::string());
3488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL original_url =
3489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server_.GetURL("server-redirect?" + destination_url.spec());
34902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
34912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(original_url, &d, &default_context_);
34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
349390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
34942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
34962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, d.received_redirect_count());
34972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(destination_url, req.url());
34982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(original_url, req.original_url());
34992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, req.url_chain().size());
35002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(original_url, req.url_chain()[0]);
35012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(destination_url, req.url_chain()[1]);
35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadTimingInfo load_timing_info_before_redirect;
35042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect(
35052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &load_timing_info_before_redirect));
35062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestLoadTimingNotReused(load_timing_info_before_redirect,
35072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          CONNECT_TIMING_HAS_DNS_TIMES);
35082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadTimingInfo load_timing_info;
35102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.GetLoadTimingInfo(&load_timing_info);
35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
35122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that a new socket was used on redirect, since the server does not
35142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // supposed keep-alive sockets, and that the times before the redirect are
35152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // before the ones recorded for the second request.
35162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(load_timing_info_before_redirect.socket_log_id,
35172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            load_timing_info.socket_log_id);
35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info_before_redirect.receive_headers_end,
35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            load_timing_info.connect_timing.connect_start);
35202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, MultipleRedirectTest) {
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL destination_url = test_server_.GetURL(std::string());
3526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL middle_redirect_url =
3527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server_.GetURL("server-redirect?" + destination_url.spec());
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL original_url = test_server_.GetURL(
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "server-redirect?" + middle_redirect_url.spec());
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(original_url, &d, &default_context_);
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
353390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, d.received_redirect_count());
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(destination_url, req.url());
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(original_url, req.original_url());
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, req.url_chain().size());
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(original_url, req.url_chain()[0]);
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(middle_redirect_url, req.url_chain()[1]);
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(destination_url, req.url_chain()[2]);
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtraHeader[] = "Allow-Snafu";
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtraValue[] = "fubar";
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RedirectWithAdditionalHeadersDelegate : public TestDelegate {
35512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnReceivedRedirect(net::URLRequest* request,
35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const GURL& new_url,
35532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool* defer_redirect) OVERRIDE {
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect);
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false);
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) {
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL destination_url = test_server_.GetURL(
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "echoheader?" + std::string(kExtraHeader));
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL original_url = test_server_.GetURL(
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "server-redirect?" + destination_url.spec());
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RedirectWithAdditionalHeadersDelegate d;
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(original_url, &d, &default_context_);
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
357190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HttpRequestHeaders& headers = req.extra_request_headers();
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value));
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kExtraValue, value);
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.is_pending());
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.is_redirecting());
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kExtraValue, d.data_received());
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
35832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExtraHeaderToRemove[] = "To-Be-Removed";
35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RedirectWithHeaderRemovalDelegate : public TestDelegate {
35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnReceivedRedirect(net::URLRequest* request,
35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const GURL& new_url,
35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          bool* defer_redirect) OVERRIDE {
35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect);
35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request->RemoveRequestHeaderByName(kExtraHeaderToRemove);
35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
35962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) {
35982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
35992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL destination_url = test_server_.GetURL(
36012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "echoheader?" + std::string(kExtraHeaderToRemove));
36022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL original_url = test_server_.GetURL(
36032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "server-redirect?" + destination_url.spec());
36042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RedirectWithHeaderRemovalDelegate d;
36052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(original_url, &d, &default_context_);
36062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false);
36072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
360890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
36092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string value;
36112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const HttpRequestHeaders& headers = req.extra_request_headers();
36122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value));
36132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(req.is_pending());
36142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(req.is_redirecting());
36152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("None", d.data_received());
36162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
36172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest) {
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("http://www.google.com/"), &d, &default_context_);
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We expect to receive OnResponseStarted even though the request has been
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // cancelled.
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest2) {
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_cancel_in_response_started(true);
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest3) {
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_cancel_in_received_data(true);
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
367190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There is no guarantee about how much data was received
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // before the cancel was issued.  It could have been 0 bytes,
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // or it could have been all the bytes.
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // EXPECT_EQ(0, d.bytes_received());
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest4) {
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The request will be implicitly canceled when it is destroyed. The
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // test delegate must not post a quit message when this happens because
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // this test doesn't actually have a message loop. The quit message would
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // get put on this thread's message queue and the next test would exit
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // early, causing problems.
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_quit_on_complete(false);
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect things to just cleanup properly.
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we won't actually get a received reponse here because we've never run the
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message loop
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(d.received_data_before_response());
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.bytes_received());
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest5) {
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // populate cache
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_);
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
371690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cancel read from cache (see bug 990242)
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_);
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
372690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostTest) {
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPUploadDataOperationTest("POST");
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PutTest) {
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPUploadDataOperationTest("PUT");
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostEmptyTest) {
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1, d.response_started_count())
37592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "request failed: " << r.status().status()
37602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << ", error: " << r.status().error();
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().empty());
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostFileTest) {
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath dir;
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(base::DIR_EXE, &dir);
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::SetCurrentDirectory(dir);
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<UploadElementReader> element_readers;
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path;
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(base::DIR_SOURCE_ROOT, &path);
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("net"));
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("data"));
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
37877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    element_readers.push_back(
37887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        new UploadFileElementReader(base::MessageLoopProxy::current().get(),
37897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    path,
37907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    0,
37917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    kuint64max,
37927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    base::Time()));
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This file should just be ignored in the upload stream.
37952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element_readers.push_back(new UploadFileElementReader(
37967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::MessageLoopProxy::current().get(),
37972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath(FILE_PATH_LITERAL(
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "c:\\path\\to\\non\\existant\\file.randomness.12345")),
37997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        0,
38007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        kuint64max,
38017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Time()));
38022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.set_upload(make_scoped_ptr(new UploadDataStream(&element_readers, 0)));
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
380790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 size = 0;
38102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(true, file_util::GetFileSize(path, &size));
3811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<char[]> buf(new char[size]);
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(size, file_util::ReadFile(path, buf.get(), size));
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1, d.response_started_count())
38162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "request failed: " << r.status().status()
38172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << ", error: " << r.status().error();
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(size, d.bytes_received());
38222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(std::string(&buf[0], size), d.data_received());
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) {
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.EnableChunkedUpload();
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChunksToUpload(&r);
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
383890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyReceivedDataMatchesChunks(&r, &d);
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) {
38452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
38462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
38482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
38492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
38502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.EnableChunkedUpload();
38512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.set_method("POST");
38522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
38532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(r.is_pending());
38542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChunksToUpload(&r);
385590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
38562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyReceivedDataMatchesChunks(&r, &d);
38582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
38592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
38602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) {
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.EnableChunkedUpload();
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
387290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChunksToUpload(&r);
387490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyReceivedDataMatchesChunks(&r, &d);
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ResponseHeadersTest) {
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("files/with-headers.html"), &d, &default_context_);
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
388790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HttpResponseHeaders* headers = req.response_headers();
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simple sanity check that response_info() accesses the same data.
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(headers, req.response_info().headers.get());
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string header;
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header));
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("private", header);
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header.clear();
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header));
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("text/html; charset=ISO-8859-1", header);
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The response has two "X-Multiple-Entries" headers.
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This verfies our output has them concatenated together.
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header.clear();
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header));
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("a, b", header);
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTS) {
3910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
3911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer https_test_server(
3912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_options,
39142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest request(
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_test_server.GetURL("files/hsts-headers.html"),
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &d,
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &default_context_);
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request.Start();
392390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState* security_state =
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_context_.transport_security_state();
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sni_available = true;
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState::DomainState domain_state;
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(security_state->GetDomainState(
3930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            domain_state.upgrade_mode);
39337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(domain_state.sts_include_subdomains);
39347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.pkp_include_subdomains);
3935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
3936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Android's CertVerifyProc does not (yet) handle pins.
3937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
3938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(domain_state.HasPublicKeyPins());
3939eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
3940eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
3941eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Android's CertVerifyProc does not (yet) handle pins. Therefore, it will
3943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// reject HPKP headers, and a test setting only HPKP headers will fail (no
3944eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// DomainState present because header rejected).
3945eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
3946eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_ProcessPKP DISABLED_ProcessPKP
3947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
3948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_ProcessPKP ProcessPKP
3949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
3950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that enabling HPKP on a domain does not affect the HSTS
3952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// validity/expiration.
3953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, MAYBE_ProcessPKP) {
3954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpawnedTestServer::SSLOptions ssl_options;
3955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpawnedTestServer https_test_server(
3956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpawnedTestServer::TYPE_HTTPS,
3957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ssl_options,
3958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
3959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(https_test_server.Start());
3960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
3962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  URLRequest request(
3963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      https_test_server.GetURL("files/hpkp-headers.html"),
3964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &d,
3965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &default_context_);
3966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  request.Start();
3967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::MessageLoop::current()->Run();
3968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TransportSecurityState* security_state =
3970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      default_context_.transport_security_state();
3971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool sni_available = true;
3972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TransportSecurityState::DomainState domain_state;
3973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(security_state->GetDomainState(
3974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
3975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(TransportSecurityState::DomainState::MODE_DEFAULT,
3976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            domain_state.upgrade_mode);
3977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(domain_state.sts_include_subdomains);
3978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(domain_state.pkp_include_subdomains);
3979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(domain_state.HasPublicKeyPins());
3980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_NE(domain_state.upgrade_expiry,
3981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            domain_state.dynamic_spki_hashes_expiry);
39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTSOnce) {
3985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
3986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer https_test_server(
3987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_options,
39892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest request(
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_test_server.GetURL("files/hsts-multiple-headers.html"),
39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &d,
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &default_context_);
39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request.Start();
399890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have set parameters from the first header, not the second.
40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState* security_state =
40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_context_.transport_security_state();
40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sni_available = true;
40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState::DomainState domain_state;
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(security_state->GetDomainState(
4006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            domain_state.upgrade_mode);
40097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.sts_include_subdomains);
40107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.pkp_include_subdomains);
40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) {
4014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
4015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer https_test_server(
4016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
4018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
4019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
4020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestDelegate d;
4022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest request(
4023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      https_test_server.GetURL("files/hsts-and-hpkp-headers.html"),
4024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &d,
4025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &default_context_);
4026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request.Start();
402790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
4028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // We should have set parameters from the first header, not the second.
4030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TransportSecurityState* security_state =
4031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default_context_.transport_security_state();
4032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool sni_available = true;
4033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TransportSecurityState::DomainState domain_state;
4034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(security_state->GetDomainState(
4035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
4036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
4037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            domain_state.upgrade_mode);
4038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID)
4039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Android's CertVerifyProc does not (yet) handle pins.
4040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
4041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(domain_state.HasPublicKeyPins());
4042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
4043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(domain_state.upgrade_expiry,
4044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            domain_state.dynamic_spki_hashes_expiry);
4045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Even though there is an HSTS header asserting includeSubdomains, it is
40477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the *second* such header, and we MUST process only the first.
40487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.sts_include_subdomains);
40497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // includeSubdomains does not occur in the test HPKP header.
40507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.pkp_include_subdomains);
4051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4053eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that when multiple HPKP headers are present, asserting different
4054eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// policies, that only the first such policy is processed.
4055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, ProcessSTSAndPKP2) {
4056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpawnedTestServer::SSLOptions ssl_options;
4057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpawnedTestServer https_test_server(
4058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpawnedTestServer::TYPE_HTTPS,
4059eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ssl_options,
4060eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
4061eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(https_test_server.Start());
4062eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4063eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
4064eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  URLRequest request(
4065eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      https_test_server.GetURL("files/hsts-and-hpkp-headers2.html"),
4066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &d,
4067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &default_context_);
4068eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  request.Start();
4069eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::MessageLoop::current()->Run();
4070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4071eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TransportSecurityState* security_state =
4072eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      default_context_.transport_security_state();
4073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool sni_available = true;
4074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TransportSecurityState::DomainState domain_state;
4075eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(security_state->GetDomainState(
4076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
4077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
4078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            domain_state.upgrade_mode);
4079eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
4080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Android's CertVerifyProc does not (yet) handle pins.
4081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
4082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(domain_state.HasPublicKeyPins());
4083eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
4084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_NE(domain_state.upgrade_expiry,
4085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            domain_state.dynamic_spki_hashes_expiry);
4086eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4087eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(domain_state.sts_include_subdomains);
4088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(domain_state.pkp_include_subdomains);
4089eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
4090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) {
40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL(
40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/content-type-normalization.html"), &d, &default_context_);
40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
409890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type;
41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.GetMimeType(&mime_type);
41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("text/html", mime_type);
41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string charset;
41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.GetCharset(&charset);
41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("utf-8", charset);
41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Cancel();
41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictRedirects) {
4111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
4112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  GURL file_url("file:///foo.txt");
4113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  GURL data_url("data:,foo");
4114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FileProtocolHandler file_protocol_handler;
4115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url));
4116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DataProtocolHandler data_protocol_handler;
4117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(data_protocol_handler.IsSafeRedirectTarget(data_url));
4118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
4119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
4120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(job_factory_.IsSafeRedirectTarget(file_url));
4121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(job_factory_.IsSafeRedirectTarget(data_url));
4122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
4123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RestrictRedirects) {
41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL(
41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/redirect-to-file.html"), &d, &default_context_);
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
413190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().error());
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) {
41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL(
41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/redirect-to-invalid-url.html"), &d, &default_context_);
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
414490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_INVALID_URL, req.status().error());
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) {
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
4156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("http://user:pass@foo.com/");
41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
415890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("http://foo.com/"), d.data_received());
41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) {
4164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
4165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestDelegate d;
4167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest req(
4168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
4169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("http://foo.com/test#fragment");
4170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.Start();
417190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
4172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(std::string("http://foo.com/test"), d.data_received());
4174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) {
4177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
4178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestDelegate d;
4180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest req(
4181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
4182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("http://foo.com/test#fragment");
4183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("");
4184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.Start();
418590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
4186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(std::string("None"), d.data_received());
4188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelRedirect) {
41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_cancel_in_received_redirect(true);
41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("files/redirect-test.html"), &d, &default_context_);
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
419990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DeferredRedirect) {
42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_quit_on_redirect(true);
4214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL test_url(test_server_.GetURL("files/redirect-test.html"));
4215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest req(test_url, &d, &default_context_);
4216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    req.Start();
4218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
4219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, d.received_redirect_count());
4221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    req.FollowDeferredRedirect();
4223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
4224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, d.response_started_count());
4226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(d.received_data_before_response());
4227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
4228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::FilePath path;
4230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PathService::Get(base::DIR_SOURCE_ROOT, &path);
4231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.Append(FILE_PATH_LITERAL("net"));
4232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.Append(FILE_PATH_LITERAL("data"));
4233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
4234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
4235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string contents;
4237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(file_util::ReadFileToString(path, &contents));
4238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(contents, d.data_received());
4239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
4240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
4241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, DeferredRedirect_GetFullRequestHeaders) {
4243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server_.Start());
4244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
4246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
4247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    d.set_quit_on_redirect(true);
4248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL test_url(test_server_.GetURL("files/redirect-test.html"));
4249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest req(test_url, &d, &default_context_);
4250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(d.have_full_request_headers());
4252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
425490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.received_redirect_count());
4257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(d.have_full_request_headers());
4258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CheckFullRequestHeaders(d.full_request_headers(), test_url);
4259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    d.ClearFullRequestHeaders();
42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.FollowDeferredRedirect();
426290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL target_url(test_server_.GetURL("files/with-headers.html"));
42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
4266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(d.have_full_request_headers());
4267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CheckFullRequestHeaders(d.full_request_headers(), target_url);
42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path;
42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(base::DIR_SOURCE_ROOT, &path);
42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("net"));
42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("data"));
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string contents;
42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(file_util::ReadFileToString(path, &contents));
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(contents, d.data_received());
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) {
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_quit_on_redirect(true);
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("files/redirect-test.html"), &d, &default_context_);
42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
429390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.received_redirect_count());
42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Cancel();
429890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, VaryHeader) {
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
431090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Populate the cache.
43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader("foo", "1");
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
431990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
432090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
432190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LoadTimingInfo load_timing_info;
432290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    req.GetLoadTimingInfo(&load_timing_info);
432390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Expect a cache hit.
43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader("foo", "1");
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
433590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(req.was_cached());
433890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
433990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LoadTimingInfo load_timing_info;
434090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    req.GetLoadTimingInfo(&load_timing_info);
434190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingCacheHitNoNetwork(load_timing_info);
43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
434490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Expect a cache miss.
43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader("foo", "2");
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
435390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(req.was_cached());
435690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
435790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LoadTimingInfo load_timing_info;
435890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    req.GetLoadTimingInfo(&load_timing_info);
435990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuth) {
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // populate the cache
43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
437490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // repeat request with end-to-end validation.  since auth-basic results in a
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cachable page, we expect this test to result in a 304.  in which case, the
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // response should be fetched from the cache.
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_load_flags(LOAD_VALIDATE_CACHE);
43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
439090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be the same cached document.
43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.was_cached());
43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that Set-Cookie headers in 401 responses are respected.
44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/6450
44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) {
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_requiring_auth =
44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("auth-basic?set-cookie-if-challenged");
44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Request a page that will give a 401 containing a Set-Cookie header.
44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that when the transaction is restarted, it includes the new cookie.
44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
44102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestURLRequestContext context(true);
44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.set_network_delegate(&network_delegate);
44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.Init();
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url_requiring_auth, &d, &context);
44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we sent the cookie in the restarted transaction.
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        != std::string::npos);
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same test as above, except this time the restart is initiated earlier
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (without user intervention since identity is embedded in the URL).
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
44332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestURLRequestContext context(true);
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.set_network_delegate(&network_delegate);
44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.Init();
44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL::Replacements replacements;
44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string username("user2");
44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string password("secret");
44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacements.SetUsernameStr(username);
44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacements.SetPasswordStr(password);
44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements);
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url_with_identity, &d, &context);
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos);
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we sent the cookie in the restarted transaction.
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        != std::string::npos);
44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that load timing works as expected with auth and the cache.
44612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) {
44622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
44632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // populate the cache
44652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
44662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestDelegate d;
44672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
44682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
44702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
44712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
447290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
44732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
44752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info_before_auth;
44772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth(
44782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &load_timing_info_before_auth));
44792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info_before_auth,
44802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            CONNECT_TIMING_HAS_DNS_TIMES);
44812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info;
44832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.GetLoadTimingInfo(&load_timing_info);
44842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The test server does not support keep alive sockets, so the second
44852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // request with auth should use a new socket.
44862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
44872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(load_timing_info_before_auth.socket_log_id,
44882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              load_timing_info.socket_log_id);
44892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_LE(load_timing_info_before_auth.receive_headers_end,
44902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              load_timing_info.connect_timing.connect_start);
44912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
44922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
449390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Repeat request with end-to-end validation.  Since auth-basic results in a
449490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // cachable page, we expect this test to result in a 304.  In which case, the
44952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // response should be fetched from the cache.
44962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
44972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestDelegate d;
44982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
44992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
45012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.set_load_flags(LOAD_VALIDATE_CACHE);
45022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
45032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
450490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
45052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
45072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Should be the same cached document.
45092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(r.was_cached());
45102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
451190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Since there was a request that went over the wire, the load timing
451290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // information should include connection times.
45132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info;
45142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.GetLoadTimingInfo(&load_timing_info);
451590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
45162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
45172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
45182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this test, we do a POST which the server will 302 redirect.
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The subsequent transaction should use GET, and should not send the
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Content-Type header.
45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/chromium/issues/detail?id=843
45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Post302RedirectGet) {
45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello world";
45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("files/redirect-to-echoall"), &d, &default_context_);
45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("POST");
45322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set headers (some of which are specific to the POST).
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.AddHeadersFromString(
45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-Type: multipart/form-data; "
45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n"
45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,"
45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Accept-Language: en-US,en\r\n"
45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Accept-Charset: ISO-8859-1,*,utf-8\r\n"
45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-Length: 11\r\n"
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Origin: http://localhost:1337/");
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
454790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type;
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.GetMimeType(&mime_type);
45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("text/html", mime_type);
45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& data = d.data_received();
45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the post-specific headers were stripped:
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContainsString(data, "Content-Length:"));
45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContainsString(data, "Content-Type:"));
45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContainsString(data, "Origin:"));
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These extra request headers should not have been stripped.
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(data, "Accept:"));
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(data, "Accept-Language:"));
45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(data, "Accept-Charset:"));
45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following tests check that we handle mutating the request method for
45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTP redirects as expected.
45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/56373 and http://crbug.com/102130.
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect301Tests) {
45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = test_server_.GetURL("files/redirect301-to-echo");
45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "POST", "GET", true);
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect302Tests) {
45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = test_server_.GetURL("files/redirect302-to-echo");
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "POST", "GET", true);
45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect303Tests) {
45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = test_server_.GetURL("files/redirect303-to-echo");
45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "POST", "GET", true);
45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "PUT", "GET", true);
45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect307Tests) {
46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = test_server_.GetURL("files/redirect307-to-echo");
46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "POST", "POST", true);
46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) {
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello world";
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("POST");
46182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kContentLength,
46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::UintToString(arraysize(kData) - 1));
46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestRedirectJob* job = new URLRequestRedirectJob(
46252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &req, &default_network_delegate_, test_server_.GetURL("echo"),
46262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      URLRequestRedirectJob::REDIRECT_302_FOUND);
46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job);
46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
463090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("GET", req.method());
46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) {
46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello world";
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("POST");
46422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kContentLength,
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::UintToString(arraysize(kData) - 1));
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestRedirectJob* job = new URLRequestRedirectJob(
46492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &req, &default_network_delegate_, test_server_.GetURL("echo"),
46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT);
46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job);
46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
465490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("POST", req.method());
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kData, d.data_received());
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default A-L header is sent.
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) {
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StaticHttpUserAgentSettings settings("en", EmptyString());
46642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_http_user_agent_settings(&settings);
46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("echoheader?Accept-Language"), &d, &context);
46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
467490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("en", d.data_received());
46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that an empty A-L header is not sent. http://crbug.com/77365.
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) {
46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StaticHttpUserAgentSettings settings(EmptyString(), EmptyString());
46832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We override the language after initialization because empty entries
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // get overridden by Init().
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_http_user_agent_settings(&settings);
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("echoheader?Accept-Language"), &d, &context);
46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
469590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("None", d.data_received());
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the A-L header, the default is not appended.
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/20894
47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) {
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?Accept-Language"),
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru");
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
471290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("ru"), d.data_received());
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default A-E header is sent.
47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) {
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"),
47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
472790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(d.data_received(), "gzip"));
47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the A-E header, the default is not appended.
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/47381
47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) {
47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"),
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity");
47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
474490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContainsString(d.data_received(), "gzip"));
47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(d.data_received(), "identity"));
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that setting the A-C header sends the proper header.
47502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, SetAcceptCharset) {
47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?Accept-Charset"),
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r");
47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
476190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("koi-8r"), d.data_received());
47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default User-Agent header is sent.
47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultUserAgent) {
47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?User-Agent"),
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
477490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(req.context()->GetUserAgent(req.url()), d.data_received());
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the User-Agent header,
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the default is not appended.
47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideUserAgent) {
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?User-Agent"),
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)");
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
479190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the net tests are being run with ChromeFrame then we need to allow for
47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the 'chromeframe' suffix which is added to the user agent before the
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closing parentheses.
47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(StartsWithASCII(d.data_received(), "Lynx (textmode", true));
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that a NULL HttpUserAgentSettings causes the corresponding empty
47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// User-Agent header to be sent but does not send the Accept-Language and
48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Accept-Charset headers.
48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) {
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We override the HttpUserAgentSettings after initialization because empty
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // entries get overridden by Init().
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_http_user_agent_settings(NULL);
48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* request;
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_response;
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = { { "echoheader?Accept-Language", "None" },
48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                { "echoheader?Accept-Charset", "None" },
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                { "echoheader?User-Agent", "" } };
48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); i++) {
48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server_.GetURL(tests[i].request), &d, &context);
48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
482390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_response, d.data_received())
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << " Request = \"" << tests[i].request << "\"";
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest passes on its priority updates to
48302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// newly-created jobs after the first one.
48312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) {
48322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
48332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
48352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
48362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
48372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<URLRequestRedirectJob> redirect_job =
48392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new URLRequestRedirectJob(
48402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &req, &default_network_delegate_, test_server_.GetURL("echo"),
48412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          URLRequestRedirectJob::REDIRECT_302_FOUND);
4842868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(redirect_job.get());
48432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(LOW);
48452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
48462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(req.is_pending());
48472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<URLRequestTestJob> job =
48492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new URLRequestTestJob(&req, &default_network_delegate_);
4850868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job.get());
48512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should trigger |job| to be started.
485390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
48542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, job->priority());
48552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
48562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSRequestTest : public testing::Test {
48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPSRequestTest() : default_context_(true) {
48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&default_network_delegate_);
48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.Init();
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HTTPSRequestTest() {}
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
48662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate default_network_delegate_;  // Must outlive URLRequest.
48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext default_context_;
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSGetTest) {
4871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
4872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::kLocalhost,
4874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
488390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckSSLInfo(r.ssl_info());
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server.host_port_pair().host(),
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server.host_port_pair().port(),
48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) {
4897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
4898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
4899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
4900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
4902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool err_allowed = true;
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      d.set_allow_certificate_errors(err_allowed);
4910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.Start();
49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.is_pending());
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
491590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1, d.response_started_count());
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(d.received_data_before_response());
49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(d.have_certificate_errors());
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (err_allowed) {
49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(0, d.bytes_received());
49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CheckSSLInfo(r.ssl_info());
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(0, d.bytes_received());
49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSExpiredTest) {
4931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
4932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_EXPIRED);
4933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
4934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
4936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterate from false to true, just so that we do the opposite of the
49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // previous test in order to increase test coverage.
49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool err_allowed = false;
49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      d.set_allow_certificate_errors(err_allowed);
4946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.Start();
49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.is_pending());
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1, d.response_started_count());
49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(d.received_data_before_response());
49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(d.have_certificate_errors());
49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (err_allowed) {
49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(0, d.bytes_received());
49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CheckSSLInfo(r.ssl_info());
49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(0, d.bytes_received());
49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests TLSv1.1 -> TLSv1 fallback. Verifies that we don't fall back more
49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than necessary.
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, TLSv1Fallback) {
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 default_version_max = SSLConfigService::default_version_max();
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The OpenSSL library in use may not support TLS 1.1.
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_OPENSSL)
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(default_version_max, SSL_PROTOCOL_VERSION_TLS1);
49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (default_version_max <= SSL_PROTOCOL_VERSION_TLS1)
49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
4978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_OK);
49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_options.tls_intolerant =
4980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
4981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
4982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
4984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_allow_certificate_errors(true);
4991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest r(test_server.GetURL(std::string()), &d, &context);
49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Start();
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
499490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, d.bytes_received());
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_TLS1),
49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SSLConnectionStatusToVersion(r.ssl_info().connection_status));
50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK);
50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a load of www.google.com with a certificate error sets
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the |certificate_errors_are_fatal| flag correctly. This flag will cause
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the interstitial to be fatal.
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) {
5007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
5009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We require that the URL be www.google.com in order to pick up the
50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preloaded HSTS entries in the TransportSecurityState. This means that we
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have to use a MockHostResolver in order to direct www.google.com to the
50182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // testserver. By default, MockHostResolver maps all hosts to 127.0.0.1.
50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHostResolver host_resolver;
50212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_host_resolver(&host_resolver);
50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState transport_security_state;
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_transport_security_state(&transport_security_state);
50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
50302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d",
50312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       test_server.host_port_pair().port())),
50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &d,
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &context);
50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Start();
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.is_pending());
50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
503890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(d.received_data_before_response());
50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(d.have_certificate_errors());
50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(d.certificate_errors_are_fatal());
50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that cached HTTPS page loads do not cause any updates to the
50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TransportSecurityState.
50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) {
50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matter. It just has to be any error.
5051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
5053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We require that the URL be www.google.com in order to pick up the
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preloaded and dynamic HSTS and public key pin entries in the
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TransportSecurityState. This means that we have to use a
50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MockHostResolver in order to direct www.google.com to the testserver.
50632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, MockHostResolver maps all hosts to 127.0.0.1.
50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHostResolver host_resolver;
50662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_host_resolver(&host_resolver);
50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState transport_security_state;
50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState::DomainState domain_state;
50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true,
50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &domain_state));
50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_transport_security_state(&transport_security_state);
50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
50782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d",
50792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       test_server.host_port_pair().port())),
50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &d,
50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &context);
50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Start();
50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.is_pending());
50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
508690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(d.received_data_before_response());
50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(d.have_certificate_errors());
50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(d.certificate_errors_are_fatal());
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a fresh copy of the state, and check that it hasn't been updated.
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState::DomainState new_domain_state;
50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true,
50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &new_domain_state));
50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(new_domain_state.upgrade_mode, domain_state.upgrade_mode);
50987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_domain_state.sts_include_subdomains,
50997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            domain_state.sts_include_subdomains);
51007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_domain_state.pkp_include_subdomains,
51017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            domain_state.pkp_include_subdomains);
51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FingerprintsEqual(new_domain_state.static_spki_hashes,
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                domain_state.static_spki_hashes));
51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FingerprintsEqual(new_domain_state.dynamic_spki_hashes,
51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                domain_state.dynamic_spki_hashes));
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FingerprintsEqual(new_domain_state.bad_static_spki_hashes,
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                domain_state.bad_static_spki_hashes));
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure HSTS preserves a POST request's method and body.
51112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HTTPSRequestTest, HSTSPreservesPosts) {
51122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kData[] = "hello world";
51132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_OK);
5116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
51202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server.Start());
51212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Per spec, TransportSecurityState expects a domain name, rather than an IP
51242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // address, so a MockHostResolver is needed to redirect www.somewhere.com to
5125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the SpawnedTestServer.  By default, MockHostResolver maps all hosts
5126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to 127.0.0.1.
51272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockHostResolver host_resolver;
51282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force https for www.somewhere.com.
51302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TransportSecurityState transport_security_state;
51312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
51322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool include_subdomains = false;
51332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transport_security_state.AddHSTS("www.somewhere.com", expiry,
51342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   include_subdomains);
51352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
51372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestURLRequestContext context(true);
51392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context.set_host_resolver(&host_resolver);
51402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context.set_transport_security_state(&transport_security_state);
51412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context.set_network_delegate(&network_delegate);
51422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context.Init();
51432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
51452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will
51462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // cause a certificate error.  Ignore the error.
51472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  d.set_allow_certificate_errors(true);
51482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(GURL(base::StringPrintf("http://www.somewhere.com:%d/echo",
51502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         test_server.host_port_pair().port())),
51512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &d,
51522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &context);
51532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_method("POST");
51542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
51552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
515790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
51582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("https", req.url().scheme());
51602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("POST", req.method());
51612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kData, d.data_received());
5162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LoadTimingInfo load_timing_info;
5164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  network_delegate.GetLoadTimingInfoBeforeRedirect(&load_timing_info);
5165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // LoadTimingInfo of HSTS redirects is similar to that of network cache hits
5166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestLoadTimingCacheHitNoNetwork(load_timing_info);
51672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
51682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, SSLv3Fallback) {
5170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_OK);
5172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.tls_intolerant =
5173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL;
5174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_allow_certificate_errors(true);
5184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest r(test_server.GetURL(std::string()), &d, &context);
51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Start();
51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
518790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, d.bytes_received());
51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_SSL3),
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SSLConnectionStatusToVersion(r.ssl_info().connection_status));
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK);
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLClientAuthTestDelegate : public TestDelegate {
51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) {
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCertificateRequested(
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
52042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SSLCertRequestInfo* cert_request_info) OVERRIDE {
52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    on_certificate_requested_count_++;
520690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int on_certificate_requested_count() {
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return on_certificate_requested_count_;
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int on_certificate_requested_count_;
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(davidben): Test the rest of the code. Specifically,
52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Filtering which certificates to select.
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Sending a certificate back.
52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Getting a certificate request in an SSL renegotiation sending the
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   HTTP request.
52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, ClientAuthTest) {
5223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_options.request_client_certificate = true;
5225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientAuthTestDelegate d;
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
523890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.on_certificate_requested_count());
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send no certificate.
52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(davidben): Get temporary client cert import (with keys) working on
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // all platforms so we can test sending a cert as well.
52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.ContinueWithCertificate(NULL);
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
524990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, ResumeTest) {
52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that we attempt a session resume when making two connections to the
52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // same host.
5260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_options.record_resume = true;
5262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientSocket::ClearSessionCache();
52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
527890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CloseAllConnections();
52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
529490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The response will look like;
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   insert abc
52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   lookup abc
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   insert xyz
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // With a newline at the end which makes the split think that there are
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // four lines.
53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> lines;
53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SplitString(d.data_received(), '\n', &lines);
53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(4u, lines.size()) << d.data_received();
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string session_id;
53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < 2; i++) {
53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<std::string> parts;
53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::SplitString(lines[i], '\t', &parts);
53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(2u, parts.size());
53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i == 0) {
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ("insert", parts[0]);
53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        session_id = parts[1];
53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ("lookup", parts[0]);
53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(session_id, parts[1]);
53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) {
53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that sessions aren't resumed when the value of ssl_session_cache_shard
53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // differs.
5329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_options.record_resume = true;
5331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientSocket::ClearSessionCache();
53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
534790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now create a new HttpCache with a different ssl_session_cache_shard value.
53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpNetworkSession::Params params;
53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.host_resolver = default_context_.host_resolver();
53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.cert_verifier = default_context_.cert_verifier();
53567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  params.transport_security_state = default_context_.transport_security_state();
53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.proxy_service = default_context_.proxy_service();
53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.ssl_config_service = default_context_.ssl_config_service();
53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.http_auth_handler_factory =
53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_context_.http_auth_handler_factory();
53612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.network_delegate = &default_network_delegate_;
53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.http_server_properties = default_context_.http_server_properties();
53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.ssl_session_cache_shard = "alternate";
53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::HttpCache> cache(new net::HttpCache(
53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpNetworkSession(params),
53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HttpCache::DefaultBackend::InMemory(0)));
53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_context_.set_http_transaction_factory(cache.get());
53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
537990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The response will look like;
53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   insert abc
53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   insert xyz
53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // With a newline at the end which makes the split think that there are
53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // three lines.
53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> lines;
53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SplitString(d.data_received(), '\n', &lines);
53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(3u, lines.size());
53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string session_id;
53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < 2; i++) {
53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<std::string> parts;
53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::SplitString(lines[i], '\t', &parts);
53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(2u, parts.size());
53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ("insert", parts[0]);
53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i == 0) {
54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        session_id = parts[1];
54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(session_id, parts[1]);
54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSSLConfigService : public SSLConfigService {
54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5410558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  TestSSLConfigService(bool ev_enabled,
5411558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       bool online_rev_checking,
5412558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       bool rev_checking_required_local_anchors)
54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ev_enabled_(ev_enabled),
5414558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        online_rev_checking_(online_rev_checking),
5415558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        rev_checking_required_local_anchors_(
5416558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            rev_checking_required_local_anchors) {}
54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSLConfigService:
54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetSSLConfig(SSLConfig* config) OVERRIDE {
54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *config = SSLConfig();
54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config->rev_checking_enabled = online_rev_checking_;
54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config->verify_ev_cert = ev_enabled_;
5423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    config->rev_checking_required_local_anchors =
5424558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        rev_checking_required_local_anchors_;
54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestSSLConfigService() {}
54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool ev_enabled_;
54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool online_rev_checking_;
5433558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const bool rev_checking_required_local_anchors_;
54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This the fingerprint of the "Testing CA" certificate used by the testserver.
54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See net/data/ssl/certificates/ocsp-test-root.pem.
54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const SHA1HashValue kOCSPTestCertFingerprint =
54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { { 0xf1, 0xad, 0xf6, 0xce, 0x42, 0xac, 0xe7, 0xb4, 0xf4, 0x24,
54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xdb, 0x1a, 0xf7, 0xa0, 0x9f, 0x09, 0xa1, 0xea, 0xf1, 0x5c } };
54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5442a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// This is the SHA256, SPKI hash of the "Testing CA" certificate used by the
5443a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// testserver.
5444a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)static const SHA256HashValue kOCSPTestCertSPKI = { {
5445a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0xee, 0xe6, 0x51, 0x2d, 0x4c, 0xfa, 0xf7, 0x3e,
5446a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x6c, 0xd8, 0xca, 0x67, 0xed, 0xb5, 0x5d, 0x49,
5447a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x76, 0xe1, 0x52, 0xa7, 0x6e, 0x0e, 0xa0, 0x74,
5448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x09, 0x75, 0xe6, 0x23, 0x24, 0xbd, 0x1b, 0x28,
5449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} };
5450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the policy OID contained in the certificates that testserver
54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generates.
54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1";
54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSOCSPTest : public HTTPSRequestTest {
54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPSOCSPTest()
54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : context_(true),
54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ev_test_policy_(
54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(),
54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   kOCSPTestCertFingerprint,
54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   kOCSPTestCertPolicy)) {
54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupContext(&context_);
54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_.Init();
54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::X509Certificate> root_cert =
5470558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem");
54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert);
5472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    test_root_.reset(new ScopedTestRoot(root_cert.get()));
54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_NSS) || defined(OS_IOS)
54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetURLRequestContextForNSSHttpIO(&context_);
54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnsureNSSHttpIOInit();
54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options,
54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    CertStatus* out_cert_status) {
54822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We always overwrite out_cert_status.
54832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_cert_status = 0;
5484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SpawnedTestServer test_server(
5485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SpawnedTestServer::TYPE_HTTPS,
5486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ssl_options,
5487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_server.Start());
54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_allow_certificate_errors(true);
5492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server.GetURL(std::string()), &d, &context_);
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
549590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out_cert_status = r.ssl_info().cert_status;
54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~HTTPSOCSPTest() {
55022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_NSS) || defined(OS_IOS)
55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShutdownNSSHttpIO();
55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetupContext configures the URLRequestContext that will be used for making
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connetions to testserver. This can be overridden in test subclasses for
55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // different behaviour.
55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupContext(URLRequestContext* context) {
55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_ssl_config_service(
55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestSSLConfigService(true /* check for EV */,
5514558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 true /* online revocation checking */,
5515558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 false /* require rev. checking for local
5516558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                          anchors */));
55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedTestRoot> test_root_;
55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context_;
55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedTestEVPolicy> ev_test_policy_;
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() {
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't
55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have that ability on other platforms.
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION;
55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5534558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// SystemSupportsHardFailRevocationChecking returns true iff the current
5535558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// operating system supports revocation checking and can distinguish between
5536558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// situations where a given certificate lacks any revocation information (eg:
5537558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// no CRLDistributionPoints and no OCSP Responder AuthorityInfoAccess) and when
5538558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// revocation information cannot be obtained (eg: the CRL was unreachable).
5539558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// If it does not, then tests which rely on 'hard fail' behaviour should be
5540558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// skipped.
5541558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstatic bool SystemSupportsHardFailRevocationChecking() {
5542558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) || defined(USE_NSS) || defined(OS_IOS)
5543558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return true;
5544558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#else
5545558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return false;
5546558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
5547558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
5548558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SystemUsesChromiumEVMetadata returns true iff the current operating system
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// several tests are effected because our testing EV certificate won't be
55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recognised as EV.
55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SystemUsesChromiumEVMetadata() {
55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_OPENSSL)
55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/117478 - OpenSSL does not support EV validation.
55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
55572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) && !defined(OS_IOS)
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On OS X, we use the system to tell us whether a certificate is EV or not
55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the system won't recognise our testing root.
55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SystemSupportsOCSP() {
55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_OPENSSL)
55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/117478 - OpenSSL does not support OCSP.
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::win::GetVersion() >= base::win::VERSION_VISTA;
55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Valid) {
55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Revoked) {
56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertStatus cert_status;
56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !(defined(OS_MACOSX) && !defined(OS_IOS))
56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Doesn't pass on OS X yet for reasons that need to be investigated.
56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Invalid) {
56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cert_status & CERT_STATUS_ALL_ERRORS);
56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Without a positive OCSP response, we shouldn't show the EV status.
56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5643558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass HTTPSHardFailTest : public HTTPSOCSPTest {
5644558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected:
5645558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual void SetupContext(URLRequestContext* context) OVERRIDE {
5646558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    context->set_ssl_config_service(
5647558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        new TestSSLConfigService(false /* check for EV */,
5648558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 false /* online revocation checking */,
5649558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 true /* require rev. checking for local
5650558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                         anchors */));
5651558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
5652558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
5653558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5654558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5655558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) {
5656558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!SystemSupportsOCSP()) {
5657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5658558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
5659558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
5660558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5661558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!SystemSupportsHardFailRevocationChecking()) {
5662558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    LOG(WARNING) << "Skipping test because system doesn't support hard fail "
5663558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 << "revocation checking";
5664558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
5665558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
5666558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5667558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  SpawnedTestServer::SSLOptions ssl_options(
5668558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      SpawnedTestServer::SSLOptions::CERT_AUTO);
5669558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
5670558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5671558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CertStatus cert_status;
5672558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DoConnection(ssl_options, &cert_status);
5673558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5674558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(CERT_STATUS_REVOKED,
5675558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            cert_status & CERT_STATUS_REVOKED);
5676558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5677558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Without a positive OCSP response, we shouldn't show the EV status.
5678558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
5679558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
5680558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSEVCRLSetTest : public HTTPSOCSPTest {
56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupContext(URLRequestContext* context) OVERRIDE {
56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_ssl_config_service(
56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestSSLConfigService(true /* check for EV */,
5686558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 false /* online revocation checking */,
5687558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 false /* require rev. checking for local
5688558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                          anchors */));
56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) {
56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>());
57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cert_status & CERT_STATUS_ALL_ERRORS);
57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) {
57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>());
57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertStatus cert_status;
57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) {
57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(
57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertStatus cert_status;
57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cert_status & CERT_STATUS_ALL_ERRORS);
57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5759a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, FreshCRLSetCovered) {
5760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
5761a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
5763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
5764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(
5769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::ForTesting(
5770a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          false, &kOCSPTestCertSPKI, "")));
57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // With a fresh CRLSet that covers the issuing certificate, we shouldn't do a
5776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // revocation check for EV.
57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
5780a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(
5781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
5782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5784a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, FreshCRLSetNotCovered) {
5785a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
5786a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5787a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
5788a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
5789a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5790a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5791a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
5793a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SSLConfigService::SetCRLSet(
5794a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::EmptyCRLSetForTesting()));
5795a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CertStatus cert_status = 0;
5797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
5798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Even with a fresh CRLSet, we should still do online revocation checks when
5800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the certificate chain isn't covered by the CRLSet, which it isn't in this
5801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // test.
5802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
5803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            cert_status & CERT_STATUS_ALL_ERRORS);
5804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
5806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
5807a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) {
58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that when EV verification is requested, but online revocation
58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // checking is disabled, and the leaf certificate is not in fact EV, that
58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no revocation checking actually happens.
58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unmark the certificate's OID as EV, which should disable revocation
58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // checking (as per the user preference)
58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev_test_policy_.reset();
58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(
58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertStatus cert_status;
58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSCRLSetTest : public HTTPSOCSPTest {
58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupContext(URLRequestContext* context) OVERRIDE {
58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_ssl_config_service(
58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestSSLConfigService(false /* check for EV */,
5843558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 false /* online revocation checking */,
5844558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                 false /* require rev. checking for local
5845558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                                          anchors */));
58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) {
5850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(
58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're not trying EV verification then, even if the CRLSet has expired,
58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we don't fall back to online revocation checks.
58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5866a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(HTTPSCRLSetTest, CRLSetRevoked) {
5867a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(USE_OPENSSL)
5868a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  LOG(WARNING) << "Skipping test because system doesn't support CRLSets";
5869a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return;
5870a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
5871a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5872a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5873a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5874a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
5875a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ssl_options.cert_serial = 10;
5876a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SSLConfigService::SetCRLSet(
5877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::ForTesting(
5878a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          false, &kOCSPTestCertSPKI, "\x0a")));
5879a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CertStatus cert_status = 0;
5881a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
5882a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5883a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // If the certificate is recorded as revoked in the CRLSet, that should be
5884a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // reflected without online revocation checking.
5885a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
5886a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
5887a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(
5888a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
5889a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_IOS)
58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_FTP_SUPPORT)
58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTestFTP : public URLRequestTest {
58945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestTestFTP()
5896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : test_server_(SpawnedTestServer::TYPE_FTP, SpawnedTestServer::kLocalhost,
58972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath()) {
58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server_;
59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure an FTP request using an unsafe ports fails.
59052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestFTP, UnsafePort) {
59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestJobFactoryImpl job_factory;
5909b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FtpNetworkLayer ftp_transaction_factory(default_context_.host_resolver());
59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("ftp://127.0.0.1:7");
59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job_factory.SetProtocolHandler(
59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ftp",
5914b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      new FtpProtocolHandler(&ftp_transaction_factory));
59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_context_.set_job_factory(&job_factory);
59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &default_context_);
59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_UNSAFE_PORT, r.status().error());
59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPDirectoryListing) {
59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("/"), &d, &default_context_);
59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
594190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(0, d.bytes_received());
59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPGetTestAnonymous) {
59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("/LICENSE"), &d, &default_context_);
59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
596790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
59715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
59845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPGetTest) {
59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"),
59945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
599990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
60035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
60122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
60132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info;
60142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.GetLoadTimingInfo(&load_timing_info);
601590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingNoHttpResponse(load_timing_info);
60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPassword) {
60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome",
60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_password"),
60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
603790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), 0);
60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPasswordRestart) {
60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
60545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set correct login credentials. The delegate will be asked for them when
60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the initial login with wrong credentials will fail.
60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_credentials(AuthCredentials(kChrome, kChrome));
60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome",
60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_password"),
60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
607090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUser) {
60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_user",
60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome"),
60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
610090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), 0);
61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUserRestart) {
61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set correct login credentials. The delegate will be asked for them when
61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the initial login with wrong credentials will fail.
61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_credentials(AuthCredentials(kChrome, kChrome));
61235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
61245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
61255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
61265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_user",
61275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome"),
61285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
61295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
61305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
61315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
61325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
613390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
61345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
61365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
61375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
61395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
61405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
61415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
61425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
61435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
61465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCacheURLCredentials) {
61475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
61485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
61505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
61515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
61525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestDelegate> d(new TestDelegate);
61545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
61555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pass correct login identity in the URL.
61565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
61585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome",
61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome"),
61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        d.get(),
61615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
616590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d->response_started_count());
61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.reset(new TestDelegate);
61775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
61785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This request should use cached identity from previous request.
61795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_);
61805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
61815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
61825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
618390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
61845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
61895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d->response_started_count());
61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCacheLoginBoxCredentials) {
61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
62015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestDelegate> d(new TestDelegate);
62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set correct login credentials. The delegate will be asked for them when
62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the initial login with wrong credentials will fail.
62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d->set_credentials(AuthCredentials(kChrome, kChrome));
62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome",
62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_password"),
62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        d.get(),
62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
62155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
62165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
621790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
62205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
62215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
62235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d->response_started_count());
62245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
62255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
62265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
62275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a new delegate without explicit credentials. The cached ones should be
62295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used.
62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.reset(new TestDelegate);
62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
62325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't pass wrong credentials in the URL, they would override valid cached
62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ones.
62345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_);
62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
623890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d->response_started_count());
62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(DISABLE_FTP_SUPPORT)
62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
6252