url_request_unittest.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Copyright (c) 2012 The Chromium Authors. All rights reserved.
292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Use of this source code is governed by a BSD-style license that can be
392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// found in the LICENSE file.
492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "build/build_config.h"
692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if defined(OS_WIN)
892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <windows.h>
992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <shlobj.h>
1092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
1192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
1292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <algorithm>
1392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <string>
1492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
1592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/basictypes.h"
1692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/bind.h"
1792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/compiler_specific.h"
1892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/file_util.h"
1992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/format_macros.h"
2092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/memory/weak_ptr.h"
2192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/message_loop.h"
2292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/path_service.h"
2392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/process_util.h"
2492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/string_number_conversions.h"
2592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/string_util.h"
2692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/stringprintf.h"
2792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/strings/string_piece.h"
2892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/strings/string_split.h"
2992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/utf_string_conversions.h"
3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/capturing_net_log.h"
3192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/load_flags.h"
3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/load_timing_info.h"
3392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/load_timing_info_test_util.h"
3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_errors.h"
3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_log.h"
3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_log_unittest.h"
3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_module.h"
3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/net_util.h"
3992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/test_data_directory.h"
4092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/upload_bytes_element_reader.h"
4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/upload_data_stream.h"
4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/base/upload_file_element_reader.h"
4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/cert/ev_root_ca_metadata.h"
4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/cert/test_root_certs.h"
4592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/cookies/cookie_monster.h"
4692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/cookies/cookie_store_test_helpers.h"
4792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/disk_cache/disk_cache.h"
4892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/dns/mock_host_resolver.h"
4992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/ftp/ftp_network_layer.h"
5092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_cache.h"
5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_network_layer.h"
5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_network_session.h"
5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_request_headers.h"
5492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/http/http_response_headers.h"
5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/ocsp/nss_ocsp.h"
5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/proxy/proxy_service.h"
5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/socket/ssl_client_socket.h"
5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/ssl/ssl_connection_status_flags.h"
5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/test/cert_test_util.h"
6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/test/spawned_test_server/spawned_test_server.h"
6114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller#include "net/url_request/data_protocol_handler.h"
6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/file_protocol_handler.h"
6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/ftp_protocol_handler.h"
6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/static_http_user_agent_settings.h"
6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request.h"
6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_file_dir_job.h"
6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_http_job.h"
6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_job_factory_impl.h"
6992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_redirect_job.h"
7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_test_job.h"
7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "net/url_request/url_request_test_util.h"
7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "testing/gtest/include/gtest/gtest.h"
730cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller#include "testing/platform_test.h"
7492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if defined(OS_WIN)
7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/win/scoped_com_initializer.h"
7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/win/scoped_comptr.h"
7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "base/win/windows_version.h"
7992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
8092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieriusing base::Time;
8292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbierinamespace net {
8465303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller
8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbierinamespace {
8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8792617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericonst base::string16 kChrome(ASCIIToUTF16("chrome"));
8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericonst base::string16 kSecret(ASCIIToUTF16("secret"));
8914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumillerconst base::string16 kUser(ASCIIToUTF16("user"));
9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
9165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller// Tests load timing information in the case a fresh connection was used, with
9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// no proxy.
9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid TestLoadTimingNotReused(const net::LoadTimingInfo& load_timing_info,
9492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                             int connect_timing_flags) {
9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.socket_reused);
9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.request_start.is_null());
10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.request_start,
10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_info.connect_timing.connect_start);
10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                              connect_timing_flags);
10592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.connect_timing.connect_end,
10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_info.send_start);
10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
10992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
11392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Same as above, but with proxy times.
115b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbierivoid TestLoadTimingNotReusedWithProxy(
11692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    const net::LoadTimingInfo& load_timing_info,
11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    int connect_timing_flags) {
11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.socket_reused);
11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
12092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
12292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.request_start.is_null());
12392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.request_start,
12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_info.proxy_resolve_start);
12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.proxy_resolve_start,
12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_info.proxy_resolve_end);
12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.proxy_resolve_end,
12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_info.connect_timing.connect_start);
13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                              connect_timing_flags);
13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.connect_timing.connect_end,
13392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_info.send_start);
13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
13792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Same as above, but with a reused socket and proxy times.
13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid TestLoadTimingReusedWithProxy(
14092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    const net::LoadTimingInfo& load_timing_info) {
14192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(load_timing_info.socket_reused);
14292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_NE(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
14392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
14592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.request_start.is_null());
14692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
14892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_LE(load_timing_info.request_start,
15014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller            load_timing_info.proxy_resolve_start);
151f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri  EXPECT_LE(load_timing_info.proxy_resolve_start,
152f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri            load_timing_info.proxy_resolve_end);
153f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri  EXPECT_LE(load_timing_info.proxy_resolve_end,
154f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri            load_timing_info.send_start);
155f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri  EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
156f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri  EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
15792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
15892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Tests load timing in the case that there is no underlying connection.  This
16092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// can be used to test in the case of cached responses, errors, or non-HTTP
16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// requests.
16292617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid TestLoadTimingNoHttpConnection(
16392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    const net::LoadTimingInfo& load_timing_info) {
16492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.socket_reused);
16592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(net::NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
1660cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller
16792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Only the request times should be non-null.
16892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
16992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(load_timing_info.request_start.is_null());
17092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
17192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
17292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
17392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
17514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  EXPECT_TRUE(load_timing_info.send_start.is_null());
17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(load_timing_info.send_end.is_null());
17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(load_timing_info.receive_headers_end.is_null());
17892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
17992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieribase::StringPiece TestNetResourceProvider(int key) {
18192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return "header";
18292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Do a case-insensitive search through |haystack| for |needle|.
18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieribool ContainsString(const std::string& haystack, const char* needle) {
18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  std::string::const_iterator it =
18792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      std::search(haystack.begin(),
18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                  haystack.end(),
18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                  needle,
19092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                  needle + strlen(needle),
19192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                  base::CaseInsensitiveCompare<char>());
1924a06248281f65d8a653c1bb744947bb6d47fdc9cChristoph Bumiller  return it != haystack.end();
193e27d72d6c3ca3512bfea524b8a7b007960841057Christoph Bumiller}
194e27d72d6c3ca3512bfea524b8a7b007960841057Christoph Bumiller
195dc4c821f0817a3db716f965692fb701079f66340Marek Olšákvoid FillBuffer(char* buffer, size_t len) {
19692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  static bool called = false;
19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  if (!called) {
19892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    called = true;
19992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    int seed = static_cast<int>(Time::Now().ToInternalValue());
20092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    srand(seed);
20192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  for (size_t i = 0; i < len; i++) {
20492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    buffer[i] = static_cast<char>(rand());
20592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    if (!buffer[i])
20692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      buffer[i] = 'g';
20792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
20892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
20992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriUploadDataStream* CreateSimpleUploadData(const char* data) {
21192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  scoped_ptr<UploadElementReader> reader(
21292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      new UploadBytesElementReader(data, strlen(data)));
21392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return UploadDataStream::CreateWithReader(reader.Pass(), 0);
21492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
21592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Verify that the SSLInfo of a successful SSL connection has valid values.
21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid CheckSSLInfo(const SSLInfo& ssl_info) {
21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Allow ChromeFrame fake SSLInfo to get through.
2199f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie  if (ssl_info.cert.get() &&
2209f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie      ssl_info.cert.get()->issuer().GetDisplayName() == "Chrome Internal") {
2219f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie    // -1 means unknown.
2229f61e43b4903c6cf0ac03a479ec9ed7b15fd6ccfDave Airlie    EXPECT_EQ(ssl_info.security_bits, -1);
22392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return;
22492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
22592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
22692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // -1 means unknown.  0 means no encryption.
22792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_GT(ssl_info.security_bits, 0);
22892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
22992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated.
23092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  int cipher_suite = SSLConnectionStatusToCipherSuite(
23192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      ssl_info.connection_status);
23292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_NE(0, cipher_suite);
23392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
23492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
23592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieribool FingerprintsEqual(const HashValueVector& a, const HashValueVector& b) {
23692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  size_t size = a.size();
23792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
23892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  if (size != b.size())
23992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return false;
24092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
24192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  for (size_t i = 0; i < size; ++i) {
24265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller    if (!a[i].Equals(b[i]))
24392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return false;
24492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
24592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
24692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return true;
24792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
24892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
24992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// A network delegate that allows the user to choose a subset of request stages
25092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// to block in. When blocking, the delegate can do one of the following:
25192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//  * synchronously return a pre-specified error code, or
25292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//  * asynchronously return that value via an automatically called callback,
25392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//    or
25492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//  * block and wait for the user to do a callback.
25592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Additionally, the user may also specify a redirect URL -- then each request
25692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// with the current URL different from the redirect target will be redirected
25792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// to that target, in the on-before-URL-request stage, independent of whether
25892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// the delegate blocks in ON_BEFORE_URL_REQUEST or not.
25992617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass BlockingNetworkDelegate : public TestNetworkDelegate {
26092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public:
26192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Stages in which the delegate can block.
26292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  enum Stage {
26392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    NOT_BLOCKED = 0,
26492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    ON_BEFORE_URL_REQUEST = 1 << 0,
2651b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri    ON_BEFORE_SEND_HEADERS = 1 << 1,
2661b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri    ON_HEADERS_RECEIVED = 1 << 2,
26792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    ON_AUTH_REQUIRED = 1 << 3
2681b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri  };
2691b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
27092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Behavior during blocked stages.  During other stages, just
2711b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri  // returns net::OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION.
2721b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri  enum BlockMode {
27392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    SYNCHRONOUS,    // No callback, returns specified return values.
2741b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri    AUTO_CALLBACK,  // |this| posts a task to run the callback using the
2751b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri                    // specified return codes.
27692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    USER_CALLBACK,  // User takes care of doing a callback.  |retval_| and
2771b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri                    // |auth_retval_| are ignored. In every blocking stage the
2781b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri                    // message loop is quit.
2791b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri  };
2801b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
2811b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri  // Creates a delegate which does not block at all.
28292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  explicit BlockingNetworkDelegate(BlockMode block_mode);
2831b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
2841b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri  // For users to trigger a callback returning |response|.
28592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Side-effects: resets |stage_blocked_for_callback_| and stored callbacks.
2861b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri  // Only call if |block_mode_| == USER_CALLBACK.
2871b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri  void DoCallback(int response);
28892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  void DoAuthCallback(NetworkDelegate::AuthRequiredResponse response);
2891b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
29092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Setters.
29192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  void set_retval(int retval) {
29292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    ASSERT_NE(USER_CALLBACK, block_mode_);
29392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    ASSERT_NE(ERR_IO_PENDING, retval);
29492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    ASSERT_NE(OK, retval);
29592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    retval_ = retval;
29692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
29792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
29892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // If |auth_retval| == AUTH_REQUIRED_RESPONSE_SET_AUTH, then
29992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // |auth_credentials_| will be passed with the response.
3008224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri  void set_auth_retval(AuthRequiredResponse auth_retval) {
3013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    ASSERT_NE(USER_CALLBACK, block_mode_);
30292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval);
3038224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri    auth_retval_ = auth_retval;
3043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
30592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  void set_auth_credentials(const AuthCredentials& auth_credentials) {
30692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    auth_credentials_ = auth_credentials;
30792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
30892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
30992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  void set_redirect_url(const GURL& url) {
31092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    redirect_url_ = url;
31192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
31292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
31392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  void set_block_on(int block_on) {
31492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    block_on_ = block_on;
31592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
31692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
31792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Allows the user to check in which state did we block.
31892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  Stage stage_blocked_for_callback() const {
31992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(USER_CALLBACK, block_mode_);
32092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return stage_blocked_for_callback_;
32192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
32292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
32392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri private:
32492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  void RunCallback(int response, const CompletionCallback& callback);
32592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  void RunAuthCallback(AuthRequiredResponse response,
32692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                       const AuthCallback& callback);
32792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
32892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // TestNetworkDelegate implementation.
32992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual int OnBeforeURLRequest(URLRequest* request,
33092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 const CompletionCallback& callback,
33192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 GURL* new_url) OVERRIDE;
33292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
33392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual int OnBeforeSendHeaders(URLRequest* request,
33492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                  const CompletionCallback& callback,
33592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                  HttpRequestHeaders* headers) OVERRIDE;
33692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
33792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual int OnHeadersReceived(
33892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      URLRequest* request,
33992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      const CompletionCallback& callback,
34092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      const HttpResponseHeaders* original_response_headers,
34192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      scoped_refptr<HttpResponseHeaders>* override_response_headers) OVERRIDE;
34292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
34355592d9da1bb694c7275984cf9a3ecaafcccf46aChristoph Bumiller  virtual NetworkDelegate::AuthRequiredResponse OnAuthRequired(
34492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      URLRequest* request,
34555592d9da1bb694c7275984cf9a3ecaafcccf46aChristoph Bumiller      const AuthChallengeInfo& auth_info,
34692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      const AuthCallback& callback,
347507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák      AuthCredentials* credentials) OVERRIDE;
34892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
34992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Resets the callbacks and |stage_blocked_for_callback_|.
35092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  void Reset();
35192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
35292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Checks whether we should block in |stage|. If yes, returns an error code
35392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // and optionally sets up callback based on |block_mode_|. If no, returns OK.
35492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  int MaybeBlockStage(Stage stage, const CompletionCallback& callback);
35592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
35692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Configuration parameters, can be adjusted by public methods:
35792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  const BlockMode block_mode_;
35892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
35992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Values returned on blocking stages when mode is SYNCHRONOUS or
36092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING.
36192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  int retval_;  // To be returned in non-auth stages.
36292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  AuthRequiredResponse auth_retval_;
36392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
36492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  GURL redirect_url_;  // Used if non-empty.
36592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  int block_on_;  // Bit mask: in which stages to block.
36692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
36792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // |auth_credentials_| will be copied to |*target_auth_credential_| on
36892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // callback.
36992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  AuthCredentials auth_credentials_;
37092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  AuthCredentials* target_auth_credentials_;
37192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
37292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Internal variables, not set by not the user:
37392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Last blocked stage waiting for user callback (unused if |block_mode_| !=
37492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // USER_CALLBACK).
37592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  Stage stage_blocked_for_callback_;
37692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
37792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Callback objects stored during blocking stages.
37892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  CompletionCallback callback_;
37992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  AuthCallback auth_callback_;
38092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
38165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller  base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_;
382974412d7b985f44c2d3a68f818d2723346a4512bChristoph Bumiller
38392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate);
38465303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller};
38565303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller
38665303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph BumillerBlockingNetworkDelegate::BlockingNetworkDelegate(BlockMode block_mode)
38765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller    : block_mode_(block_mode),
38865303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller      retval_(OK),
38992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION),
39092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      block_on_(0),
39192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      target_auth_credentials_(NULL),
39292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      stage_blocked_for_callback_(NOT_BLOCKED),
39392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      weak_factory_(this) {
3948224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri}
39592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
39692617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid BlockingNetworkDelegate::DoCallback(int response) {
39792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_EQ(USER_CALLBACK, block_mode_);
39892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_NE(NOT_BLOCKED, stage_blocked_for_callback_);
39992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_NE(ON_AUTH_REQUIRED, stage_blocked_for_callback_);
40092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  CompletionCallback callback = callback_;
4018224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri  Reset();
40292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  RunCallback(response, callback);
40392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
40492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
40592617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid BlockingNetworkDelegate::DoAuthCallback(
40692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    NetworkDelegate::AuthRequiredResponse response) {
40792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_EQ(USER_CALLBACK, block_mode_);
4083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  ASSERT_EQ(ON_AUTH_REQUIRED, stage_blocked_for_callback_);
4093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  AuthCallback auth_callback = auth_callback_;
4103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  Reset();
41192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  RunAuthCallback(response, auth_callback);
41292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
4133e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
41492617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid BlockingNetworkDelegate::RunCallback(int response,
41592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                          const CompletionCallback& callback) {
4163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  callback.Run(response);
4173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
4183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
41992617aeac109481258f0c3863d09c1b8903d438bLuca Barbierivoid BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response,
42092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                              const AuthCallback& callback) {
4213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) {
4223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    ASSERT_TRUE(target_auth_credentials_ != NULL);
42392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    *target_auth_credentials_ = auth_credentials_;
42492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
4253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  callback.Run(response);
4263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
4273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
42892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieriint BlockingNetworkDelegate::OnBeforeURLRequest(
42992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest* request,
4303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    const CompletionCallback& callback,
43192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    GURL* new_url) {
43292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  if (redirect_url_ == request->url())
4333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    return OK;  // We've already seen this request and redirected elsewhere.
4343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
4353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url);
43692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
43792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  if (!redirect_url_.is_empty())
4383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    *new_url = redirect_url_;
4393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
44092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return MaybeBlockStage(ON_BEFORE_URL_REQUEST, callback);
44192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
4423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
4433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieriint BlockingNetworkDelegate::OnBeforeSendHeaders(
4443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    URLRequest* request,
44592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    const CompletionCallback& callback,
44692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    HttpRequestHeaders* headers) {
4473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestNetworkDelegate::OnBeforeSendHeaders(request, callback, headers);
44892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
44992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, callback);
4503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
4513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
4523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieriint BlockingNetworkDelegate::OnHeadersReceived(
45392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest* request,
45492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    const CompletionCallback& callback,
4553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    const HttpResponseHeaders* original_response_headers,
4563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    scoped_refptr<HttpResponseHeaders>* override_response_headers) {
45792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestNetworkDelegate::OnHeadersReceived(
45892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      request, callback, original_response_headers,
45992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      override_response_headers);
46092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
46192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return MaybeBlockStage(ON_HEADERS_RECEIVED, callback);
46292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
46392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
46492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriNetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired(
46592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest* request,
46692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    const AuthChallengeInfo& auth_info,
46792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    const AuthCallback& callback,
46892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    AuthCredentials* credentials) {
46992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestNetworkDelegate::OnAuthRequired(request, auth_info, callback,
47092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                      credentials);
47192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check that the user has provided callback for the previous blocked stage.
47292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
47392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
47492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  if ((block_on_ & ON_AUTH_REQUIRED) == 0) {
4753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    return AUTH_REQUIRED_RESPONSE_NO_ACTION;
4763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
4773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
4783e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  target_auth_credentials_ = credentials;
47992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
48092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  switch (block_mode_) {
4813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    case SYNCHRONOUS:
4823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH)
48392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        *target_auth_credentials_ = auth_credentials_;
48492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return auth_retval_;
48592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
4863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    case AUTO_CALLBACK:
4873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      MessageLoop::current()->PostTask(
4883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri          FROM_HERE,
48992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri          base::Bind(&BlockingNetworkDelegate::RunAuthCallback,
49092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                     weak_factory_.GetWeakPtr(), auth_retval_, callback));
4913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      return AUTH_REQUIRED_RESPONSE_IO_PENDING;
4923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
49392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    case USER_CALLBACK:
49492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      auth_callback_ = callback;
49592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      stage_blocked_for_callback_ = ON_AUTH_REQUIRED;
49692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
49792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return AUTH_REQUIRED_RESPONSE_IO_PENDING;
49892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
49992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  NOTREACHED();
50092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return AUTH_REQUIRED_RESPONSE_NO_ACTION;  // Dummy value.
50192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
50292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
503f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbierivoid BlockingNetworkDelegate::Reset() {
50492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_NE(NOT_BLOCKED, stage_blocked_for_callback_);
50565303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller  stage_blocked_for_callback_ = NOT_BLOCKED;
50692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  callback_.Reset();
50792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  auth_callback_.Reset();
50892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
50965303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller
51092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieriint BlockingNetworkDelegate::MaybeBlockStage(
51192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    BlockingNetworkDelegate::Stage stage,
51265303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller    const CompletionCallback& callback) {
51392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check that the user has provided callback for the previous blocked stage.
51492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
51565303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller
51692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  if ((block_on_ & stage) == 0) {
51792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return OK;
51892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
51992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
52092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  switch (block_mode_) {
52192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    case SYNCHRONOUS:
52292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      EXPECT_NE(OK, retval_);
52365303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller      return retval_;
52492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
525f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri    case AUTO_CALLBACK:
52692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      MessageLoop::current()->PostTask(
52765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller          FROM_HERE,
52892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri          base::Bind(&BlockingNetworkDelegate::RunCallback,
52992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                     weak_factory_.GetWeakPtr(), retval_, callback));
53092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return ERR_IO_PENDING;
53165303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller
53292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    case USER_CALLBACK:
53392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      callback_ = callback;
53465303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller      stage_blocked_for_callback_ = stage;
53592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
53692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return ERR_IO_PENDING;
53765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller  }
53892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  NOTREACHED();
53992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return 0;
54092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
54192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
54292617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass TestURLRequestContextWithProxy : public TestURLRequestContext {
54392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public:
54492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Does not own |delegate|.
54592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestURLRequestContextWithProxy(const std::string& proxy,
54692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 NetworkDelegate* delegate)
54792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      : TestURLRequestContext(true) {
54892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy));
54992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    set_network_delegate(delegate);
55092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    Init();
55192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
55292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual ~TestURLRequestContextWithProxy() {}
55392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
55492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
55592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}  // namespace
55692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
55792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Inherit PlatformTest since we require the autorelease pool on Mac OS X.
55892617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass URLRequestTest : public PlatformTest {
55992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public:
56092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequestTest() : default_context_(true) {
56192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&default_network_delegate_);
56292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_net_log(&net_log_);
56392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    job_factory_.SetProtocolHandler("data", new DataProtocolHandler);
56492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    job_factory_.SetProtocolHandler("file", new FileProtocolHandler);
56592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_job_factory(&job_factory_);
5663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    default_context_.Init();
56792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
56892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual ~URLRequestTest() {}
5693e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
57092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Adds the TestJobInterceptor to the default context.
5713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestJobInterceptor* AddTestInterceptor() {
5723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    TestJobInterceptor* protocol_handler_ = new TestJobInterceptor();
57392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    job_factory_.SetProtocolHandler("http", NULL);
57492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    job_factory_.SetProtocolHandler("http", protocol_handler_);
57592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return protocol_handler_;
57692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
5773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
57892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri protected:
57992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  CapturingNetLog net_log_;
5803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestNetworkDelegate default_network_delegate_;  // Must outlive URLRequest.
58192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequestJobFactoryImpl job_factory_;
58292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestURLRequestContext default_context_;
58392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
5843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
5853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, AboutBlankTest) {
5863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
5873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  {
5883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    URLRequest r(GURL("about:blank"), &d, &default_context_);
58992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
59092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    r.Start();
59192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(r.is_pending());
5923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
59392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
5943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
5953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_TRUE(!r.is_pending());
5963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_FALSE(d.received_data_before_response());
597856f3336dc6687c6629f88f67e589e007763ddf0Christoph Bumiller    EXPECT_EQ(d.bytes_received(), 0);
59892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ("", r.GetSocketAddress().host());
59992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, r.GetSocketAddress().port());
6003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
6013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
6023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
6033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, DataURLImageTest) {
60492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
60592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
60692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    // Use our nice little Chrome logo.
60792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest r(GURL(
60892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "data:image/png;base64,"
6093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUBBjG3"
61092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQxIEVxitD"
61192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI5MpCVdW0gO7t"
61292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "vNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKzMx1+fg9bAgK6zHq9"
61392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7CkIMDxQpF7r/MWq12UctI1"
61492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0WYUqt57yWf2McHTObYPbVD+Z"
6153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "wbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2HQQcm43XwmtoYM6vVKleh0uoWvnzW"
6163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nkDFHF9ZS+uYVjRUasMeHUmyLYtcklTvzW"
6173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "GFZnNOXczThvpKIzjcahSqIzkvDLayDq6D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTb"
6183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "xXX1T5xsV9tm9r4TQwHLiZw/pdDZJea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5"
6193e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "MrVvMzNaI3+ERHfrFzPKQukrQGI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gV"
62092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "Md6q5c8GdosynKmSeRuGzpjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq"
62192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "/uxxZKzNiZFGD0wRC3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7F"
6223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "Ux1qLnV7MGF40smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufB"
62392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "JbsysjjW4kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJM"
6243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "nlm2O34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfm"
6253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        "moRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV5En"
62692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        "hORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="),
62792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        &d,
6283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        &default_context_);
62992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    r.Start();
6313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_TRUE(r.is_pending());
63292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
63392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
6343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
63592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(!r.is_pending());
6363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_FALSE(d.received_data_before_response());
6373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_EQ(d.bytes_received(), 911);
63892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ("", r.GetSocketAddress().host());
63992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, r.GetSocketAddress().port());
64092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
64192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
64292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
64392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileTest) {
64492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::FilePath app_path;
64592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  PathService::Get(base::FILE_EXE, &app_path);
64692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  GURL app_url = FilePathToFileURL(app_path);
64792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
64892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
64992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
6500cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller    URLRequest r(app_url, &d, &default_context_);
6510cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller
65292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    r.Start();
6530cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller    EXPECT_TRUE(r.is_pending());
6540cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller
6550cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller    MessageLoop::current()->Run();
65692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6570cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller    int64 file_size = -1;
6580cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller    EXPECT_TRUE(file_util::GetFileSize(app_path, &file_size));
6590cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller
66092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(!r.is_pending());
6610cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller    EXPECT_EQ(1, d.response_started_count());
6620cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller    EXPECT_FALSE(d.received_data_before_response());
6630cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
66492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ("", r.GetSocketAddress().host());
66592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, r.GetSocketAddress().port());
66692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
66792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
66892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
66992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileTestCancel) {
67092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::FilePath app_path;
6713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  PathService::Get(base::FILE_EXE, &app_path);
6723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  GURL app_url = FilePathToFileURL(app_path);
6733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
67492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
67592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
6763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    URLRequest r(app_url, &d, &default_context_);
67792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6783e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    r.Start();
6793e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_TRUE(r.is_pending());
6803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    r.Cancel();
68192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
68292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Async cancelation should be safe even when URLRequest has been already
68392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // destroyed.
68492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->RunUntilIdle();
68592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
68692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, FileTestFullSpecifiedRange) {
6883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  const size_t buffer_size = 4000;
6893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  scoped_ptr<char[]> buffer(new char[buffer_size]);
69092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  FillBuffer(buffer.get(), buffer_size);
69192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  base::FilePath temp_path;
6933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
6943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  GURL temp_url = FilePathToFileURL(temp_path);
6953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
6963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
6973e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  int64 file_size;
69892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
69992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
70092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  const size_t first_byte_position = 500;
7013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  const size_t last_byte_position = buffer_size - first_byte_position;
70292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  const size_t content_length = last_byte_position - first_byte_position + 1;
70392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  std::string partial_buffer_string(buffer.get() + first_byte_position,
7043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                    buffer.get() + last_byte_position + 1);
70592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
7063e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
7073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  {
70892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest r(temp_url, &d, &default_context_);
70992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
7103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    HttpRequestHeaders headers;
71192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    headers.SetHeader(HttpRequestHeaders::kRange,
71292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                      base::StringPrintf(
71392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                           "bytes=%" PRIuS "-%" PRIuS,
71492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                           first_byte_position, last_byte_position));
7153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    r.SetExtraRequestHeaders(headers);
71692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    r.Start();
71792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(r.is_pending());
7183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
71992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
72092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(!r.is_pending());
72192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(1, d.response_started_count());
7223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_FALSE(d.received_data_before_response());
7233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
7243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
72592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(partial_buffer_string == d.data_received());
72692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
72792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
72892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(file_util::Delete(temp_path, false));
72992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
73092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
73192617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileTestHalfSpecifiedRange) {
73292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  const size_t buffer_size = 4000;
7333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  scoped_ptr<char[]> buffer(new char[buffer_size]);
7343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  FillBuffer(buffer.get(), buffer_size);
7353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
73692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::FilePath temp_path;
73792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
73892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  GURL temp_url = FilePathToFileURL(temp_path);
73992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
74027b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller
74127b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller  int64 file_size;
74214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
74392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
74492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  const size_t first_byte_position = 500;
74592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  const size_t last_byte_position = buffer_size - 1;
74692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  const size_t content_length = last_byte_position - first_byte_position + 1;
74792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  std::string partial_buffer_string(buffer.get() + first_byte_position,
7483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                    buffer.get() + last_byte_position + 1);
7493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
75092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
75192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
75292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest r(temp_url, &d, &default_context_);
75392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
75492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    HttpRequestHeaders headers;
75592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    headers.SetHeader(HttpRequestHeaders::kRange,
75692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                      base::StringPrintf("bytes=%" PRIuS "-",
75792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                         first_byte_position));
7583e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    r.SetExtraRequestHeaders(headers);
7593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    r.Start();
76092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(r.is_pending());
76192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
76292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
76392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(!r.is_pending());
76492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(1, d.response_started_count());
76527b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller    EXPECT_FALSE(d.received_data_before_response());
76614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
76792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
76892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(partial_buffer_string == d.data_received());
76992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
77092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
77192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(file_util::Delete(temp_path, false));
7723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
7733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
7743e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, FileTestMultipleRanges) {
7753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  const size_t buffer_size = 400000;
7763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  scoped_ptr<char[]> buffer(new char[buffer_size]);
77792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  FillBuffer(buffer.get(), buffer_size);
77892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
77992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::FilePath temp_path;
78092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
78192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  GURL temp_url = FilePathToFileURL(temp_path);
78292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
78392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
78492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  int64 file_size;
7853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
7863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
7873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
78892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
78992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest r(temp_url, &d, &default_context_);
7903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
7913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    HttpRequestHeaders headers;
79227b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller    headers.SetHeader(HttpRequestHeaders::kRange,
79327b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller                      "bytes=0-0,10-200,200-300");
79414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    r.SetExtraRequestHeaders(headers);
79592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    r.Start();
79692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(r.is_pending());
79792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
79892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
79992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.request_failed());
8003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
8013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
8023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_TRUE(file_util::Delete(temp_path, false));
8033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
80492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
80592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InvalidUrlTest) {
80692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
80792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
80892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest r(GURL("invalid url"), &d, &default_context_);
80992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
81092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    r.Start();
81192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(r.is_pending());
8123e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
8133e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    MessageLoop::current()->Run();
81492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.request_failed());
81592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
81692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
8173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
8183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri#if defined(OS_WIN)
81927b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph BumillerTEST_F(URLRequestTest, ResolveShortcutTest) {
82014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  base::FilePath app_path;
82192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
82292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  app_path = app_path.AppendASCII("net");
82392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  app_path = app_path.AppendASCII("data");
82492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  app_path = app_path.AppendASCII("url_request_unittest");
82592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  app_path = app_path.AppendASCII("with-headers.html");
82692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
82792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  std::wstring lnk_path = app_path.value() + L".lnk";
82892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
82992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::win::ScopedCOMInitializer com_initializer;
83092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
83192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Temporarily create a shortcut for test
83292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
83392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    base::win::ScopedComPtr<IShellLink> shell;
83414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    ASSERT_TRUE(SUCCEEDED(shell.CreateInstance(CLSID_ShellLink, NULL,
83514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller                                               CLSCTX_INPROC_SERVER)));
83614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    base::win::ScopedComPtr<IPersistFile> persist;
83714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    ASSERT_TRUE(SUCCEEDED(shell.QueryInterface(persist.Receive())));
83814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str())));
83914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest")));
84014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE)));
84114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  }
84214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
84314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  TestDelegate d;
84414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  {
84514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    URLRequest r(FilePathToFileURL(base::FilePath(lnk_path)), &d,
84614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller                 &default_context_);
84714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
84814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller    r.Start();
84992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(r.is_pending());
85092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
85192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
8523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
8533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    WIN32_FILE_ATTRIBUTE_DATA data;
85492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    GetFileAttributesEx(app_path.value().c_str(),
85592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                        GetFileExInfoStandard, &data);
85692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ,
85792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                             FILE_SHARE_READ, NULL, OPEN_EXISTING,
85892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                             FILE_ATTRIBUTE_NORMAL, NULL);
85992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_NE(INVALID_HANDLE_VALUE, file);
86092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    scoped_ptr<char[]> buffer(new char[data.nFileSizeLow]);
86192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    DWORD read_size;
86292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    BOOL result;
86392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    result = ReadFile(file, buffer.get(), data.nFileSizeLow,
86492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                      &read_size, NULL);
86592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    std::string content(buffer.get(), read_size);
8663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    CloseHandle(file);
86792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
86892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(!r.is_pending());
86992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(1, d.received_redirect_count());
87092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(content, d.data_received());
87192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
87292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
87392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Clean the shortcut
87492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  DeleteFile(lnk_path.c_str());
87592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
87692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif  // defined(OS_WIN)
87792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
87827b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph BumillerTEST_F(URLRequestTest, FileDirCancelTest) {
87927b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller  // Put in mock resource provider.
88014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  NetModule::SetResourceProvider(TestNetResourceProvider);
88192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
88292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
88392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
88492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    base::FilePath file_path;
88592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
8863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    file_path = file_path.Append(FILE_PATH_LITERAL("net"));
8873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    file_path = file_path.Append(FILE_PATH_LITERAL("data"));
88892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
88992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(FilePathToFileURL(file_path), &d, &default_context_);
89092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
89192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(req.is_pending());
89292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
89392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    d.set_cancel_in_received_data_pending(true);
89492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
89592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
89692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
89792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
89892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Take out mock resource provider.
8993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  NetModule::SetResourceProvider(NULL);
90092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
90192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
90292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileDirRedirectNoCrash) {
90392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // There is an implicit redirect when loading a file path that matches a
90492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // directory and does not end with a slash.  Ensure that following such
90592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // redirects does not crash.  See http://crbug.com/18686.
90692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
90792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::FilePath path;
90892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  PathService::Get(base::DIR_SOURCE_ROOT, &path);
90992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  path = path.Append(FILE_PATH_LITERAL("net"));
91092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  path = path.Append(FILE_PATH_LITERAL("data"));
91127b0c9d51300712f3b5d4af6cc20d53fcf9c8c46Christoph Bumiller  path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
91214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
91392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
91492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(FilePathToFileURL(path), &d, &default_context_);
91592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
91692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
91792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
91892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_EQ(1, d.received_redirect_count());
9193e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  ASSERT_LT(0, d.bytes_received());
9203e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  ASSERT_FALSE(d.request_failed());
9213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  ASSERT_TRUE(req.status().is_success());
92292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
92392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
92492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if defined(OS_WIN)
92592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Don't accept the url "file:///" on windows. See http://crbug.com/1474.
92692617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, FileDirRedirectSingleSlash) {
92792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
92892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("file:///"), &d, &default_context_);
92992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
9303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  MessageLoop::current()->Run();
9313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
93292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_EQ(1, d.received_redirect_count());
93392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_FALSE(req.status().is_success());
93492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
93592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
93692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
93792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Custom URLRequestJobs for use with interceptor tests
93892617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass RestartTestJob : public URLRequestTestJob {
93992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public:
94092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate)
9413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    : URLRequestTestJob(request, network_delegate, true) {}
94292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri protected:
94392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual void StartAsync() OVERRIDE {
9443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    this->NotifyRestartRequired();
94592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
9463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri private:
9473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  virtual ~RestartTestJob() {}
94892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
94992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
95092617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass CancelTestJob : public URLRequestTestJob {
95192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public:
9523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate)
95392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    : URLRequestTestJob(request, network_delegate, true) {}
95492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri protected:
9553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  virtual void StartAsync() OVERRIDE {
95692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    request_->Cancel();
95792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
95892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri private:
95992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual ~CancelTestJob() {}
96092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
96192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
96292617aeac109481258f0c3863d09c1b8903d438bLuca Barbiericlass CancelThenRestartTestJob : public URLRequestTestJob {
96392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public:
96492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  explicit CancelThenRestartTestJob(URLRequest* request,
96592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                    NetworkDelegate* network_delegate)
96692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      : URLRequestTestJob(request, network_delegate, true) {
96792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
96892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri protected:
96992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual void StartAsync() OVERRIDE {
97092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    request_->Cancel();
97192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    this->NotifyRestartRequired();
97292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
97392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri private:
97492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual ~CancelThenRestartTestJob() {}
97592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
97692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
9773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// An Interceptor for use with interceptor tests
9783e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbiericlass TestInterceptor : URLRequest::Interceptor {
97992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri public:
98092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestInterceptor()
9813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      : intercept_main_request_(false), restart_main_request_(false),
98292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        cancel_main_request_(false), cancel_then_restart_main_request_(false),
9833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        simulate_main_network_error_(false),
98492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        intercept_redirect_(false), cancel_redirect_request_(false),
9853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        intercept_final_response_(false), cancel_final_request_(false),
98692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        did_intercept_main_(false), did_restart_main_(false),
98792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        did_cancel_main_(false), did_cancel_then_restart_main_(false),
9883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        did_simulate_error_main_(false),
9893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri        did_intercept_redirect_(false), did_cancel_redirect_(false),
99092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        did_intercept_final_(false), did_cancel_final_(false) {
99192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest::Deprecated::RegisterRequestInterceptor(this);
99292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
99392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
99492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual ~TestInterceptor() {
99592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest::Deprecated::UnregisterRequestInterceptor(this);
99692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
9973e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
99892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual URLRequestJob* MaybeIntercept(
99992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      URLRequest* request,
100092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      NetworkDelegate* network_delegate) OVERRIDE {
10013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    if (restart_main_request_) {
10023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      restart_main_request_ = false;
100392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      did_restart_main_ = true;
100492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return new RestartTestJob(request, network_delegate);
10053e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    }
100692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    if (cancel_main_request_) {
100792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      cancel_main_request_ = false;
10083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      did_cancel_main_ = true;
10093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      return new CancelTestJob(request, network_delegate);
101092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    }
10113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    if (cancel_then_restart_main_request_) {
101292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      cancel_then_restart_main_request_ = false;
101392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      did_cancel_then_restart_main_ = true;
10143e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      return new CancelThenRestartTestJob(request, network_delegate);
101592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    }
101692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    if (simulate_main_network_error_) {
101792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      simulate_main_network_error_ = false;
101892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      did_simulate_error_main_ = true;
101992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      // will error since the requeted url is not one of its canned urls
102092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return new URLRequestTestJob(request, network_delegate, true);
102192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    }
102292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    if (!intercept_main_request_)
102392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return NULL;
102492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    intercept_main_request_ = false;
102592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    did_intercept_main_ = true;
102692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequestTestJob* job =  new URLRequestTestJob(request,
102792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                                    network_delegate,
10283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                                    main_headers_,
10293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                                    main_data_,
103092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                                    true);
103192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    job->set_load_timing_info(main_request_load_timing_info_);
10323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    return job;
103392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
10343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
103592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual URLRequestJob* MaybeInterceptRedirect(
10363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      URLRequest* request,
103792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      NetworkDelegate* network_delegate,
103892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      const GURL& location) OVERRIDE {
10393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    if (cancel_redirect_request_) {
10403e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      cancel_redirect_request_ = false;
104192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      did_cancel_redirect_ = true;
104292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return new CancelTestJob(request, network_delegate);
104392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    }
104492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    if (!intercept_redirect_)
104592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      return NULL;
104692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    intercept_redirect_ = false;
104792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    did_intercept_redirect_ = true;
104892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return new URLRequestTestJob(request,
10493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                 network_delegate,
105092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 redirect_headers_,
105192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 redirect_data_,
105292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 true);
10533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
10543e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
105592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  virtual URLRequestJob* MaybeInterceptResponse(
105692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      URLRequest* request, NetworkDelegate* network_delegate) OVERRIDE {
10573e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    if (cancel_final_request_) {
105892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      cancel_final_request_ = false;
105992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      did_cancel_final_ = true;
10603e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      return new CancelTestJob(request, network_delegate);
10613e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    }
106292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    if (!intercept_final_response_)
10633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      return NULL;
106492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    intercept_final_response_ = false;
106592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    did_intercept_final_ = true;
10663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    return new URLRequestTestJob(request,
106792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 network_delegate,
106892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 final_headers_,
106992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 final_data_,
10703e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                 true);
10713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
10723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
107392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Whether to intercept the main request, and if so the response to return and
107492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // the LoadTimingInfo to use.
107592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  bool intercept_main_request_;
107692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  std::string main_headers_;
10773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  std::string main_data_;
107892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LoadTimingInfo main_request_load_timing_info_;
10793e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
10803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Other actions we take at MaybeIntercept time
108192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  bool restart_main_request_;
108292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  bool cancel_main_request_;
108392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  bool cancel_then_restart_main_request_;
10843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool simulate_main_network_error_;
10853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
108692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Whether to intercept redirects, and if so the response to return.
10873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool intercept_redirect_;
108892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  std::string redirect_headers_;
10893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  std::string redirect_data_;
10903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
109192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Other actions we can take at MaybeInterceptRedirect time
109292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  bool cancel_redirect_request_;
10933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
109492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Whether to intercept final response, and if so the response to return.
10953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool intercept_final_response_;
10963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  std::string final_headers_;
109792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  std::string final_data_;
109892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
109992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Other actions we can take at MaybeInterceptResponse time
110092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  bool cancel_final_request_;
11013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
11023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // If we did something or not
11033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool did_intercept_main_;
110492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  bool did_restart_main_;
110592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  bool did_cancel_main_;
11063e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool did_cancel_then_restart_main_;
11073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool did_simulate_error_main_;
11083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool did_intercept_redirect_;
11093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool did_cancel_redirect_;
11103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool did_intercept_final_;
11113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  bool did_cancel_final_;
111292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
111392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Static getters for canned response header and data strings
111492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
111592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  static std::string ok_data() {
111692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return URLRequestTestJob::test_data_1();
111792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
111892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
111992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  static std::string ok_headers() {
112092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return URLRequestTestJob::test_headers();
112192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
112292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  static std::string redirect_data() {
11243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    return std::string();
112592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
112692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  static std::string redirect_headers() {
112892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return URLRequestTestJob::test_redirect_headers();
11293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
11303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
113192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  static std::string error_data() {
113292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return std::string("ohhh nooooo mr. bill!");
11333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
113492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  static std::string error_headers() {
113692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    return URLRequestTestJob::test_error_headers();
113792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
113892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
113992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
114092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, Intercept) {
11413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestInterceptor interceptor;
11423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
114392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // intercept the main request and respond with a simple response
114492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.intercept_main_request_ = true;
11453e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.main_headers_ = TestInterceptor::ok_headers();
11463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.main_data_ = TestInterceptor::ok_data();
11473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
11483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
114992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
115092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data();
115192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data();
115292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data();
115392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.SetUserData(NULL, user_data0);
115492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.SetUserData(&user_data1, user_data1);
115592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.SetUserData(&user_data2, user_data2);
115692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.set_method("GET");
115792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
115892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
115992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
116092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Make sure we can retrieve our specific user data
116192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(user_data0, req.GetUserData(NULL));
116292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(user_data1, req.GetUserData(&user_data1));
116392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(user_data2, req.GetUserData(&user_data2));
116492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
116592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check the interceptor got called as expected
116692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(interceptor.did_intercept_main_);
116792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
116892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check we got one good response
116992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(req.status().is_success());
117092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(200, req.response_headers()->response_code());
117192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
117292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(1, d.response_started_count());
117392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(0, d.received_redirect_count());
117492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
117592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
117692617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptRedirect) {
117792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestInterceptor interceptor;
117892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
117992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // intercept the main request and respond with a redirect
118092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.intercept_main_request_ = true;
118192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.main_headers_ = TestInterceptor::redirect_headers();
118292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.main_data_ = TestInterceptor::redirect_data();
118392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
118492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // intercept that redirect and respond a final OK response
118592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.intercept_redirect_ = true;
118692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.redirect_headers_ =  TestInterceptor::ok_headers();
11873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.redirect_data_ = TestInterceptor::ok_data();
11883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
11893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
119092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
119192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.set_method("GET");
1192d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  req.Start();
1193d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  MessageLoop::current()->Run();
1194d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller
1195d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  // Check the interceptor got called as expected
1196d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  EXPECT_TRUE(interceptor.did_intercept_main_);
1197d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  EXPECT_TRUE(interceptor.did_intercept_redirect_);
1198d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller
1199d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  // Check we got one good response
1200d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  EXPECT_TRUE(req.status().is_success());
12013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  if (req.status().is_success()) {
12023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_EQ(200, req.response_headers()->response_code());
1203d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  }
1204d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
120592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(1, d.response_started_count());
1206d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  EXPECT_EQ(0, d.received_redirect_count());
120792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
120892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
1209d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph BumillerTEST_F(URLRequestTest, InterceptServerError) {
1210d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  TestInterceptor interceptor;
1211d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller
1212d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  // intercept the main request to generate a server error response
1213d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  interceptor.intercept_main_request_ = true;
1214d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  interceptor.main_headers_ = TestInterceptor::error_headers();
1215d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  interceptor.main_data_ = TestInterceptor::error_data();
1216d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller
1217d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  // intercept that error and respond with an OK response
1218d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  interceptor.intercept_final_response_ = true;
1219d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  interceptor.final_headers_ = TestInterceptor::ok_headers();
122092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.final_data_ = TestInterceptor::ok_data();
1221d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller
1222d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  TestDelegate d;
1223d5cfab703b1179ac6e81c6281f6e25d1cab9d4c2Christoph Bumiller  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
122492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.set_method("GET");
122592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
122692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
12273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
12283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Check the interceptor got called as expected
12293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_TRUE(interceptor.did_intercept_main_);
123092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(interceptor.did_intercept_final_);
123192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Check we got one good response
123392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(req.status().is_success());
123492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(200, req.response_headers()->response_code());
12353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
12363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(1, d.response_started_count());
123792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(0, d.received_redirect_count());
12383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
12393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
124092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptNetworkError) {
124192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestInterceptor interceptor;
12423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
12433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // intercept the main request to simulate a network error
124492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.simulate_main_network_error_ = true;
124592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
124692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // intercept that error and respond with an OK response
124792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.intercept_final_response_ = true;
124892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.final_headers_ = TestInterceptor::ok_headers();
12493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.final_data_ = TestInterceptor::ok_data();
12503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
12513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
12523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
12533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  req.set_method("GET");
12543e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  req.Start();
12553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  MessageLoop::current()->Run();
125692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
125792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check the interceptor got called as expected
12583e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_TRUE(interceptor.did_simulate_error_main_);
12593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_TRUE(interceptor.did_intercept_final_);
126092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12613e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Check we received one good response
126292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(req.status().is_success());
12633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(200, req.response_headers()->response_code());
126492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
12653e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(1, d.response_started_count());
12663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(0, d.received_redirect_count());
126792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
126892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
126992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptRestartRequired) {
127092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestInterceptor interceptor;
127192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // restart the main request
12733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.restart_main_request_ = true;
12743e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
12753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // then intercept the new main request and respond with an OK response
12763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.intercept_main_request_ = true;
12773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.main_headers_ = TestInterceptor::ok_headers();
127892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.main_data_ = TestInterceptor::ok_data();
127992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
12813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
128292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.set_method("GET");
12833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  req.Start();
128492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
12853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
12863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Check the interceptor got called as expected
128792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(interceptor.did_restart_main_);
128892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(interceptor.did_intercept_main_);
128992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
129092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check we received one good response
129192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(req.status().is_success());
12923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  if (req.status().is_success()) {
12933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    EXPECT_EQ(200, req.response_headers()->response_code());
12943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
129592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
129692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(1, d.response_started_count());
129714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  EXPECT_EQ(0, d.received_redirect_count());
129814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller}
129914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
130014193da589275969be31dbdb3280bb48cd24d0c0Christoph BumillerTEST_F(URLRequestTest, InterceptRespectsCancelMain) {
130114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  TestInterceptor interceptor;
130214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
13033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // intercept the main request and cancel from within the restarted job
13043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.cancel_main_request_ = true;
130514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
130692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // setup to intercept final response and override it with an OK response
130714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.intercept_final_response_ = true;
130814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.final_headers_ = TestInterceptor::ok_headers();
130914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.final_data_ = TestInterceptor::ok_data();
131092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
131192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
131214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
131314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  req.set_method("GET");
131492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
131514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  MessageLoop::current()->Run();
131614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
131714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  // Check the interceptor got called as expected
131814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  EXPECT_TRUE(interceptor.did_cancel_main_);
131914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  EXPECT_FALSE(interceptor.did_intercept_final_);
132014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
132114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  // Check we see a canceled request
132214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  EXPECT_FALSE(req.status().is_success());
132314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
132414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller}
132514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
132614193da589275969be31dbdb3280bb48cd24d0c0Christoph BumillerTEST_F(URLRequestTest, InterceptRespectsCancelRedirect) {
132792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestInterceptor interceptor;
132814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
132914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  // intercept the main request and respond with a redirect
133014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.intercept_main_request_ = true;
133114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.main_headers_ = TestInterceptor::redirect_headers();
133292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.main_data_ = TestInterceptor::redirect_data();
133392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
133492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // intercept the redirect and cancel from within that job
133514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.cancel_redirect_request_ = true;
133614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
133714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  // setup to intercept final response and override it with an OK response
133814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.intercept_final_response_ = true;
133914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.final_headers_ = TestInterceptor::ok_headers();
134014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  interceptor.final_data_ = TestInterceptor::ok_data();
134192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
134214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  TestDelegate d;
134314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
134492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.set_method("GET");
134592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
134692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
13473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
13483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Check the interceptor got called as expected
134992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(interceptor.did_intercept_main_);
13503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_TRUE(interceptor.did_cancel_redirect_);
135192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(interceptor.did_intercept_final_);
135292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
135392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check we see a canceled request
135492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(req.status().is_success());
13553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
135692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
135714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
135892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptRespectsCancelFinal) {
135914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  TestInterceptor interceptor;
136092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
136192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // intercept the main request to simulate a network error
136292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.simulate_main_network_error_ = true;
136392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
136492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // setup to intercept final response and cancel from within that job
13653e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.cancel_final_request_ = true;
136692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
136792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
136892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
13693e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  req.set_method("GET");
137092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
137192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
137292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
13733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Check the interceptor got called as expected
137492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(interceptor.did_simulate_error_main_);
137592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(interceptor.did_cancel_final_);
137692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
13773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Check we see a canceled request
137892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(req.status().is_success());
137992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
138092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
13813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
13823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, InterceptRespectsCancelInRestart) {
13833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestInterceptor interceptor;
13843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
138592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // intercept the main request and cancel then restart from within that job
138692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.cancel_then_restart_main_request_ = true;
138792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
138892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // setup to intercept final response and override it with an OK response
138992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.intercept_final_response_ = true;
13903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.final_headers_ = TestInterceptor::ok_headers();
13913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  interceptor.final_data_ = TestInterceptor::ok_data();
139214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
13933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
13943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
139514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  req.set_method("GET");
13963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  req.Start();
139714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  MessageLoop::current()->Run();
139892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
139992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check the interceptor got called as expected
140092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_TRUE(interceptor.did_cancel_then_restart_main_);
140192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(interceptor.did_intercept_final_);
140292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
140392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Check we see a canceled request
140492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_FALSE(req.status().is_success());
140592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
140692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
140792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
140892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriLoadTimingInfo RunLoadTimingTest(const LoadTimingInfo& job_load_timing,
140992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                 URLRequestContext* context) {
141092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestInterceptor interceptor;
141192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.intercept_main_request_ = true;
141292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  interceptor.main_request_load_timing_info_ = job_load_timing;
141392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
141492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, context);
141592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
141692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
141792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
141892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LoadTimingInfo resulting_load_timing;
141992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.GetLoadTimingInfo(&resulting_load_timing);
142092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
142192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // None of these should be modified by the URLRequest.
142292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused);
142392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id);
142492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start);
14253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end);
14263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(job_load_timing.receive_headers_end,
142792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            resulting_load_timing.receive_headers_end);
142892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  return resulting_load_timing;
143092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
14313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
14323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// "Normal" LoadTimingInfo as returned by a job.  Everything is in order, not
143392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// reused.  |connect_time_flags| is used to indicate if there should be dns
143492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// or SSL times, and |used_proxy| is used for proxy times.
143592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriLoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now,
143692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                    int connect_time_flags,
143792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                    bool used_proxy) {
14383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  LoadTimingInfo load_timing;
14393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  load_timing.socket_log_id = 1;
144092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
144192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  if (used_proxy) {
14423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
14433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri    load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
14443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  }
14453e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
144692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing;
144792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) {
14484c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    connect_timing.dns_start = now + base::TimeDelta::FromDays(3);
144992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    connect_timing.dns_end = now + base::TimeDelta::FromDays(4);
145092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
145192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  connect_timing.connect_start = now + base::TimeDelta::FromDays(5);
14524c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) {
145392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    connect_timing.ssl_start = now + base::TimeDelta::FromDays(6);
145492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    connect_timing.ssl_end = now + base::TimeDelta::FromDays(7);
145592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
145692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  connect_timing.connect_end = now + base::TimeDelta::FromDays(8);
14574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
145892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  load_timing.send_start = now + base::TimeDelta::FromDays(9);
145992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  load_timing.send_end = now + base::TimeDelta::FromDays(10);
146092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
14616ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  return load_timing;
14624c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger}
14634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
14644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger// Same as above, but in the case of a reused socket.
14654c7001462607e6e99e474d6271dd481d3f8f201cRoland ScheideggerLoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now,
14664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                          bool used_proxy) {
14674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  LoadTimingInfo load_timing;
14684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  load_timing.socket_log_id = 1;
14694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  load_timing.socket_reused = true;
14704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
14714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  if (used_proxy) {
14724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
14734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger    load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
14744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  }
1475a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri
1476a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri  load_timing.send_start = now + base::TimeDelta::FromDays(9);
1477a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri  load_timing.send_end = now + base::TimeDelta::FromDays(10);
1478a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri  load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
147992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  return load_timing;
14803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
14813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
14823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// Basic test that the intercept + load timing tests work.
14833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTiming) {
14843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  base::TimeTicks now = base::TimeTicks::Now();
148592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LoadTimingInfo job_load_timing =
148692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false);
14873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
14883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
148992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                                        &default_context_);
14904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
14916ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  // Nothing should have been changed by the URLRequest.
14924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  EXPECT_EQ(job_load_timing.proxy_resolve_start,
14936ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller            load_timing_result.proxy_resolve_start);
149492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.proxy_resolve_end,
14953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.proxy_resolve_end);
149692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.dns_start,
14973e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.connect_timing.dns_start);
149892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.dns_end,
14993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.connect_timing.dns_end);
150092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.connect_start,
15013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.connect_timing.connect_start);
150292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.connect_end,
15033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.connect_timing.connect_end);
15045db9cedeafe98c5ac094fc32f7b4d275c273b867Marek Olšák  EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
150592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.ssl_start);
150692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
15073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.connect_timing.ssl_end);
150892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
15094c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  // Redundant sanity check.
151092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES);
15113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
151292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
151392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Another basic test, with proxy and SSL times, but no DNS times.
151492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTimingProxy) {
151592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::TimeTicks now = base::TimeTicks::Now();
15163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  LoadTimingInfo job_load_timing =
1517a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true);
15183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
15194c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
152092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                                        &default_context_);
152192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
152292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Nothing should have been changed by the URLRequest.
152392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.proxy_resolve_start,
15243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.proxy_resolve_start);
15253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(job_load_timing.proxy_resolve_end,
152692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.proxy_resolve_end);
152792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.dns_start,
15283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.connect_timing.dns_start);
15293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.dns_end,
153092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.dns_end);
153192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.connect_start,
153292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.connect_start);
15336c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.connect_end,
153492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.connect_end);
153592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
153692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.ssl_start);
153792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
153892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.ssl_end);
15393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
15403e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Redundant sanity check.
15413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestLoadTimingNotReusedWithProxy(load_timing_result,
15423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                   CONNECT_TIMING_HAS_SSL_TIMES);
15433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
15443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
15453e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// Make sure that URLRequest correctly adjusts proxy times when they're before
15463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// |request_start|, due to already having a connected socket.  This happens in
154792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// the case of reusing a SPDY session or HTTP pipeline.  The connected socket is
154892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// not considered reused in this test (May be a preconnect).
15493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri//
15503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// To mix things up from the test above, assumes DNS times but no SSL times.
15514c7001462607e6e99e474d6271dd481d3f8f201cRoland ScheideggerTEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolution) {
15526ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  base::TimeTicks now = base::TimeTicks::Now();
15534c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  LoadTimingInfo job_load_timing =
15546ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true);
15554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6);
15566ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5);
15576ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4);
155892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3);
155992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  job_load_timing.connect_timing.connect_start =
15604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      now - base::TimeDelta::FromDays(2);
15614c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  job_load_timing.connect_timing.connect_end =
156292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      now - base::TimeDelta::FromDays(1);
156392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
156492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
156592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                                        &default_context_);
15663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
15673e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  // Proxy times, connect times, and DNS times should all be replaced with
156892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // request_start.
156992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(load_timing_result.request_start,
15703e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.proxy_resolve_start);
15713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(load_timing_result.request_start,
15724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            load_timing_result.proxy_resolve_end);
15734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  EXPECT_EQ(load_timing_result.request_start,
157492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.dns_start);
15754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  EXPECT_EQ(load_timing_result.request_start,
15764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            load_timing_result.connect_timing.dns_end);
15774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  EXPECT_EQ(load_timing_result.request_start,
15784c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            load_timing_result.connect_timing.connect_start);
15796ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  EXPECT_EQ(load_timing_result.request_start,
15806ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller            load_timing_result.connect_timing.connect_end);
15816ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller
15826ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  // Other times should have been left null.
15834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  TestLoadTimingNotReusedWithProxy(load_timing_result,
15844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                   CONNECT_TIMING_HAS_DNS_TIMES);
15854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger}
158692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
158792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Same as above, but in the reused case.
158892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTimingEarlyProxyResolutionReused) {
158992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::TimeTicks now = base::TimeTicks::Now();
15903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true);
15913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4);
15928224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri  job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3);
15938224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri
15943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
15953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                                        &default_context_);
159692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
159792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Proxy times and connect times should all be replaced with request_start.
15983e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(load_timing_result.request_start,
15994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            load_timing_result.proxy_resolve_start);
16006ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  EXPECT_EQ(load_timing_result.request_start,
16014c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger            load_timing_result.proxy_resolve_end);
16026ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller
16034c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger  // Other times should have been left null.
160492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestLoadTimingReusedWithProxy(load_timing_result);
160592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
160692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
160792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that URLRequest correctly adjusts connect times when they're before
16083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// |request_start|, due to reusing a connected socket.  The connected socket is
16093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// not considered reused in this test (May be a preconnect).
16103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri//
161192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// To mix things up, the request has SSL times, but no DNS times.
161292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTimingEarlyConnect) {
161392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::TimeTicks now = base::TimeTicks::Now();
161492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LoadTimingInfo job_load_timing =
161592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false);
161692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  job_load_timing.connect_timing.connect_start =
16173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      now - base::TimeDelta::FromDays(1);
16183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2);
161992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3);
162092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  job_load_timing.connect_timing.connect_end =
16213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      now - base::TimeDelta::FromDays(4);
16226dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie
16236dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
16246dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie                                                        &default_context_);
16256dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie
16266dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie  // Connect times, and SSL times should be replaced with request_start.
16276dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie  EXPECT_EQ(load_timing_result.request_start,
162892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.connect_start);
162992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(load_timing_result.request_start,
163092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.ssl_start);
16313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(load_timing_result.request_start,
16323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.connect_timing.ssl_end);
16333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(load_timing_result.request_start,
16343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri            load_timing_result.connect_timing.connect_end);
163592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
163692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Other times should have been left null.
16373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES);
163892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
16393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
164092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that URLRequest correctly adjusts connect times when they're before
16413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// |request_start|, due to reusing a connected socket in the case that there
164292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// are also proxy times.  The connected socket is not considered reused in this
16433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// test (May be a preconnect).
164492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//
164592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// In this test, there are no SSL or DNS times.
164692617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, InterceptLoadTimingEarlyConnectWithProxy) {
164792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  base::TimeTicks now = base::TimeTicks::Now();
16483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  LoadTimingInfo job_load_timing =
16493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true);
165092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  job_load_timing.connect_timing.connect_start =
165192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      now - base::TimeDelta::FromDays(1);
165292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  job_load_timing.connect_timing.connect_end =
165392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      now - base::TimeDelta::FromDays(2);
165492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
16553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  LoadTimingInfo load_timing_result = RunLoadTimingTest(job_load_timing,
16563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri                                                        &default_context_);
165792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
165892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Connect times should be replaced with proxy_resolve_end.
165992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(load_timing_result.proxy_resolve_end,
166092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri            load_timing_result.connect_timing.connect_start);
166192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(load_timing_result.proxy_resolve_end,
166217ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri            load_timing_result.connect_timing.connect_end);
166392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
166492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Other times should have been left null.
166592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestLoadTimingNotReusedWithProxy(load_timing_result,
166692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                                   CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
166792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
166892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
166992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Check that two different URL requests have different identifiers.
167092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, Identifiers) {
167192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
167214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  TestURLRequestContext context;
167314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  TestURLRequest req(GURL("http://example.com"), &d, &context, NULL);
167492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestURLRequest other_req(GURL("http://example.com"), &d, &context, NULL);
167592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
167692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_NE(req.identifier(), other_req.identifier());
167792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
167892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
167992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Check that a failure to connect to the proxy is reported to the network
168092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// delegate.
168117ad9972f4b998dbf1a046780b6bde461d721dd0Luca BarbieriTEST_F(URLRequestTest, NetworkDelegateProxyError) {
168217ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri  MockHostResolver host_resolver;
168317ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri  host_resolver.rules()->AddSimulatedFailure("*");
168417ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri
168517ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
168617ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri  TestURLRequestContextWithProxy context("myproxy:70", &network_delegate);
168792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
16883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
168992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("http://example.com"), &d, &context);
169092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.set_method("GET");
169192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
16923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  req.Start();
169392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
169492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
169514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  // Check we see a failed request.
169614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller  EXPECT_FALSE(req.status().is_success());
169792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
169892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, req.status().error());
1699c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller
1700c463dfe4e4999a0d745c31bce9a2a2bbe6a05899Christoph Bumiller  EXPECT_EQ(1, network_delegate.error_count());
170117ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri  EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, network_delegate.last_error());
170292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(1, network_delegate.completed_requests());
170392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
170492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
170592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that net::NetworkDelegate::NotifyCompleted is called if
170692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// content is empty.
170717ad9972f4b998dbf1a046780b6bde461d721dd0Luca BarbieriTEST_F(URLRequestTest, RequestCompletionForEmptyResponse) {
170892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
170992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("data:,"), &d, &default_context_);
171092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
171192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  MessageLoop::current()->Run();
171292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ("", d.data_received());
171392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(1, default_network_delegate_.completed_requests());
171492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
171592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
171692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that SetPriority actually sets the URLRequest's priority
171792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// correctly, both before and after start.
1718507337864fa80caf9f26602324d2c28dd0a75d61Marek OlšákTEST_F(URLRequestTest, SetPriorityBasic) {
171992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
172092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
172192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
172292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
172392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.SetPriority(LOW);
172492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(LOW, req.priority());
172592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
172692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
172792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(LOW, req.priority());
172892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
172992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.SetPriority(MEDIUM);
17303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(MEDIUM, req.priority());
17313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri}
173292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
173392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that URLRequest calls SetPriority on a job before calling
17343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// Start on it.
17353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) {
173692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestDelegate d;
173792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
17383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
173992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
174092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  scoped_refptr<URLRequestTestJob> job =
174192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      new URLRequestTestJob(&req, &default_network_delegate_);
174292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  AddTestInterceptor()->set_main_intercept_job(job);
17433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  EXPECT_EQ(DEFAULT_PRIORITY, job->priority());
174492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
174592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.SetPriority(LOW);
17463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
174792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  req.Start();
174892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  EXPECT_EQ(LOW, job->priority());
174992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
175092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
175192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// Make sure that URLRequest passes on its priority updates to its
17523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri// job.
17533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca BarbieriTEST_F(URLRequestTest, SetJobPriority) {
17543e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  TestDelegate d;
17553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  URLRequest req(GURL("http://test_intercept/foo"), &d, &default_context_);
17563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
175792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  scoped_refptr<URLRequestTestJob> job =
175892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      new URLRequestTestJob(&req, &default_network_delegate_);
17593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  AddTestInterceptor()->set_main_intercept_job(job);
17603e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
17614dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller  req.SetPriority(LOW);
17624dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller  req.Start();
17634dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller  EXPECT_EQ(LOW, job->priority());
17644dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller
17654dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller  req.SetPriority(MEDIUM);
17666ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  EXPECT_EQ(MEDIUM, req.priority());
17676ab6c43079083c811761241b901d07f9ad2c9affChristoph Bumiller  EXPECT_EQ(MEDIUM, job->priority());
17684dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller}
17694dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller
17704dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller// TODO(droger): Support SpawnedTestServer on iOS (see http://crbug.com/148666).
17714dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller#if !defined(OS_IOS)
17724dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller// A subclass of SpawnedTestServer that uses a statically-configured hostname.
17734dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller// This is to work around mysterious failures in chrome_frame_net_tests. See:
17744dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller// http://crbug.com/114369
17754dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumillerclass LocalHttpTestServer : public SpawnedTestServer {
17764dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller public:
17774dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller  explicit LocalHttpTestServer(const base::FilePath& document_root)
17784dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller      : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP,
17794dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller                          ScopedCustomUrlRequestTestHttpHost::value(),
17804dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller                          document_root) {}
178192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer()
178292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri      : SpawnedTestServer(SpawnedTestServer::TYPE_HTTP,
178392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                          ScopedCustomUrlRequestTestHttpHost::value(),
178492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                          base::FilePath()) {}
17853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri};
17863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
178792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DelayedCookieCallback) {
178892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer test_server;
178992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_TRUE(test_server.Start());
179092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
179192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  TestURLRequestContext context;
17923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri  scoped_refptr<DelayedCookieMonster> delayed_cm =
17933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri      new DelayedCookieMonster();
179492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  scoped_refptr<CookieStore> cookie_store = delayed_cm;
179592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  context.set_cookie_store(delayed_cm);
179692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
179792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Set up a cookie.
179892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
179992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
180092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    context.set_network_delegate(&network_delegate);
180192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
180217ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri    URLRequest req(
180317ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri        test_server.GetURL("set-cookie?CookieToNotSend=1"), &d, &context);
180417ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri    req.Start();
180517ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri    MessageLoop::current()->Run();
180617ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
180717ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
180892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(1, network_delegate.set_cookie_count());
180992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
181092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
181192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify that the cookie is set.
181292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
181392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
181492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    context.set_network_delegate(&network_delegate);
181592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
181692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(test_server.GetURL("echoheader?Cookie"), &d, &context);
181792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
181892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
181992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
182092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
182192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                != std::string::npos);
182292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
182392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
182492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
182592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
182692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
182792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSendCookies) {
182892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer test_server;
182992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_TRUE(test_server.Start());
183092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
183192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Set up a cookie.
183292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
183392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
183492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
183592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
183692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
183792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &d,
183892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &default_context_);
183992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
184092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
184192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
184292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
184392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
184492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
184592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify that the cookie is set.
184692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
184792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
184892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
184992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
185092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
185192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
185292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
185392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
185492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
185592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
185692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                != std::string::npos);
185792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
185892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
185992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
186092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
186192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set.
186292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
186392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
186492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
186592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
186692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
186792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
186892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.set_load_flags(LOAD_DO_NOT_SEND_COOKIES);
186992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
187092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
187192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
187292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
187392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                == std::string::npos);
187492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
18757e02303497237cde958c28608477d0c355a8038bMarek Olšák    // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies.
187692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
187792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
187892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
187992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
188092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
188192617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSaveCookies) {
188292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer test_server;
188392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_TRUE(test_server.Start());
188492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
188592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Set up a cookie.
188692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
188792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
188892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
188992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
189092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
189192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &d,
189292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &default_context_);
189392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
189492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
189592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
189692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
189792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
189892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(1, network_delegate.set_cookie_count());
189992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
190092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
190192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Try to set-up another cookie and update the previous cookie.
190292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
190392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
190492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
190592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
190692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
190792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
190892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        &d,
190992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        &default_context_);
191092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.set_load_flags(LOAD_DO_NOT_SAVE_COOKIES);
191192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
191292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
191392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
191492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
191592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie.
191692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
191792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
191892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.set_cookie_count());
191992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
192092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
192192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify the cookies weren't saved or updated.
192292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
192392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
192492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
192592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
192692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
192765303c49d1efc996f5cc9dafa2768d0225b76f1cChristoph Bumiller        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
192892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
192992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
193092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
193192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
193292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                == std::string::npos);
193392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
193492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                != std::string::npos);
193592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
193692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
193792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
193892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.set_cookie_count());
193992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
194092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
194192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
194292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) {
194392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer test_server;
194492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_TRUE(test_server.Start());
194592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
194692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Set up a cookie.
194792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
194892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
194992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
195092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
195192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
195292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &d,
195392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &default_context_);
195492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
195592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
195692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
195792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
195892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
195992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
196092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
196192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify that the cookie is set.
196292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
196392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
1964507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák    default_context_.set_network_delegate(&network_delegate);
196592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
196692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
196792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
196892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
196992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
19703e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri
197192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
197292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                != std::string::npos);
197392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
197492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
197592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
197692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
197792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
197892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify that the cookie isn't sent.
197992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
198092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
198192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
198292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
198392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
198492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
198592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
198692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
198792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
198892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
198992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
199092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                == std::string::npos);
199192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
199292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
199392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
199492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
199592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
199692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
199792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) {
199892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer test_server;
199992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_TRUE(test_server.Start());
200092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
200192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Set up a cookie.
200292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
200392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
200492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
200592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
200692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
200792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &d,
200892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &default_context_);
200992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
201092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
201192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
201292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
201392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
201492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
201592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
201692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Try to set-up another cookie and update the previous cookie.
201792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
201892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
201992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
202092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
202192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
202292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
202392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
202492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        &d,
202592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        &default_context_);
202692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
202792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
202892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
202992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
203092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
203192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
203292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
203392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
203492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify the cookies weren't saved or updated.
203592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
203692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
203792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
203892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
203992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
204092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
204192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
204292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
204392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
204492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
204592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                == std::string::npos);
204692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
204792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                != std::string::npos);
204892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
204992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
205092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
205192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
205292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
205392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
205492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSaveEmptyCookies) {
205592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer test_server;
205692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_TRUE(test_server.Start());
205792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
205892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Set up an empty cookie.
205992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
206092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
206192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
206292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
206392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(test_server.GetURL("set-cookie"), &d, &default_context_);
206492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
206592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
206692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
206792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
206892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
206992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.set_cookie_count());
207092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
207192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
207292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
207392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) {
207492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer test_server;
207592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_TRUE(test_server.Start());
207692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
207792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Set up a cookie.
207892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
207992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
208092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
208192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
208292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"),
208392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &d,
208492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                   &default_context_);
208592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
208692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
208792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
2088b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
208992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
209092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
209192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
209292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify that the cookie is set.
209392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
209492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
209592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
209692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
209792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
209892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
209992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
210092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
210192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
210292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
210392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                != std::string::npos);
210492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
210592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
210692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
210792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
210892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
210992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  // Verify that the cookie isn't sent.
211092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  {
211192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestNetworkDelegate network_delegate;
211292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    default_context_.set_network_delegate(&network_delegate);
211392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    TestDelegate d;
211492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
211592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    URLRequest req(
211692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
211792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    req.Start();
211892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    MessageLoop::current()->Run();
211992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
212092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
212192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri                == std::string::npos);
212292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
212392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
212492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
212592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  }
212692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
212792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
212892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriTEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) {
212992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  LocalHttpTestServer test_server;
213092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri  ASSERT_TRUE(test_server.Start());
2131
2132  // Set up a cookie.
2133  {
2134    TestNetworkDelegate network_delegate;
2135    default_context_.set_network_delegate(&network_delegate);
2136    TestDelegate d;
2137    URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
2138                   &d,
2139                   &default_context_);
2140    req.Start();
2141    MessageLoop::current()->Run();
2142
2143    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2144    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2145  }
2146
2147  // Try to set-up another cookie and update the previous cookie.
2148  {
2149    TestNetworkDelegate network_delegate;
2150    default_context_.set_network_delegate(&network_delegate);
2151    TestDelegate d;
2152    network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
2153    URLRequest req(
2154        test_server.GetURL("set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
2155        &d,
2156        &default_context_);
2157    req.Start();
2158
2159    MessageLoop::current()->Run();
2160
2161    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2162    EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
2163  }
2164
2165  // Verify the cookies weren't saved or updated.
2166  {
2167    TestNetworkDelegate network_delegate;
2168    default_context_.set_network_delegate(&network_delegate);
2169    TestDelegate d;
2170    URLRequest req(
2171        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
2172    req.Start();
2173    MessageLoop::current()->Run();
2174
2175    EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
2176                == std::string::npos);
2177    EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
2178                != std::string::npos);
2179
2180    EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2181    EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2182  }
2183}
2184
2185// FixedDateNetworkDelegate swaps out the server's HTTP Date response header
2186// value for the |fixed_date| argument given to the constructor.
2187class FixedDateNetworkDelegate : public TestNetworkDelegate {
2188 public:
2189  explicit FixedDateNetworkDelegate(const std::string& fixed_date)
2190      : fixed_date_(fixed_date) {}
2191  virtual ~FixedDateNetworkDelegate() {}
2192
2193  // net::NetworkDelegate implementation
2194  virtual int OnHeadersReceived(
2195      net::URLRequest* request,
2196      const net::CompletionCallback& callback,
2197      const net::HttpResponseHeaders* original_response_headers,
2198      scoped_refptr<net::HttpResponseHeaders>* override_response_headers)
2199      OVERRIDE;
2200
2201 private:
2202  std::string fixed_date_;
2203
2204  DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate);
2205};
2206
2207int FixedDateNetworkDelegate::OnHeadersReceived(
2208    net::URLRequest* request,
2209    const net::CompletionCallback& callback,
2210    const net::HttpResponseHeaders* original_response_headers,
2211    scoped_refptr<net::HttpResponseHeaders>* override_response_headers) {
2212  net::HttpResponseHeaders* new_response_headers =
2213      new net::HttpResponseHeaders(original_response_headers->raw_headers());
2214
2215  new_response_headers->RemoveHeader("Date");
2216  new_response_headers->AddHeader("Date: " + fixed_date_);
2217
2218  *override_response_headers = new_response_headers;
2219  return TestNetworkDelegate::OnHeadersReceived(request,
2220                                                callback,
2221                                                original_response_headers,
2222                                                override_response_headers);
2223}
2224
2225// Test that cookie expiration times are adjusted for server/client clock
2226// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date
2227// headers by defaulting to GMT. (crbug.com/135131)
2228TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) {
2229  LocalHttpTestServer test_server;
2230  ASSERT_TRUE(test_server.Start());
2231
2232  // Set up an expired cookie.
2233  {
2234    TestNetworkDelegate network_delegate;
2235    default_context_.set_network_delegate(&network_delegate);
2236    TestDelegate d;
2237    URLRequest req(test_server.GetURL(
2238        "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
2239        &d,
2240        &default_context_);
2241    req.Start();
2242    MessageLoop::current()->Run();
2243  }
2244  // Verify that the cookie is not set.
2245  {
2246    TestNetworkDelegate network_delegate;
2247    default_context_.set_network_delegate(&network_delegate);
2248    TestDelegate d;
2249    URLRequest req(
2250        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
2251    req.Start();
2252    MessageLoop::current()->Run();
2253
2254    EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos);
2255  }
2256  // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier.
2257  {
2258    FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC");
2259    default_context_.set_network_delegate(&network_delegate);
2260    TestDelegate d;
2261    URLRequest req(test_server.GetURL(
2262        "set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
2263        &d,
2264        &default_context_);
2265    req.Start();
2266    MessageLoop::current()->Run();
2267  }
2268  // Verify that the cookie is set.
2269  {
2270    TestNetworkDelegate network_delegate;
2271    default_context_.set_network_delegate(&network_delegate);
2272    TestDelegate d;
2273    URLRequest req(
2274        test_server.GetURL("echoheader?Cookie"), &d, &default_context_);
2275    req.Start();
2276    MessageLoop::current()->Run();
2277
2278    EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos);
2279  }
2280}
2281
2282
2283// Check that it is impossible to change the referrer in the extra headers of
2284// an URLRequest.
2285TEST_F(URLRequestTest, DoNotOverrideReferrer) {
2286  LocalHttpTestServer test_server;
2287  ASSERT_TRUE(test_server.Start());
2288
2289  // If extra headers contain referer and the request contains a referer,
2290  // only the latter shall be respected.
2291  {
2292    TestDelegate d;
2293    URLRequest req(
2294        test_server.GetURL("echoheader?Referer"), &d, &default_context_);
2295    req.SetReferrer("http://foo.com/");
2296
2297    HttpRequestHeaders headers;
2298    headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
2299    req.SetExtraRequestHeaders(headers);
2300
2301    req.Start();
2302    MessageLoop::current()->Run();
2303
2304    EXPECT_EQ("http://foo.com/", d.data_received());
2305  }
2306
2307  // If extra headers contain a referer but the request does not, no referer
2308  // shall be sent in the header.
2309  {
2310    TestDelegate d;
2311    URLRequest req(
2312        test_server.GetURL("echoheader?Referer"), &d, &default_context_);
2313
2314    HttpRequestHeaders headers;
2315    headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
2316    req.SetExtraRequestHeaders(headers);
2317    req.set_load_flags(LOAD_VALIDATE_CACHE);
2318
2319    req.Start();
2320    MessageLoop::current()->Run();
2321
2322    EXPECT_EQ("None", d.data_received());
2323  }
2324}
2325
2326class URLRequestTestHTTP : public URLRequestTest {
2327 public:
2328  URLRequestTestHTTP()
2329      : test_server_(base::FilePath(FILE_PATH_LITERAL(
2330                                  "net/data/url_request_unittest"))) {
2331  }
2332
2333 protected:
2334  // Requests |redirect_url|, which must return a HTTP 3xx redirect.
2335  // |request_method| is the method to use for the initial request.
2336  // |redirect_method| is the method that is expected to be used for the second
2337  // request, after redirection.
2338  // If |include_data| is true, data is uploaded with the request.  The
2339  // response body is expected to match it exactly, if and only if
2340  // |request_method| == |redirect_method|.
2341  void HTTPRedirectMethodTest(const GURL& redirect_url,
2342                              const std::string& request_method,
2343                              const std::string& redirect_method,
2344                              bool include_data) {
2345    static const char kData[] = "hello world";
2346    TestDelegate d;
2347    URLRequest req(redirect_url, &d, &default_context_);
2348    req.set_method(request_method);
2349    if (include_data) {
2350      req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
2351      HttpRequestHeaders headers;
2352      headers.SetHeader(HttpRequestHeaders::kContentLength,
2353                        base::UintToString(arraysize(kData) - 1));
2354      req.SetExtraRequestHeaders(headers);
2355    }
2356    req.Start();
2357    MessageLoop::current()->Run();
2358    EXPECT_EQ(redirect_method, req.method());
2359    EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
2360    EXPECT_EQ(OK, req.status().error());
2361    if (include_data) {
2362      if (request_method == redirect_method) {
2363        EXPECT_EQ(kData, d.data_received());
2364      } else {
2365        EXPECT_NE(kData, d.data_received());
2366      }
2367    }
2368    if (HasFailure())
2369      LOG(WARNING) << "Request method was: " << request_method;
2370  }
2371
2372  void HTTPUploadDataOperationTest(const std::string& method) {
2373    const int kMsgSize = 20000;  // multiple of 10
2374    const int kIterations = 50;
2375    char* uploadBytes = new char[kMsgSize+1];
2376    char* ptr = uploadBytes;
2377    char marker = 'a';
2378    for (int idx = 0; idx < kMsgSize/10; idx++) {
2379      memcpy(ptr, "----------", 10);
2380      ptr += 10;
2381      if (idx % 100 == 0) {
2382        ptr--;
2383        *ptr++ = marker;
2384        if (++marker > 'z')
2385          marker = 'a';
2386      }
2387    }
2388    uploadBytes[kMsgSize] = '\0';
2389
2390    for (int i = 0; i < kIterations; ++i) {
2391      TestDelegate d;
2392      URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
2393      r.set_method(method.c_str());
2394
2395      r.set_upload(make_scoped_ptr(CreateSimpleUploadData(uploadBytes)));
2396
2397      r.Start();
2398      EXPECT_TRUE(r.is_pending());
2399
2400      MessageLoop::current()->Run();
2401
2402      ASSERT_EQ(1, d.response_started_count())
2403          << "request failed: " << r.status().status()
2404          << ", os error: " << r.status().error();
2405
2406      EXPECT_FALSE(d.received_data_before_response());
2407      EXPECT_EQ(uploadBytes, d.data_received());
2408    }
2409    delete[] uploadBytes;
2410  }
2411
2412  void AddChunksToUpload(URLRequest* r) {
2413    r->AppendChunkToUpload("a", 1, false);
2414    r->AppendChunkToUpload("bcd", 3, false);
2415    r->AppendChunkToUpload("this is a longer chunk than before.", 35, false);
2416    r->AppendChunkToUpload("\r\n\r\n", 4, false);
2417    r->AppendChunkToUpload("0", 1, false);
2418    r->AppendChunkToUpload("2323", 4, true);
2419  }
2420
2421  void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) {
2422    // This should match the chunks sent by AddChunksToUpload().
2423    const std::string expected_data =
2424        "abcdthis is a longer chunk than before.\r\n\r\n02323";
2425
2426    ASSERT_EQ(1, d->response_started_count())
2427        << "request failed: " << r->status().status()
2428        << ", os error: " << r->status().error();
2429
2430    EXPECT_FALSE(d->received_data_before_response());
2431
2432    EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received()));
2433    EXPECT_EQ(expected_data, d->data_received());
2434  }
2435
2436  bool DoManyCookiesRequest(int num_cookies) {
2437    TestDelegate d;
2438    URLRequest r(test_server_.GetURL("set-many-cookies?" +
2439                                     base::IntToString(num_cookies)),
2440                                     &d,
2441                                     &default_context_);
2442
2443    r.Start();
2444    EXPECT_TRUE(r.is_pending());
2445
2446    MessageLoop::current()->Run();
2447
2448    bool is_success = r.status().is_success();
2449
2450    if (!is_success) {
2451      // Requests handled by ChromeFrame send a less precise error message,
2452      // ERR_CONNECTION_ABORTED.
2453      EXPECT_TRUE(r.status().error() == ERR_RESPONSE_HEADERS_TOO_BIG ||
2454                  r.status().error() == ERR_CONNECTION_ABORTED);
2455      // The test server appears to be unable to handle subsequent requests
2456      // after this error is triggered. Force it to restart.
2457      EXPECT_TRUE(test_server_.Stop());
2458      EXPECT_TRUE(test_server_.Start());
2459    }
2460
2461    return is_success;
2462  }
2463
2464  LocalHttpTestServer test_server_;
2465};
2466
2467// In this unit test, we're using the HTTPTestServer as a proxy server and
2468// issuing a CONNECT request with the magic host name "www.redirect.com".
2469// The HTTPTestServer will return a 302 response, which we should not
2470// follow.
2471TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) {
2472  ASSERT_TRUE(test_server_.Start());
2473
2474  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
2475  TestURLRequestContextWithProxy context(
2476      test_server_.host_port_pair().ToString(),
2477      &network_delegate);
2478
2479  TestDelegate d;
2480  {
2481    URLRequest r(GURL("https://www.redirect.com/"), &d, &context);
2482    r.Start();
2483    EXPECT_TRUE(r.is_pending());
2484
2485    MessageLoop::current()->Run();
2486
2487    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
2488    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
2489    EXPECT_EQ(1, d.response_started_count());
2490    // We should not have followed the redirect.
2491    EXPECT_EQ(0, d.received_redirect_count());
2492  }
2493}
2494
2495// This is the same as the previous test, but checks that the network delegate
2496// registers the error.
2497TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) {
2498  ASSERT_TRUE(test_server_.Start());
2499
2500  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
2501  TestURLRequestContextWithProxy context(
2502      test_server_.host_port_pair().ToString(),
2503      &network_delegate);
2504
2505  TestDelegate d;
2506  {
2507    URLRequest r(GURL("https://www.redirect.com/"), &d, &context);
2508    r.Start();
2509    EXPECT_TRUE(r.is_pending());
2510
2511    MessageLoop::current()->Run();
2512
2513    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
2514    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
2515    EXPECT_EQ(1, d.response_started_count());
2516    // We should not have followed the redirect.
2517    EXPECT_EQ(0, d.received_redirect_count());
2518
2519    EXPECT_EQ(1, network_delegate.error_count());
2520    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, network_delegate.last_error());
2521  }
2522}
2523
2524// Tests that we can block and asynchronously return OK in various stages.
2525TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) {
2526  static const BlockingNetworkDelegate::Stage blocking_stages[] = {
2527    BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
2528    BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
2529    BlockingNetworkDelegate::ON_HEADERS_RECEIVED
2530  };
2531  static const size_t blocking_stages_length = arraysize(blocking_stages);
2532
2533  ASSERT_TRUE(test_server_.Start());
2534
2535  TestDelegate d;
2536  BlockingNetworkDelegate network_delegate(
2537      BlockingNetworkDelegate::USER_CALLBACK);
2538  network_delegate.set_block_on(
2539      BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST |
2540      BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS |
2541      BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
2542
2543  TestURLRequestContext context(true);
2544  context.set_network_delegate(&network_delegate);
2545  context.Init();
2546
2547  {
2548    URLRequest r(test_server_.GetURL("empty.html"), &d, &context);
2549
2550    r.Start();
2551    for (size_t i = 0; i < blocking_stages_length; ++i) {
2552      MessageLoop::current()->Run();
2553      EXPECT_EQ(blocking_stages[i],
2554                network_delegate.stage_blocked_for_callback());
2555      network_delegate.DoCallback(OK);
2556    }
2557    MessageLoop::current()->Run();
2558    EXPECT_EQ(200, r.GetResponseCode());
2559    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2560    EXPECT_EQ(1, network_delegate.created_requests());
2561    EXPECT_EQ(0, network_delegate.destroyed_requests());
2562  }
2563  EXPECT_EQ(1, network_delegate.destroyed_requests());
2564}
2565
2566// Tests that the network delegate can block and cancel a request.
2567TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) {
2568  ASSERT_TRUE(test_server_.Start());
2569
2570  TestDelegate d;
2571  BlockingNetworkDelegate network_delegate(
2572      BlockingNetworkDelegate::AUTO_CALLBACK);
2573  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
2574  network_delegate.set_retval(ERR_EMPTY_RESPONSE);
2575
2576  TestURLRequestContextWithProxy context(
2577      test_server_.host_port_pair().ToString(),
2578      &network_delegate);
2579
2580  {
2581    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
2582
2583    r.Start();
2584    MessageLoop::current()->Run();
2585
2586    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
2587    EXPECT_EQ(ERR_EMPTY_RESPONSE, r.status().error());
2588    EXPECT_EQ(1, network_delegate.created_requests());
2589    EXPECT_EQ(0, network_delegate.destroyed_requests());
2590  }
2591  EXPECT_EQ(1, network_delegate.destroyed_requests());
2592}
2593
2594// Helper function for NetworkDelegateCancelRequestAsynchronously and
2595// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network
2596// delegate operating in |block_mode| and a request for |url|. It blocks the
2597// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT.
2598void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode,
2599                                  BlockingNetworkDelegate::Stage stage,
2600                                  const GURL& url) {
2601  TestDelegate d;
2602  BlockingNetworkDelegate network_delegate(block_mode);
2603  network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT);
2604  network_delegate.set_block_on(stage);
2605
2606  TestURLRequestContext context(true);
2607  context.set_network_delegate(&network_delegate);
2608  context.Init();
2609
2610  {
2611    URLRequest r(url, &d, &context);
2612
2613    r.Start();
2614    MessageLoop::current()->Run();
2615
2616    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
2617    EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, r.status().error());
2618    EXPECT_EQ(1, network_delegate.created_requests());
2619    EXPECT_EQ(0, network_delegate.destroyed_requests());
2620  }
2621  EXPECT_EQ(1, network_delegate.destroyed_requests());
2622}
2623
2624// The following 3 tests check that the network delegate can cancel a request
2625// synchronously in various stages of the request.
2626TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) {
2627  ASSERT_TRUE(test_server_.Start());
2628  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
2629                               BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
2630                               test_server_.GetURL(std::string()));
2631}
2632
2633TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) {
2634  ASSERT_TRUE(test_server_.Start());
2635  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
2636                               BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
2637                               test_server_.GetURL(std::string()));
2638}
2639
2640TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) {
2641  ASSERT_TRUE(test_server_.Start());
2642  NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
2643                               BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
2644                               test_server_.GetURL(std::string()));
2645}
2646
2647// The following 3 tests check that the network delegate can cancel a request
2648// asynchronously in various stages of the request.
2649TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) {
2650  ASSERT_TRUE(test_server_.Start());
2651  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
2652                               BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
2653                               test_server_.GetURL(std::string()));
2654}
2655
2656TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) {
2657  ASSERT_TRUE(test_server_.Start());
2658  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
2659                               BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
2660                               test_server_.GetURL(std::string()));
2661}
2662
2663TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) {
2664  ASSERT_TRUE(test_server_.Start());
2665  NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
2666                               BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
2667                               test_server_.GetURL(std::string()));
2668}
2669
2670// Tests that the network delegate can block and redirect a request to a new
2671// URL.
2672TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) {
2673  ASSERT_TRUE(test_server_.Start());
2674
2675  TestDelegate d;
2676  BlockingNetworkDelegate network_delegate(
2677      BlockingNetworkDelegate::AUTO_CALLBACK);
2678  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
2679  GURL redirect_url(test_server_.GetURL("simple.html"));
2680  network_delegate.set_redirect_url(redirect_url);
2681
2682  TestURLRequestContextWithProxy context(
2683      test_server_.host_port_pair().ToString(),
2684      &network_delegate);
2685
2686  {
2687    GURL original_url(test_server_.GetURL("empty.html"));
2688    URLRequest r(original_url, &d, &context);
2689
2690    r.Start();
2691    MessageLoop::current()->Run();
2692
2693    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2694    EXPECT_EQ(0, r.status().error());
2695    EXPECT_EQ(redirect_url, r.url());
2696    EXPECT_EQ(original_url, r.original_url());
2697    EXPECT_EQ(2U, r.url_chain().size());
2698    EXPECT_EQ(1, network_delegate.created_requests());
2699    EXPECT_EQ(0, network_delegate.destroyed_requests());
2700  }
2701  EXPECT_EQ(1, network_delegate.destroyed_requests());
2702}
2703
2704// Tests that the network delegate can block and redirect a request to a new
2705// URL by setting a redirect_url and returning in OnBeforeURLRequest directly.
2706TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) {
2707  ASSERT_TRUE(test_server_.Start());
2708
2709  TestDelegate d;
2710  BlockingNetworkDelegate network_delegate(
2711      BlockingNetworkDelegate::SYNCHRONOUS);
2712  GURL redirect_url(test_server_.GetURL("simple.html"));
2713  network_delegate.set_redirect_url(redirect_url);
2714
2715  TestURLRequestContextWithProxy context(
2716      test_server_.host_port_pair().ToString(),
2717      &network_delegate);
2718
2719  {
2720    GURL original_url(test_server_.GetURL("empty.html"));
2721    URLRequest r(original_url, &d, &context);
2722
2723    r.Start();
2724    MessageLoop::current()->Run();
2725
2726    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2727    EXPECT_EQ(0, r.status().error());
2728    EXPECT_EQ(redirect_url, r.url());
2729    EXPECT_EQ(original_url, r.original_url());
2730    EXPECT_EQ(2U, r.url_chain().size());
2731    EXPECT_EQ(1, network_delegate.created_requests());
2732    EXPECT_EQ(0, network_delegate.destroyed_requests());
2733  }
2734  EXPECT_EQ(1, network_delegate.destroyed_requests());
2735}
2736
2737// Tests that redirects caused by the network delegate preserve POST data.
2738TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) {
2739  ASSERT_TRUE(test_server_.Start());
2740
2741  const char kData[] = "hello world";
2742
2743  TestDelegate d;
2744  BlockingNetworkDelegate network_delegate(
2745      BlockingNetworkDelegate::AUTO_CALLBACK);
2746  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
2747  GURL redirect_url(test_server_.GetURL("echo"));
2748  network_delegate.set_redirect_url(redirect_url);
2749
2750  TestURLRequestContext context(true);
2751  context.set_network_delegate(&network_delegate);
2752  context.Init();
2753
2754  {
2755    GURL original_url(test_server_.GetURL("empty.html"));
2756    URLRequest r(original_url, &d, &context);
2757    r.set_method("POST");
2758    r.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
2759    HttpRequestHeaders headers;
2760    headers.SetHeader(HttpRequestHeaders::kContentLength,
2761                      base::UintToString(arraysize(kData) - 1));
2762    r.SetExtraRequestHeaders(headers);
2763    r.Start();
2764    MessageLoop::current()->Run();
2765
2766    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2767    EXPECT_EQ(0, r.status().error());
2768    EXPECT_EQ(redirect_url, r.url());
2769    EXPECT_EQ(original_url, r.original_url());
2770    EXPECT_EQ(2U, r.url_chain().size());
2771    EXPECT_EQ(1, network_delegate.created_requests());
2772    EXPECT_EQ(0, network_delegate.destroyed_requests());
2773    EXPECT_EQ("POST", r.method());
2774    EXPECT_EQ(kData, d.data_received());
2775  }
2776  EXPECT_EQ(1, network_delegate.destroyed_requests());
2777}
2778
2779// Tests that the network delegate can synchronously complete OnAuthRequired
2780// by taking no action. This indicates that the NetworkDelegate does not want to
2781// handle the challenge, and is passing the buck along to the
2782// URLRequest::Delegate.
2783TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) {
2784  ASSERT_TRUE(test_server_.Start());
2785
2786  TestDelegate d;
2787  BlockingNetworkDelegate network_delegate(
2788      BlockingNetworkDelegate::SYNCHRONOUS);
2789
2790  TestURLRequestContext context(true);
2791  context.set_network_delegate(&network_delegate);
2792  context.Init();
2793
2794  d.set_credentials(AuthCredentials(kUser, kSecret));
2795
2796  {
2797    GURL url(test_server_.GetURL("auth-basic"));
2798    URLRequest r(url, &d, &context);
2799    r.Start();
2800    MessageLoop::current()->Run();
2801
2802    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2803    EXPECT_EQ(0, r.status().error());
2804    EXPECT_EQ(200, r.GetResponseCode());
2805    EXPECT_TRUE(d.auth_required_called());
2806    EXPECT_EQ(1, network_delegate.created_requests());
2807    EXPECT_EQ(0, network_delegate.destroyed_requests());
2808  }
2809  EXPECT_EQ(1, network_delegate.destroyed_requests());
2810}
2811
2812// Tests that the network delegate can synchronously complete OnAuthRequired
2813// by setting credentials.
2814TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) {
2815  ASSERT_TRUE(test_server_.Start());
2816
2817  TestDelegate d;
2818  BlockingNetworkDelegate network_delegate(
2819      BlockingNetworkDelegate::SYNCHRONOUS);
2820  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
2821  network_delegate.set_auth_retval(
2822      NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
2823
2824  network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
2825
2826  TestURLRequestContext context(true);
2827  context.set_network_delegate(&network_delegate);
2828  context.Init();
2829
2830  {
2831    GURL url(test_server_.GetURL("auth-basic"));
2832    URLRequest r(url, &d, &context);
2833    r.Start();
2834    MessageLoop::current()->Run();
2835
2836    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2837    EXPECT_EQ(0, r.status().error());
2838    EXPECT_EQ(200, r.GetResponseCode());
2839    EXPECT_FALSE(d.auth_required_called());
2840    EXPECT_EQ(1, network_delegate.created_requests());
2841    EXPECT_EQ(0, network_delegate.destroyed_requests());
2842  }
2843  EXPECT_EQ(1, network_delegate.destroyed_requests());
2844}
2845
2846// Tests that the network delegate can synchronously complete OnAuthRequired
2847// by cancelling authentication.
2848TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) {
2849  ASSERT_TRUE(test_server_.Start());
2850
2851  TestDelegate d;
2852  BlockingNetworkDelegate network_delegate(
2853      BlockingNetworkDelegate::SYNCHRONOUS);
2854  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
2855  network_delegate.set_auth_retval(
2856      NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
2857
2858  TestURLRequestContext context(true);
2859  context.set_network_delegate(&network_delegate);
2860  context.Init();
2861
2862  {
2863    GURL url(test_server_.GetURL("auth-basic"));
2864    URLRequest r(url, &d, &context);
2865    r.Start();
2866    MessageLoop::current()->Run();
2867
2868    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2869    EXPECT_EQ(OK, r.status().error());
2870    EXPECT_EQ(401, r.GetResponseCode());
2871    EXPECT_FALSE(d.auth_required_called());
2872    EXPECT_EQ(1, network_delegate.created_requests());
2873    EXPECT_EQ(0, network_delegate.destroyed_requests());
2874  }
2875  EXPECT_EQ(1, network_delegate.destroyed_requests());
2876}
2877
2878// Tests that the network delegate can asynchronously complete OnAuthRequired
2879// by taking no action. This indicates that the NetworkDelegate does not want
2880// to handle the challenge, and is passing the buck along to the
2881// URLRequest::Delegate.
2882TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) {
2883  ASSERT_TRUE(test_server_.Start());
2884
2885  TestDelegate d;
2886  BlockingNetworkDelegate network_delegate(
2887      BlockingNetworkDelegate::AUTO_CALLBACK);
2888  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
2889
2890  TestURLRequestContext context(true);
2891  context.set_network_delegate(&network_delegate);
2892  context.Init();
2893
2894  d.set_credentials(AuthCredentials(kUser, kSecret));
2895
2896  {
2897    GURL url(test_server_.GetURL("auth-basic"));
2898    URLRequest r(url, &d, &context);
2899    r.Start();
2900    MessageLoop::current()->Run();
2901
2902    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2903    EXPECT_EQ(0, r.status().error());
2904    EXPECT_EQ(200, r.GetResponseCode());
2905    EXPECT_TRUE(d.auth_required_called());
2906    EXPECT_EQ(1, network_delegate.created_requests());
2907    EXPECT_EQ(0, network_delegate.destroyed_requests());
2908  }
2909  EXPECT_EQ(1, network_delegate.destroyed_requests());
2910}
2911
2912// Tests that the network delegate can asynchronously complete OnAuthRequired
2913// by setting credentials.
2914TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) {
2915  ASSERT_TRUE(test_server_.Start());
2916
2917  TestDelegate d;
2918  BlockingNetworkDelegate network_delegate(
2919      BlockingNetworkDelegate::AUTO_CALLBACK);
2920  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
2921  network_delegate.set_auth_retval(
2922      NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
2923
2924  AuthCredentials auth_credentials(kUser, kSecret);
2925  network_delegate.set_auth_credentials(auth_credentials);
2926
2927  TestURLRequestContext context(true);
2928  context.set_network_delegate(&network_delegate);
2929  context.Init();
2930
2931  {
2932    GURL url(test_server_.GetURL("auth-basic"));
2933    URLRequest r(url, &d, &context);
2934    r.Start();
2935    MessageLoop::current()->Run();
2936
2937    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2938    EXPECT_EQ(0, r.status().error());
2939
2940    EXPECT_EQ(200, r.GetResponseCode());
2941    EXPECT_FALSE(d.auth_required_called());
2942    EXPECT_EQ(1, network_delegate.created_requests());
2943    EXPECT_EQ(0, network_delegate.destroyed_requests());
2944  }
2945  EXPECT_EQ(1, network_delegate.destroyed_requests());
2946}
2947
2948// Tests that the network delegate can asynchronously complete OnAuthRequired
2949// by cancelling authentication.
2950TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) {
2951  ASSERT_TRUE(test_server_.Start());
2952
2953  TestDelegate d;
2954  BlockingNetworkDelegate network_delegate(
2955      BlockingNetworkDelegate::AUTO_CALLBACK);
2956  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
2957  network_delegate.set_auth_retval(
2958      NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
2959
2960  TestURLRequestContext context(true);
2961  context.set_network_delegate(&network_delegate);
2962  context.Init();
2963
2964  {
2965    GURL url(test_server_.GetURL("auth-basic"));
2966    URLRequest r(url, &d, &context);
2967    r.Start();
2968    MessageLoop::current()->Run();
2969
2970    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
2971    EXPECT_EQ(OK, r.status().error());
2972    EXPECT_EQ(401, r.GetResponseCode());
2973    EXPECT_FALSE(d.auth_required_called());
2974    EXPECT_EQ(1, network_delegate.created_requests());
2975    EXPECT_EQ(0, network_delegate.destroyed_requests());
2976  }
2977  EXPECT_EQ(1, network_delegate.destroyed_requests());
2978}
2979
2980// Tests that we can handle when a network request was canceled while we were
2981// waiting for the network delegate.
2982// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback.
2983TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) {
2984  ASSERT_TRUE(test_server_.Start());
2985
2986  TestDelegate d;
2987  BlockingNetworkDelegate network_delegate(
2988      BlockingNetworkDelegate::USER_CALLBACK);
2989  network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
2990
2991  TestURLRequestContext context(true);
2992  context.set_network_delegate(&network_delegate);
2993  context.Init();
2994
2995  {
2996    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
2997
2998    r.Start();
2999    MessageLoop::current()->Run();
3000    EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
3001              network_delegate.stage_blocked_for_callback());
3002    EXPECT_EQ(0, network_delegate.completed_requests());
3003    // Cancel before callback.
3004    r.Cancel();
3005    // Ensure that network delegate is notified.
3006    EXPECT_EQ(1, network_delegate.completed_requests());
3007    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
3008    EXPECT_EQ(ERR_ABORTED, r.status().error());
3009    EXPECT_EQ(1, network_delegate.created_requests());
3010    EXPECT_EQ(0, network_delegate.destroyed_requests());
3011  }
3012  EXPECT_EQ(1, network_delegate.destroyed_requests());
3013}
3014
3015// Tests that we can handle when a network request was canceled while we were
3016// waiting for the network delegate.
3017// Part 2: Request is cancelled while waiting for OnBeforeSendHeaders callback.
3018TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) {
3019  ASSERT_TRUE(test_server_.Start());
3020
3021  TestDelegate d;
3022  BlockingNetworkDelegate network_delegate(
3023      BlockingNetworkDelegate::USER_CALLBACK);
3024  network_delegate.set_block_on(
3025      BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS);
3026
3027  TestURLRequestContext context(true);
3028  context.set_network_delegate(&network_delegate);
3029  context.Init();
3030
3031  {
3032    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
3033
3034    r.Start();
3035    MessageLoop::current()->Run();
3036    EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
3037              network_delegate.stage_blocked_for_callback());
3038    EXPECT_EQ(0, network_delegate.completed_requests());
3039    // Cancel before callback.
3040    r.Cancel();
3041    // Ensure that network delegate is notified.
3042    EXPECT_EQ(1, network_delegate.completed_requests());
3043    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
3044    EXPECT_EQ(ERR_ABORTED, r.status().error());
3045    EXPECT_EQ(1, network_delegate.created_requests());
3046    EXPECT_EQ(0, network_delegate.destroyed_requests());
3047  }
3048  EXPECT_EQ(1, network_delegate.destroyed_requests());
3049}
3050
3051// Tests that we can handle when a network request was canceled while we were
3052// waiting for the network delegate.
3053// Part 3: Request is cancelled while waiting for OnHeadersReceived callback.
3054TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) {
3055  ASSERT_TRUE(test_server_.Start());
3056
3057  TestDelegate d;
3058  BlockingNetworkDelegate network_delegate(
3059      BlockingNetworkDelegate::USER_CALLBACK);
3060  network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
3061
3062  TestURLRequestContext context(true);
3063  context.set_network_delegate(&network_delegate);
3064  context.Init();
3065
3066  {
3067    URLRequest r(test_server_.GetURL(std::string()), &d, &context);
3068
3069    r.Start();
3070    MessageLoop::current()->Run();
3071    EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
3072              network_delegate.stage_blocked_for_callback());
3073    EXPECT_EQ(0, network_delegate.completed_requests());
3074    // Cancel before callback.
3075    r.Cancel();
3076    // Ensure that network delegate is notified.
3077    EXPECT_EQ(1, network_delegate.completed_requests());
3078    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
3079    EXPECT_EQ(ERR_ABORTED, r.status().error());
3080    EXPECT_EQ(1, network_delegate.created_requests());
3081    EXPECT_EQ(0, network_delegate.destroyed_requests());
3082  }
3083  EXPECT_EQ(1, network_delegate.destroyed_requests());
3084}
3085
3086// Tests that we can handle when a network request was canceled while we were
3087// waiting for the network delegate.
3088// Part 4: Request is cancelled while waiting for OnAuthRequired callback.
3089TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) {
3090  ASSERT_TRUE(test_server_.Start());
3091
3092  TestDelegate d;
3093  BlockingNetworkDelegate network_delegate(
3094      BlockingNetworkDelegate::USER_CALLBACK);
3095  network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
3096
3097  TestURLRequestContext context(true);
3098  context.set_network_delegate(&network_delegate);
3099  context.Init();
3100
3101  {
3102    URLRequest r(test_server_.GetURL("auth-basic"), &d, &context);
3103
3104    r.Start();
3105    MessageLoop::current()->Run();
3106    EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED,
3107              network_delegate.stage_blocked_for_callback());
3108    EXPECT_EQ(0, network_delegate.completed_requests());
3109    // Cancel before callback.
3110    r.Cancel();
3111    // Ensure that network delegate is notified.
3112    EXPECT_EQ(1, network_delegate.completed_requests());
3113    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
3114    EXPECT_EQ(ERR_ABORTED, r.status().error());
3115    EXPECT_EQ(1, network_delegate.created_requests());
3116    EXPECT_EQ(0, network_delegate.destroyed_requests());
3117  }
3118  EXPECT_EQ(1, network_delegate.destroyed_requests());
3119}
3120
3121// In this unit test, we're using the HTTPTestServer as a proxy server and
3122// issuing a CONNECT request with the magic host name "www.server-auth.com".
3123// The HTTPTestServer will return a 401 response, which we should balk at.
3124TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) {
3125  ASSERT_TRUE(test_server_.Start());
3126
3127  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
3128  TestURLRequestContextWithProxy context(
3129      test_server_.host_port_pair().ToString(),
3130      &network_delegate);
3131
3132  TestDelegate d;
3133  {
3134    URLRequest r(GURL("https://www.server-auth.com/"), &d, &context);
3135
3136    r.Start();
3137    EXPECT_TRUE(r.is_pending());
3138
3139    MessageLoop::current()->Run();
3140
3141    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
3142    EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().error());
3143  }
3144}
3145
3146TEST_F(URLRequestTestHTTP, GetTest_NoCache) {
3147  ASSERT_TRUE(test_server_.Start());
3148
3149  TestDelegate d;
3150  {
3151    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
3152
3153    r.Start();
3154    EXPECT_TRUE(r.is_pending());
3155
3156    MessageLoop::current()->Run();
3157
3158    EXPECT_EQ(1, d.response_started_count());
3159    EXPECT_FALSE(d.received_data_before_response());
3160    EXPECT_NE(0, d.bytes_received());
3161    EXPECT_EQ(test_server_.host_port_pair().host(),
3162              r.GetSocketAddress().host());
3163    EXPECT_EQ(test_server_.host_port_pair().port(),
3164              r.GetSocketAddress().port());
3165
3166    // TODO(eroman): Add back the NetLog tests...
3167  }
3168}
3169
3170// This test has the server send a large number of cookies to the client.
3171// To ensure that no number of cookies causes a crash, a galloping binary
3172// search is used to estimate that maximum number of cookies that are accepted
3173// by the browser. Beyond the maximum number, the request will fail with
3174// ERR_RESPONSE_HEADERS_TOO_BIG.
3175#if defined(OS_WIN)
3176// http://crbug.com/177916
3177#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies
3178#else
3179#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies
3180#endif  // defined(OS_WIN)
3181TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) {
3182  ASSERT_TRUE(test_server_.Start());
3183
3184  int lower_bound = 0;
3185  int upper_bound = 1;
3186
3187  // Double the number of cookies until the response header limits are
3188  // exceeded.
3189  while (DoManyCookiesRequest(upper_bound)) {
3190    lower_bound = upper_bound;
3191    upper_bound *= 2;
3192    ASSERT_LT(upper_bound, 1000000);
3193  }
3194
3195  int tolerance = upper_bound * 0.005;
3196  if (tolerance < 2)
3197    tolerance = 2;
3198
3199  // Perform a binary search to find the highest possible number of cookies,
3200  // within the desired tolerance.
3201  while (upper_bound - lower_bound >= tolerance) {
3202    int num_cookies = (lower_bound + upper_bound) / 2;
3203
3204    if (DoManyCookiesRequest(num_cookies))
3205      lower_bound = num_cookies;
3206    else
3207      upper_bound = num_cookies;
3208  }
3209  // Success: the test did not crash.
3210}
3211
3212TEST_F(URLRequestTestHTTP, GetTest) {
3213  ASSERT_TRUE(test_server_.Start());
3214
3215  TestDelegate d;
3216  {
3217    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
3218
3219    r.Start();
3220    EXPECT_TRUE(r.is_pending());
3221
3222    MessageLoop::current()->Run();
3223
3224    EXPECT_EQ(1, d.response_started_count());
3225    EXPECT_FALSE(d.received_data_before_response());
3226    EXPECT_NE(0, d.bytes_received());
3227    EXPECT_EQ(test_server_.host_port_pair().host(),
3228              r.GetSocketAddress().host());
3229    EXPECT_EQ(test_server_.host_port_pair().port(),
3230              r.GetSocketAddress().port());
3231  }
3232}
3233
3234TEST_F(URLRequestTestHTTP, GetTestLoadTiming) {
3235  ASSERT_TRUE(test_server_.Start());
3236
3237  TestDelegate d;
3238  {
3239    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
3240
3241    r.Start();
3242    EXPECT_TRUE(r.is_pending());
3243
3244    MessageLoop::current()->Run();
3245
3246    LoadTimingInfo load_timing_info;
3247    r.GetLoadTimingInfo(&load_timing_info);
3248    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
3249
3250    EXPECT_EQ(1, d.response_started_count());
3251    EXPECT_FALSE(d.received_data_before_response());
3252    EXPECT_NE(0, d.bytes_received());
3253    EXPECT_EQ(test_server_.host_port_pair().host(),
3254              r.GetSocketAddress().host());
3255    EXPECT_EQ(test_server_.host_port_pair().port(),
3256              r.GetSocketAddress().port());
3257  }
3258}
3259
3260TEST_F(URLRequestTestHTTP, GetZippedTest) {
3261  ASSERT_TRUE(test_server_.Start());
3262
3263  // Parameter that specifies the Content-Length field in the response:
3264  // C - Compressed length.
3265  // U - Uncompressed length.
3266  // L - Large length (larger than both C & U).
3267  // M - Medium length (between C & U).
3268  // S - Small length (smaller than both C & U).
3269  const char test_parameters[] = "CULMS";
3270  const int num_tests = arraysize(test_parameters)- 1;  // Skip NULL.
3271  // C & U should be OK.
3272  // L & M are larger than the data sent, and show an error.
3273  // S has too little data, but we seem to accept it.
3274  const bool test_expect_success[num_tests] =
3275      { true, true, false, false, true };
3276
3277  for (int i = 0; i < num_tests ; i++) {
3278    TestDelegate d;
3279    {
3280      std::string test_file =
3281          base::StringPrintf("compressedfiles/BullRunSpeech.txt?%c",
3282                             test_parameters[i]);
3283
3284      TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
3285      TestURLRequestContext context(true);
3286      context.set_network_delegate(&network_delegate);
3287      context.Init();
3288
3289      URLRequest r(test_server_.GetURL(test_file), &d, &context);
3290      r.Start();
3291      EXPECT_TRUE(r.is_pending());
3292
3293      MessageLoop::current()->Run();
3294
3295      EXPECT_EQ(1, d.response_started_count());
3296      EXPECT_FALSE(d.received_data_before_response());
3297      VLOG(1) << " Received " << d.bytes_received() << " bytes"
3298              << " status = " << r.status().status()
3299              << " error = " << r.status().error();
3300      if (test_expect_success[i]) {
3301        EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status())
3302            << " Parameter = \"" << test_file << "\"";
3303      } else {
3304        EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
3305        EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, r.status().error())
3306            << " Parameter = \"" << test_file << "\"";
3307      }
3308    }
3309  }
3310}
3311
3312TEST_F(URLRequestTestHTTP, HTTPSToHTTPRedirectNoRefererTest) {
3313  ASSERT_TRUE(test_server_.Start());
3314
3315  SpawnedTestServer https_test_server(
3316      SpawnedTestServer::TYPE_HTTPS, SpawnedTestServer::kLocalhost,
3317      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3318  ASSERT_TRUE(https_test_server.Start());
3319
3320  // An https server is sent a request with an https referer,
3321  // and responds with a redirect to an http url. The http
3322  // server should not be sent the referer.
3323  GURL http_destination = test_server_.GetURL(std::string());
3324  TestDelegate d;
3325  URLRequest req(https_test_server.GetURL(
3326      "server-redirect?" + http_destination.spec()), &d, &default_context_);
3327  req.SetReferrer("https://www.referrer.com/");
3328  req.Start();
3329  MessageLoop::current()->Run();
3330
3331  EXPECT_EQ(1, d.response_started_count());
3332  EXPECT_EQ(1, d.received_redirect_count());
3333  EXPECT_EQ(http_destination, req.url());
3334  EXPECT_EQ(std::string(), req.referrer());
3335}
3336
3337TEST_F(URLRequestTestHTTP, RedirectLoadTiming) {
3338  ASSERT_TRUE(test_server_.Start());
3339
3340  GURL destination_url = test_server_.GetURL(std::string());
3341  GURL original_url =
3342      test_server_.GetURL("server-redirect?" + destination_url.spec());
3343  TestDelegate d;
3344  URLRequest req(original_url, &d, &default_context_);
3345  req.Start();
3346  MessageLoop::current()->Run();
3347
3348  EXPECT_EQ(1, d.response_started_count());
3349  EXPECT_EQ(1, d.received_redirect_count());
3350  EXPECT_EQ(destination_url, req.url());
3351  EXPECT_EQ(original_url, req.original_url());
3352  ASSERT_EQ(2U, req.url_chain().size());
3353  EXPECT_EQ(original_url, req.url_chain()[0]);
3354  EXPECT_EQ(destination_url, req.url_chain()[1]);
3355
3356  LoadTimingInfo load_timing_info_before_redirect;
3357  EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect(
3358      &load_timing_info_before_redirect));
3359  TestLoadTimingNotReused(load_timing_info_before_redirect,
3360                          CONNECT_TIMING_HAS_DNS_TIMES);
3361
3362  LoadTimingInfo load_timing_info;
3363  req.GetLoadTimingInfo(&load_timing_info);
3364  TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
3365
3366  // Check that a new socket was used on redirect, since the server does not
3367  // supposed keep-alive sockets, and that the times before the redirect are
3368  // before the ones recorded for the second request.
3369  EXPECT_NE(load_timing_info_before_redirect.socket_log_id,
3370            load_timing_info.socket_log_id);
3371  EXPECT_LE(load_timing_info_before_redirect.receive_headers_end,
3372            load_timing_info.connect_timing.connect_start);
3373}
3374
3375TEST_F(URLRequestTestHTTP, MultipleRedirectTest) {
3376  ASSERT_TRUE(test_server_.Start());
3377
3378  GURL destination_url = test_server_.GetURL(std::string());
3379  GURL middle_redirect_url =
3380      test_server_.GetURL("server-redirect?" + destination_url.spec());
3381  GURL original_url = test_server_.GetURL(
3382      "server-redirect?" + middle_redirect_url.spec());
3383  TestDelegate d;
3384  URLRequest req(original_url, &d, &default_context_);
3385  req.Start();
3386  MessageLoop::current()->Run();
3387
3388  EXPECT_EQ(1, d.response_started_count());
3389  EXPECT_EQ(2, d.received_redirect_count());
3390  EXPECT_EQ(destination_url, req.url());
3391  EXPECT_EQ(original_url, req.original_url());
3392  ASSERT_EQ(3U, req.url_chain().size());
3393  EXPECT_EQ(original_url, req.url_chain()[0]);
3394  EXPECT_EQ(middle_redirect_url, req.url_chain()[1]);
3395  EXPECT_EQ(destination_url, req.url_chain()[2]);
3396}
3397
3398namespace {
3399
3400const char kExtraHeader[] = "Allow-Snafu";
3401const char kExtraValue[] = "fubar";
3402
3403class RedirectWithAdditionalHeadersDelegate : public TestDelegate {
3404  virtual void OnReceivedRedirect(net::URLRequest* request,
3405                                  const GURL& new_url,
3406                                  bool* defer_redirect) OVERRIDE {
3407    TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect);
3408    request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false);
3409  }
3410};
3411
3412}  // namespace
3413
3414TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) {
3415  ASSERT_TRUE(test_server_.Start());
3416
3417  GURL destination_url = test_server_.GetURL(
3418      "echoheader?" + std::string(kExtraHeader));
3419  GURL original_url = test_server_.GetURL(
3420      "server-redirect?" + destination_url.spec());
3421  RedirectWithAdditionalHeadersDelegate d;
3422  URLRequest req(original_url, &d, &default_context_);
3423  req.Start();
3424  MessageLoop::current()->Run();
3425
3426  std::string value;
3427  const HttpRequestHeaders& headers = req.extra_request_headers();
3428  EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value));
3429  EXPECT_EQ(kExtraValue, value);
3430  EXPECT_FALSE(req.is_pending());
3431  EXPECT_FALSE(req.is_redirecting());
3432  EXPECT_EQ(kExtraValue, d.data_received());
3433}
3434
3435namespace {
3436
3437const char kExtraHeaderToRemove[] = "To-Be-Removed";
3438
3439class RedirectWithHeaderRemovalDelegate : public TestDelegate {
3440  virtual void OnReceivedRedirect(net::URLRequest* request,
3441                          const GURL& new_url,
3442                          bool* defer_redirect) OVERRIDE {
3443    TestDelegate::OnReceivedRedirect(request, new_url, defer_redirect);
3444    request->RemoveRequestHeaderByName(kExtraHeaderToRemove);
3445  }
3446};
3447
3448}  // namespace
3449
3450TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) {
3451  ASSERT_TRUE(test_server_.Start());
3452
3453  GURL destination_url = test_server_.GetURL(
3454      "echoheader?" + std::string(kExtraHeaderToRemove));
3455  GURL original_url = test_server_.GetURL(
3456      "server-redirect?" + destination_url.spec());
3457  RedirectWithHeaderRemovalDelegate d;
3458  URLRequest req(original_url, &d, &default_context_);
3459  req.SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false);
3460  req.Start();
3461  MessageLoop::current()->Run();
3462
3463  std::string value;
3464  const HttpRequestHeaders& headers = req.extra_request_headers();
3465  EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value));
3466  EXPECT_FALSE(req.is_pending());
3467  EXPECT_FALSE(req.is_redirecting());
3468  EXPECT_EQ("None", d.data_received());
3469}
3470
3471TEST_F(URLRequestTestHTTP, CancelTest) {
3472  TestDelegate d;
3473  {
3474    URLRequest r(GURL("http://www.google.com/"), &d, &default_context_);
3475
3476    r.Start();
3477    EXPECT_TRUE(r.is_pending());
3478
3479    r.Cancel();
3480
3481    MessageLoop::current()->Run();
3482
3483    // We expect to receive OnResponseStarted even though the request has been
3484    // cancelled.
3485    EXPECT_EQ(1, d.response_started_count());
3486    EXPECT_EQ(0, d.bytes_received());
3487    EXPECT_FALSE(d.received_data_before_response());
3488  }
3489}
3490
3491TEST_F(URLRequestTestHTTP, CancelTest2) {
3492  ASSERT_TRUE(test_server_.Start());
3493
3494  TestDelegate d;
3495  {
3496    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
3497
3498    d.set_cancel_in_response_started(true);
3499
3500    r.Start();
3501    EXPECT_TRUE(r.is_pending());
3502
3503    MessageLoop::current()->Run();
3504
3505    EXPECT_EQ(1, d.response_started_count());
3506    EXPECT_EQ(0, d.bytes_received());
3507    EXPECT_FALSE(d.received_data_before_response());
3508    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
3509  }
3510}
3511
3512TEST_F(URLRequestTestHTTP, CancelTest3) {
3513  ASSERT_TRUE(test_server_.Start());
3514
3515  TestDelegate d;
3516  {
3517    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
3518
3519    d.set_cancel_in_received_data(true);
3520
3521    r.Start();
3522    EXPECT_TRUE(r.is_pending());
3523
3524    MessageLoop::current()->Run();
3525
3526    EXPECT_EQ(1, d.response_started_count());
3527    // There is no guarantee about how much data was received
3528    // before the cancel was issued.  It could have been 0 bytes,
3529    // or it could have been all the bytes.
3530    // EXPECT_EQ(0, d.bytes_received());
3531    EXPECT_FALSE(d.received_data_before_response());
3532    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
3533  }
3534}
3535
3536TEST_F(URLRequestTestHTTP, CancelTest4) {
3537  ASSERT_TRUE(test_server_.Start());
3538
3539  TestDelegate d;
3540  {
3541    URLRequest r(test_server_.GetURL(std::string()), &d, &default_context_);
3542
3543    r.Start();
3544    EXPECT_TRUE(r.is_pending());
3545
3546    // The request will be implicitly canceled when it is destroyed. The
3547    // test delegate must not post a quit message when this happens because
3548    // this test doesn't actually have a message loop. The quit message would
3549    // get put on this thread's message queue and the next test would exit
3550    // early, causing problems.
3551    d.set_quit_on_complete(false);
3552  }
3553  // expect things to just cleanup properly.
3554
3555  // we won't actually get a received reponse here because we've never run the
3556  // message loop
3557  EXPECT_FALSE(d.received_data_before_response());
3558  EXPECT_EQ(0, d.bytes_received());
3559}
3560
3561TEST_F(URLRequestTestHTTP, CancelTest5) {
3562  ASSERT_TRUE(test_server_.Start());
3563
3564  // populate cache
3565  {
3566    TestDelegate d;
3567    URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_);
3568    r.Start();
3569    MessageLoop::current()->Run();
3570    EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
3571  }
3572
3573  // cancel read from cache (see bug 990242)
3574  {
3575    TestDelegate d;
3576    URLRequest r(test_server_.GetURL("cachetime"), &d, &default_context_);
3577    r.Start();
3578    r.Cancel();
3579    MessageLoop::current()->Run();
3580
3581    EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
3582    EXPECT_EQ(1, d.response_started_count());
3583    EXPECT_EQ(0, d.bytes_received());
3584    EXPECT_FALSE(d.received_data_before_response());
3585  }
3586}
3587
3588TEST_F(URLRequestTestHTTP, PostTest) {
3589  ASSERT_TRUE(test_server_.Start());
3590  HTTPUploadDataOperationTest("POST");
3591}
3592
3593TEST_F(URLRequestTestHTTP, PutTest) {
3594  ASSERT_TRUE(test_server_.Start());
3595  HTTPUploadDataOperationTest("PUT");
3596}
3597
3598TEST_F(URLRequestTestHTTP, PostEmptyTest) {
3599  ASSERT_TRUE(test_server_.Start());
3600
3601  TestDelegate d;
3602  {
3603    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
3604    r.set_method("POST");
3605
3606    r.Start();
3607    EXPECT_TRUE(r.is_pending());
3608
3609    MessageLoop::current()->Run();
3610
3611    ASSERT_EQ(1, d.response_started_count())
3612        << "request failed: " << r.status().status()
3613        << ", error: " << r.status().error();
3614
3615    EXPECT_FALSE(d.received_data_before_response());
3616    EXPECT_TRUE(d.data_received().empty());
3617  }
3618}
3619
3620TEST_F(URLRequestTestHTTP, PostFileTest) {
3621  ASSERT_TRUE(test_server_.Start());
3622
3623  TestDelegate d;
3624  {
3625    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
3626    r.set_method("POST");
3627
3628    base::FilePath dir;
3629    PathService::Get(base::DIR_EXE, &dir);
3630    file_util::SetCurrentDirectory(dir);
3631
3632    ScopedVector<UploadElementReader> element_readers;
3633
3634    base::FilePath path;
3635    PathService::Get(base::DIR_SOURCE_ROOT, &path);
3636    path = path.Append(FILE_PATH_LITERAL("net"));
3637    path = path.Append(FILE_PATH_LITERAL("data"));
3638    path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
3639    path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
3640    element_readers.push_back(new UploadFileElementReader(
3641        base::MessageLoopProxy::current(), path, 0, kuint64max, base::Time()));
3642
3643    // This file should just be ignored in the upload stream.
3644    element_readers.push_back(new UploadFileElementReader(
3645        base::MessageLoopProxy::current(),
3646        base::FilePath(FILE_PATH_LITERAL(
3647            "c:\\path\\to\\non\\existant\\file.randomness.12345")),
3648        0, kuint64max, base::Time()));
3649    r.set_upload(make_scoped_ptr(new UploadDataStream(&element_readers, 0)));
3650
3651    r.Start();
3652    EXPECT_TRUE(r.is_pending());
3653
3654    MessageLoop::current()->Run();
3655
3656    int64 size = 0;
3657    ASSERT_EQ(true, file_util::GetFileSize(path, &size));
3658    scoped_ptr<char[]> buf(new char[size]);
3659
3660    ASSERT_EQ(size, file_util::ReadFile(path, buf.get(), size));
3661
3662    ASSERT_EQ(1, d.response_started_count())
3663        << "request failed: " << r.status().status()
3664        << ", error: " << r.status().error();
3665
3666    EXPECT_FALSE(d.received_data_before_response());
3667
3668    EXPECT_EQ(size, d.bytes_received());
3669    EXPECT_EQ(std::string(&buf[0], size), d.data_received());
3670  }
3671}
3672
3673TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) {
3674  ASSERT_TRUE(test_server_.Start());
3675
3676  TestDelegate d;
3677  {
3678    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
3679    r.EnableChunkedUpload();
3680    r.set_method("POST");
3681    AddChunksToUpload(&r);
3682    r.Start();
3683    EXPECT_TRUE(r.is_pending());
3684
3685    MessageLoop::current()->Run();
3686
3687    VerifyReceivedDataMatchesChunks(&r, &d);
3688  }
3689}
3690
3691TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) {
3692  ASSERT_TRUE(test_server_.Start());
3693
3694  TestDelegate d;
3695  {
3696    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
3697    r.EnableChunkedUpload();
3698    r.set_method("POST");
3699    r.Start();
3700    EXPECT_TRUE(r.is_pending());
3701    AddChunksToUpload(&r);
3702    MessageLoop::current()->Run();
3703
3704    VerifyReceivedDataMatchesChunks(&r, &d);
3705  }
3706}
3707
3708TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) {
3709  ASSERT_TRUE(test_server_.Start());
3710
3711  TestDelegate d;
3712  {
3713    URLRequest r(test_server_.GetURL("echo"), &d, &default_context_);
3714    r.EnableChunkedUpload();
3715    r.set_method("POST");
3716    r.Start();
3717    EXPECT_TRUE(r.is_pending());
3718
3719    MessageLoop::current()->RunUntilIdle();
3720    AddChunksToUpload(&r);
3721    MessageLoop::current()->Run();
3722
3723    VerifyReceivedDataMatchesChunks(&r, &d);
3724  }
3725}
3726
3727TEST_F(URLRequestTestHTTP, ResponseHeadersTest) {
3728  ASSERT_TRUE(test_server_.Start());
3729
3730  TestDelegate d;
3731  URLRequest req(
3732      test_server_.GetURL("files/with-headers.html"), &d, &default_context_);
3733  req.Start();
3734  MessageLoop::current()->Run();
3735
3736  const HttpResponseHeaders* headers = req.response_headers();
3737
3738  // Simple sanity check that response_info() accesses the same data.
3739  EXPECT_EQ(headers, req.response_info().headers.get());
3740
3741  std::string header;
3742  EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header));
3743  EXPECT_EQ("private", header);
3744
3745  header.clear();
3746  EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header));
3747  EXPECT_EQ("text/html; charset=ISO-8859-1", header);
3748
3749  // The response has two "X-Multiple-Entries" headers.
3750  // This verfies our output has them concatenated together.
3751  header.clear();
3752  EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header));
3753  EXPECT_EQ("a, b", header);
3754}
3755
3756TEST_F(URLRequestTestHTTP, ProcessSTS) {
3757  SpawnedTestServer::SSLOptions ssl_options;
3758  SpawnedTestServer https_test_server(
3759      SpawnedTestServer::TYPE_HTTPS,
3760      ssl_options,
3761      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
3762  ASSERT_TRUE(https_test_server.Start());
3763
3764  TestDelegate d;
3765  URLRequest request(
3766      https_test_server.GetURL("files/hsts-headers.html"),
3767      &d,
3768      &default_context_);
3769  request.Start();
3770  MessageLoop::current()->Run();
3771
3772  TransportSecurityState* security_state =
3773      default_context_.transport_security_state();
3774  bool sni_available = true;
3775  TransportSecurityState::DomainState domain_state;
3776  EXPECT_TRUE(security_state->GetDomainState(
3777      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
3778  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
3779            domain_state.upgrade_mode);
3780  EXPECT_TRUE(domain_state.include_subdomains);
3781}
3782
3783TEST_F(URLRequestTestHTTP, ProcessSTSOnce) {
3784  SpawnedTestServer::SSLOptions ssl_options;
3785  SpawnedTestServer https_test_server(
3786      SpawnedTestServer::TYPE_HTTPS,
3787      ssl_options,
3788      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
3789  ASSERT_TRUE(https_test_server.Start());
3790
3791  TestDelegate d;
3792  URLRequest request(
3793      https_test_server.GetURL("files/hsts-multiple-headers.html"),
3794      &d,
3795      &default_context_);
3796  request.Start();
3797  MessageLoop::current()->Run();
3798
3799  // We should have set parameters from the first header, not the second.
3800  TransportSecurityState* security_state =
3801      default_context_.transport_security_state();
3802  bool sni_available = true;
3803  TransportSecurityState::DomainState domain_state;
3804  EXPECT_TRUE(security_state->GetDomainState(
3805      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
3806  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
3807            domain_state.upgrade_mode);
3808  EXPECT_FALSE(domain_state.include_subdomains);
3809}
3810
3811TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) {
3812  SpawnedTestServer::SSLOptions ssl_options;
3813  SpawnedTestServer https_test_server(
3814      SpawnedTestServer::TYPE_HTTPS,
3815      ssl_options,
3816      base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
3817  ASSERT_TRUE(https_test_server.Start());
3818
3819  TestDelegate d;
3820  URLRequest request(
3821      https_test_server.GetURL("files/hsts-and-hpkp-headers.html"),
3822      &d,
3823      &default_context_);
3824  request.Start();
3825  MessageLoop::current()->Run();
3826
3827  // We should have set parameters from the first header, not the second.
3828  TransportSecurityState* security_state =
3829      default_context_.transport_security_state();
3830  bool sni_available = true;
3831  TransportSecurityState::DomainState domain_state;
3832  EXPECT_TRUE(security_state->GetDomainState(
3833      SpawnedTestServer::kLocalhost, sni_available, &domain_state));
3834  EXPECT_EQ(TransportSecurityState::DomainState::MODE_FORCE_HTTPS,
3835            domain_state.upgrade_mode);
3836#if defined(OS_ANDROID)
3837  // Android's CertVerifyProc does not (yet) handle pins.
3838#else
3839  EXPECT_TRUE(domain_state.HasPublicKeyPins());
3840#endif
3841  EXPECT_NE(domain_state.upgrade_expiry,
3842            domain_state.dynamic_spki_hashes_expiry);
3843
3844  // TODO(palmer): In the (near) future, TransportSecurityState will have a
3845  // storage model allowing us to have independent values for
3846  // include_subdomains. At that time, extend this test.
3847  //EXPECT_FALSE(domain_state.include_subdomains);
3848}
3849
3850TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) {
3851  ASSERT_TRUE(test_server_.Start());
3852
3853  TestDelegate d;
3854  URLRequest req(test_server_.GetURL(
3855      "files/content-type-normalization.html"), &d, &default_context_);
3856  req.Start();
3857  MessageLoop::current()->Run();
3858
3859  std::string mime_type;
3860  req.GetMimeType(&mime_type);
3861  EXPECT_EQ("text/html", mime_type);
3862
3863  std::string charset;
3864  req.GetCharset(&charset);
3865  EXPECT_EQ("utf-8", charset);
3866  req.Cancel();
3867}
3868
3869TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictRedirects) {
3870  // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
3871  GURL file_url("file:///foo.txt");
3872  GURL data_url("data:,foo");
3873  FileProtocolHandler file_protocol_handler;
3874  EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url));
3875  DataProtocolHandler data_protocol_handler;
3876  EXPECT_TRUE(data_protocol_handler.IsSafeRedirectTarget(data_url));
3877
3878  // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
3879  EXPECT_FALSE(job_factory_.IsSafeRedirectTarget(file_url));
3880  EXPECT_TRUE(job_factory_.IsSafeRedirectTarget(data_url));
3881}
3882
3883TEST_F(URLRequestTestHTTP, RestrictRedirects) {
3884  ASSERT_TRUE(test_server_.Start());
3885
3886  TestDelegate d;
3887  URLRequest req(test_server_.GetURL(
3888      "files/redirect-to-file.html"), &d, &default_context_);
3889  req.Start();
3890  MessageLoop::current()->Run();
3891
3892  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
3893  EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().error());
3894}
3895
3896TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) {
3897  ASSERT_TRUE(test_server_.Start());
3898
3899  TestDelegate d;
3900  URLRequest req(test_server_.GetURL(
3901      "files/redirect-to-invalid-url.html"), &d, &default_context_);
3902  req.Start();
3903  MessageLoop::current()->Run();
3904
3905  EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
3906  EXPECT_EQ(ERR_INVALID_URL, req.status().error());
3907}
3908
3909TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) {
3910  ASSERT_TRUE(test_server_.Start());
3911
3912  TestDelegate d;
3913  URLRequest req(
3914      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
3915  req.SetReferrer("http://user:pass@foo.com/");
3916  req.Start();
3917  MessageLoop::current()->Run();
3918
3919  EXPECT_EQ(std::string("http://foo.com/"), d.data_received());
3920}
3921
3922TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) {
3923  ASSERT_TRUE(test_server_.Start());
3924
3925  TestDelegate d;
3926  URLRequest req(
3927      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
3928  req.SetReferrer("http://foo.com/test#fragment");
3929  req.Start();
3930  MessageLoop::current()->Run();
3931
3932  EXPECT_EQ(std::string("http://foo.com/test"), d.data_received());
3933}
3934
3935TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) {
3936  ASSERT_TRUE(test_server_.Start());
3937
3938  TestDelegate d;
3939  URLRequest req(
3940      test_server_.GetURL("echoheader?Referer"), &d, &default_context_);
3941  req.SetReferrer("http://foo.com/test#fragment");
3942  req.SetReferrer("");
3943  req.Start();
3944  MessageLoop::current()->Run();
3945
3946  EXPECT_EQ(std::string("None"), d.data_received());
3947}
3948
3949TEST_F(URLRequestTestHTTP, CancelRedirect) {
3950  ASSERT_TRUE(test_server_.Start());
3951
3952  TestDelegate d;
3953  {
3954    d.set_cancel_in_received_redirect(true);
3955    URLRequest req(
3956        test_server_.GetURL("files/redirect-test.html"), &d, &default_context_);
3957    req.Start();
3958    MessageLoop::current()->Run();
3959
3960    EXPECT_EQ(1, d.response_started_count());
3961    EXPECT_EQ(0, d.bytes_received());
3962    EXPECT_FALSE(d.received_data_before_response());
3963    EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
3964  }
3965}
3966
3967TEST_F(URLRequestTestHTTP, DeferredRedirect) {
3968  ASSERT_TRUE(test_server_.Start());
3969
3970  TestDelegate d;
3971  {
3972    d.set_quit_on_redirect(true);
3973    URLRequest req(
3974        test_server_.GetURL("files/redirect-test.html"), &d, &default_context_);
3975    req.Start();
3976    MessageLoop::current()->Run();
3977
3978    EXPECT_EQ(1, d.received_redirect_count());
3979
3980    req.FollowDeferredRedirect();
3981    MessageLoop::current()->Run();
3982
3983    EXPECT_EQ(1, d.response_started_count());
3984    EXPECT_FALSE(d.received_data_before_response());
3985    EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
3986
3987    base::FilePath path;
3988    PathService::Get(base::DIR_SOURCE_ROOT, &path);
3989    path = path.Append(FILE_PATH_LITERAL("net"));
3990    path = path.Append(FILE_PATH_LITERAL("data"));
3991    path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
3992    path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
3993
3994    std::string contents;
3995    EXPECT_TRUE(file_util::ReadFileToString(path, &contents));
3996    EXPECT_EQ(contents, d.data_received());
3997  }
3998}
3999
4000TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) {
4001  ASSERT_TRUE(test_server_.Start());
4002
4003  TestDelegate d;
4004  {
4005    d.set_quit_on_redirect(true);
4006    URLRequest req(
4007        test_server_.GetURL("files/redirect-test.html"), &d, &default_context_);
4008    req.Start();
4009    MessageLoop::current()->Run();
4010
4011    EXPECT_EQ(1, d.received_redirect_count());
4012
4013    req.Cancel();
4014    MessageLoop::current()->Run();
4015
4016    EXPECT_EQ(1, d.response_started_count());
4017    EXPECT_EQ(0, d.bytes_received());
4018    EXPECT_FALSE(d.received_data_before_response());
4019    EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
4020  }
4021}
4022
4023TEST_F(URLRequestTestHTTP, VaryHeader) {
4024  ASSERT_TRUE(test_server_.Start());
4025
4026  // populate the cache
4027  {
4028    TestDelegate d;
4029    URLRequest req(
4030        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
4031    HttpRequestHeaders headers;
4032    headers.SetHeader("foo", "1");
4033    req.SetExtraRequestHeaders(headers);
4034    req.Start();
4035    MessageLoop::current()->Run();
4036  }
4037
4038  // expect a cache hit
4039  {
4040    TestDelegate d;
4041    URLRequest req(
4042        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
4043    HttpRequestHeaders headers;
4044    headers.SetHeader("foo", "1");
4045    req.SetExtraRequestHeaders(headers);
4046    req.Start();
4047    MessageLoop::current()->Run();
4048
4049    EXPECT_TRUE(req.was_cached());
4050  }
4051
4052  // expect a cache miss
4053  {
4054    TestDelegate d;
4055    URLRequest req(
4056        test_server_.GetURL("echoheadercache?foo"), &d, &default_context_);
4057    HttpRequestHeaders headers;
4058    headers.SetHeader("foo", "2");
4059    req.SetExtraRequestHeaders(headers);
4060    req.Start();
4061    MessageLoop::current()->Run();
4062
4063    EXPECT_FALSE(req.was_cached());
4064  }
4065}
4066
4067TEST_F(URLRequestTestHTTP, BasicAuth) {
4068  ASSERT_TRUE(test_server_.Start());
4069
4070  // populate the cache
4071  {
4072    TestDelegate d;
4073    d.set_credentials(AuthCredentials(kUser, kSecret));
4074
4075    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
4076    r.Start();
4077
4078    MessageLoop::current()->Run();
4079
4080    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
4081  }
4082
4083  // repeat request with end-to-end validation.  since auth-basic results in a
4084  // cachable page, we expect this test to result in a 304.  in which case, the
4085  // response should be fetched from the cache.
4086  {
4087    TestDelegate d;
4088    d.set_credentials(AuthCredentials(kUser, kSecret));
4089
4090    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
4091    r.set_load_flags(LOAD_VALIDATE_CACHE);
4092    r.Start();
4093
4094    MessageLoop::current()->Run();
4095
4096    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
4097
4098    // Should be the same cached document.
4099    EXPECT_TRUE(r.was_cached());
4100  }
4101}
4102
4103// Check that Set-Cookie headers in 401 responses are respected.
4104// http://crbug.com/6450
4105TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) {
4106  ASSERT_TRUE(test_server_.Start());
4107
4108  GURL url_requiring_auth =
4109      test_server_.GetURL("auth-basic?set-cookie-if-challenged");
4110
4111  // Request a page that will give a 401 containing a Set-Cookie header.
4112  // Verify that when the transaction is restarted, it includes the new cookie.
4113  {
4114    TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
4115    TestURLRequestContext context(true);
4116    context.set_network_delegate(&network_delegate);
4117    context.Init();
4118
4119    TestDelegate d;
4120    d.set_credentials(AuthCredentials(kUser, kSecret));
4121
4122    URLRequest r(url_requiring_auth, &d, &context);
4123    r.Start();
4124
4125    MessageLoop::current()->Run();
4126
4127    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
4128
4129    // Make sure we sent the cookie in the restarted transaction.
4130    EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
4131        != std::string::npos);
4132  }
4133
4134  // Same test as above, except this time the restart is initiated earlier
4135  // (without user intervention since identity is embedded in the URL).
4136  {
4137    TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
4138    TestURLRequestContext context(true);
4139    context.set_network_delegate(&network_delegate);
4140    context.Init();
4141
4142    TestDelegate d;
4143
4144    GURL::Replacements replacements;
4145    std::string username("user2");
4146    std::string password("secret");
4147    replacements.SetUsernameStr(username);
4148    replacements.SetPasswordStr(password);
4149    GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements);
4150
4151    URLRequest r(url_with_identity, &d, &context);
4152    r.Start();
4153
4154    MessageLoop::current()->Run();
4155
4156    EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos);
4157
4158    // Make sure we sent the cookie in the restarted transaction.
4159    EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
4160        != std::string::npos);
4161  }
4162}
4163
4164// Tests that load timing works as expected with auth and the cache.
4165TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) {
4166  ASSERT_TRUE(test_server_.Start());
4167
4168  // populate the cache
4169  {
4170    TestDelegate d;
4171    d.set_credentials(AuthCredentials(kUser, kSecret));
4172
4173    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
4174    r.Start();
4175
4176    MessageLoop::current()->Run();
4177
4178    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
4179
4180    LoadTimingInfo load_timing_info_before_auth;
4181    EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth(
4182        &load_timing_info_before_auth));
4183    TestLoadTimingNotReused(load_timing_info_before_auth,
4184                            CONNECT_TIMING_HAS_DNS_TIMES);
4185
4186    LoadTimingInfo load_timing_info;
4187    r.GetLoadTimingInfo(&load_timing_info);
4188    // The test server does not support keep alive sockets, so the second
4189    // request with auth should use a new socket.
4190    TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
4191    EXPECT_NE(load_timing_info_before_auth.socket_log_id,
4192              load_timing_info.socket_log_id);
4193    EXPECT_LE(load_timing_info_before_auth.receive_headers_end,
4194              load_timing_info.connect_timing.connect_start);
4195  }
4196
4197  // repeat request with end-to-end validation.  since auth-basic results in a
4198  // cachable page, we expect this test to result in a 304.  in which case, the
4199  // response should be fetched from the cache.
4200  {
4201    TestDelegate d;
4202    d.set_credentials(AuthCredentials(kUser, kSecret));
4203
4204    URLRequest r(test_server_.GetURL("auth-basic"), &d, &default_context_);
4205    r.set_load_flags(LOAD_VALIDATE_CACHE);
4206    r.Start();
4207
4208    MessageLoop::current()->Run();
4209
4210    EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
4211
4212    // Should be the same cached document.
4213    EXPECT_TRUE(r.was_cached());
4214
4215    LoadTimingInfo load_timing_info;
4216    r.GetLoadTimingInfo(&load_timing_info);
4217    TestLoadTimingNoHttpConnection(load_timing_info);
4218  }
4219}
4220
4221// In this test, we do a POST which the server will 302 redirect.
4222// The subsequent transaction should use GET, and should not send the
4223// Content-Type header.
4224// http://code.google.com/p/chromium/issues/detail?id=843
4225TEST_F(URLRequestTestHTTP, Post302RedirectGet) {
4226  ASSERT_TRUE(test_server_.Start());
4227
4228  const char kData[] = "hello world";
4229
4230  TestDelegate d;
4231  URLRequest req(
4232      test_server_.GetURL("files/redirect-to-echoall"), &d, &default_context_);
4233  req.set_method("POST");
4234  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
4235
4236  // Set headers (some of which are specific to the POST).
4237  HttpRequestHeaders headers;
4238  headers.AddHeadersFromString(
4239    "Content-Type: multipart/form-data; "
4240    "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n"
4241    "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,"
4242    "text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
4243    "Accept-Language: en-US,en\r\n"
4244    "Accept-Charset: ISO-8859-1,*,utf-8\r\n"
4245    "Content-Length: 11\r\n"
4246    "Origin: http://localhost:1337/");
4247  req.SetExtraRequestHeaders(headers);
4248  req.Start();
4249  MessageLoop::current()->Run();
4250
4251  std::string mime_type;
4252  req.GetMimeType(&mime_type);
4253  EXPECT_EQ("text/html", mime_type);
4254
4255  const std::string& data = d.data_received();
4256
4257  // Check that the post-specific headers were stripped:
4258  EXPECT_FALSE(ContainsString(data, "Content-Length:"));
4259  EXPECT_FALSE(ContainsString(data, "Content-Type:"));
4260  EXPECT_FALSE(ContainsString(data, "Origin:"));
4261
4262  // These extra request headers should not have been stripped.
4263  EXPECT_TRUE(ContainsString(data, "Accept:"));
4264  EXPECT_TRUE(ContainsString(data, "Accept-Language:"));
4265  EXPECT_TRUE(ContainsString(data, "Accept-Charset:"));
4266}
4267
4268// The following tests check that we handle mutating the request method for
4269// HTTP redirects as expected.
4270// See http://crbug.com/56373 and http://crbug.com/102130.
4271
4272TEST_F(URLRequestTestHTTP, Redirect301Tests) {
4273  ASSERT_TRUE(test_server_.Start());
4274
4275  const GURL url = test_server_.GetURL("files/redirect301-to-echo");
4276
4277  HTTPRedirectMethodTest(url, "POST", "GET", true);
4278  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
4279  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
4280}
4281
4282TEST_F(URLRequestTestHTTP, Redirect302Tests) {
4283  ASSERT_TRUE(test_server_.Start());
4284
4285  const GURL url = test_server_.GetURL("files/redirect302-to-echo");
4286
4287  HTTPRedirectMethodTest(url, "POST", "GET", true);
4288  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
4289  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
4290}
4291
4292TEST_F(URLRequestTestHTTP, Redirect303Tests) {
4293  ASSERT_TRUE(test_server_.Start());
4294
4295  const GURL url = test_server_.GetURL("files/redirect303-to-echo");
4296
4297  HTTPRedirectMethodTest(url, "POST", "GET", true);
4298  HTTPRedirectMethodTest(url, "PUT", "GET", true);
4299  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
4300}
4301
4302TEST_F(URLRequestTestHTTP, Redirect307Tests) {
4303  ASSERT_TRUE(test_server_.Start());
4304
4305  const GURL url = test_server_.GetURL("files/redirect307-to-echo");
4306
4307  HTTPRedirectMethodTest(url, "POST", "POST", true);
4308  HTTPRedirectMethodTest(url, "PUT", "PUT", true);
4309  HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
4310}
4311
4312TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) {
4313  ASSERT_TRUE(test_server_.Start());
4314
4315  const char kData[] = "hello world";
4316
4317  TestDelegate d;
4318  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
4319  req.set_method("POST");
4320  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
4321  HttpRequestHeaders headers;
4322  headers.SetHeader(HttpRequestHeaders::kContentLength,
4323                    base::UintToString(arraysize(kData) - 1));
4324  req.SetExtraRequestHeaders(headers);
4325
4326  URLRequestRedirectJob* job = new URLRequestRedirectJob(
4327      &req, &default_network_delegate_, test_server_.GetURL("echo"),
4328      URLRequestRedirectJob::REDIRECT_302_FOUND);
4329  AddTestInterceptor()->set_main_intercept_job(job);
4330
4331  req.Start();
4332  MessageLoop::current()->Run();
4333  EXPECT_EQ("GET", req.method());
4334}
4335
4336TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) {
4337  ASSERT_TRUE(test_server_.Start());
4338
4339  const char kData[] = "hello world";
4340
4341  TestDelegate d;
4342  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
4343  req.set_method("POST");
4344  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
4345  HttpRequestHeaders headers;
4346  headers.SetHeader(HttpRequestHeaders::kContentLength,
4347                    base::UintToString(arraysize(kData) - 1));
4348  req.SetExtraRequestHeaders(headers);
4349
4350  URLRequestRedirectJob* job = new URLRequestRedirectJob(
4351      &req, &default_network_delegate_, test_server_.GetURL("echo"),
4352      URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT);
4353  AddTestInterceptor()->set_main_intercept_job(job);
4354
4355  req.Start();
4356  MessageLoop::current()->Run();
4357  EXPECT_EQ("POST", req.method());
4358  EXPECT_EQ(kData, d.data_received());
4359}
4360
4361// Check that default A-L header is sent.
4362TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) {
4363  ASSERT_TRUE(test_server_.Start());
4364
4365  StaticHttpUserAgentSettings settings("en", EmptyString());
4366  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
4367  TestURLRequestContext context(true);
4368  context.set_network_delegate(&network_delegate);
4369  context.set_http_user_agent_settings(&settings);
4370  context.Init();
4371
4372  TestDelegate d;
4373  URLRequest req(
4374      test_server_.GetURL("echoheader?Accept-Language"), &d, &context);
4375  req.Start();
4376  MessageLoop::current()->Run();
4377  EXPECT_EQ("en", d.data_received());
4378}
4379
4380// Check that an empty A-L header is not sent. http://crbug.com/77365.
4381TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) {
4382  ASSERT_TRUE(test_server_.Start());
4383
4384  StaticHttpUserAgentSettings settings(EmptyString(), EmptyString());
4385  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
4386  TestURLRequestContext context(true);
4387  context.set_network_delegate(&network_delegate);
4388  context.Init();
4389  // We override the language after initialization because empty entries
4390  // get overridden by Init().
4391  context.set_http_user_agent_settings(&settings);
4392
4393  TestDelegate d;
4394  URLRequest req(
4395      test_server_.GetURL("echoheader?Accept-Language"), &d, &context);
4396  req.Start();
4397  MessageLoop::current()->Run();
4398  EXPECT_EQ("None", d.data_received());
4399}
4400
4401// Check that if request overrides the A-L header, the default is not appended.
4402// See http://crbug.com/20894
4403TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) {
4404  ASSERT_TRUE(test_server_.Start());
4405
4406  TestDelegate d;
4407  URLRequest req(test_server_.GetURL("echoheader?Accept-Language"),
4408                 &d,
4409                 &default_context_);
4410  HttpRequestHeaders headers;
4411  headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru");
4412  req.SetExtraRequestHeaders(headers);
4413  req.Start();
4414  MessageLoop::current()->Run();
4415  EXPECT_EQ(std::string("ru"), d.data_received());
4416}
4417
4418// Check that default A-E header is sent.
4419TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) {
4420  ASSERT_TRUE(test_server_.Start());
4421
4422  TestDelegate d;
4423  URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"),
4424                 &d,
4425                 &default_context_);
4426  HttpRequestHeaders headers;
4427  req.SetExtraRequestHeaders(headers);
4428  req.Start();
4429  MessageLoop::current()->Run();
4430  EXPECT_TRUE(ContainsString(d.data_received(), "gzip"));
4431}
4432
4433// Check that if request overrides the A-E header, the default is not appended.
4434// See http://crbug.com/47381
4435TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) {
4436  ASSERT_TRUE(test_server_.Start());
4437
4438  TestDelegate d;
4439  URLRequest req(test_server_.GetURL("echoheader?Accept-Encoding"),
4440                 &d,
4441                 &default_context_);
4442  HttpRequestHeaders headers;
4443  headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity");
4444  req.SetExtraRequestHeaders(headers);
4445  req.Start();
4446  MessageLoop::current()->Run();
4447  EXPECT_FALSE(ContainsString(d.data_received(), "gzip"));
4448  EXPECT_TRUE(ContainsString(d.data_received(), "identity"));
4449}
4450
4451// Check that setting the A-C header sends the proper header.
4452TEST_F(URLRequestTestHTTP, SetAcceptCharset) {
4453  ASSERT_TRUE(test_server_.Start());
4454
4455  TestDelegate d;
4456  URLRequest req(test_server_.GetURL("echoheader?Accept-Charset"),
4457                 &d,
4458                 &default_context_);
4459  HttpRequestHeaders headers;
4460  headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r");
4461  req.SetExtraRequestHeaders(headers);
4462  req.Start();
4463  MessageLoop::current()->Run();
4464  EXPECT_EQ(std::string("koi-8r"), d.data_received());
4465}
4466
4467// Check that default User-Agent header is sent.
4468TEST_F(URLRequestTestHTTP, DefaultUserAgent) {
4469  ASSERT_TRUE(test_server_.Start());
4470
4471  TestDelegate d;
4472  URLRequest req(test_server_.GetURL("echoheader?User-Agent"),
4473                 &d,
4474                 &default_context_);
4475  req.Start();
4476  MessageLoop::current()->Run();
4477  EXPECT_EQ(req.context()->GetUserAgent(req.url()), d.data_received());
4478}
4479
4480// Check that if request overrides the User-Agent header,
4481// the default is not appended.
4482TEST_F(URLRequestTestHTTP, OverrideUserAgent) {
4483  ASSERT_TRUE(test_server_.Start());
4484
4485  TestDelegate d;
4486  URLRequest req(test_server_.GetURL("echoheader?User-Agent"),
4487                 &d,
4488                 &default_context_);
4489  HttpRequestHeaders headers;
4490  headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)");
4491  req.SetExtraRequestHeaders(headers);
4492  req.Start();
4493  MessageLoop::current()->Run();
4494  // If the net tests are being run with ChromeFrame then we need to allow for
4495  // the 'chromeframe' suffix which is added to the user agent before the
4496  // closing parentheses.
4497  EXPECT_TRUE(StartsWithASCII(d.data_received(), "Lynx (textmode", true));
4498}
4499
4500// Check that a NULL HttpUserAgentSettings causes the corresponding empty
4501// User-Agent header to be sent but does not send the Accept-Language and
4502// Accept-Charset headers.
4503TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) {
4504  ASSERT_TRUE(test_server_.Start());
4505
4506  TestNetworkDelegate network_delegate;  // Must outlive URLRequests.
4507  TestURLRequestContext context(true);
4508  context.set_network_delegate(&network_delegate);
4509  context.Init();
4510  // We override the HttpUserAgentSettings after initialization because empty
4511  // entries get overridden by Init().
4512  context.set_http_user_agent_settings(NULL);
4513
4514  struct {
4515    const char* request;
4516    const char* expected_response;
4517  } tests[] = { { "echoheader?Accept-Language", "None" },
4518                { "echoheader?Accept-Charset", "None" },
4519                { "echoheader?User-Agent", "" } };
4520
4521  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); i++) {
4522    TestDelegate d;
4523    URLRequest req(test_server_.GetURL(tests[i].request), &d, &context);
4524    req.Start();
4525    MessageLoop::current()->Run();
4526    EXPECT_EQ(tests[i].expected_response, d.data_received())
4527        << " Request = \"" << tests[i].request << "\"";
4528  }
4529}
4530
4531// Make sure that URLRequest passes on its priority updates to
4532// newly-created jobs after the first one.
4533TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) {
4534  ASSERT_TRUE(test_server_.Start());
4535
4536  TestDelegate d;
4537  URLRequest req(test_server_.GetURL("empty.html"), &d, &default_context_);
4538  EXPECT_EQ(DEFAULT_PRIORITY, req.priority());
4539
4540  scoped_refptr<URLRequestRedirectJob> redirect_job =
4541      new URLRequestRedirectJob(
4542          &req, &default_network_delegate_, test_server_.GetURL("echo"),
4543          URLRequestRedirectJob::REDIRECT_302_FOUND);
4544  AddTestInterceptor()->set_main_intercept_job(redirect_job);
4545
4546  req.SetPriority(LOW);
4547  req.Start();
4548  EXPECT_TRUE(req.is_pending());
4549
4550  scoped_refptr<URLRequestTestJob> job =
4551      new URLRequestTestJob(&req, &default_network_delegate_);
4552  AddTestInterceptor()->set_main_intercept_job(job);
4553
4554  // Should trigger |job| to be started.
4555  MessageLoop::current()->Run();
4556  EXPECT_EQ(LOW, job->priority());
4557}
4558
4559class HTTPSRequestTest : public testing::Test {
4560 public:
4561  HTTPSRequestTest() : default_context_(true) {
4562    default_context_.set_network_delegate(&default_network_delegate_);
4563    default_context_.Init();
4564  }
4565  virtual ~HTTPSRequestTest() {}
4566
4567 protected:
4568  TestNetworkDelegate default_network_delegate_;  // Must outlive URLRequest.
4569  TestURLRequestContext default_context_;
4570};
4571
4572TEST_F(HTTPSRequestTest, HTTPSGetTest) {
4573  SpawnedTestServer test_server(
4574      SpawnedTestServer::TYPE_HTTPS,
4575      SpawnedTestServer::kLocalhost,
4576      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4577  ASSERT_TRUE(test_server.Start());
4578
4579  TestDelegate d;
4580  {
4581    URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
4582    r.Start();
4583    EXPECT_TRUE(r.is_pending());
4584
4585    MessageLoop::current()->Run();
4586
4587    EXPECT_EQ(1, d.response_started_count());
4588    EXPECT_FALSE(d.received_data_before_response());
4589    EXPECT_NE(0, d.bytes_received());
4590    CheckSSLInfo(r.ssl_info());
4591    EXPECT_EQ(test_server.host_port_pair().host(),
4592              r.GetSocketAddress().host());
4593    EXPECT_EQ(test_server.host_port_pair().port(),
4594              r.GetSocketAddress().port());
4595  }
4596}
4597
4598TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) {
4599  SpawnedTestServer::SSLOptions ssl_options(
4600      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
4601  SpawnedTestServer test_server(
4602      SpawnedTestServer::TYPE_HTTPS,
4603      ssl_options,
4604      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4605  ASSERT_TRUE(test_server.Start());
4606
4607  bool err_allowed = true;
4608  for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
4609    TestDelegate d;
4610    {
4611      d.set_allow_certificate_errors(err_allowed);
4612      URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
4613
4614      r.Start();
4615      EXPECT_TRUE(r.is_pending());
4616
4617      MessageLoop::current()->Run();
4618
4619      EXPECT_EQ(1, d.response_started_count());
4620      EXPECT_FALSE(d.received_data_before_response());
4621      EXPECT_TRUE(d.have_certificate_errors());
4622      if (err_allowed) {
4623        EXPECT_NE(0, d.bytes_received());
4624        CheckSSLInfo(r.ssl_info());
4625      } else {
4626        EXPECT_EQ(0, d.bytes_received());
4627      }
4628    }
4629  }
4630}
4631
4632TEST_F(HTTPSRequestTest, HTTPSExpiredTest) {
4633  SpawnedTestServer::SSLOptions ssl_options(
4634      SpawnedTestServer::SSLOptions::CERT_EXPIRED);
4635  SpawnedTestServer test_server(
4636      SpawnedTestServer::TYPE_HTTPS,
4637      ssl_options,
4638      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4639  ASSERT_TRUE(test_server.Start());
4640
4641  // Iterate from false to true, just so that we do the opposite of the
4642  // previous test in order to increase test coverage.
4643  bool err_allowed = false;
4644  for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
4645    TestDelegate d;
4646    {
4647      d.set_allow_certificate_errors(err_allowed);
4648      URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
4649
4650      r.Start();
4651      EXPECT_TRUE(r.is_pending());
4652
4653      MessageLoop::current()->Run();
4654
4655      EXPECT_EQ(1, d.response_started_count());
4656      EXPECT_FALSE(d.received_data_before_response());
4657      EXPECT_TRUE(d.have_certificate_errors());
4658      if (err_allowed) {
4659        EXPECT_NE(0, d.bytes_received());
4660        CheckSSLInfo(r.ssl_info());
4661      } else {
4662        EXPECT_EQ(0, d.bytes_received());
4663      }
4664    }
4665  }
4666}
4667
4668// Tests TLSv1.1 -> TLSv1 fallback. Verifies that we don't fall back more
4669// than necessary.
4670TEST_F(HTTPSRequestTest, TLSv1Fallback) {
4671  uint16 default_version_max = SSLConfigService::default_version_max();
4672  // The OpenSSL library in use may not support TLS 1.1.
4673#if !defined(USE_OPENSSL)
4674  EXPECT_GT(default_version_max, SSL_PROTOCOL_VERSION_TLS1);
4675#endif
4676  if (default_version_max <= SSL_PROTOCOL_VERSION_TLS1)
4677    return;
4678
4679  SpawnedTestServer::SSLOptions ssl_options(
4680      SpawnedTestServer::SSLOptions::CERT_OK);
4681  ssl_options.tls_intolerant =
4682      SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
4683  SpawnedTestServer test_server(
4684      SpawnedTestServer::TYPE_HTTPS,
4685      ssl_options,
4686      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4687  ASSERT_TRUE(test_server.Start());
4688
4689  TestDelegate d;
4690  TestURLRequestContext context(true);
4691  context.Init();
4692  d.set_allow_certificate_errors(true);
4693  URLRequest r(test_server.GetURL(std::string()), &d, &context);
4694  r.Start();
4695
4696  MessageLoop::current()->Run();
4697
4698  EXPECT_EQ(1, d.response_started_count());
4699  EXPECT_NE(0, d.bytes_received());
4700  EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_TLS1),
4701            SSLConnectionStatusToVersion(r.ssl_info().connection_status));
4702  EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK);
4703}
4704
4705// This tests that a load of www.google.com with a certificate error sets
4706// the |certificate_errors_are_fatal| flag correctly. This flag will cause
4707// the interstitial to be fatal.
4708TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) {
4709  SpawnedTestServer::SSLOptions ssl_options(
4710      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
4711  SpawnedTestServer test_server(
4712      SpawnedTestServer::TYPE_HTTPS,
4713      ssl_options,
4714      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4715  ASSERT_TRUE(test_server.Start());
4716
4717  // We require that the URL be www.google.com in order to pick up the
4718  // preloaded HSTS entries in the TransportSecurityState. This means that we
4719  // have to use a MockHostResolver in order to direct www.google.com to the
4720  // testserver. By default, MockHostResolver maps all hosts to 127.0.0.1.
4721
4722  MockHostResolver host_resolver;
4723  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
4724  TestURLRequestContext context(true);
4725  context.set_network_delegate(&network_delegate);
4726  context.set_host_resolver(&host_resolver);
4727  TransportSecurityState transport_security_state;
4728  context.set_transport_security_state(&transport_security_state);
4729  context.Init();
4730
4731  TestDelegate d;
4732  URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d",
4733                                       test_server.host_port_pair().port())),
4734               &d,
4735               &context);
4736
4737  r.Start();
4738  EXPECT_TRUE(r.is_pending());
4739
4740  MessageLoop::current()->Run();
4741
4742  EXPECT_EQ(1, d.response_started_count());
4743  EXPECT_FALSE(d.received_data_before_response());
4744  EXPECT_TRUE(d.have_certificate_errors());
4745  EXPECT_TRUE(d.certificate_errors_are_fatal());
4746}
4747
4748// This tests that cached HTTPS page loads do not cause any updates to the
4749// TransportSecurityState.
4750TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) {
4751  // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't
4752  // matter. It just has to be any error.
4753  SpawnedTestServer::SSLOptions ssl_options(
4754      SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
4755  SpawnedTestServer test_server(
4756      SpawnedTestServer::TYPE_HTTPS,
4757      ssl_options,
4758      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4759  ASSERT_TRUE(test_server.Start());
4760
4761  // We require that the URL be www.google.com in order to pick up the
4762  // preloaded and dynamic HSTS and public key pin entries in the
4763  // TransportSecurityState. This means that we have to use a
4764  // MockHostResolver in order to direct www.google.com to the testserver.
4765  // By default, MockHostResolver maps all hosts to 127.0.0.1.
4766
4767  MockHostResolver host_resolver;
4768  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
4769  TestURLRequestContext context(true);
4770  context.set_network_delegate(&network_delegate);
4771  context.set_host_resolver(&host_resolver);
4772  TransportSecurityState transport_security_state;
4773  TransportSecurityState::DomainState domain_state;
4774  EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true,
4775                                                      &domain_state));
4776  context.set_transport_security_state(&transport_security_state);
4777  context.Init();
4778
4779  TestDelegate d;
4780  URLRequest r(GURL(base::StringPrintf("https://www.google.com:%d",
4781                                       test_server.host_port_pair().port())),
4782               &d,
4783               &context);
4784
4785  r.Start();
4786  EXPECT_TRUE(r.is_pending());
4787
4788  MessageLoop::current()->Run();
4789
4790  EXPECT_EQ(1, d.response_started_count());
4791  EXPECT_FALSE(d.received_data_before_response());
4792  EXPECT_TRUE(d.have_certificate_errors());
4793  EXPECT_TRUE(d.certificate_errors_are_fatal());
4794
4795  // Get a fresh copy of the state, and check that it hasn't been updated.
4796  TransportSecurityState::DomainState new_domain_state;
4797  EXPECT_TRUE(transport_security_state.GetDomainState("www.google.com", true,
4798                                                      &new_domain_state));
4799  EXPECT_EQ(new_domain_state.upgrade_mode, domain_state.upgrade_mode);
4800  EXPECT_EQ(new_domain_state.include_subdomains,
4801            domain_state.include_subdomains);
4802  EXPECT_TRUE(FingerprintsEqual(new_domain_state.static_spki_hashes,
4803                                domain_state.static_spki_hashes));
4804  EXPECT_TRUE(FingerprintsEqual(new_domain_state.dynamic_spki_hashes,
4805                                domain_state.dynamic_spki_hashes));
4806  EXPECT_TRUE(FingerprintsEqual(new_domain_state.bad_static_spki_hashes,
4807                                domain_state.bad_static_spki_hashes));
4808}
4809
4810// Make sure HSTS preserves a POST request's method and body.
4811TEST_F(HTTPSRequestTest, HSTSPreservesPosts) {
4812  static const char kData[] = "hello world";
4813
4814  SpawnedTestServer::SSLOptions ssl_options(
4815      SpawnedTestServer::SSLOptions::CERT_OK);
4816  SpawnedTestServer test_server(
4817      SpawnedTestServer::TYPE_HTTPS,
4818      ssl_options,
4819      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4820  ASSERT_TRUE(test_server.Start());
4821
4822
4823  // Per spec, TransportSecurityState expects a domain name, rather than an IP
4824  // address, so a MockHostResolver is needed to redirect www.somewhere.com to
4825  // the SpawnedTestServer.  By default, MockHostResolver maps all hosts
4826  // to 127.0.0.1.
4827  MockHostResolver host_resolver;
4828
4829  // Force https for www.somewhere.com.
4830  TransportSecurityState transport_security_state;
4831  base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
4832  bool include_subdomains = false;
4833  transport_security_state.AddHSTS("www.somewhere.com", expiry,
4834                                   include_subdomains);
4835
4836  TestNetworkDelegate network_delegate;  // Must outlive URLRequest.
4837
4838  TestURLRequestContext context(true);
4839  context.set_host_resolver(&host_resolver);
4840  context.set_transport_security_state(&transport_security_state);
4841  context.set_network_delegate(&network_delegate);
4842  context.Init();
4843
4844  TestDelegate d;
4845  // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will
4846  // cause a certificate error.  Ignore the error.
4847  d.set_allow_certificate_errors(true);
4848
4849  URLRequest req(GURL(base::StringPrintf("http://www.somewhere.com:%d/echo",
4850                                         test_server.host_port_pair().port())),
4851                 &d,
4852                 &context);
4853  req.set_method("POST");
4854  req.set_upload(make_scoped_ptr(CreateSimpleUploadData(kData)));
4855
4856  req.Start();
4857  MessageLoop::current()->Run();
4858
4859  EXPECT_EQ("https", req.url().scheme());
4860  EXPECT_EQ("POST", req.method());
4861  EXPECT_EQ(kData, d.data_received());
4862}
4863
4864TEST_F(HTTPSRequestTest, SSLv3Fallback) {
4865  SpawnedTestServer::SSLOptions ssl_options(
4866      SpawnedTestServer::SSLOptions::CERT_OK);
4867  ssl_options.tls_intolerant =
4868      SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL;
4869  SpawnedTestServer test_server(
4870      SpawnedTestServer::TYPE_HTTPS,
4871      ssl_options,
4872      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4873  ASSERT_TRUE(test_server.Start());
4874
4875  TestDelegate d;
4876  TestURLRequestContext context(true);
4877  context.Init();
4878  d.set_allow_certificate_errors(true);
4879  URLRequest r(test_server.GetURL(std::string()), &d, &context);
4880  r.Start();
4881
4882  MessageLoop::current()->Run();
4883
4884  EXPECT_EQ(1, d.response_started_count());
4885  EXPECT_NE(0, d.bytes_received());
4886  EXPECT_EQ(static_cast<int>(SSL_CONNECTION_VERSION_SSL3),
4887            SSLConnectionStatusToVersion(r.ssl_info().connection_status));
4888  EXPECT_TRUE(r.ssl_info().connection_status & SSL_CONNECTION_VERSION_FALLBACK);
4889}
4890
4891namespace {
4892
4893class SSLClientAuthTestDelegate : public TestDelegate {
4894 public:
4895  SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) {
4896  }
4897  virtual void OnCertificateRequested(
4898      URLRequest* request,
4899      SSLCertRequestInfo* cert_request_info) OVERRIDE {
4900    on_certificate_requested_count_++;
4901    MessageLoop::current()->Quit();
4902  }
4903  int on_certificate_requested_count() {
4904    return on_certificate_requested_count_;
4905  }
4906 private:
4907  int on_certificate_requested_count_;
4908};
4909
4910}  // namespace
4911
4912// TODO(davidben): Test the rest of the code. Specifically,
4913// - Filtering which certificates to select.
4914// - Sending a certificate back.
4915// - Getting a certificate request in an SSL renegotiation sending the
4916//   HTTP request.
4917TEST_F(HTTPSRequestTest, ClientAuthTest) {
4918  SpawnedTestServer::SSLOptions ssl_options;
4919  ssl_options.request_client_certificate = true;
4920  SpawnedTestServer test_server(
4921      SpawnedTestServer::TYPE_HTTPS,
4922      ssl_options,
4923      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4924  ASSERT_TRUE(test_server.Start());
4925
4926  SSLClientAuthTestDelegate d;
4927  {
4928    URLRequest r(test_server.GetURL(std::string()), &d, &default_context_);
4929
4930    r.Start();
4931    EXPECT_TRUE(r.is_pending());
4932
4933    MessageLoop::current()->Run();
4934
4935    EXPECT_EQ(1, d.on_certificate_requested_count());
4936    EXPECT_FALSE(d.received_data_before_response());
4937    EXPECT_EQ(0, d.bytes_received());
4938
4939    // Send no certificate.
4940    // TODO(davidben): Get temporary client cert import (with keys) working on
4941    // all platforms so we can test sending a cert as well.
4942    r.ContinueWithCertificate(NULL);
4943
4944    MessageLoop::current()->Run();
4945
4946    EXPECT_EQ(1, d.response_started_count());
4947    EXPECT_FALSE(d.received_data_before_response());
4948    EXPECT_NE(0, d.bytes_received());
4949  }
4950}
4951
4952TEST_F(HTTPSRequestTest, ResumeTest) {
4953  // Test that we attempt a session resume when making two connections to the
4954  // same host.
4955  SpawnedTestServer::SSLOptions ssl_options;
4956  ssl_options.record_resume = true;
4957  SpawnedTestServer test_server(
4958      SpawnedTestServer::TYPE_HTTPS,
4959      ssl_options,
4960      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
4961  ASSERT_TRUE(test_server.Start());
4962
4963  SSLClientSocket::ClearSessionCache();
4964
4965  {
4966    TestDelegate d;
4967    URLRequest r(
4968        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
4969
4970    r.Start();
4971    EXPECT_TRUE(r.is_pending());
4972
4973    MessageLoop::current()->Run();
4974
4975    EXPECT_EQ(1, d.response_started_count());
4976  }
4977
4978  reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
4979    CloseAllConnections();
4980
4981  {
4982    TestDelegate d;
4983    URLRequest r(
4984        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
4985
4986    r.Start();
4987    EXPECT_TRUE(r.is_pending());
4988
4989    MessageLoop::current()->Run();
4990
4991    // The response will look like;
4992    //   insert abc
4993    //   lookup abc
4994    //   insert xyz
4995    //
4996    // With a newline at the end which makes the split think that there are
4997    // four lines.
4998
4999    EXPECT_EQ(1, d.response_started_count());
5000    std::vector<std::string> lines;
5001    base::SplitString(d.data_received(), '\n', &lines);
5002    ASSERT_EQ(4u, lines.size()) << d.data_received();
5003
5004    std::string session_id;
5005
5006    for (size_t i = 0; i < 2; i++) {
5007      std::vector<std::string> parts;
5008      base::SplitString(lines[i], '\t', &parts);
5009      ASSERT_EQ(2u, parts.size());
5010      if (i == 0) {
5011        EXPECT_EQ("insert", parts[0]);
5012        session_id = parts[1];
5013      } else {
5014        EXPECT_EQ("lookup", parts[0]);
5015        EXPECT_EQ(session_id, parts[1]);
5016      }
5017    }
5018  }
5019}
5020
5021TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) {
5022  // Test that sessions aren't resumed when the value of ssl_session_cache_shard
5023  // differs.
5024  SpawnedTestServer::SSLOptions ssl_options;
5025  ssl_options.record_resume = true;
5026  SpawnedTestServer test_server(
5027      SpawnedTestServer::TYPE_HTTPS,
5028      ssl_options,
5029      base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
5030  ASSERT_TRUE(test_server.Start());
5031
5032  SSLClientSocket::ClearSessionCache();
5033
5034  {
5035    TestDelegate d;
5036    URLRequest r(
5037        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
5038
5039    r.Start();
5040    EXPECT_TRUE(r.is_pending());
5041
5042    MessageLoop::current()->Run();
5043
5044    EXPECT_EQ(1, d.response_started_count());
5045  }
5046
5047  // Now create a new HttpCache with a different ssl_session_cache_shard value.
5048  HttpNetworkSession::Params params;
5049  params.host_resolver = default_context_.host_resolver();
5050  params.cert_verifier = default_context_.cert_verifier();
5051  params.proxy_service = default_context_.proxy_service();
5052  params.ssl_config_service = default_context_.ssl_config_service();
5053  params.http_auth_handler_factory =
5054      default_context_.http_auth_handler_factory();
5055  params.network_delegate = &default_network_delegate_;
5056  params.http_server_properties = default_context_.http_server_properties();
5057  params.ssl_session_cache_shard = "alternate";
5058
5059  scoped_ptr<net::HttpCache> cache(new net::HttpCache(
5060      new net::HttpNetworkSession(params),
5061      net::HttpCache::DefaultBackend::InMemory(0)));
5062
5063  default_context_.set_http_transaction_factory(cache.get());
5064
5065  {
5066    TestDelegate d;
5067    URLRequest r(
5068        test_server.GetURL("ssl-session-cache"), &d, &default_context_);
5069
5070    r.Start();
5071    EXPECT_TRUE(r.is_pending());
5072
5073    MessageLoop::current()->Run();
5074
5075    // The response will look like;
5076    //   insert abc
5077    //   insert xyz
5078    //
5079    // With a newline at the end which makes the split think that there are
5080    // three lines.
5081
5082    EXPECT_EQ(1, d.response_started_count());
5083    std::vector<std::string> lines;
5084    base::SplitString(d.data_received(), '\n', &lines);
5085    ASSERT_EQ(3u, lines.size());
5086
5087    std::string session_id;
5088    for (size_t i = 0; i < 2; i++) {
5089      std::vector<std::string> parts;
5090      base::SplitString(lines[i], '\t', &parts);
5091      ASSERT_EQ(2u, parts.size());
5092      EXPECT_EQ("insert", parts[0]);
5093      if (i == 0) {
5094        session_id = parts[1];
5095      } else {
5096        EXPECT_NE(session_id, parts[1]);
5097      }
5098    }
5099  }
5100}
5101
5102class TestSSLConfigService : public SSLConfigService {
5103 public:
5104  TestSSLConfigService(bool ev_enabled, bool online_rev_checking)
5105      : ev_enabled_(ev_enabled),
5106        online_rev_checking_(online_rev_checking) {
5107  }
5108
5109  // SSLConfigService:
5110  virtual void GetSSLConfig(SSLConfig* config) OVERRIDE {
5111    *config = SSLConfig();
5112    config->rev_checking_enabled = online_rev_checking_;
5113    config->verify_ev_cert = ev_enabled_;
5114  }
5115
5116 protected:
5117  virtual ~TestSSLConfigService() {}
5118
5119 private:
5120  const bool ev_enabled_;
5121  const bool online_rev_checking_;
5122};
5123
5124// This the fingerprint of the "Testing CA" certificate used by the testserver.
5125// See net/data/ssl/certificates/ocsp-test-root.pem.
5126static const SHA1HashValue kOCSPTestCertFingerprint =
5127  { { 0xf1, 0xad, 0xf6, 0xce, 0x42, 0xac, 0xe7, 0xb4, 0xf4, 0x24,
5128      0xdb, 0x1a, 0xf7, 0xa0, 0x9f, 0x09, 0xa1, 0xea, 0xf1, 0x5c } };
5129
5130// This is the policy OID contained in the certificates that testserver
5131// generates.
5132static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1";
5133
5134class HTTPSOCSPTest : public HTTPSRequestTest {
5135 public:
5136  HTTPSOCSPTest()
5137      : context_(true),
5138        ev_test_policy_(
5139            new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(),
5140                                   kOCSPTestCertFingerprint,
5141                                   kOCSPTestCertPolicy)) {
5142  }
5143
5144  virtual void SetUp() OVERRIDE {
5145    SetupContext(&context_);
5146    context_.Init();
5147
5148    scoped_refptr<net::X509Certificate> root_cert =
5149      ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem");
5150    CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert);
5151    test_root_.reset(new ScopedTestRoot(root_cert));
5152
5153#if defined(USE_NSS) || defined(OS_IOS)
5154    SetURLRequestContextForNSSHttpIO(&context_);
5155    EnsureNSSHttpIOInit();
5156#endif
5157  }
5158
5159  void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options,
5160                    CertStatus* out_cert_status) {
5161    // We always overwrite out_cert_status.
5162    *out_cert_status = 0;
5163    SpawnedTestServer test_server(
5164        SpawnedTestServer::TYPE_HTTPS,
5165        ssl_options,
5166        base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
5167    ASSERT_TRUE(test_server.Start());
5168
5169    TestDelegate d;
5170    d.set_allow_certificate_errors(true);
5171    URLRequest r(test_server.GetURL(std::string()), &d, &context_);
5172    r.Start();
5173
5174    MessageLoop::current()->Run();
5175
5176    EXPECT_EQ(1, d.response_started_count());
5177    *out_cert_status = r.ssl_info().cert_status;
5178  }
5179
5180  virtual ~HTTPSOCSPTest() {
5181#if defined(USE_NSS) || defined(OS_IOS)
5182    ShutdownNSSHttpIO();
5183#endif
5184  }
5185
5186 protected:
5187  // SetupContext configures the URLRequestContext that will be used for making
5188  // connetions to testserver. This can be overridden in test subclasses for
5189  // different behaviour.
5190  virtual void SetupContext(URLRequestContext* context) {
5191    context->set_ssl_config_service(
5192        new TestSSLConfigService(true /* check for EV */,
5193                                 true /* online revocation checking */));
5194  }
5195
5196  scoped_ptr<ScopedTestRoot> test_root_;
5197  TestURLRequestContext context_;
5198  scoped_ptr<ScopedTestEVPolicy> ev_test_policy_;
5199};
5200
5201static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() {
5202#if defined(OS_WIN)
5203  // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't
5204  // have that ability on other platforms.
5205  return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION;
5206#else
5207  return 0;
5208#endif
5209}
5210
5211// SystemUsesChromiumEVMetadata returns true iff the current operating system
5212// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then
5213// several tests are effected because our testing EV certificate won't be
5214// recognised as EV.
5215static bool SystemUsesChromiumEVMetadata() {
5216#if defined(USE_OPENSSL)
5217  // http://crbug.com/117478 - OpenSSL does not support EV validation.
5218  return false;
5219#elif defined(OS_MACOSX) && !defined(OS_IOS)
5220  // On OS X, we use the system to tell us whether a certificate is EV or not
5221  // and the system won't recognise our testing root.
5222  return false;
5223#else
5224  return true;
5225#endif
5226}
5227
5228static bool SystemSupportsOCSP() {
5229#if defined(USE_OPENSSL)
5230  // http://crbug.com/117478 - OpenSSL does not support OCSP.
5231  return false;
5232#elif defined(OS_WIN)
5233  return base::win::GetVersion() >= base::win::VERSION_VISTA;
5234#elif defined(OS_ANDROID)
5235  // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
5236  return false;
5237#else
5238  return true;
5239#endif
5240}
5241
5242TEST_F(HTTPSOCSPTest, Valid) {
5243  if (!SystemSupportsOCSP()) {
5244    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5245    return;
5246  }
5247
5248  SpawnedTestServer::SSLOptions ssl_options(
5249      SpawnedTestServer::SSLOptions::CERT_AUTO);
5250  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
5251
5252  CertStatus cert_status;
5253  DoConnection(ssl_options, &cert_status);
5254
5255  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
5256
5257  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
5258            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
5259
5260  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
5261}
5262
5263TEST_F(HTTPSOCSPTest, Revoked) {
5264  if (!SystemSupportsOCSP()) {
5265    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5266    return;
5267  }
5268
5269  SpawnedTestServer::SSLOptions ssl_options(
5270      SpawnedTestServer::SSLOptions::CERT_AUTO);
5271  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
5272
5273  CertStatus cert_status;
5274  DoConnection(ssl_options, &cert_status);
5275
5276#if !(defined(OS_MACOSX) && !defined(OS_IOS))
5277  // Doesn't pass on OS X yet for reasons that need to be investigated.
5278  EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
5279#endif
5280  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
5281  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
5282}
5283
5284TEST_F(HTTPSOCSPTest, Invalid) {
5285  if (!SystemSupportsOCSP()) {
5286    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5287    return;
5288  }
5289
5290  SpawnedTestServer::SSLOptions ssl_options(
5291      SpawnedTestServer::SSLOptions::CERT_AUTO);
5292  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
5293
5294  CertStatus cert_status;
5295  DoConnection(ssl_options, &cert_status);
5296
5297  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
5298            cert_status & CERT_STATUS_ALL_ERRORS);
5299
5300  // Without a positive OCSP response, we shouldn't show the EV status.
5301  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
5302  EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
5303}
5304
5305class HTTPSEVCRLSetTest : public HTTPSOCSPTest {
5306 protected:
5307  virtual void SetupContext(URLRequestContext* context) OVERRIDE {
5308    context->set_ssl_config_service(
5309        new TestSSLConfigService(true /* check for EV */,
5310                                 false /* online revocation checking */));
5311  }
5312};
5313
5314TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) {
5315  if (!SystemSupportsOCSP()) {
5316    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5317    return;
5318  }
5319
5320  SpawnedTestServer::SSLOptions ssl_options(
5321      SpawnedTestServer::SSLOptions::CERT_AUTO);
5322  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
5323  SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>());
5324
5325  CertStatus cert_status;
5326  DoConnection(ssl_options, &cert_status);
5327
5328  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
5329            cert_status & CERT_STATUS_ALL_ERRORS);
5330
5331  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
5332  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
5333            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
5334}
5335
5336TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) {
5337  if (!SystemSupportsOCSP()) {
5338    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5339    return;
5340  }
5341
5342  SpawnedTestServer::SSLOptions ssl_options(
5343      SpawnedTestServer::SSLOptions::CERT_AUTO);
5344  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
5345  SSLConfigService::SetCRLSet(scoped_refptr<CRLSet>());
5346
5347  CertStatus cert_status;
5348  DoConnection(ssl_options, &cert_status);
5349
5350  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
5351
5352  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
5353            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
5354  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
5355            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
5356}
5357
5358TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) {
5359  if (!SystemSupportsOCSP()) {
5360    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5361    return;
5362  }
5363
5364  SpawnedTestServer::SSLOptions ssl_options(
5365      SpawnedTestServer::SSLOptions::CERT_AUTO);
5366  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
5367  SSLConfigService::SetCRLSet(
5368      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
5369
5370  CertStatus cert_status;
5371  DoConnection(ssl_options, &cert_status);
5372
5373  EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
5374            cert_status & CERT_STATUS_ALL_ERRORS);
5375
5376  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
5377  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
5378            static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
5379}
5380
5381TEST_F(HTTPSEVCRLSetTest, FreshCRLSet) {
5382  SpawnedTestServer::SSLOptions ssl_options(
5383      SpawnedTestServer::SSLOptions::CERT_AUTO);
5384  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
5385  SSLConfigService::SetCRLSet(
5386      scoped_refptr<CRLSet>(CRLSet::EmptyCRLSetForTesting()));
5387
5388  CertStatus cert_status;
5389  DoConnection(ssl_options, &cert_status);
5390
5391  // With a valid, fresh CRLSet the bad OCSP response shouldn't matter because
5392  // we wont check it.
5393  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
5394
5395  EXPECT_EQ(SystemUsesChromiumEVMetadata(),
5396            static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
5397
5398  EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
5399}
5400
5401TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) {
5402  // Test that when EV verification is requested, but online revocation
5403  // checking is disabled, and the leaf certificate is not in fact EV, that
5404  // no revocation checking actually happens.
5405  if (!SystemSupportsOCSP()) {
5406    LOG(WARNING) << "Skipping test because system doesn't support OCSP";
5407    return;
5408  }
5409
5410  // Unmark the certificate's OID as EV, which should disable revocation
5411  // checking (as per the user preference)
5412  ev_test_policy_.reset();
5413
5414  SpawnedTestServer::SSLOptions ssl_options(
5415      SpawnedTestServer::SSLOptions::CERT_AUTO);
5416  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
5417  SSLConfigService::SetCRLSet(
5418      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
5419
5420  CertStatus cert_status;
5421  DoConnection(ssl_options, &cert_status);
5422
5423  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
5424
5425  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
5426  EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
5427}
5428
5429class HTTPSCRLSetTest : public HTTPSOCSPTest {
5430 protected:
5431  virtual void SetupContext(URLRequestContext* context) OVERRIDE {
5432    context->set_ssl_config_service(
5433        new TestSSLConfigService(false /* check for EV */,
5434                                 false /* online revocation checking */));
5435  }
5436};
5437
5438TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) {
5439  SpawnedTestServer::SSLOptions ssl_options(
5440      SpawnedTestServer::SSLOptions::CERT_AUTO);
5441  ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_INVALID;
5442  SSLConfigService::SetCRLSet(
5443      scoped_refptr<CRLSet>(CRLSet::ExpiredCRLSetForTesting()));
5444
5445  CertStatus cert_status;
5446  DoConnection(ssl_options, &cert_status);
5447
5448  // If we're not trying EV verification then, even if the CRLSet has expired,
5449  // we don't fall back to online revocation checks.
5450  EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
5451  EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
5452  EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
5453}
5454#endif  // !defined(OS_IOS)
5455
5456#if !defined(DISABLE_FTP_SUPPORT)
5457class URLRequestTestFTP : public URLRequestTest {
5458 public:
5459  URLRequestTestFTP()
5460      : test_server_(SpawnedTestServer::TYPE_FTP, SpawnedTestServer::kLocalhost,
5461                     base::FilePath()) {
5462  }
5463
5464 protected:
5465  SpawnedTestServer test_server_;
5466};
5467
5468// Make sure an FTP request using an unsafe ports fails.
5469TEST_F(URLRequestTestFTP, UnsafePort) {
5470  ASSERT_TRUE(test_server_.Start());
5471
5472  URLRequestJobFactoryImpl job_factory;
5473  FtpNetworkLayer ftp_transaction_factory(default_context_.host_resolver());
5474
5475  GURL url("ftp://127.0.0.1:7");
5476  job_factory.SetProtocolHandler(
5477      "ftp",
5478      new FtpProtocolHandler(&ftp_transaction_factory));
5479  default_context_.set_job_factory(&job_factory);
5480
5481  TestDelegate d;
5482  {
5483    URLRequest r(url, &d, &default_context_);
5484    r.Start();
5485    EXPECT_TRUE(r.is_pending());
5486
5487    MessageLoop::current()->Run();
5488
5489    EXPECT_FALSE(r.is_pending());
5490    EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
5491    EXPECT_EQ(ERR_UNSAFE_PORT, r.status().error());
5492  }
5493}
5494
5495// Flaky, see http://crbug.com/25045.
5496TEST_F(URLRequestTestFTP, DISABLED_FTPDirectoryListing) {
5497  ASSERT_TRUE(test_server_.Start());
5498
5499  TestDelegate d;
5500  {
5501    URLRequest r(test_server_.GetURL("/"), &d, &default_context_);
5502    r.Start();
5503    EXPECT_TRUE(r.is_pending());
5504
5505    MessageLoop::current()->Run();
5506
5507    EXPECT_FALSE(r.is_pending());
5508    EXPECT_EQ(1, d.response_started_count());
5509    EXPECT_FALSE(d.received_data_before_response());
5510    EXPECT_LT(0, d.bytes_received());
5511    EXPECT_EQ(test_server_.host_port_pair().host(),
5512              r.GetSocketAddress().host());
5513    EXPECT_EQ(test_server_.host_port_pair().port(),
5514              r.GetSocketAddress().port());
5515  }
5516}
5517
5518// Flaky, see http://crbug.com/25045.
5519TEST_F(URLRequestTestFTP, DISABLED_FTPGetTestAnonymous) {
5520  ASSERT_TRUE(test_server_.Start());
5521
5522  base::FilePath app_path;
5523  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
5524  app_path = app_path.AppendASCII("LICENSE");
5525  TestDelegate d;
5526  {
5527    URLRequest r(test_server_.GetURL("/LICENSE"), &d, &default_context_);
5528    r.Start();
5529    EXPECT_TRUE(r.is_pending());
5530
5531    MessageLoop::current()->Run();
5532
5533    int64 file_size = 0;
5534    file_util::GetFileSize(app_path, &file_size);
5535
5536    EXPECT_FALSE(r.is_pending());
5537    EXPECT_EQ(1, d.response_started_count());
5538    EXPECT_FALSE(d.received_data_before_response());
5539    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
5540    EXPECT_EQ(test_server_.host_port_pair().host(),
5541              r.GetSocketAddress().host());
5542    EXPECT_EQ(test_server_.host_port_pair().port(),
5543              r.GetSocketAddress().port());
5544  }
5545}
5546
5547// Flaky, see http://crbug.com/25045.
5548TEST_F(URLRequestTestFTP, DISABLED_FTPGetTest) {
5549  ASSERT_TRUE(test_server_.Start());
5550
5551  base::FilePath app_path;
5552  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
5553  app_path = app_path.AppendASCII("LICENSE");
5554  TestDelegate d;
5555  {
5556    URLRequest r(
5557        test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"),
5558        &d,
5559        &default_context_);
5560    r.Start();
5561    EXPECT_TRUE(r.is_pending());
5562
5563    MessageLoop::current()->Run();
5564
5565    int64 file_size = 0;
5566    file_util::GetFileSize(app_path, &file_size);
5567
5568    EXPECT_FALSE(r.is_pending());
5569    EXPECT_EQ(test_server_.host_port_pair().host(),
5570              r.GetSocketAddress().host());
5571    EXPECT_EQ(test_server_.host_port_pair().port(),
5572              r.GetSocketAddress().port());
5573    EXPECT_EQ(1, d.response_started_count());
5574    EXPECT_FALSE(d.received_data_before_response());
5575    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
5576
5577    LoadTimingInfo load_timing_info;
5578    r.GetLoadTimingInfo(&load_timing_info);
5579    TestLoadTimingNoHttpConnection(load_timing_info);
5580  }
5581}
5582
5583// Flaky, see http://crbug.com/25045.
5584TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPassword) {
5585  ASSERT_TRUE(test_server_.Start());
5586
5587  base::FilePath app_path;
5588  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
5589  app_path = app_path.AppendASCII("LICENSE");
5590  TestDelegate d;
5591  {
5592    URLRequest r(
5593        test_server_.GetURLWithUserAndPassword("/LICENSE",
5594                                               "chrome",
5595                                               "wrong_password"),
5596        &d,
5597        &default_context_);
5598    r.Start();
5599    EXPECT_TRUE(r.is_pending());
5600
5601    MessageLoop::current()->Run();
5602
5603    int64 file_size = 0;
5604    file_util::GetFileSize(app_path, &file_size);
5605
5606    EXPECT_FALSE(r.is_pending());
5607    EXPECT_EQ(1, d.response_started_count());
5608    EXPECT_FALSE(d.received_data_before_response());
5609    EXPECT_EQ(d.bytes_received(), 0);
5610  }
5611}
5612
5613// Flaky, see http://crbug.com/25045.
5614TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongPasswordRestart) {
5615  ASSERT_TRUE(test_server_.Start());
5616
5617  base::FilePath app_path;
5618  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
5619  app_path = app_path.AppendASCII("LICENSE");
5620  TestDelegate d;
5621  // Set correct login credentials. The delegate will be asked for them when
5622  // the initial login with wrong credentials will fail.
5623  d.set_credentials(AuthCredentials(kChrome, kChrome));
5624  {
5625    URLRequest r(
5626        test_server_.GetURLWithUserAndPassword("/LICENSE",
5627                                               "chrome",
5628                                               "wrong_password"),
5629        &d,
5630        &default_context_);
5631    r.Start();
5632    EXPECT_TRUE(r.is_pending());
5633
5634    MessageLoop::current()->Run();
5635
5636    int64 file_size = 0;
5637    file_util::GetFileSize(app_path, &file_size);
5638
5639    EXPECT_FALSE(r.is_pending());
5640    EXPECT_EQ(1, d.response_started_count());
5641    EXPECT_FALSE(d.received_data_before_response());
5642    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
5643  }
5644}
5645
5646// Flaky, see http://crbug.com/25045.
5647TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUser) {
5648  ASSERT_TRUE(test_server_.Start());
5649
5650  base::FilePath app_path;
5651  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
5652  app_path = app_path.AppendASCII("LICENSE");
5653  TestDelegate d;
5654  {
5655    URLRequest r(
5656        test_server_.GetURLWithUserAndPassword("/LICENSE",
5657                                               "wrong_user",
5658                                               "chrome"),
5659        &d,
5660        &default_context_);
5661    r.Start();
5662    EXPECT_TRUE(r.is_pending());
5663
5664    MessageLoop::current()->Run();
5665
5666    int64 file_size = 0;
5667    file_util::GetFileSize(app_path, &file_size);
5668
5669    EXPECT_FALSE(r.is_pending());
5670    EXPECT_EQ(1, d.response_started_count());
5671    EXPECT_FALSE(d.received_data_before_response());
5672    EXPECT_EQ(d.bytes_received(), 0);
5673  }
5674}
5675
5676// Flaky, see http://crbug.com/25045.
5677TEST_F(URLRequestTestFTP, DISABLED_FTPCheckWrongUserRestart) {
5678  ASSERT_TRUE(test_server_.Start());
5679
5680  base::FilePath app_path;
5681  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
5682  app_path = app_path.AppendASCII("LICENSE");
5683  TestDelegate d;
5684  // Set correct login credentials. The delegate will be asked for them when
5685  // the initial login with wrong credentials will fail.
5686  d.set_credentials(AuthCredentials(kChrome, kChrome));
5687  {
5688    URLRequest r(
5689        test_server_.GetURLWithUserAndPassword("/LICENSE",
5690                                               "wrong_user",
5691                                               "chrome"),
5692        &d,
5693        &default_context_);
5694    r.Start();
5695    EXPECT_TRUE(r.is_pending());
5696
5697    MessageLoop::current()->Run();
5698
5699    int64 file_size = 0;
5700    file_util::GetFileSize(app_path, &file_size);
5701
5702    EXPECT_FALSE(r.is_pending());
5703    EXPECT_EQ(1, d.response_started_count());
5704    EXPECT_FALSE(d.received_data_before_response());
5705    EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
5706  }
5707}
5708
5709// Flaky, see http://crbug.com/25045.
5710TEST_F(URLRequestTestFTP, DISABLED_FTPCacheURLCredentials) {
5711  ASSERT_TRUE(test_server_.Start());
5712
5713  base::FilePath app_path;
5714  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
5715  app_path = app_path.AppendASCII("LICENSE");
5716
5717  scoped_ptr<TestDelegate> d(new TestDelegate);
5718  {
5719    // Pass correct login identity in the URL.
5720    URLRequest r(
5721        test_server_.GetURLWithUserAndPassword("/LICENSE",
5722                                               "chrome",
5723                                               "chrome"),
5724        d.get(),
5725        &default_context_);
5726    r.Start();
5727    EXPECT_TRUE(r.is_pending());
5728
5729    MessageLoop::current()->Run();
5730
5731    int64 file_size = 0;
5732    file_util::GetFileSize(app_path, &file_size);
5733
5734    EXPECT_FALSE(r.is_pending());
5735    EXPECT_EQ(1, d->response_started_count());
5736    EXPECT_FALSE(d->received_data_before_response());
5737    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
5738  }
5739
5740  d.reset(new TestDelegate);
5741  {
5742    // This request should use cached identity from previous request.
5743    URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_);
5744    r.Start();
5745    EXPECT_TRUE(r.is_pending());
5746
5747    MessageLoop::current()->Run();
5748
5749    int64 file_size = 0;
5750    file_util::GetFileSize(app_path, &file_size);
5751
5752    EXPECT_FALSE(r.is_pending());
5753    EXPECT_EQ(1, d->response_started_count());
5754    EXPECT_FALSE(d->received_data_before_response());
5755    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
5756  }
5757}
5758
5759// Flaky, see http://crbug.com/25045.
5760TEST_F(URLRequestTestFTP, DISABLED_FTPCacheLoginBoxCredentials) {
5761  ASSERT_TRUE(test_server_.Start());
5762
5763  base::FilePath app_path;
5764  PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
5765  app_path = app_path.AppendASCII("LICENSE");
5766
5767  scoped_ptr<TestDelegate> d(new TestDelegate);
5768  // Set correct login credentials. The delegate will be asked for them when
5769  // the initial login with wrong credentials will fail.
5770  d->set_credentials(AuthCredentials(kChrome, kChrome));
5771  {
5772    URLRequest r(
5773        test_server_.GetURLWithUserAndPassword("/LICENSE",
5774                                               "chrome",
5775                                               "wrong_password"),
5776        d.get(),
5777        &default_context_);
5778    r.Start();
5779    EXPECT_TRUE(r.is_pending());
5780
5781    MessageLoop::current()->Run();
5782
5783    int64 file_size = 0;
5784    file_util::GetFileSize(app_path, &file_size);
5785
5786    EXPECT_FALSE(r.is_pending());
5787    EXPECT_EQ(1, d->response_started_count());
5788    EXPECT_FALSE(d->received_data_before_response());
5789    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
5790  }
5791
5792  // Use a new delegate without explicit credentials. The cached ones should be
5793  // used.
5794  d.reset(new TestDelegate);
5795  {
5796    // Don't pass wrong credentials in the URL, they would override valid cached
5797    // ones.
5798    URLRequest r(test_server_.GetURL("/LICENSE"), d.get(), &default_context_);
5799    r.Start();
5800    EXPECT_TRUE(r.is_pending());
5801
5802    MessageLoop::current()->Run();
5803
5804    int64 file_size = 0;
5805    file_util::GetFileSize(app_path, &file_size);
5806
5807    EXPECT_FALSE(r.is_pending());
5808    EXPECT_EQ(1, d->response_started_count());
5809    EXPECT_FALSE(d->received_data_before_response());
5810    EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
5811  }
5812}
5813#endif  // !defined(DISABLE_FTP_SUPPORT)
5814
5815}  // namespace net
5816