url_request_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shlobj.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_util.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/capturing_net_log.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_flags.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info_test_util.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_unittest.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_module.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_data_directory.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_bytes_element_reader.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_data_stream.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/upload_file_element_reader.h"
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/ev_root_ca_metadata.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/test_root_certs.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_store_test_helpers.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ftp/ftp_network_layer.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_layer.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/ocsp/nss_ocsp.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_connection_status_flags.h"
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/test/cert_test_util.h"
60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/data_protocol_handler.h"
62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/url_request/file_protocol_handler.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/ftp_protocol_handler.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/static_http_user_agent_settings.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_file_dir_job.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_http_job.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory_impl.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_redirect_job.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_job.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_com_initializer.h"
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/win/scoped_comptr.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kChrome(ASCIIToUTF16("chrome"));
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kSecret(ASCIIToUTF16("secret"));
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::string16 kUser(ASCIIToUTF16("user"));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests load timing information in the case a fresh connection was used, with
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// no proxy.
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             int connect_timing_flags) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.socket_reused);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info.request_start,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            load_timing_info.connect_timing.connect_start);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              connect_timing_flags);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info.connect_timing.connect_end,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            load_timing_info.send_start);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but with proxy times.
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestLoadTimingNotReusedWithProxy(
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const net::LoadTimingInfo& load_timing_info,
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int connect_timing_flags) {
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.socket_reused);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.request_start,
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.proxy_resolve_start);
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.proxy_resolve_start,
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.proxy_resolve_end);
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.proxy_resolve_end,
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.connect_timing.connect_start);
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              connect_timing_flags);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.connect_timing.connect_end,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.send_start);
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but with a reused socket and proxy times.
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TestLoadTimingReusedWithProxy(
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const net::LoadTimingInfo& load_timing_info) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.socket_reused);
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.request_start,
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.proxy_resolve_start);
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.proxy_resolve_start,
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.proxy_resolve_end);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.proxy_resolve_end,
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_info.send_start);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests load timing information in the case of a cache hit, when no cache
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// validation request was sent over the wire.
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestLoadTimingCacheHitNoNetwork(
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const net::LoadTimingInfo& load_timing_info) {
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.socket_reused);
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_LE(load_timing_info.request_start, load_timing_info.send_start);
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests load timing in the case that there is no HTTP response.  This can be
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// used to test in the case of errors or non-HTTP requests.
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TestLoadTimingNoHttpResponse(
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const net::LoadTimingInfo& load_timing_info) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.socket_reused);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only the request times should be non-null.
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(load_timing_info.request_start.is_null());
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.send_start.is_null());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.send_end.is_null());
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(load_timing_info.receive_headers_end.is_null());
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::StringPiece TestNetResourceProvider(int key) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "header";
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do a case-insensitive search through |haystack| for |needle|.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContainsString(const std::string& haystack, const char* needle) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string::const_iterator it =
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::search(haystack.begin(),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  haystack.end(),
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  needle,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  needle + strlen(needle),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::CaseInsensitiveCompare<char>());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return it != haystack.end();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FillBuffer(char* buffer, size_t len) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool called = false;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!called) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    called = true;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int seed = static_cast<int>(Time::Now().ToInternalValue());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    srand(seed);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < len; i++) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer[i] = static_cast<char>(rand());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!buffer[i])
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer[i] = 'g';
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UploadDataStream* CreateSimpleUploadData(const char* data) {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<UploadElementReader> reader(
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new UploadBytesElementReader(data, strlen(data)));
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return UploadDataStream::CreateWithReader(reader.Pass(), 0);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that the SSLInfo of a successful SSL connection has valid values.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckSSLInfo(const SSLInfo& ssl_info) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow ChromeFrame fake SSLInfo to get through.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ssl_info.cert.get() &&
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_info.cert.get()->issuer().GetDisplayName() == "Chrome Internal") {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -1 means unknown.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ssl_info.security_bits, -1);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -1 means unknown.  0 means no encryption.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(ssl_info.security_bits, 0);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cipher_suite = SSLConnectionStatusToCipherSuite(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_info.connection_status);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, cipher_suite);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid CheckFullRequestHeaders(const HttpRequestHeaders& headers,
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             const GURL& host_url) {
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string sent_value;
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(headers.GetHeader("Host", &sent_value));
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(GetHostAndOptionalPort(host_url), sent_value);
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(headers.GetHeader("Connection", &sent_value));
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("keep-alive", sent_value);
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FingerprintsEqual(const HashValueVector& a, const HashValueVector& b) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size = a.size();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size != b.size())
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < size; ++i) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!a[i].Equals(b[i]))
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A network delegate that allows the user to choose a subset of request stages
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to block in. When blocking, the delegate can do one of the following:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  * synchronously return a pre-specified error code, or
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  * asynchronously return that value via an automatically called callback,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    or
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  * block and wait for the user to do a callback.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additionally, the user may also specify a redirect URL -- then each request
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with the current URL different from the redirect target will be redirected
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to that target, in the on-before-URL-request stage, independent of whether
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the delegate blocks in ON_BEFORE_URL_REQUEST or not.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockingNetworkDelegate : public TestNetworkDelegate {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stages in which the delegate can block.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Stage {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOT_BLOCKED = 0,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_BEFORE_URL_REQUEST = 1 << 0,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_BEFORE_SEND_HEADERS = 1 << 1,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_HEADERS_RECEIVED = 1 << 2,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ON_AUTH_REQUIRED = 1 << 3
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Behavior during blocked stages.  During other stages, just
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns net::OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum BlockMode {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SYNCHRONOUS,    // No callback, returns specified return values.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AUTO_CALLBACK,  // |this| posts a task to run the callback using the
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // specified return codes.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    USER_CALLBACK,  // User takes care of doing a callback.  |retval_| and
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // |auth_retval_| are ignored. In every blocking stage the
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // message loop is quit.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a delegate which does not block at all.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit BlockingNetworkDelegate(BlockMode block_mode);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For users to trigger a callback returning |response|.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Side-effects: resets |stage_blocked_for_callback_| and stored callbacks.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only call if |block_mode_| == USER_CALLBACK.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoCallback(int response);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoAuthCallback(NetworkDelegate::AuthRequiredResponse response);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setters.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_retval(int retval) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(USER_CALLBACK, block_mode_);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(ERR_IO_PENDING, retval);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(OK, retval);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    retval_ = retval;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |auth_retval| == AUTH_REQUIRED_RESPONSE_SET_AUTH, then
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |auth_credentials_| will be passed with the response.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_auth_retval(AuthRequiredResponse auth_retval) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(USER_CALLBACK, block_mode_);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auth_retval_ = auth_retval;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_auth_credentials(const AuthCredentials& auth_credentials) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auth_credentials_ = auth_credentials;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_redirect_url(const GURL& url) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    redirect_url_ = url;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_block_on(int block_on) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    block_on_ = block_on;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows the user to check in which state did we block.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stage stage_blocked_for_callback() const {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(USER_CALLBACK, block_mode_);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return stage_blocked_for_callback_;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunCallback(int response, const CompletionCallback& callback);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunAuthCallback(AuthRequiredResponse response,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const AuthCallback& callback);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TestNetworkDelegate implementation.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeURLRequest(URLRequest* request,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const CompletionCallback& callback,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 GURL* new_url) OVERRIDE;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnBeforeSendHeaders(URLRequest* request,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const CompletionCallback& callback,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  HttpRequestHeaders* headers) OVERRIDE;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnHeadersReceived(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CompletionCallback& callback,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const HttpResponseHeaders* original_response_headers,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired(
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AuthChallengeInfo& auth_info,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AuthCallback& callback,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AuthCredentials* credentials) OVERRIDE;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets the callbacks and |stage_blocked_for_callback_|.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether we should block in |stage|. If yes, returns an error code
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and optionally sets up callback based on |block_mode_|. If no, returns OK.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int MaybeBlockStage(Stage stage, const CompletionCallback& callback);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configuration parameters, can be adjusted by public methods:
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BlockMode block_mode_;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Values returned on blocking stages when mode is SYNCHRONOUS or
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int retval_;  // To be returned in non-auth stages.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthRequiredResponse auth_retval_;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL redirect_url_;  // Used if non-empty.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int block_on_;  // Bit mask: in which stages to block.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |auth_credentials_| will be copied to |*target_auth_credential_| on
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCredentials auth_credentials_;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCredentials* target_auth_credentials_;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal variables, not set by not the user:
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last blocked stage waiting for user callback (unused if |block_mode_| !=
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // USER_CALLBACK).
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stage stage_blocked_for_callback_;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback objects stored during blocking stages.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback_;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCallback auth_callback_;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BlockingNetworkDelegate::BlockingNetworkDelegate(BlockMode block_mode)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : block_mode_(block_mode),
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      retval_(OK),
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION),
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      block_on_(0),
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_auth_credentials_(NULL),
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stage_blocked_for_callback_(NOT_BLOCKED),
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this) {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::DoCallback(int response) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(USER_CALLBACK, block_mode_);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(NOT_BLOCKED, stage_blocked_for_callback_);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(ON_AUTH_REQUIRED, stage_blocked_for_callback_);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CompletionCallback callback = callback_;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunCallback(response, callback);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::DoAuthCallback(
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetworkDelegate::AuthRequiredResponse response) {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(USER_CALLBACK, block_mode_);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(ON_AUTH_REQUIRED, stage_blocked_for_callback_);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCallback auth_callback = auth_callback_;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAuthCallback(response, auth_callback);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::RunCallback(int response,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const CompletionCallback& callback) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(response);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response,
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const AuthCallback& callback) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(target_auth_credentials_ != NULL);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *target_auth_credentials_ = auth_credentials_;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(response);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnBeforeURLRequest(
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL* new_url) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (redirect_url_ == request->url())
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;  // We've already seen this request and redirected elsewhere.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!redirect_url_.is_empty())
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *new_url = redirect_url_;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnBeforeSendHeaders(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders* headers) {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::OnHeadersReceived(
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const HttpResponseHeaders* original_response_headers,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<HttpResponseHeaders>* override_response_headers) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkDelegate::OnHeadersReceived(
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request, callback, original_response_headers,
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      override_response_headers);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MaybeBlockStage(ON_HEADERS_RECEIVED, callback);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired(
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest* request,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AuthChallengeInfo& auth_info,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AuthCallback& callback,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AuthCredentials* credentials) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkDelegate::OnAuthRequired(request, auth_info, callback,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      credentials);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the user has provided callback for the previous blocked stage.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((block_on_ & ON_AUTH_REQUIRED) == 0) {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return AUTH_REQUIRED_RESPONSE_NO_ACTION;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_auth_credentials_ = credentials;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (block_mode_) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SYNCHRONOUS:
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *target_auth_credentials_ = auth_credentials_;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return auth_retval_;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case AUTO_CALLBACK:
51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BlockingNetworkDelegate::RunAuthCallback,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     weak_factory_.GetWeakPtr(), auth_retval_, callback));
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return AUTH_REQUIRED_RESPONSE_IO_PENDING;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case USER_CALLBACK:
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      auth_callback_ = callback;
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stage_blocked_for_callback_ = ON_AUTH_REQUIRED;
52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostTask(FROM_HERE,
52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                             base::MessageLoop::QuitClosure());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return AUTH_REQUIRED_RESPONSE_IO_PENDING;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return AUTH_REQUIRED_RESPONSE_NO_ACTION;  // Dummy value.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BlockingNetworkDelegate::Reset() {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(NOT_BLOCKED, stage_blocked_for_callback_);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stage_blocked_for_callback_ = NOT_BLOCKED;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_.Reset();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auth_callback_.Reset();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BlockingNetworkDelegate::MaybeBlockStage(
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlockingNetworkDelegate::Stage stage,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CompletionCallback& callback) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the user has provided callback for the previous blocked stage.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((block_on_ & stage) == 0) {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return OK;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (block_mode_) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case SYNCHRONOUS:
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(OK, retval_);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return retval_;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case AUTO_CALLBACK:
55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostTask(
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&BlockingNetworkDelegate::RunCallback,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     weak_factory_.GetWeakPtr(), retval_, callback));
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ERR_IO_PENDING;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case USER_CALLBACK:
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_ = callback;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stage_blocked_for_callback_ = stage;
56590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostTask(FROM_HERE,
56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                             base::MessageLoop::QuitClosure());
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ERR_IO_PENDING;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestURLRequestContextWithProxy : public TestURLRequestContext {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does not own |delegate|.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy(const std::string& proxy,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 NetworkDelegate* delegate)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TestURLRequestContext(true) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_network_delegate(delegate);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Init();
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestURLRequestContextWithProxy() {}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inherit PlatformTest since we require the autorelease pool on Mac OS X.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTest : public PlatformTest {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestTest() : default_context_(true) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&default_network_delegate_);
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_context_.set_net_log(&net_log_);
594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    job_factory_.SetProtocolHandler("data", new DataProtocolHandler);
595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    job_factory_.SetProtocolHandler("file", new FileProtocolHandler);
596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    default_context_.set_job_factory(&job_factory_);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.Init();
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~URLRequestTest() {}
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds the TestJobInterceptor to the default context.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestJobInterceptor* AddTestInterceptor() {
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestJobInterceptor* protocol_handler_ = new TestJobInterceptor();
604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    job_factory_.SetProtocolHandler("http", NULL);
605b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    job_factory_.SetProtocolHandler("http", protocol_handler_);
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return protocol_handler_;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog net_log_;
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate default_network_delegate_;  // Must outlive URLRequest.
612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  URLRequestJobFactoryImpl job_factory_;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext default_context_;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, AboutBlankTest) {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("about:blank"), &d, &default_context_);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), 0);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("", r.GetSocketAddress().host());
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.GetSocketAddress().port());
631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HttpRequestHeaders headers;
633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(r.GetFullRequestHeaders(&headers));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DataURLImageTest) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use our nice little Chrome logo.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL(
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "data:image/png;base64,"
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUBBjG3"
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQxIEVxitD"
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI5MpCVdW0gO7t"
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "vNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKzMx1+fg9bAgK6zHq9"
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7CkIMDxQpF7r/MWq12UctI1"
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0WYUqt57yWf2McHTObYPbVD+Z"
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "wbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2HQQcm43XwmtoYM6vVKleh0uoWvnzW"
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nkDFHF9ZS+uYVjRUasMeHUmyLYtcklTvzW"
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GFZnNOXczThvpKIzjcahSqIzkvDLayDq6D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTb"
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "xXX1T5xsV9tm9r4TQwHLiZw/pdDZJea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5"
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "MrVvMzNaI3+ERHfrFzPKQukrQGI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gV"
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Md6q5c8GdosynKmSeRuGzpjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq"
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "/uxxZKzNiZFGD0wRC3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7F"
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "Ux1qLnV7MGF40smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufB"
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "JbsysjjW4kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJM"
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "nlm2O34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfm"
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "moRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV5En"
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "hORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="),
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), 911);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("", r.GetSocketAddress().host());
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.GetSocketAddress().port());
674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HttpRequestHeaders headers;
676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(r.GetFullRequestHeaders(&headers));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTest) {
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::FILE_EXE, &app_path);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL app_url = FilePathToFileURL(app_path);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(app_url, &d, &default_context_);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = -1;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(file_util::GetFileSize(app_path, &file_size));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("", r.GetSocketAddress().host());
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.GetSocketAddress().port());
703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HttpRequestHeaders headers;
705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(r.GetFullRequestHeaders(&headers));
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, FileTestCancel) {
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PathService::Get(base::FILE_EXE, &app_path);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL app_url = FilePathToFileURL(app_path);
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(app_url, &d, &default_context_);
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(r.is_pending());
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Cancel();
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Async cancellation should be safe even when URLRequest has been already
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // destroyed.
72490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestFullSpecifiedRange) {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t buffer_size = 4000;
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char[]> buffer(new char[buffer_size]);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillBuffer(buffer.get(), buffer_size);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath temp_path;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL temp_url = FilePathToFileURL(temp_path);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t first_byte_position = 500;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t last_byte_position = buffer_size - first_byte_position;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t content_length = last_byte_position - first_byte_position + 1;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string partial_buffer_string(buffer.get() + first_byte_position,
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    buffer.get() + last_byte_position + 1);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(temp_url, &d, &default_context_);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kRange,
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      base::StringPrintf(
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           "bytes=%" PRIuS "-%" PRIuS,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           first_byte_position, last_byte_position));
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.SetExtraRequestHeaders(headers);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(partial_buffer_string == d.data_received());
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(base::Delete(temp_path, false));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t buffer_size = 4000;
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char[]> buffer(new char[buffer_size]);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillBuffer(buffer.get(), buffer_size);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath temp_path;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL temp_url = FilePathToFileURL(temp_path);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t first_byte_position = 500;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t last_byte_position = buffer_size - 1;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t content_length = last_byte_position - first_byte_position + 1;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string partial_buffer_string(buffer.get() + first_byte_position,
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    buffer.get() + last_byte_position + 1);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(temp_url, &d, &default_context_);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kRange,
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      base::StringPrintf("bytes=%" PRIuS "-",
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         first_byte_position));
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.SetExtraRequestHeaders(headers);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(partial_buffer_string == d.data_received());
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(base::Delete(temp_path, false));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileTestMultipleRanges) {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t buffer_size = 400000;
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<char[]> buffer(new char[buffer_size]);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FillBuffer(buffer.get(), buffer_size);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath temp_path;
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL temp_url = FilePathToFileURL(temp_path);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 file_size;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(temp_url, &d, &default_context_);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kRange,
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "bytes=0-0,10-200,200-300");
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.SetExtraRequestHeaders(headers);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.request_failed());
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(base::Delete(temp_path, false));
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InvalidUrlTest) {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("invalid url"), &d, &default_context_);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.request_failed());
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, ResolveShortcutTest) {
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("net");
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("data");
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("url_request_unittest");
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("with-headers.html");
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring lnk_path = app_path.value() + L".lnk";
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedCOMInitializer com_initializer;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily create a shortcut for test
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::win::ScopedComPtr<IShellLink> shell;
874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(SUCCEEDED(shell.CreateInstance(CLSID_ShellLink, NULL,
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                               CLSCTX_INPROC_SERVER)));
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::win::ScopedComPtr<IPersistFile> persist;
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(SUCCEEDED(shell.QueryInterface(persist.Receive())));
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str())));
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest")));
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE)));
881c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(FilePathToFileURL(base::FilePath(lnk_path)), &d,
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &default_context_);
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WIN32_FILE_ATTRIBUTE_DATA data;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetFileAttributesEx(app_path.value().c_str(),
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GetFileExInfoStandard, &data);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             FILE_SHARE_READ, NULL, OPEN_EXISTING,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             FILE_ATTRIBUTE_NORMAL, NULL);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(INVALID_HANDLE_VALUE, file);
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<char[]> buffer(new char[data.nFileSizeLow]);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD read_size;
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL result;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = ReadFile(file, buffer.get(), data.nFileSizeLow,
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      &read_size, NULL);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string content(buffer.get(), read_size);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CloseHandle(file);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(!r.is_pending());
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.received_redirect_count());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(content, d.data_received());
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clean the shortcut
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteFile(lnk_path.c_str());
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirCancelTest) {
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Put in mock resource provider.
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetModule::SetResourceProvider(TestNetResourceProvider);
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_path = file_path.Append(FILE_PATH_LITERAL("net"));
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_path = file_path.Append(FILE_PATH_LITERAL("data"));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(FilePathToFileURL(file_path), &d, &default_context_);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(req.is_pending());
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_cancel_in_received_data_pending(true);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Take out mock resource provider.
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetModule::SetResourceProvider(NULL);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirRedirectNoCrash) {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is an implicit redirect when loading a file path that matches a
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // directory and does not end with a slash.  Ensure that following such
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // redirects does not crash.  See http://crbug.com/18686.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &path);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.Append(FILE_PATH_LITERAL("net"));
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.Append(FILE_PATH_LITERAL("data"));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(FilePathToFileURL(path), &d, &default_context_);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
95690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, d.received_redirect_count());
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_LT(0, d.bytes_received());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(d.request_failed());
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(req.status().is_success());
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't accept the url "file:///" on windows. See http://crbug.com/1474.
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, FileDirRedirectSingleSlash) {
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("file:///"), &d, &default_context_);
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, d.received_redirect_count());
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(req.status().is_success());
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Custom URLRequestJobs for use with interceptor tests
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RestartTestJob : public URLRequestTestJob {
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : URLRequestTestJob(request, network_delegate, true) {}
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartAsync() OVERRIDE {
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this->NotifyRestartRequired();
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~RestartTestJob() {}
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelTestJob : public URLRequestTestJob {
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : URLRequestTestJob(request, network_delegate, true) {}
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartAsync() OVERRIDE {
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_->Cancel();
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CancelTestJob() {}
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelThenRestartTestJob : public URLRequestTestJob {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit CancelThenRestartTestJob(URLRequest* request,
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    NetworkDelegate* network_delegate)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : URLRequestTestJob(request, network_delegate, true) {
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void StartAsync() OVERRIDE {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request_->Cancel();
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this->NotifyRestartRequired();
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CancelThenRestartTestJob() {}
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An Interceptor for use with interceptor tests
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInterceptor : URLRequest::Interceptor {
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor()
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : intercept_main_request_(false), restart_main_request_(false),
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cancel_main_request_(false), cancel_then_restart_main_request_(false),
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        simulate_main_network_error_(false),
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        intercept_redirect_(false), cancel_redirect_request_(false),
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        intercept_final_response_(false), cancel_final_request_(false),
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_intercept_main_(false), did_restart_main_(false),
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_cancel_main_(false), did_cancel_then_restart_main_(false),
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_simulate_error_main_(false),
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_intercept_redirect_(false), did_cancel_redirect_(false),
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        did_intercept_final_(false), did_cancel_final_(false) {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest::Deprecated::RegisterRequestInterceptor(this);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestInterceptor() {
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest::Deprecated::UnregisterRequestInterceptor(this);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual URLRequestJob* MaybeIntercept(
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      URLRequest* request,
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetworkDelegate* network_delegate) OVERRIDE {
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (restart_main_request_) {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restart_main_request_ = false;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_restart_main_ = true;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new RestartTestJob(request, network_delegate);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancel_main_request_) {
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_main_request_ = false;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_cancel_main_ = true;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CancelTestJob(request, network_delegate);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancel_then_restart_main_request_) {
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_then_restart_main_request_ = false;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_cancel_then_restart_main_ = true;
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CancelThenRestartTestJob(request, network_delegate);
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (simulate_main_network_error_) {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      simulate_main_network_error_ = false;
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_simulate_error_main_ = true;
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // will error since the requeted url is not one of its canned urls
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new URLRequestTestJob(request, network_delegate, true);
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!intercept_main_request_)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intercept_main_request_ = false;
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    did_intercept_main_ = true;
1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequestTestJob* job =  new URLRequestTestJob(request,
1067c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    network_delegate,
1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    main_headers_,
1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    main_data_,
1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    true);
1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    job->set_load_timing_info(main_request_load_timing_info_);
1072c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return job;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual URLRequestJob* MaybeInterceptRedirect(
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate* network_delegate,
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& location) OVERRIDE {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancel_redirect_request_) {
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_redirect_request_ = false;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_cancel_redirect_ = true;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CancelTestJob(request, network_delegate);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!intercept_redirect_)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intercept_redirect_ = false;
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    did_intercept_redirect_ = true;
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new URLRequestTestJob(request,
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 network_delegate,
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 redirect_headers_,
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 redirect_data_,
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual URLRequestJob* MaybeInterceptResponse(
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      URLRequest* request, NetworkDelegate* network_delegate) OVERRIDE {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancel_final_request_) {
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancel_final_request_ = false;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_cancel_final_ = true;
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CancelTestJob(request, network_delegate);
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!intercept_final_response_)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    intercept_final_response_ = false;
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    did_intercept_final_ = true;
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new URLRequestTestJob(request,
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 network_delegate,
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 final_headers_,
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 final_data_,
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whether to intercept the main request, and if so the response to return and
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the LoadTimingInfo to use.
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool intercept_main_request_;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string main_headers_;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string main_data_;
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo main_request_load_timing_info_;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other actions we take at MaybeIntercept time
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool restart_main_request_;
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancel_main_request_;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancel_then_restart_main_request_;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool simulate_main_network_error_;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether to intercept redirects, and if so the response to return.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool intercept_redirect_;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string redirect_headers_;
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string redirect_data_;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other actions we can take at MaybeInterceptRedirect time
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancel_redirect_request_;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether to intercept final response, and if so the response to return.
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool intercept_final_response_;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string final_headers_;
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string final_data_;
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other actions we can take at MaybeInterceptResponse time
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool cancel_final_request_;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we did something or not
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_intercept_main_;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_restart_main_;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_cancel_main_;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_cancel_then_restart_main_;
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_simulate_error_main_;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_intercept_redirect_;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_cancel_redirect_;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_intercept_final_;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool did_cancel_final_;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Static getters for canned response header and data strings
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string ok_data() {
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return URLRequestTestJob::test_data_1();
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string ok_headers() {
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return URLRequestTestJob::test_headers();
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string redirect_data() {
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string redirect_headers() {
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return URLRequestTestJob::test_redirect_headers();
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string error_data() {
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string("ohhh nooooo mr. bill!");
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string error_headers() {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return URLRequestTestJob::test_error_headers();
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, Intercept) {
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and respond with a simple response
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::ok_headers();
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::ok_data();
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data();
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data();
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data();
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetUserData(NULL, user_data0);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetUserData(&user_data1, user_data1);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetUserData(&user_data2, user_data2);
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
119890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we can retrieve our specific user data
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(user_data0, req.GetUserData(NULL));
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(user_data1, req.GetUserData(&user_data1));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(user_data2, req.GetUserData(&user_data2));
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we got one good response
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, req.response_headers()->response_code());
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRedirect) {
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and respond with a redirect
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::redirect_headers();
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::redirect_data();
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept that redirect and respond a final OK response
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_redirect_ = true;
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.redirect_headers_ =  TestInterceptor::ok_headers();
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.redirect_data_ = TestInterceptor::ok_data();
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_redirect_);
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we got one good response
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (req.status().is_success()) {
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, req.response_headers()->response_code());
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptServerError) {
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request to generate a server error response
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::error_headers();
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::error_data();
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept that error and respond with an OK response
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
126690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_final_);
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we got one good response
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, req.response_headers()->response_code());
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptNetworkError) {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request to simulate a network error
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.simulate_main_network_error_ = true;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept that error and respond with an OK response
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
129590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_simulate_error_main_);
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_final_);
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we received one good response
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, req.response_headers()->response_code());
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRestartRequired) {
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // restart the main request
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.restart_main_request_ = true;
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then intercept the new main request and respond with an OK response
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::ok_headers();
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::ok_data();
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
132490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_restart_main_);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we received one good response
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(req.status().is_success());
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (req.status().is_success()) {
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, req.response_headers()->response_code());
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.received_redirect_count());
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelMain) {
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and cancel from within the restarted job
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.cancel_main_request_ = true;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setup to intercept final response and override it with an OK response
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
135590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_cancel_main_);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(interceptor.did_intercept_final_);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a canceled request
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelRedirect) {
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and respond with a redirect
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_main_request_ = true;
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_headers_ = TestInterceptor::redirect_headers();
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.main_data_ = TestInterceptor::redirect_data();
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the redirect and cancel from within that job
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.cancel_redirect_request_ = true;
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setup to intercept final response and override it with an OK response
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
138690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_intercept_main_);
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_cancel_redirect_);
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(interceptor.did_intercept_final_);
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a canceled request
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelFinal) {
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request to simulate a network error
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.simulate_main_network_error_ = true;
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setup to intercept final response and cancel from within that job
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.cancel_final_request_ = true;
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
141190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_simulate_error_main_);
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_cancel_final_);
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a canceled request
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, InterceptRespectsCancelInRestart) {
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterceptor interceptor;
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // intercept the main request and cancel then restart from within that job
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.cancel_then_restart_main_request_ = true;
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // setup to intercept final response and override it with an OK response
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.intercept_final_response_ = true;
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_headers_ = TestInterceptor::ok_headers();
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interceptor.final_data_ = TestInterceptor::ok_data();
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
143790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the interceptor got called as expected
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interceptor.did_cancel_then_restart_main_);
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(interceptor.did_intercept_final_);
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a canceled request
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing,
1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 URLRequestContext* context) {
1450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestInterceptor interceptor;
1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  interceptor.intercept_main_request_ = true;
1452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  interceptor.main_request_load_timing_info_ = job_load_timing;
1453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestDelegate d;
1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, context);
1455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.Start();
145690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
1457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo resulting_load_timing;
1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.GetLoadTimingInfo(&resulting_load_timing);
1460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // None of these should be modified by the URLRequest.
1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused);
1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id);
1464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start);
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end);
1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.receive_headers_end,
1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            resulting_load_timing.receive_headers_end);
1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return resulting_load_timing;
1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// "Normal" LoadTimingInfo as returned by a job.  Everything is in order, not
1473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// reused.  |connect_time_flags| is used to indicate if there should be dns
1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// or SSL times, and |used_proxy| is used for proxy times.
1475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now,
1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    int connect_time_flags,
1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    bool used_proxy) {
1478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing;
1479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.socket_log_id = 1;
1480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (used_proxy) {
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
1484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing;
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) {
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connect_timing.dns_start = now + base::TimeDelta::FromDays(3);
1489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connect_timing.dns_end = now + base::TimeDelta::FromDays(4);
1490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connect_timing.connect_start = now + base::TimeDelta::FromDays(5);
1492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) {
1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connect_timing.ssl_start = now + base::TimeDelta::FromDays(6);
1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    connect_timing.ssl_end = now + base::TimeDelta::FromDays(7);
1495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  connect_timing.connect_end = now + base::TimeDelta::FromDays(8);
1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.send_start = now + base::TimeDelta::FromDays(9);
1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.send_end = now + base::TimeDelta::FromDays(10);
1500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return load_timing;
1502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but in the case of a reused socket.
1505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now,
1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          bool used_proxy) {
1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing;
1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.socket_log_id = 1;
1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.socket_reused = true;
1510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (used_proxy) {
1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
1514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.send_start = now + base::TimeDelta::FromDays(9);
1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.send_end = now + base::TimeDelta::FromDays(10);
1518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return load_timing;
1520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Basic test that the intercept + load timing tests work.
1523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTiming) {
1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false);
1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Nothing should have been changed by the URLRequest.
1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.proxy_resolve_start,
1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_start);
1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.proxy_resolve_end,
1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_end);
1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.dns_start,
1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_start);
1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.dns_end,
1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_end);
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.connect_start,
1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.connect_end,
1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_start);
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_end);
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Redundant sanity check.
1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES);
1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Another basic test, with proxy and SSL times, but no DNS times.
1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingProxy) {
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true);
1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Nothing should have been changed by the URLRequest.
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.proxy_resolve_start,
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_start);
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.proxy_resolve_end,
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_end);
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.dns_start,
1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_start);
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.dns_end,
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_end);
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.connect_start,
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.connect_end,
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_start);
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_end);
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Redundant sanity check.
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReusedWithProxy(load_timing_result,
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   CONNECT_TIMING_HAS_SSL_TIMES);
1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts proxy times when they're before
1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to already having a connected socket.  This happens in
1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the case of reusing a SPDY session or HTTP pipeline.  The connected socket is
1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// not considered reused in this test (May be a preconnect).
1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// To mix things up from the test above, assumes DNS times but no SSL times.
1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) {
1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true);
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6);
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5);
1597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4);
1598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3);
1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_start =
1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(2);
1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_end =
1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(1);
1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Proxy times, connect times, and DNS times should all be replaced with
1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // request_start.
1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_start);
1611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_end);
1613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_start);
1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.dns_end);
1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Other times should have been left null.
1623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReusedWithProxy(load_timing_result,
1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   CONNECT_TIMING_HAS_DNS_TIMES);
1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Same as above, but in the reused case.
1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) {
1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true);
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4);
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3);
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Proxy times and connect times should all be replaced with request_start.
1638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_start);
1640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.proxy_resolve_end);
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Other times should have been left null.
1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingReusedWithProxy(load_timing_result);
1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts connect times when they're before
1648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to reusing a connected socket.  The connected socket is
1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// not considered reused in this test (May be a preconnect).
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// To mix things up, the request has SSL times, but no DNS times.
1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) {
1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false);
1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_start =
1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(1);
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2);
1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3);
1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_end =
1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(4);
1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Connect times, and SSL times should be replaced with request_start.
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_start);
1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.ssl_end);
1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.request_start,
1674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Other times should have been left null.
1677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES);
1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Make sure that URLRequest correctly adjusts connect times when they're before
1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |request_start|, due to reusing a connected socket in the case that there
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// are also proxy times.  The connected socket is not considered reused in this
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// test (May be a preconnect).
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// In this test, there are no SSL or DNS times.
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) {
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::TimeTicks now = base::TimeTicks::Now();
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo job_load_timing =
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true);
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_start =
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(1);
1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  job_load_timing.connect_timing.connect_end =
1693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      now - base::TimeDelta::FromDays(2);
1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                        &default_context_);
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Connect times should be replaced with proxy_resolve_end.
1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.proxy_resolve_end,
1700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_start);
1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(load_timing_result.proxy_resolve_end,
1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            load_timing_result.connect_timing.connect_end);
1703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Other times should have been left null.
1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestLoadTimingNotReusedWithProxy(load_timing_result,
1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that two different URL requests have different identifiers.
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, Identifiers) {
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context;
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestURLRequest req(GURL("http://example.com"), &d, &context, NULL);
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestURLRequest other_req(GURL("http://example.com"), &d, &context, NULL);
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(req.identifier(), other_req.identifier());
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that a failure to connect to the proxy is reported to the network
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate.
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, NetworkDelegateProxyError) {
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHostResolver host_resolver;
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver.rules()->AddSimulatedFailure("*");
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context("myproxy:70", &network_delegate);
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("http://example.com"), &d, &context);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("GET");
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
173390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we see a failed request.
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.status().is_success());
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, req.status().error());
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.error_count());
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, network_delegate.last_error());
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.completed_requests());
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that net::NetworkDelegate::NotifyCompleted is called if
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content is empty.
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, RequestCompletionForEmptyResponse) {
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(GURL("data:,"), &d, &default_context_);
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
175190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", d.data_received());
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, default_network_delegate_.completed_requests());
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that SetPriority actually sets the URLRequest's priority
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// correctly, both before and after start.
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetPriorityBasic) {
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(LOW);
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, req.priority());
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, req.priority());
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(MEDIUM);
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(MEDIUM, req.priority());
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest calls SetPriority on a job before calling
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Start on it.
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) {
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<URLRequestTestJob> job =
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new URLRequestTestJob(&req, &default_network_delegate_);
1782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job.get());
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DEFAULT_PRIORITY, job->priority());
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(LOW);
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, job->priority());
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest passes on its priority updates to its
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// job.
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, SetJobPriority) {
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<URLRequestTestJob> job =
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new URLRequestTestJob(&req, &default_network_delegate_);
1799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job.get());
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(LOW);
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, job->priority());
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(MEDIUM);
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(MEDIUM, req.priority());
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(MEDIUM, job->priority());
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(droger): Support SpawnedTestServer on iOS (see http://crbug.com/148666).
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS)
1812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A subclass of SpawnedTestServer that uses a statically-configured hostname.
1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is to work around mysterious failures in chrome_frame_net_tests. See:
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114369
1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LocalHttpTestServer : public SpawnedTestServer {
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit LocalHttpTestServer(const base::FilePath& document_root)
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP,
1819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          ScopedCustomUrlRequestTestHttpHost::value(),
1820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          document_root) {}
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer()
1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP,
1823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          ScopedCustomUrlRequestTestHttpHost::value(),
1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          base::FilePath()) {}
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTest, DelayedCookieCallback) {
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context;
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<DelayedCookieMonster> delayed_cm =
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new DelayedCookieMonster();
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<CookieStore> cookie_store = delayed_cm;
1835868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  context.set_cookie_store(delayed_cm.get());
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.set_network_delegate(&network_delegate);
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("set-cookie?CookieToNotSend=1"), &d, &context);
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
184590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.set_cookie_count());
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.set_network_delegate(&network_delegate);
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("echoheader?Cookie"), &d, &context);
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
185890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies) {
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
188090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
189390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set.
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.set_load_flags(LOAD_DO_NOT_SEND_COOKIES);
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
191090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies.
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies) {
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
193490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.set_cookie_count());
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to set-up another cookie and update the previous cookie.
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.set_load_flags(LOAD_DO_NOT_SAVE_COOKIES);
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie.
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.set_cookie_count());
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the cookies weren't saved or updated.
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
196990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.set_cookie_count());
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) {
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
199590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
200990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie isn't sent.
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
202790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) {
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
205090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to set-up another cookie and update the previous cookie.
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the cookies weren't saved or updated.
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
208290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveEmptyCookies) {
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up an empty cookie.
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie"), &d, &default_context_);
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
210590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.set_cookie_count());
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) {
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
212690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
214090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie isn't sent.
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
215890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) {
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie.
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &d,
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   &default_context_);
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
218190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to set-up another cookie and update the previous cookie.
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the cookies weren't saved or updated.
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
221390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                == std::string::npos);
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                != std::string::npos);
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FixedDateNetworkDelegate swaps out the server's HTTP Date response header
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value for the |fixed_date| argument given to the constructor.
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FixedDateNetworkDelegate : public TestNetworkDelegate {
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FixedDateNetworkDelegate(const std::string& fixed_date)
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : fixed_date_(fixed_date) {}
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FixedDateNetworkDelegate() {}
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::NetworkDelegate implementation
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnHeadersReceived(
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::CompletionCallback& callback,
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HttpResponseHeaders* original_response_headers,
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<net::HttpResponseHeaders>* override_response_headers)
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OVERRIDE;
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string fixed_date_;
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate);
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FixedDateNetworkDelegate::OnHeadersReceived(
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request,
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CompletionCallback& callback,
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::HttpResponseHeaders* original_response_headers,
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders>* override_response_headers) {
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HttpResponseHeaders* new_response_headers =
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpResponseHeaders(original_response_headers->raw_headers());
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_response_headers->RemoveHeader("Date");
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_response_headers->AddHeader("Date: " + fixed_date_);
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *override_response_headers = new_response_headers;
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TestNetworkDelegate::OnHeadersReceived(request,
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                callback,
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                original_response_headers,
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                override_response_headers);
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that cookie expiration times are adjusted for server/client clock
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// headers by defaulting to GMT. (crbug.com/135131)
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) {
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up an expired cookie.
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL(
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
228290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is not set.
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
229290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos);
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier.
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC");
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server.GetURL(
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
230690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the cookie is set.
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNetworkDelegate network_delegate;
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&network_delegate);
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
231690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos);
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that it is impossible to change the referrer in the extra headers of
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an URLRequest.
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTest, DoNotOverrideReferrer) {
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server;
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If extra headers contain referer and the request contains a referer,
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only the latter shall be respected.
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Referer"), &d, &default_context_);
2335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    req.SetReferrer("http://foo.com/");
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
234290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://foo.com/", d.data_received());
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If extra headers contain a referer but the request does not, no referer
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // shall be sent in the header.
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("echoheader?Referer"), &d, &default_context_);
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.set_load_flags(LOAD_VALIDATE_CACHE);
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
236090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("None", d.data_received());
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTestHTTP : public URLRequestTest {
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestTestHTTP()
23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : test_server_(base::FilePath(FILE_PATH_LITERAL(
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  "net/data/url_request_unittest"))) {
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests |redirect_url|, which must return a HTTP 3xx redirect.
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |request_method| is the method to use for the initial request.
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |redirect_method| is the method that is expected to be used for the second
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request, after redirection.
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |include_data| is true, data is uploaded with the request.  The
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // response body is expected to match it exactly, if and only if
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |request_method| == |redirect_method|.
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HTTPRedirectMethodTest(const GURL& redirect_url,
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& request_method,
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& redirect_method,
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool include_data) {
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const char kData[] = "hello world";
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(redirect_url, &d, &default_context_);
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.set_method(request_method);
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (include_data) {
23902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpRequestHeaders headers;
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      headers.SetHeader(HttpRequestHeaders::kContentLength,
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::UintToString(arraysize(kData) - 1));
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      req.SetExtraRequestHeaders(headers);
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
239790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(redirect_method, req.method());
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, req.status().error());
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (include_data) {
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (request_method == redirect_method) {
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(kData, d.data_received());
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(kData, d.data_received());
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFailure())
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Request method was: " << request_method;
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HTTPUploadDataOperationTest(const std::string& method) {
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int kMsgSize = 20000;  // multiple of 10
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int kIterations = 50;
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char* uploadBytes = new char[kMsgSize+1];
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char* ptr = uploadBytes;
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char marker = 'a';
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int idx = 0; idx < kMsgSize/10; idx++) {
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(ptr, "----------", 10);
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ptr += 10;
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (idx % 100 == 0) {
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ptr--;
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *ptr++ = marker;
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (++marker > 'z')
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          marker = 'a';
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uploadBytes[kMsgSize] = '\0';
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < kIterations; ++i) {
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestDelegate d;
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.set_method(method.c_str());
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      r.set_upload(make_scoped_ptr(CreateSimpleUploadData(uploadBytes)));
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.Start();
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.is_pending());
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASSERT_EQ(1, d.response_started_count())
24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          << "request failed: " << r.status().status()
24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          << ", os error: " << r.status().error();
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(d.received_data_before_response());
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(uploadBytes, d.data_received());
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete[] uploadBytes;
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddChunksToUpload(URLRequest* r) {
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("a", 1, false);
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("bcd", 3, false);
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("this is a longer chunk than before.", 35, false);
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("\r\n\r\n", 4, false);
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("0", 1, false);
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r->AppendChunkToUpload("2323", 4, true);
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) {
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This should match the chunks sent by AddChunksToUpload().
24632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string expected_data =
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "abcdthis is a longer chunk than before.\r\n\r\n02323";
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1, d->response_started_count())
24672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "request failed: " << r->status().status()
24682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << ", os error: " << r->status().error();
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received()));
24732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_data, d->data_received());
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoManyCookiesRequest(int num_cookies) {
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("set-many-cookies?" +
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     base::IntToString(num_cookies)),
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &d,
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &default_context_);
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_success = r.status().is_success();
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_success) {
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Requests handled by ChromeFrame send a less precise error message,
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // ERR_CONNECTION_ABORTED.
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.status().error() == ERR_RESPONSE_HEADERS_TOO_BIG ||
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  r.status().error() == ERR_CONNECTION_ABORTED);
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The test server appears to be unable to handle subsequent requests
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // after this error is triggered. Force it to restart.
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(test_server_.Stop());
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(test_server_.Start());
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return is_success;
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalHttpTestServer test_server_;
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this unit test, we're using the HTTPTestServer as a proxy server and
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// issuing a CONNECT request with the magic host name "www.redirect.com".
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HTTPTestServer will return a 302 response, which we should not
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// follow.
25112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) {
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("https://www.redirect.com/"), &d, &context);
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should not have followed the redirect.
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.received_redirect_count());
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the same as the previous test, but checks that the network delegate
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// registers the error.
25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) {
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("https://www.redirect.com/"), &d, &context);
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should not have followed the redirect.
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.received_redirect_count());
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.error_count());
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, network_delegate.last_error());
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can block and asynchronously return OK in various stages.
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) {
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const BlockingNetworkDelegate::Stage blocking_stages[] = {
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BlockingNetworkDelegate::ON_HEADERS_RECEIVED
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t blocking_stages_length = arraysize(blocking_stages);
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST |
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS |
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("empty.html"), &d, &context);
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < blocking_stages_length; ++i) {
259290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(blocking_stages[i],
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                network_delegate.stage_blocked_for_callback());
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_delegate.DoCallback(OK);
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
259790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and cancel a request.
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) {
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_retval(ERR_EMPTY_RESPONSE);
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
262490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_EMPTY_RESPONSE, r.status().error());
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function for NetworkDelegateCancelRequestAsynchronously and
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate operating in |block_mode| and a request for |url|. It blocks the
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT.
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode,
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  BlockingNetworkDelegate::Stage stage,
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const GURL& url) {
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(block_mode);
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT);
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(stage);
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
265490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, r.status().error());
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following 3 tests check that the network delegate can cancel a request
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// synchronously in various stages of the request.
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) {
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
2670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) {
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
2677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) {
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
2684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following 3 tests check that the network delegate can cancel a request
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// asynchronously in various stages of the request.
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) {
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
2693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) {
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
2700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) {
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
2707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               test_server_.GetURL(std::string()));
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and redirect a request to a new
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL.
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) {
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL redirect_url(test_server_.GetURL("simple.html"));
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_redirect_url(redirect_url);
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL original_url(test_server_.GetURL("empty.html"));
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(original_url, &d, &context);
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
273190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(redirect_url, r.url());
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(original_url, r.original_url());
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, r.url_chain().size());
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can block and redirect a request to a new
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL by setting a redirect_url and returning in OnBeforeURLRequest directly.
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) {
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::SYNCHRONOUS);
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL redirect_url(test_server_.GetURL("simple.html"));
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_redirect_url(redirect_url);
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL original_url(test_server_.GetURL("empty.html"));
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(original_url, &d, &context);
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
276490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(redirect_url, r.url());
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(original_url, r.original_url());
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, r.url_chain().size());
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that redirects caused by the network delegate preserve POST data.
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) {
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello world";
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL redirect_url(test_server_.GetURL("echo"));
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_redirect_url(redirect_url);
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL original_url(test_server_.GetURL("empty.html"));
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(original_url, &d, &context);
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
27982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader(HttpRequestHeaders::kContentLength,
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      base::UintToString(arraysize(kData) - 1));
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.SetExtraRequestHeaders(headers);
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
280490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(redirect_url, r.url());
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(original_url, r.original_url());
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, r.url_chain().size());
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("POST", r.method());
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kData, d.data_received());
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by taking no action. This indicates that the NetworkDelegate does not want to
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handle the challenge, and is passing the buck along to the
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate.
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) {
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::SYNCHRONOUS);
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_credentials(AuthCredentials(kUser, kSecret));
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
2840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
2842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0, r.status().error());
2845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(200, r.GetResponseCode());
2846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(d.auth_required_called());
2847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, network_delegate.created_requests());
2848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0, network_delegate.destroyed_requests());
2849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, network_delegate.destroyed_requests());
2851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2853eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP,
2854eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetworkDelegateOnAuthRequiredSyncNoAction_GetFullRequestHeaders) {
2855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server_.Start());
2856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
2858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BlockingNetworkDelegate network_delegate(
2859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BlockingNetworkDelegate::SYNCHRONOUS);
2860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestURLRequestContext context(true);
2862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context.set_network_delegate(&network_delegate);
2863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context.Init();
2864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  d.set_credentials(AuthCredentials(kUser, kSecret));
2866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
2868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL url(test_server_.GetURL("auth-basic"));
2869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest r(url, &d, &context);
2870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    r.Start();
2871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    {
2873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      HttpRequestHeaders headers;
2874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_TRUE(r.GetFullRequestHeaders(&headers));
2875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_FALSE(headers.HasHeader("Authorization"));
2876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
2877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
287890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.auth_required_called());
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by setting credentials.
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) {
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::SYNCHRONOUS);
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_retval(
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
291290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.auth_required_called());
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Same as above, but also tests that GetFullRequestHeaders returns the proper
2925eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// headers (for the first or second request) when called at the proper times.
2926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP,
2927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetworkDelegateOnAuthRequiredSyncSetAuth_GetFullRequestHeaders) {
2928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server_.Start());
2929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
2931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BlockingNetworkDelegate network_delegate(
2932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BlockingNetworkDelegate::SYNCHRONOUS);
2933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
2934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  network_delegate.set_auth_retval(
2935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
2936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
2938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2939eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestURLRequestContext context(true);
2940eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context.set_network_delegate(&network_delegate);
2941eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  context.Init();
2942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
2944eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL url(test_server_.GetURL("auth-basic"));
2945eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest r(url, &d, &context);
2946eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    r.Start();
2947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
2948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0, r.status().error());
2951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(200, r.GetResponseCode());
2952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(d.auth_required_called());
2953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, network_delegate.created_requests());
2954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0, network_delegate.destroyed_requests());
2955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    {
2957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      HttpRequestHeaders headers;
2958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_TRUE(r.GetFullRequestHeaders(&headers));
2959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_TRUE(headers.HasHeader("Authorization"));
2960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
2961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, network_delegate.destroyed_requests());
2963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
2964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can synchronously complete OnAuthRequired
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by cancelling authentication.
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) {
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::SYNCHRONOUS);
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_retval(
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
298590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, r.status().error());
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(401, r.GetResponseCode());
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.auth_required_called());
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by taking no action. This indicates that the NetworkDelegate does not want
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to handle the challenge, and is passing the buck along to the
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequest::Delegate.
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) {
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_credentials(AuthCredentials(kUser, kSecret));
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
301990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.auth_required_called());
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by setting credentials.
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) {
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_retval(
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthCredentials auth_credentials(kUser, kSecret);
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_credentials(auth_credentials);
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
305490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, r.status().error());
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(200, r.GetResponseCode());
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.auth_required_called());
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the network delegate can asynchronously complete OnAuthRequired
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by cancelling authentication.
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) {
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::AUTO_CALLBACK);
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_auth_retval(
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url(test_server_.GetURL("auth-basic"));
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &context);
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
308790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, r.status().error());
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(401, r.GetResponseCode());
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.auth_required_called());
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate.
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback.
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) {
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
311890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_delegate.stage_blocked_for_callback());
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.completed_requests());
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel before callback.
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that network delegate is notified.
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.completed_requests());
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_ABORTED, r.status().error());
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate.
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 2: Request is cancelled while waiting for OnBeforeSendHeaders callback.
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) {
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS);
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
315490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_delegate.stage_blocked_for_callback());
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.completed_requests());
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel before callback.
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that network delegate is notified.
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.completed_requests());
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_ABORTED, r.status().error());
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate.
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 3: Request is cancelled while waiting for OnHeadersReceived callback.
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) {
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
318990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_delegate.stage_blocked_for_callback());
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.completed_requests());
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel before callback.
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that network delegate is notified.
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.completed_requests());
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_ABORTED, r.status().error());
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can handle when a network request was canceled while we were
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// waiting for the network delegate.
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Part 4: Request is cancelled while waiting for OnAuthRequired callback.
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) {
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockingNetworkDelegate network_delegate(
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BlockingNetworkDelegate::USER_CALLBACK);
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &context);
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
322490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED,
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_delegate.stage_blocked_for_callback());
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.completed_requests());
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel before callback.
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that network delegate is notified.
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.completed_requests());
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_ABORTED, r.status().error());
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, network_delegate.created_requests());
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_delegate.destroyed_requests());
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, network_delegate.destroyed_requests());
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this unit test, we're using the HTTPTestServer as a proxy server and
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// issuing a CONNECT request with the magic host name "www.server-auth.com".
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HTTPTestServer will return a 401 response, which we should balk at.
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) {
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContextWithProxy context(
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.host_port_pair().ToString(),
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &network_delegate);
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("https://www.server-auth.com/"), &d, &context);
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTest_NoCache) {
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
327590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(eroman): Add back the NetLog tests...
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test has the server send a large number of cookies to the client.
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To ensure that no number of cookies causes a crash, a galloping binary
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// search is used to estimate that maximum number of cookies that are accepted
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the browser. Beyond the maximum number, the request will fail with
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ERR_RESPONSE_HEADERS_TOO_BIG.
32942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
32952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/177916
32962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies
32972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
32982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies
32992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_WIN)
33002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) {
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int lower_bound = 0;
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int upper_bound = 1;
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Double the number of cookies until the response header limits are
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exceeded.
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (DoManyCookiesRequest(upper_bound)) {
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lower_bound = upper_bound;
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upper_bound *= 2;
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LT(upper_bound, 1000000);
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tolerance = upper_bound * 0.005;
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tolerance < 2)
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tolerance = 2;
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perform a binary search to find the highest possible number of cookies,
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // within the desired tolerance.
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (upper_bound - lower_bound >= tolerance) {
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num_cookies = (lower_bound + upper_bound) / 2;
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (DoManyCookiesRequest(num_cookies))
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lower_bound = num_cookies;
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      upper_bound = num_cookies;
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Success: the test did not crash.
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTest) {
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
334190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, GetTest_GetFullRequestHeaders) {
3354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server_.Start());
3355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
3357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
3358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL test_url(test_server_.GetURL(std::string()));
3359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest r(test_url, &d, &default_context_);
3360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HttpRequestHeaders headers;
3362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(r.GetFullRequestHeaders(&headers));
3363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    r.Start();
3365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(r.is_pending());
3366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
3368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, d.response_started_count());
3370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(d.received_data_before_response());
3371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_NE(0, d.bytes_received());
3372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_server_.host_port_pair().host(),
3373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              r.GetSocketAddress().host());
3374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(test_server_.host_port_pair().port(),
3375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch              r.GetSocketAddress().port());
3376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(d.have_full_request_headers());
3378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CheckFullRequestHeaders(d.full_request_headers(), test_url);
3379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
3380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
3381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, GetTestLoadTiming) {
33832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
33842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
33862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
3387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
33882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
33902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(r.is_pending());
33912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
339290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
33932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info;
33952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.GetLoadTimingInfo(&load_timing_info);
33962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
33972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
33992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
34002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
34012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
34022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              r.GetSocketAddress().host());
34032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
34042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              r.GetSocketAddress().port());
34052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
34062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
34072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, GetZippedTest) {
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parameter that specifies the Content-Length field in the response:
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // C - Compressed length.
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // U - Uncompressed length.
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // L - Large length (larger than both C & U).
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // M - Medium length (between C & U).
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // S - Small length (smaller than both C & U).
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char test_parameters[] = "CULMS";
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int num_tests = arraysize(test_parameters)- 1;  // Skip NULL.
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // C & U should be OK.
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // L & M are larger than the data sent, and show an error.
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // S has too little data, but we seem to accept it.
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool test_expect_success[num_tests] =
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { true, true, false, false, true };
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < num_tests ; i++) {
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string test_file =
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::StringPrintf("compressedfiles/BullRunSpeech.txt?%c",
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             test_parameters[i]);
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestURLRequestContext context(true);
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.set_network_delegate(&network_delegate);
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context.Init();
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest r(test_server_.GetURL(test_file), &d, &context);
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.Start();
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.is_pending());
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
344190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1, d.response_started_count());
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(d.received_data_before_response());
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      VLOG(1) << " Received " << d.bytes_received() << " bytes"
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << " status = " << r.status().status()
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              << " error = " << r.status().error();
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (test_expect_success[i]) {
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status())
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            << " Parameter = \"" << test_file << "\"";
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, r.status().error())
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            << " Parameter = \"" << test_file << "\"";
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, HTTPSToHTTPRedirectNoRefererTest) {
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer https_test_server(
3464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS, SpawnedTestServer::kLocalhost,
34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An https server is sent a request with an https referer,
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and responds with a redirect to an http url. The http
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // server should not be sent the referer.
3471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL http_destination = test_server_.GetURL(std::string());
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(https_test_server.GetURL(
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "server-redirect?" + http_destination.spec()), &d, &default_context_);
3475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("https://www.referrer.com/");
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
347790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.received_redirect_count());
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(http_destination, req.url());
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string(), req.referrer());
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectLoadTiming) {
34862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
34872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL destination_url = test_server_.GetURL(std::string());
3489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL original_url =
3490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server_.GetURL("server-redirect?" + destination_url.spec());
34912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
34922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(original_url, &d, &default_context_);
34932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
349490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
34952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
34962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
34972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, d.received_redirect_count());
34982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(destination_url, req.url());
34992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(original_url, req.original_url());
35002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, req.url_chain().size());
35012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(original_url, req.url_chain()[0]);
35022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(destination_url, req.url_chain()[1]);
35032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadTimingInfo load_timing_info_before_redirect;
35052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect(
35062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &load_timing_info_before_redirect));
35072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestLoadTimingNotReused(load_timing_info_before_redirect,
35082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          CONNECT_TIMING_HAS_DNS_TIMES);
35092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoadTimingInfo load_timing_info;
35112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.GetLoadTimingInfo(&load_timing_info);
35122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
35132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that a new socket was used on redirect, since the server does not
35152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // supposed keep-alive sockets, and that the times before the redirect are
35162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // before the ones recorded for the second request.
35172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(load_timing_info_before_redirect.socket_log_id,
35182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            load_timing_info.socket_log_id);
35192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(load_timing_info_before_redirect.receive_headers_end,
35202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            load_timing_info.connect_timing.connect_start);
35212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
35222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, MultipleRedirectTest) {
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL destination_url = test_server_.GetURL(std::string());
3527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL middle_redirect_url =
3528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server_.GetURL("server-redirect?" + destination_url.spec());
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL original_url = test_server_.GetURL(
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "server-redirect?" + middle_redirect_url.spec());
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(original_url, &d, &default_context_);
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
353490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, d.received_redirect_count());
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(destination_url, req.url());
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(original_url, req.original_url());
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, req.url_chain().size());
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(original_url, req.url_chain()[0]);
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(middle_redirect_url, req.url_chain()[1]);
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(destination_url, req.url_chain()[2]);
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtraHeader[] = "Allow-Snafu";
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtraValue[] = "fubar";
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RedirectWithAdditionalHeadersDelegate : public TestDelegate {
35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnReceivedRedirect(net::URLRequest* request,
35532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const GURL& new_url,
35542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool* defer_redirect) OVERRIDE {
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect);
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false);
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) {
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL destination_url = test_server_.GetURL(
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "echoheader?" + std::string(kExtraHeader));
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL original_url = test_server_.GetURL(
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "server-redirect?" + destination_url.spec());
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RedirectWithAdditionalHeadersDelegate d;
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(original_url, &d, &default_context_);
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
357290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HttpRequestHeaders& headers = req.extra_request_headers();
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value));
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kExtraValue, value);
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.is_pending());
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(req.is_redirecting());
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kExtraValue, d.data_received());
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
35842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kExtraHeaderToRemove[] = "To-Be-Removed";
35862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RedirectWithHeaderRemovalDelegate : public TestDelegate {
35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnReceivedRedirect(net::URLRequest* request,
35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const GURL& new_url,
35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          bool* defer_redirect) OVERRIDE {
35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect);
35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    request->RemoveRequestHeaderByName(kExtraHeaderToRemove);
35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
35952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
35972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) {
35992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
36002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL destination_url = test_server_.GetURL(
36022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "echoheader?" + std::string(kExtraHeaderToRemove));
36032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL original_url = test_server_.GetURL(
36042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "server-redirect?" + destination_url.spec());
36052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RedirectWithHeaderRemovalDelegate d;
36062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(original_url, &d, &default_context_);
36072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false);
36082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
360990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
36102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string value;
36122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const HttpRequestHeaders& headers = req.extra_request_headers();
36132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value));
36142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(req.is_pending());
36152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(req.is_redirecting());
36162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("None", d.data_received());
36172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
36182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest) {
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(GURL("http://www.google.com/"), &d, &default_context_);
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We expect to receive OnResponseStarted even though the request has been
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // cancelled.
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest2) {
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_cancel_in_response_started(true);
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest3) {
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_cancel_in_received_data(true);
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
367290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There is no guarantee about how much data was received
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // before the cancel was issued.  It could have been 0 bytes,
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // or it could have been all the bytes.
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // EXPECT_EQ(0, d.bytes_received());
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest4) {
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The request will be implicitly canceled when it is destroyed. The
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // test delegate must not post a quit message when this happens because
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // this test doesn't actually have a message loop. The quit message would
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // get put on this thread's message queue and the next test would exit
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // early, causing problems.
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_quit_on_complete(false);
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expect things to just cleanup properly.
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we won't actually get a received reponse here because we've never run the
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message loop
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(d.received_data_before_response());
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, d.bytes_received());
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelTest5) {
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // populate cache
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_);
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
371790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cancel read from cache (see bug 990242)
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_);
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Cancel();
372790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostTest) {
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPUploadDataOperationTest("POST");
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PutTest) {
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPUploadDataOperationTest("PUT");
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostEmptyTest) {
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1, d.response_started_count())
37602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "request failed: " << r.status().status()
37612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << ", error: " << r.status().error();
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().empty());
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, PostFileTest) {
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath dir;
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(base::DIR_EXE, &dir);
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::SetCurrentDirectory(dir);
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedVector<UploadElementReader> element_readers;
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path;
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(base::DIR_SOURCE_ROOT, &path);
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("net"));
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("data"));
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
37887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    element_readers.push_back(
37897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        new UploadFileElementReader(base::MessageLoopProxy::current().get(),
37907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    path,
37917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    0,
37927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    kuint64max,
37937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    base::Time()));
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This file should just be ignored in the upload stream.
37962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element_readers.push_back(new UploadFileElementReader(
37977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::MessageLoopProxy::current().get(),
37982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath(FILE_PATH_LITERAL(
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "c:\\path\\to\\non\\existant\\file.randomness.12345")),
38007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        0,
38017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        kuint64max,
38027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        base::Time()));
38032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.set_upload(make_scoped_ptr(new UploadDataStream(&element_readers, 0)));
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
380890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 size = 0;
38112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(true, file_util::GetFileSize(path, &size));
3812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<char[]> buf(new char[size]);
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(size, file_util::ReadFile(path, buf.get(), size));
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1, d.response_started_count())
38172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "request failed: " << r.status().status()
38182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << ", error: " << r.status().error();
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(size, d.bytes_received());
38232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(std::string(&buf[0], size), d.data_received());
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) {
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.EnableChunkedUpload();
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChunksToUpload(&r);
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
383990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyReceivedDataMatchesChunks(&r, &d);
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) {
38462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
38472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
38492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
38502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
38512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.EnableChunkedUpload();
38522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.set_method("POST");
38532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
38542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(r.is_pending());
38552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChunksToUpload(&r);
385690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
38572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyReceivedDataMatchesChunks(&r, &d);
38592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
38602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
38612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) {
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.EnableChunkedUpload();
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_method("POST");
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
387390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChunksToUpload(&r);
387590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyReceivedDataMatchesChunks(&r, &d);
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ResponseHeadersTest) {
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("files/with-headers.html"), &d, &default_context_);
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
388890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const HttpResponseHeaders* headers = req.response_headers();
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simple sanity check that response_info() accesses the same data.
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(headers, req.response_info().headers.get());
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string header;
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header));
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("private", header);
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header.clear();
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header));
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("text/html; charset=ISO-8859-1", header);
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The response has two "X-Multiple-Entries" headers.
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This verfies our output has them concatenated together.
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header.clear();
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header));
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("a, b", header);
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTS) {
3911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
3912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer https_test_server(
3913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_options,
39152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest request(
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_test_server.GetURL("files/hsts-headers.html"),
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &d,
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &default_context_);
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request.Start();
392490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState* security_state =
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_context_.transport_security_state();
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sni_available = true;
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState::DomainState domain_state;
39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(security_state->GetDomainState(
3931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            domain_state.upgrade_mode);
39347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(domain_state.sts_include_subdomains);
39357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.pkp_include_subdomains);
3936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
3937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Android's CertVerifyProc does not (yet) handle pins.
3938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
3939eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(domain_state.HasPublicKeyPins());
3940eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
3941eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
3942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Android's CertVerifyProc does not (yet) handle pins. Therefore, it will
3944eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// reject HPKP headers, and a test setting only HPKP headers will fail (no
3945eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// DomainState present because header rejected).
3946eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
3947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_ProcessPKP DISABLED_ProcessPKP
3948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
3949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define MAYBE_ProcessPKP ProcessPKP
3950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
3951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that enabling HPKP on a domain does not affect the HSTS
3953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// validity/expiration.
3954eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, MAYBE_ProcessPKP) {
3955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpawnedTestServer::SSLOptions ssl_options;
3956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpawnedTestServer https_test_server(
3957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpawnedTestServer::TYPE_HTTPS,
3958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ssl_options,
3959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
3960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(https_test_server.Start());
3961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
3963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  URLRequest request(
3964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      https_test_server.GetURL("files/hpkp-headers.html"),
3965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &d,
3966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &default_context_);
3967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  request.Start();
3968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::MessageLoop::current()->Run();
3969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TransportSecurityState* security_state =
3971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      default_context_.transport_security_state();
3972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool sni_available = true;
3973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TransportSecurityState::DomainState domain_state;
3974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(security_state->GetDomainState(
3975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
3976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(TransportSecurityState::DomainState::MODE_DEFAULT,
3977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            domain_state.upgrade_mode);
3978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(domain_state.sts_include_subdomains);
3979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(domain_state.pkp_include_subdomains);
3980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(domain_state.HasPublicKeyPins());
3981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_NE(domain_state.upgrade_expiry,
3982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            domain_state.dynamic_spki_hashes_expiry);
39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTSOnce) {
3986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
3987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer https_test_server(
3988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_options,
39902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest request(
39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      https_test_server.GetURL("files/hsts-multiple-headers.html"),
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &d,
39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &default_context_);
39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request.Start();
399990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have set parameters from the first header, not the second.
40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState* security_state =
40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_context_.transport_security_state();
40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sni_available = true;
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState::DomainState domain_state;
40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(security_state->GetDomainState(
4007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            domain_state.upgrade_mode);
40107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.sts_include_subdomains);
40117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.pkp_include_subdomains);
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) {
4015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
4016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer https_test_server(
4017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
4019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
4020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
4021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestDelegate d;
4023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest request(
4024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      https_test_server.GetURL("files/hsts-and-hpkp-headers.html"),
4025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &d,
4026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &default_context_);
4027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request.Start();
402890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
4029c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // We should have set parameters from the first header, not the second.
4031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TransportSecurityState* security_state =
4032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      default_context_.transport_security_state();
4033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool sni_available = true;
4034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TransportSecurityState::DomainState domain_state;
4035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(security_state->GetDomainState(
4036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
4037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
4038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            domain_state.upgrade_mode);
4039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_ANDROID)
4040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Android's CertVerifyProc does not (yet) handle pins.
4041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
4042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(domain_state.HasPublicKeyPins());
4043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
4044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(domain_state.upgrade_expiry,
4045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            domain_state.dynamic_spki_hashes_expiry);
4046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Even though there is an HSTS header asserting includeSubdomains, it is
40487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the *second* such header, and we MUST process only the first.
40497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.sts_include_subdomains);
40507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // includeSubdomains does not occur in the test HPKP header.
40517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(domain_state.pkp_include_subdomains);
4052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4054eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that when multiple HPKP headers are present, asserting different
4055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// policies, that only the first such policy is processed.
4056eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, ProcessSTSAndPKP2) {
4057eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpawnedTestServer::SSLOptions ssl_options;
4058eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SpawnedTestServer https_test_server(
4059eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpawnedTestServer::TYPE_HTTPS,
4060eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ssl_options,
4061eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
4062eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(https_test_server.Start());
4063eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4064eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
4065eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  URLRequest request(
4066eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      https_test_server.GetURL("files/hsts-and-hpkp-headers2.html"),
4067eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &d,
4068eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &default_context_);
4069eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  request.Start();
4070eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::MessageLoop::current()->Run();
4071eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4072eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TransportSecurityState* security_state =
4073eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      default_context_.transport_security_state();
4074eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool sni_available = true;
4075eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TransportSecurityState::DomainState domain_state;
4076eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(security_state->GetDomainState(
4077eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
4078eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
4079eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            domain_state.upgrade_mode);
4080eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
4081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Android's CertVerifyProc does not (yet) handle pins.
4082eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
4083eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(domain_state.HasPublicKeyPins());
4084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
4085eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_NE(domain_state.upgrade_expiry,
4086eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            domain_state.dynamic_spki_hashes_expiry);
4087eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(domain_state.sts_include_subdomains);
4089eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(domain_state.pkp_include_subdomains);
4090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
4091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) {
40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL(
40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/content-type-normalization.html"), &d, &default_context_);
40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
409990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type;
41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.GetMimeType(&mime_type);
41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("text/html", mime_type);
41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string charset;
41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.GetCharset(&charset);
41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("utf-8", charset);
41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Cancel();
41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictRedirects) {
4112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
4113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  GURL file_url("file:///foo.txt");
4114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  GURL data_url("data:,foo");
4115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FileProtocolHandler file_protocol_handler;
4116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url));
4117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DataProtocolHandler data_protocol_handler;
4118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(data_protocol_handler.IsSafeRedirectTarget(data_url));
4119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
4120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
4121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(job_factory_.IsSafeRedirectTarget(file_url));
4122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(job_factory_.IsSafeRedirectTarget(data_url));
4123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
4124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RestrictRedirects) {
41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL(
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/redirect-to-file.html"), &d, &default_context_);
41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
413290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().error());
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) {
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL(
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/redirect-to-invalid-url.html"), &d, &default_context_);
41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
414590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ERR_INVALID_URL, req.status().error());
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) {
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
4157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("http://user:pass@foo.com/");
41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
415990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("http://foo.com/"), d.data_received());
41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) {
4165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
4166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestDelegate d;
4168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest req(
4169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
4170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("http://foo.com/test#fragment");
4171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.Start();
417290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
4173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(std::string("http://foo.com/test"), d.data_received());
4175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) {
4178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
4179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestDelegate d;
4181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest req(
4182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
4183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("http://foo.com/test#fragment");
4184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.SetReferrer("");
4185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  req.Start();
418690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
4187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(std::string("None"), d.data_received());
4189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
4190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelRedirect) {
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_cancel_in_received_redirect(true);
41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("files/redirect-test.html"), &d, &default_context_);
41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
420090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DeferredRedirect) {
42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_quit_on_redirect(true);
4215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL test_url(test_server_.GetURL("files/redirect-test.html"));
4216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest req(test_url, &d, &default_context_);
4217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    req.Start();
4219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
4220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, d.received_redirect_count());
4222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    req.FollowDeferredRedirect();
4224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::MessageLoop::current()->Run();
4225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1, d.response_started_count());
4227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(d.received_data_before_response());
4228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
4229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::FilePath path;
4231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PathService::Get(base::DIR_SOURCE_ROOT, &path);
4232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.Append(FILE_PATH_LITERAL("net"));
4233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.Append(FILE_PATH_LITERAL("data"));
4234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
4235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
4236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string contents;
4238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(file_util::ReadFileToString(path, &contents));
4239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(contents, d.data_received());
4240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
4241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
4242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(URLRequestTestHTTP, DeferredRedirect_GetFullRequestHeaders) {
4244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(test_server_.Start());
4245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestDelegate d;
4247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
4248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    d.set_quit_on_redirect(true);
4249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL test_url(test_server_.GetURL("files/redirect-test.html"));
4250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    URLRequest req(test_url, &d, &default_context_);
4251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_FALSE(d.have_full_request_headers());
4253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
425590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.received_redirect_count());
4258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(d.have_full_request_headers());
4259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CheckFullRequestHeaders(d.full_request_headers(), test_url);
4260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    d.ClearFullRequestHeaders();
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.FollowDeferredRedirect();
426390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GURL target_url(test_server_.GetURL("files/with-headers.html"));
42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
4267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(d.have_full_request_headers());
4268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CheckFullRequestHeaders(d.full_request_headers(), target_url);
42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path;
42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(base::DIR_SOURCE_ROOT, &path);
42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("net"));
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("data"));
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string contents;
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(file_util::ReadFileToString(path, &contents));
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(contents, d.data_received());
42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) {
42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_quit_on_redirect(true);
42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("files/redirect-test.html"), &d, &default_context_);
42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
429490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.received_redirect_count());
42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Cancel();
429990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, VaryHeader) {
43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
431190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Populate the cache.
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader("foo", "1");
43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
432090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
432190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
432290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LoadTimingInfo load_timing_info;
432390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    req.GetLoadTimingInfo(&load_timing_info);
432490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Expect a cache hit.
43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader("foo", "1");
43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
433690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(req.was_cached());
433990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
434090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LoadTimingInfo load_timing_info;
434190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    req.GetLoadTimingInfo(&load_timing_info);
434290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingCacheHitNoNetwork(load_timing_info);
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
434590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Expect a cache miss.
43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(
43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpRequestHeaders headers;
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    headers.SetHeader("foo", "2");
43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.SetExtraRequestHeaders(headers);
43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
435490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(req.was_cached());
435790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
435890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LoadTimingInfo load_timing_info;
435990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    req.GetLoadTimingInfo(&load_timing_info);
436090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuth) {
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // populate the cache
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
437590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // repeat request with end-to-end validation.  since auth-basic results in a
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cachable page, we expect this test to result in a 304.  in which case, the
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // response should be fetched from the cache.
43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.set_load_flags(LOAD_VALIDATE_CACHE);
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
439190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Should be the same cached document.
43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.was_cached());
43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that Set-Cookie headers in 401 responses are respected.
44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/6450
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) {
44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_requiring_auth =
44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("auth-basic?set-cookie-if-challenged");
44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Request a page that will give a 401 containing a Set-Cookie header.
44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that when the transaction is restarted, it includes the new cookie.
44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
44112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestURLRequestContext context(true);
44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.set_network_delegate(&network_delegate);
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.Init();
44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url_requiring_auth, &d, &context);
44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we sent the cookie in the restarted transaction.
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        != std::string::npos);
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same test as above, except this time the restart is initiated earlier
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (without user intervention since identity is embedded in the URL).
44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
44342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestURLRequestContext context(true);
44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.set_network_delegate(&network_delegate);
44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context.Init();
44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL::Replacements replacements;
44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string username("user2");
44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string password("secret");
44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacements.SetUsernameStr(username);
44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacements.SetPasswordStr(password);
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements);
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url_with_identity, &d, &context);
44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos);
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we sent the cookie in the restarted transaction.
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        != std::string::npos);
44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that load timing works as expected with auth and the cache.
44622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) {
44632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
44642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // populate the cache
44662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
44672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestDelegate d;
44682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
44692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
44712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
44722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
447390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
44742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
44762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info_before_auth;
44782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth(
44792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &load_timing_info_before_auth));
44802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info_before_auth,
44812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            CONNECT_TIMING_HAS_DNS_TIMES);
44822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info;
44842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.GetLoadTimingInfo(&load_timing_info);
44852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The test server does not support keep alive sockets, so the second
44862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // request with auth should use a new socket.
44872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
44882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(load_timing_info_before_auth.socket_log_id,
44892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              load_timing_info.socket_log_id);
44902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_LE(load_timing_info_before_auth.receive_headers_end,
44912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              load_timing_info.connect_timing.connect_start);
44922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
44932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
449490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Repeat request with end-to-end validation.  Since auth-basic results in a
449590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // cachable page, we expect this test to result in a 304.  In which case, the
44962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // response should be fetched from the cache.
44972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
44982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestDelegate d;
44992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    d.set_credentials(AuthCredentials(kUser, kSecret));
45002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
45022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.set_load_flags(LOAD_VALIDATE_CACHE);
45032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.Start();
45042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
450590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
45062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
45082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Should be the same cached document.
45102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(r.was_cached());
45112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
451290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Since there was a request that went over the wire, the load timing
451390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // information should include connection times.
45142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info;
45152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.GetLoadTimingInfo(&load_timing_info);
451690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
45172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
45182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
45192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this test, we do a POST which the server will 302 redirect.
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The subsequent transaction should use GET, and should not send the
45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Content-Type header.
45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/chromium/issues/detail?id=843
45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Post302RedirectGet) {
45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello world";
45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("files/redirect-to-echoall"), &d, &default_context_);
45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("POST");
45332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set headers (some of which are specific to the POST).
45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.AddHeadersFromString(
45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-Type: multipart/form-data; "
45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n"
45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,"
45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Accept-Language: en-US,en\r\n"
45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Accept-Charset: ISO-8859-1,*,utf-8\r\n"
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Content-Length: 11\r\n"
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Origin: http://localhost:1337/");
45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
454890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type;
45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.GetMimeType(&mime_type);
45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("text/html", mime_type);
45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& data = d.data_received();
45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the post-specific headers were stripped:
45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContainsString(data, "Content-Length:"));
45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContainsString(data, "Content-Type:"));
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContainsString(data, "Origin:"));
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These extra request headers should not have been stripped.
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(data, "Accept:"));
45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(data, "Accept-Language:"));
45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(data, "Accept-Charset:"));
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following tests check that we handle mutating the request method for
45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTTP redirects as expected.
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/56373 and http://crbug.com/102130.
45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect301Tests) {
45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = test_server_.GetURL("files/redirect301-to-echo");
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "POST", "GET", true);
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect302Tests) {
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = test_server_.GetURL("files/redirect302-to-echo");
45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "POST", "GET", true);
45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect303Tests) {
45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = test_server_.GetURL("files/redirect303-to-echo");
45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "POST", "GET", true);
45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "PUT", "GET", true);
45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, Redirect307Tests) {
46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url = test_server_.GetURL("files/redirect307-to-echo");
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "POST", "POST", true);
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) {
46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello world";
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("POST");
46192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kContentLength,
46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::UintToString(arraysize(kData) - 1));
46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestRedirectJob* job = new URLRequestRedirectJob(
46262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &req, &default_network_delegate_, test_server_.GetURL("echo"),
46272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      URLRequestRedirectJob::REDIRECT_302_FOUND);
46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job);
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
463190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("GET", req.method());
46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) {
46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello world";
46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.set_method("POST");
46432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kContentLength,
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::UintToString(arraysize(kData) - 1));
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestRedirectJob* job = new URLRequestRedirectJob(
46502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &req, &default_network_delegate_, test_server_.GetURL("echo"),
46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT);
46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job);
46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
465590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("POST", req.method());
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kData, d.data_received());
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default A-L header is sent.
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) {
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StaticHttpUserAgentSettings settings("en", EmptyString());
46652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_http_user_agent_settings(&settings);
46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("echoheader?Accept-Language"), &d, &context);
46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
467590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("en", d.data_received());
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that an empty A-L header is not sent. http://crbug.com/77365.
46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) {
46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StaticHttpUserAgentSettings settings(EmptyString(), EmptyString());
46842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We override the language after initialization because empty entries
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // get overridden by Init().
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_http_user_agent_settings(&settings);
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(
46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server_.GetURL("echoheader?Accept-Language"), &d, &context);
46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
469690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("None", d.data_received());
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the A-L header, the default is not appended.
47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/20894
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) {
47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?Accept-Language"),
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru");
47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
471390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("ru"), d.data_received());
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default A-E header is sent.
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) {
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"),
47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
472890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(d.data_received(), "gzip"));
47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the A-E header, the default is not appended.
47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/47381
47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) {
47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"),
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity");
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
474590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContainsString(d.data_received(), "gzip"));
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContainsString(d.data_received(), "identity"));
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that setting the A-C header sends the proper header.
47512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, SetAcceptCharset) {
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?Accept-Charset"),
47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r");
47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
476290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("koi-8r"), d.data_received());
47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that default User-Agent header is sent.
47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, DefaultUserAgent) {
47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?User-Agent"),
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
477590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(req.context()->GetUserAgent(req.url()), d.data_received());
47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that if request overrides the User-Agent header,
47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the default is not appended.
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, OverrideUserAgent) {
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequest req(test_server_.GetURL("echoheader?User-Agent"),
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &d,
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 &default_context_);
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpRequestHeaders headers;
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)");
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.SetExtraRequestHeaders(headers);
47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.Start();
479290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the net tests are being run with ChromeFrame then we need to allow for
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the 'chromeframe' suffix which is added to the user agent before the
47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closing parentheses.
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(StartsWithASCII(d.data_received(), "Lynx (textmode", true));
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that a NULL HttpUserAgentSettings causes the corresponding empty
48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// User-Agent header to be sent but does not send the Accept-Language and
48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Accept-Charset headers.
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) {
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We override the HttpUserAgentSettings after initialization because empty
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // entries get overridden by Init().
48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_http_user_agent_settings(NULL);
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* request;
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_response;
48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = { { "echoheader?Accept-Language", "None" },
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                { "echoheader?Accept-Charset", "None" },
48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                { "echoheader?User-Agent", "" } };
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); i++) {
48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest req(test_server_.GetURL(tests[i].request), &d, &context);
48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.Start();
482490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_response, d.data_received())
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << " Request = \"" << tests[i].request << "\"";
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure that URLRequest passes on its priority updates to
48312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// newly-created jobs after the first one.
48322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) {
48332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
48342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
48362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
48372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
48382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<URLRequestRedirectJob> redirect_job =
48402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new URLRequestRedirectJob(
48412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &req, &default_network_delegate_, test_server_.GetURL("echo"),
48422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          URLRequestRedirectJob::REDIRECT_302_FOUND);
4843868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(redirect_job.get());
48442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.SetPriority(LOW);
48462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
48472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(req.is_pending());
48482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<URLRequestTestJob> job =
48502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new URLRequestTestJob(&req, &default_network_delegate_);
4851868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTestInterceptor()->set_main_intercept_job(job.get());
48522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should trigger |job| to be started.
485490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
48552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(LOW, job->priority());
48562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
48572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSRequestTest : public testing::Test {
48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPSRequestTest() : default_context_(true) {
48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.set_network_delegate(&default_network_delegate_);
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_context_.Init();
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HTTPSRequestTest() {}
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
48672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate default_network_delegate_;  // Must outlive URLRequest.
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext default_context_;
48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSGetTest) {
4872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
4873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::kLocalhost,
4875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
488490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckSSLInfo(r.ssl_info());
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server.host_port_pair().host(),
48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server.host_port_pair().port(),
48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) {
4898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
4899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
4900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
4901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
4903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool err_allowed = true;
49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      d.set_allow_certificate_errors(err_allowed);
4911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.Start();
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.is_pending());
49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
491690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1, d.response_started_count());
49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(d.received_data_before_response());
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(d.have_certificate_errors());
49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (err_allowed) {
49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(0, d.bytes_received());
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CheckSSLInfo(r.ssl_info());
49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(0, d.bytes_received());
49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSExpiredTest) {
4932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
4933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_EXPIRED);
4934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
4935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
4937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterate from false to true, just so that we do the opposite of the
49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // previous test in order to increase test coverage.
49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool err_allowed = false;
49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      d.set_allow_certificate_errors(err_allowed);
4947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.Start();
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(r.is_pending());
49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(1, d.response_started_count());
49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(d.received_data_before_response());
49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(d.have_certificate_errors());
49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (err_allowed) {
49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(0, d.bytes_received());
49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CheckSSLInfo(r.ssl_info());
49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(0, d.bytes_received());
49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests TLSv1.1 -> TLSv1 fallback. Verifies that we don't fall back more
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// than necessary.
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, TLSv1Fallback) {
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 default_version_max = SSLConfigService::default_version_max();
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The OpenSSL library in use may not support TLS 1.1.
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_OPENSSL)
49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(default_version_max, SSL_PROTOCOL_VERSION_TLS1);
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (default_version_max <= SSL_PROTOCOL_VERSION_TLS1)
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
4979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_OK);
49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_options.tls_intolerant =
4981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
4982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
4983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
4984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
4985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_allow_certificate_errors(true);
4992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest r(test_server.GetURL(std::string()), &d, &context);
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Start();
49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
499590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, d.bytes_received());
49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_TLS1),
50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SSLConnectionStatusToVersion(r.ssl_info().connection_status));
50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK);
50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that a load of www.google.com with a certificate error sets
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the |certificate_errors_are_fatal| flag correctly. This flag will cause
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the interstitial to be fatal.
50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) {
5008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
5010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We require that the URL be www.google.com in order to pick up the
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preloaded HSTS entries in the TransportSecurityState. This means that we
50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have to use a MockHostResolver in order to direct www.google.com to the
50192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // testserver. By default, MockHostResolver maps all hosts to 127.0.0.1.
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHostResolver host_resolver;
50222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_host_resolver(&host_resolver);
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState transport_security_state;
50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_transport_security_state(&transport_security_state);
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
50312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d",
50322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       test_server.host_port_pair().port())),
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &d,
50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &context);
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Start();
50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.is_pending());
50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
503990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(d.received_data_before_response());
50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(d.have_certificate_errors());
50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(d.certificate_errors_are_fatal());
50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests that cached HTTPS page loads do not cause any updates to the
50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TransportSecurityState.
50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) {
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't
50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matter. It just has to be any error.
5052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5053c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
5054c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We require that the URL be www.google.com in order to pick up the
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preloaded and dynamic HSTS and public key pin entries in the
50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TransportSecurityState. This means that we have to use a
50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MockHostResolver in order to direct www.google.com to the testserver.
50642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, MockHostResolver maps all hosts to 127.0.0.1.
50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockHostResolver host_resolver;
50672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_network_delegate(&network_delegate);
50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_host_resolver(&host_resolver);
50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState transport_security_state;
50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState::DomainState domain_state;
50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true,
50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &domain_state));
50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.set_transport_security_state(&transport_security_state);
50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
50792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d",
50802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       test_server.host_port_pair().port())),
50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &d,
50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               &context);
50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Start();
50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.is_pending());
50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
508790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(d.received_data_before_response());
50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(d.have_certificate_errors());
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(d.certificate_errors_are_fatal());
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a fresh copy of the state, and check that it hasn't been updated.
50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportSecurityState::DomainState new_domain_state;
50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true,
50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &new_domain_state));
50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(new_domain_state.upgrade_mode, domain_state.upgrade_mode);
50997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_domain_state.sts_include_subdomains,
51007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            domain_state.sts_include_subdomains);
51017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_domain_state.pkp_include_subdomains,
51027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            domain_state.pkp_include_subdomains);
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FingerprintsEqual(new_domain_state.static_spki_hashes,
51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                domain_state.static_spki_hashes));
51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FingerprintsEqual(new_domain_state.dynamic_spki_hashes,
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                domain_state.dynamic_spki_hashes));
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FingerprintsEqual(new_domain_state.bad_static_spki_hashes,
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                domain_state.bad_static_spki_hashes));
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure HSTS preserves a POST request's method and body.
51122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HTTPSRequestTest, HSTSPreservesPosts) {
51132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char kData[] = "hello world";
51142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_OK);
5117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
51212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server.Start());
51222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Per spec, TransportSecurityState expects a domain name, rather than an IP
51252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // address, so a MockHostResolver is needed to redirect www.somewhere.com to
5126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the SpawnedTestServer.  By default, MockHostResolver maps all hosts
5127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to 127.0.0.1.
51282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockHostResolver host_resolver;
51292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force https for www.somewhere.com.
51312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TransportSecurityState transport_security_state;
51322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
51332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool include_subdomains = false;
51342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transport_security_state.AddHSTS("www.somewhere.com", expiry,
51352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   include_subdomains);
51362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
51382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestURLRequestContext context(true);
51402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context.set_host_resolver(&host_resolver);
51412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context.set_transport_security_state(&transport_security_state);
51422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context.set_network_delegate(&network_delegate);
51432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context.Init();
51442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestDelegate d;
51462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will
51472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // cause a certificate error.  Ignore the error.
51482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  d.set_allow_certificate_errors(true);
51492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  URLRequest req(GURL(base::StringPrintf("http://www.somewhere.com:%d/echo",
51512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         test_server.host_port_pair().port())),
51522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &d,
51532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &context);
51542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_method("POST");
51552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
51562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  req.Start();
515890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
51592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("https", req.url().scheme());
51612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("POST", req.method());
51622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kData, d.data_received());
5163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LoadTimingInfo load_timing_info;
5165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  network_delegate.GetLoadTimingInfoBeforeRedirect(&load_timing_info);
5166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // LoadTimingInfo of HSTS redirects is similar to that of network cache hits
5167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestLoadTimingCacheHitNoNetwork(load_timing_info);
51682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
51692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, SSLv3Fallback) {
5171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_OK);
5173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.tls_intolerant =
5174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL;
5175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context(true);
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context.Init();
51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_allow_certificate_errors(true);
5185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  URLRequest r(test_server.GetURL(std::string()), &d, &context);
51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  r.Start();
51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
518890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, d.response_started_count());
51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(0, d.bytes_received());
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_SSL3),
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SSLConnectionStatusToVersion(r.ssl_info().connection_status));
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK);
51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLClientAuthTestDelegate : public TestDelegate {
52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) {
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCertificateRequested(
52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request,
52052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SSLCertRequestInfo* cert_request_info) OVERRIDE {
52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    on_certificate_requested_count_++;
520790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int on_certificate_requested_count() {
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return on_certificate_requested_count_;
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int on_certificate_requested_count_;
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(davidben): Test the rest of the code. Specifically,
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Filtering which certificates to select.
52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Sending a certificate back.
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Getting a certificate request in an SSL renegotiation sending the
52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   HTTP request.
52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, ClientAuthTest) {
5224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_options.request_client_certificate = true;
5226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientAuthTestDelegate d;
52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
523990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.on_certificate_requested_count());
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, d.bytes_received());
52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Send no certificate.
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(davidben): Get temporary client cert import (with keys) working on
52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // all platforms so we can test sending a cert as well.
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.ContinueWithCertificate(NULL);
52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(0, d.bytes_received());
52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, ResumeTest) {
52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that we attempt a session resume when making two connections to the
52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // same host.
5261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_options.record_resume = true;
5263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientSocket::ClearSessionCache();
52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
527990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CloseAllConnections();
52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
529590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The response will look like;
52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   insert abc
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   lookup abc
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   insert xyz
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // With a newline at the end which makes the split think that there are
53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // four lines.
53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> lines;
53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SplitString(d.data_received(), '\n', &lines);
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(4u, lines.size()) << d.data_received();
53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string session_id;
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < 2; i++) {
53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<std::string> parts;
53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::SplitString(lines[i], '\t', &parts);
53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(2u, parts.size());
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i == 0) {
53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ("insert", parts[0]);
53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        session_id = parts[1];
53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ("lookup", parts[0]);
53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_EQ(session_id, parts[1]);
53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) {
53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that sessions aren't resumed when the value of ssl_session_cache_shard
53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // differs.
5330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options;
53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ssl_options.record_resume = true;
5332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server(
5333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::TYPE_HTTPS,
5334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ssl_options,
5335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLClientSocket::ClearSessionCache();
53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
534890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now create a new HttpCache with a different ssl_session_cache_shard value.
53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpNetworkSession::Params params;
53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.host_resolver = default_context_.host_resolver();
53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.cert_verifier = default_context_.cert_verifier();
53577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  params.transport_security_state = default_context_.transport_security_state();
53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.proxy_service = default_context_.proxy_service();
53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.ssl_config_service = default_context_.ssl_config_service();
53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.http_auth_handler_factory =
53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_context_.http_auth_handler_factory();
53622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.network_delegate = &default_network_delegate_;
53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.http_server_properties = default_context_.http_server_properties();
53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.ssl_session_cache_shard = "alternate";
53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::HttpCache> cache(new net::HttpCache(
53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::HttpNetworkSession(params),
53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HttpCache::DefaultBackend::InMemory(0)));
53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_context_.set_http_transaction_factory(cache.get());
53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
538090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The response will look like;
53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   insert abc
53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   insert xyz
53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // With a newline at the end which makes the split think that there are
53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // three lines.
53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> lines;
53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SplitString(d.data_received(), '\n', &lines);
53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(3u, lines.size());
53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string session_id;
53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < 2; i++) {
53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<std::string> parts;
53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::SplitString(lines[i], '\t', &parts);
53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(2u, parts.size());
53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ("insert", parts[0]);
54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i == 0) {
54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        session_id = parts[1];
54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EXPECT_NE(session_id, parts[1]);
54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSSLConfigService : public SSLConfigService {
54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSSLConfigService(bool ev_enabled, bool online_rev_checking)
54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ev_enabled_(ev_enabled),
54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        online_rev_checking_(online_rev_checking) {
54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSLConfigService:
54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetSSLConfig(SSLConfig* config) OVERRIDE {
54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *config = SSLConfig();
54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config->rev_checking_enabled = online_rev_checking_;
54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config->verify_ev_cert = ev_enabled_;
54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestSSLConfigService() {}
54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool ev_enabled_;
54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool online_rev_checking_;
54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This the fingerprint of the "Testing CA" certificate used by the testserver.
54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See net/data/ssl/certificates/ocsp-test-root.pem.
54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const SHA1HashValue kOCSPTestCertFingerprint =
54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { { 0xf1, 0xad, 0xf6, 0xce, 0x42, 0xac, 0xe7, 0xb4, 0xf4, 0x24,
54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xdb, 0x1a, 0xf7, 0xa0, 0x9f, 0x09, 0xa1, 0xea, 0xf1, 0x5c } };
54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the policy OID contained in the certificates that testserver
54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generates.
54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1";
54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSOCSPTest : public HTTPSRequestTest {
54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTTPSOCSPTest()
54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : context_(true),
54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ev_test_policy_(
54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(),
54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   kOCSPTestCertFingerprint,
54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   kOCSPTestCertPolicy)) {
54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetupContext(&context_);
54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_.Init();
54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::X509Certificate> root_cert =
54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem");
54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert);
5458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    test_root_.reset(new ScopedTestRoot(root_cert.get()));
54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_NSS) || defined(OS_IOS)
54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetURLRequestContextForNSSHttpIO(&context_);
54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnsureNSSHttpIOInit();
54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options,
54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    CertStatus* out_cert_status) {
54682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We always overwrite out_cert_status.
54692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_cert_status = 0;
5470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SpawnedTestServer test_server(
5471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SpawnedTestServer::TYPE_HTTPS,
5472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ssl_options,
5473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_server.Start());
54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDelegate d;
54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    d.set_allow_certificate_errors(true);
5478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    URLRequest r(test_server.GetURL(std::string()), &d, &context_);
54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
548190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out_cert_status = r.ssl_info().cert_status;
54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~HTTPSOCSPTest() {
54882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_NSS) || defined(OS_IOS)
54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShutdownNSSHttpIO();
54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetupContext configures the URLRequestContext that will be used for making
54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connetions to testserver. This can be overridden in test subclasses for
54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // different behaviour.
54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupContext(URLRequestContext* context) {
54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_ssl_config_service(
54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestSSLConfigService(true /* check for EV */,
55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 true /* online revocation checking */));
55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedTestRoot> test_root_;
55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext context_;
55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedTestEVPolicy> ev_test_policy_;
55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() {
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't
55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have that ability on other platforms.
55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION;
55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SystemUsesChromiumEVMetadata returns true iff the current operating system
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then
55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// several tests are effected because our testing EV certificate won't be
55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recognised as EV.
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SystemUsesChromiumEVMetadata() {
55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_OPENSSL)
55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/117478 - OpenSSL does not support EV validation.
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
55262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) && !defined(OS_IOS)
55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On OS X, we use the system to tell us whether a certificate is EV or not
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the system won't recognise our testing root.
55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool SystemSupportsOCSP() {
55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_OPENSSL)
55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/117478 - OpenSSL does not support OCSP.
55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::win::GetVersion() >= base::win::VERSION_VISTA;
55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Valid) {
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Revoked) {
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertStatus cert_status;
55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !(defined(OS_MACOSX) && !defined(OS_IOS))
55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Doesn't pass on OS X yet for reasons that need to be investigated.
55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSOCSPTest, Invalid) {
55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cert_status & CERT_STATUS_ALL_ERRORS);
56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Without a positive OCSP response, we shouldn't show the EV status.
56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSEVCRLSetTest : public HTTPSOCSPTest {
56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupContext(URLRequestContext* context) OVERRIDE {
56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_ssl_config_service(
56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestSSLConfigService(true /* check for EV */,
56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false /* online revocation checking */));
56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) {
56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>());
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)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) {
56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>());
56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertStatus cert_status;
56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) {
56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(
56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertStatus cert_status;
56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cert_status & CERT_STATUS_ALL_ERRORS);
56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, FreshCRLSet) {
5689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(
56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::EmptyCRLSetForTesting()));
56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // With a valid, fresh CRLSet the bad OCSP response shouldn't matter because
56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we wont check it.
57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) {
57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that when EV verification is requested, but online revocation
57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // checking is disabled, and the leaf certificate is not in fact EV, that
57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no revocation checking actually happens.
57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SystemSupportsOCSP()) {
57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unmark the certificate's OID as EV, which should disable revocation
57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // checking (as per the user preference)
57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ev_test_policy_.reset();
57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(
57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertStatus cert_status;
57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HTTPSCRLSetTest : public HTTPSOCSPTest {
57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetupContext(URLRequestContext* context) OVERRIDE {
57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context->set_ssl_config_service(
57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestSSLConfigService(false /* check for EV */,
57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 false /* online revocation checking */));
57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) {
5746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer::SSLOptions ssl_options(
5747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SpawnedTestServer::SSLOptions::CERT_AUTO);
5748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLConfigService::SetCRLSet(
57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CertStatus cert_status;
57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConnection(ssl_options, &cert_status);
57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're not trying EV verification then, even if the CRLSet has expired,
57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we don't fall back to online revocation checks.
57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_IOS)
57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(DISABLE_FTP_SUPPORT)
57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestTestFTP : public URLRequestTest {
57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestTestFTP()
5767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : test_server_(SpawnedTestServer::TYPE_FTP, SpawnedTestServer::kLocalhost,
57682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath()) {
57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpawnedTestServer test_server_;
57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure an FTP request using an unsafe ports fails.
57762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(URLRequestTestFTP, UnsafePort) {
57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestJobFactoryImpl job_factory;
5780b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  FtpNetworkLayer ftp_transaction_factory(default_context_.host_resolver());
57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("ftp://127.0.0.1:7");
57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job_factory.SetProtocolHandler(
57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ftp",
5785b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      new FtpProtocolHandler(&ftp_transaction_factory));
57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_context_.set_job_factory(&job_factory);
57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(url, &d, &default_context_);
57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
579490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ERR_UNSAFE_PORT, r.status().error());
57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPDirectoryListing) {
58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("/"), &d, &default_context_);
58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
581290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(0, d.bytes_received());
58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPGetTestAnonymous) {
58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("/LICENSE"), &d, &default_context_);
58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
583890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPGetTest) {
58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"),
58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
587090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().host(),
58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().host());
58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(test_server_.host_port_pair().port(),
58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              r.GetSocketAddress().port());
58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
58832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
58842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LoadTimingInfo load_timing_info;
58852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    r.GetLoadTimingInfo(&load_timing_info);
588690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TestLoadTimingNoHttpResponse(load_timing_info);
58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPassword) {
58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome",
59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_password"),
59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), 0);
59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPasswordRestart) {
59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set correct login credentials. The delegate will be asked for them when
59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the initial login with wrong credentials will fail.
59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_credentials(AuthCredentials(kChrome, kChrome));
59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome",
59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_password"),
59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &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)    int64 file_size = 0;
59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUser) {
59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate d;
59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_user",
59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome"),
59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
597190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), 0);
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_FTPCheckWrongUserRestart) {
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)  // Set correct login credentials. The delegate will be asked for them when
59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the initial login with wrong credentials will fail.
59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.set_credentials(AuthCredentials(kChrome, kChrome));
59945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_user",
59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome"),
59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &d,
60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
60035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
600490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d.response_started_count());
60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d.received_data_before_response());
60125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
60135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCacheURLCredentials) {
60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestDelegate> d(new TestDelegate);
60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pass correct login identity in the URL.
60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome",
60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome"),
60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        d.get(),
60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
603690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d->response_started_count());
60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.reset(new TestDelegate);
60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This request should use cached identity from previous request.
60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_);
60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d->response_started_count());
60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, see http://crbug.com/25045.
60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(URLRequestTestFTP, DISABLED_FTPCacheLoginBoxCredentials) {
60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server_.Start());
60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath app_path;
60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_path = app_path.AppendASCII("LICENSE");
60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestDelegate> d(new TestDelegate);
60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set correct login credentials. The delegate will be asked for them when
60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the initial login with wrong credentials will fail.
60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d->set_credentials(AuthCredentials(kChrome, kChrome));
60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(
60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_server_.GetURLWithUserAndPassword("/LICENSE",
60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "chrome",
60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               "wrong_password"),
60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        d.get(),
60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &default_context_);
60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
608890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d->response_started_count());
60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a new delegate without explicit credentials. The cached ones should be
61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used.
61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  d.reset(new TestDelegate);
61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't pass wrong credentials in the URL, they would override valid cached
61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ones.
61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_);
61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.Start();
61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(r.is_pending());
61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
610990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 file_size = 0;
61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::GetFileSize(app_path, &file_size);
61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(r.is_pending());
61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, d->response_started_count());
61165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(d->received_data_before_response());
61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(DISABLE_FTP_SUPPORT)
61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
6123