url_request_test_util.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/url_request/url_request_test_util.h"
6
7#include "base/compiler_specific.h"
8#include "base/logging.h"
9#include "base/message_loop/message_loop.h"
10#include "base/threading/thread.h"
11#include "base/threading/worker_pool.h"
12#include "net/base/host_port_pair.h"
13#include "net/cert/cert_verifier.h"
14#include "net/dns/mock_host_resolver.h"
15#include "net/http/http_network_session.h"
16#include "net/http/http_response_headers.h"
17#include "net/http/http_server_properties_impl.h"
18#include "net/http/transport_security_state.h"
19#include "net/ssl/channel_id_service.h"
20#include "net/ssl/default_channel_id_store.h"
21#include "net/url_request/static_http_user_agent_settings.h"
22#include "net/url_request/url_request_job_factory_impl.h"
23#include "testing/gtest/include/gtest/gtest.h"
24
25namespace net {
26
27namespace {
28
29// These constants put the NetworkDelegate events of TestNetworkDelegate
30// into an order. They are used in conjunction with
31// |TestNetworkDelegate::next_states_| to check that we do not send
32// events in the wrong order.
33const int kStageBeforeURLRequest = 1 << 0;
34const int kStageBeforeSendHeaders = 1 << 1;
35const int kStageSendHeaders = 1 << 2;
36const int kStageHeadersReceived = 1 << 3;
37const int kStageAuthRequired = 1 << 4;
38const int kStageBeforeRedirect = 1 << 5;
39const int kStageResponseStarted = 1 << 6;
40const int kStageCompletedSuccess = 1 << 7;
41const int kStageCompletedError = 1 << 8;
42const int kStageURLRequestDestroyed = 1 << 9;
43const int kStageDestruction = 1 << 10;
44
45}  // namespace
46
47TestURLRequestContext::TestURLRequestContext()
48    : initialized_(false),
49      client_socket_factory_(NULL),
50      context_storage_(this) {
51  Init();
52}
53
54TestURLRequestContext::TestURLRequestContext(bool delay_initialization)
55    : initialized_(false),
56      client_socket_factory_(NULL),
57      context_storage_(this) {
58  if (!delay_initialization)
59    Init();
60}
61
62TestURLRequestContext::~TestURLRequestContext() {
63  DCHECK(initialized_);
64  AssertNoURLRequests();
65}
66
67void TestURLRequestContext::Init() {
68  DCHECK(!initialized_);
69  initialized_ = true;
70
71  if (!host_resolver())
72    context_storage_.set_host_resolver(
73        scoped_ptr<HostResolver>(new MockCachingHostResolver()));
74  if (!proxy_service())
75    context_storage_.set_proxy_service(ProxyService::CreateDirect());
76  if (!cert_verifier())
77    context_storage_.set_cert_verifier(CertVerifier::CreateDefault());
78  if (!transport_security_state())
79    context_storage_.set_transport_security_state(new TransportSecurityState);
80  if (!ssl_config_service())
81    context_storage_.set_ssl_config_service(new SSLConfigServiceDefaults);
82  if (!http_auth_handler_factory()) {
83    context_storage_.set_http_auth_handler_factory(
84        HttpAuthHandlerFactory::CreateDefault(host_resolver()));
85  }
86  if (!http_server_properties()) {
87    context_storage_.set_http_server_properties(
88        scoped_ptr<HttpServerProperties>(new HttpServerPropertiesImpl()));
89  }
90  if (!transport_security_state()) {
91    context_storage_.set_transport_security_state(
92        new TransportSecurityState());
93  }
94  if (http_transaction_factory()) {
95    // Make sure we haven't been passed an object we're not going to use.
96    EXPECT_FALSE(client_socket_factory_);
97  } else {
98    HttpNetworkSession::Params params;
99    if (http_network_session_params_)
100      params = *http_network_session_params_;
101    params.client_socket_factory = client_socket_factory();
102    params.host_resolver = host_resolver();
103    params.cert_verifier = cert_verifier();
104    params.transport_security_state = transport_security_state();
105    params.proxy_service = proxy_service();
106    params.ssl_config_service = ssl_config_service();
107    params.http_auth_handler_factory = http_auth_handler_factory();
108    params.network_delegate = network_delegate();
109    params.http_server_properties = http_server_properties();
110    params.net_log = net_log();
111    context_storage_.set_http_transaction_factory(new HttpCache(
112        new HttpNetworkSession(params),
113        HttpCache::DefaultBackend::InMemory(0)));
114  }
115  // In-memory cookie store.
116  if (!cookie_store())
117    context_storage_.set_cookie_store(new CookieMonster(NULL, NULL));
118  // In-memory Channel ID service.
119  if (!channel_id_service()) {
120    context_storage_.set_channel_id_service(
121        new ChannelIDService(
122            new DefaultChannelIDStore(NULL),
123            base::WorkerPool::GetTaskRunner(true)));
124  }
125  if (!http_user_agent_settings()) {
126    context_storage_.set_http_user_agent_settings(
127        new StaticHttpUserAgentSettings("en-us,fr", std::string()));
128  }
129  if (!job_factory())
130    context_storage_.set_job_factory(new URLRequestJobFactoryImpl);
131}
132
133TestURLRequest::TestURLRequest(const GURL& url,
134                               RequestPriority priority,
135                               Delegate* delegate,
136                               TestURLRequestContext* context)
137    : URLRequest(url, priority, delegate, context) {}
138
139TestURLRequest::~TestURLRequest() {
140}
141
142TestURLRequestContextGetter::TestURLRequestContextGetter(
143    const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner)
144    : network_task_runner_(network_task_runner) {
145  DCHECK(network_task_runner_.get());
146}
147
148TestURLRequestContextGetter::TestURLRequestContextGetter(
149    const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner,
150    scoped_ptr<TestURLRequestContext> context)
151    : network_task_runner_(network_task_runner), context_(context.Pass()) {
152  DCHECK(network_task_runner_.get());
153}
154
155TestURLRequestContextGetter::~TestURLRequestContextGetter() {}
156
157TestURLRequestContext* TestURLRequestContextGetter::GetURLRequestContext() {
158  if (!context_.get())
159    context_.reset(new TestURLRequestContext);
160  return context_.get();
161}
162
163scoped_refptr<base::SingleThreadTaskRunner>
164TestURLRequestContextGetter::GetNetworkTaskRunner() const {
165  return network_task_runner_;
166}
167
168TestDelegate::TestDelegate()
169    : cancel_in_rr_(false),
170      cancel_in_rs_(false),
171      cancel_in_rd_(false),
172      cancel_in_rd_pending_(false),
173      quit_on_complete_(true),
174      quit_on_redirect_(false),
175      quit_on_before_network_start_(false),
176      allow_certificate_errors_(false),
177      response_started_count_(0),
178      received_bytes_count_(0),
179      received_redirect_count_(0),
180      received_before_network_start_count_(0),
181      received_data_before_response_(false),
182      request_failed_(false),
183      have_certificate_errors_(false),
184      certificate_errors_are_fatal_(false),
185      auth_required_(false),
186      have_full_request_headers_(false),
187      buf_(new IOBuffer(kBufferSize)) {
188}
189
190TestDelegate::~TestDelegate() {}
191
192void TestDelegate::ClearFullRequestHeaders() {
193  full_request_headers_.Clear();
194  have_full_request_headers_ = false;
195}
196
197void TestDelegate::OnReceivedRedirect(URLRequest* request,
198                                      const GURL& new_url,
199                                      bool* defer_redirect) {
200  EXPECT_TRUE(request->is_redirecting());
201
202  have_full_request_headers_ =
203      request->GetFullRequestHeaders(&full_request_headers_);
204
205  received_redirect_count_++;
206  if (quit_on_redirect_) {
207    *defer_redirect = true;
208    base::MessageLoop::current()->PostTask(FROM_HERE,
209                                           base::MessageLoop::QuitClosure());
210  } else if (cancel_in_rr_) {
211    request->Cancel();
212  }
213}
214
215void TestDelegate::OnBeforeNetworkStart(URLRequest* request, bool* defer) {
216  received_before_network_start_count_++;
217  if (quit_on_before_network_start_) {
218    *defer = true;
219    base::MessageLoop::current()->PostTask(FROM_HERE,
220                                           base::MessageLoop::QuitClosure());
221  }
222}
223
224void TestDelegate::OnAuthRequired(URLRequest* request,
225                                  AuthChallengeInfo* auth_info) {
226  auth_required_ = true;
227  if (!credentials_.Empty()) {
228    request->SetAuth(credentials_);
229  } else {
230    request->CancelAuth();
231  }
232}
233
234void TestDelegate::OnSSLCertificateError(URLRequest* request,
235                                         const SSLInfo& ssl_info,
236                                         bool fatal) {
237  // The caller can control whether it needs all SSL requests to go through,
238  // independent of any possible errors, or whether it wants SSL errors to
239  // cancel the request.
240  have_certificate_errors_ = true;
241  certificate_errors_are_fatal_ = fatal;
242  if (allow_certificate_errors_)
243    request->ContinueDespiteLastError();
244  else
245    request->Cancel();
246}
247
248void TestDelegate::OnResponseStarted(URLRequest* request) {
249  // It doesn't make sense for the request to have IO pending at this point.
250  DCHECK(!request->status().is_io_pending());
251  EXPECT_FALSE(request->is_redirecting());
252
253  have_full_request_headers_ =
254      request->GetFullRequestHeaders(&full_request_headers_);
255
256  response_started_count_++;
257  if (cancel_in_rs_) {
258    request->Cancel();
259    OnResponseCompleted(request);
260  } else if (!request->status().is_success()) {
261    DCHECK(request->status().status() == URLRequestStatus::FAILED ||
262           request->status().status() == URLRequestStatus::CANCELED);
263    request_failed_ = true;
264    OnResponseCompleted(request);
265  } else {
266    // Initiate the first read.
267    int bytes_read = 0;
268    if (request->Read(buf_.get(), kBufferSize, &bytes_read))
269      OnReadCompleted(request, bytes_read);
270    else if (!request->status().is_io_pending())
271      OnResponseCompleted(request);
272  }
273}
274
275void TestDelegate::OnReadCompleted(URLRequest* request, int bytes_read) {
276  // It doesn't make sense for the request to have IO pending at this point.
277  DCHECK(!request->status().is_io_pending());
278
279  if (response_started_count_ == 0)
280    received_data_before_response_ = true;
281
282  if (cancel_in_rd_)
283    request->Cancel();
284
285  if (bytes_read >= 0) {
286    // There is data to read.
287    received_bytes_count_ += bytes_read;
288
289    // consume the data
290    data_received_.append(buf_->data(), bytes_read);
291  }
292
293  // If it was not end of stream, request to read more.
294  if (request->status().is_success() && bytes_read > 0) {
295    bytes_read = 0;
296    while (request->Read(buf_.get(), kBufferSize, &bytes_read)) {
297      if (bytes_read > 0) {
298        data_received_.append(buf_->data(), bytes_read);
299        received_bytes_count_ += bytes_read;
300      } else {
301        break;
302      }
303    }
304  }
305  if (!request->status().is_io_pending())
306    OnResponseCompleted(request);
307  else if (cancel_in_rd_pending_)
308    request->Cancel();
309}
310
311void TestDelegate::OnResponseCompleted(URLRequest* request) {
312  if (quit_on_complete_)
313    base::MessageLoop::current()->PostTask(FROM_HERE,
314                                           base::MessageLoop::QuitClosure());
315}
316
317TestNetworkDelegate::TestNetworkDelegate()
318    : last_error_(0),
319      error_count_(0),
320      created_requests_(0),
321      destroyed_requests_(0),
322      completed_requests_(0),
323      canceled_requests_(0),
324      cookie_options_bit_mask_(0),
325      blocked_get_cookies_count_(0),
326      blocked_set_cookie_count_(0),
327      set_cookie_count_(0),
328      observed_before_proxy_headers_sent_callbacks_(0),
329      has_load_timing_info_before_redirect_(false),
330      has_load_timing_info_before_auth_(false),
331      can_access_files_(true),
332      can_throttle_requests_(true) {
333}
334
335TestNetworkDelegate::~TestNetworkDelegate() {
336  for (std::map<int, int>::iterator i = next_states_.begin();
337       i != next_states_.end(); ++i) {
338    event_order_[i->first] += "~TestNetworkDelegate\n";
339    EXPECT_TRUE(i->second & kStageDestruction) << event_order_[i->first];
340  }
341}
342
343bool TestNetworkDelegate::GetLoadTimingInfoBeforeRedirect(
344    LoadTimingInfo* load_timing_info_before_redirect) const {
345  *load_timing_info_before_redirect = load_timing_info_before_redirect_;
346  return has_load_timing_info_before_redirect_;
347}
348
349bool TestNetworkDelegate::GetLoadTimingInfoBeforeAuth(
350    LoadTimingInfo* load_timing_info_before_auth) const {
351  *load_timing_info_before_auth = load_timing_info_before_auth_;
352  return has_load_timing_info_before_auth_;
353}
354
355void TestNetworkDelegate::InitRequestStatesIfNew(int request_id) {
356  if (next_states_.find(request_id) == next_states_.end()) {
357    // TODO(davidben): Although the URLRequest documentation does not allow
358    // calling Cancel() before Start(), the ResourceLoader does so. URLRequest's
359    // destructor also calls Cancel. Either officially support this or fix the
360    // ResourceLoader code.
361    next_states_[request_id] = kStageBeforeURLRequest | kStageCompletedError;
362    event_order_[request_id] = "";
363  }
364}
365
366int TestNetworkDelegate::OnBeforeURLRequest(
367    URLRequest* request,
368    const CompletionCallback& callback,
369    GURL* new_url ) {
370  int req_id = request->identifier();
371  InitRequestStatesIfNew(req_id);
372  event_order_[req_id] += "OnBeforeURLRequest\n";
373  EXPECT_TRUE(next_states_[req_id] & kStageBeforeURLRequest) <<
374      event_order_[req_id];
375  next_states_[req_id] =
376      kStageBeforeSendHeaders |
377      kStageResponseStarted |  // data: URLs do not trigger sending headers
378      kStageBeforeRedirect |  // a delegate can trigger a redirection
379      kStageCompletedError |  // request canceled by delegate
380      kStageAuthRequired;  // Auth can come next for FTP requests
381  created_requests_++;
382  return OK;
383}
384
385int TestNetworkDelegate::OnBeforeSendHeaders(
386    URLRequest* request,
387    const CompletionCallback& callback,
388    HttpRequestHeaders* headers) {
389  int req_id = request->identifier();
390  InitRequestStatesIfNew(req_id);
391  event_order_[req_id] += "OnBeforeSendHeaders\n";
392  EXPECT_TRUE(next_states_[req_id] & kStageBeforeSendHeaders) <<
393      event_order_[req_id];
394  next_states_[req_id] =
395      kStageSendHeaders |
396      kStageCompletedError;  // request canceled by delegate
397
398  return OK;
399}
400
401void TestNetworkDelegate::OnBeforeSendProxyHeaders(
402    net::URLRequest* request,
403    const net::ProxyInfo& proxy_info,
404    net::HttpRequestHeaders* headers) {
405  ++observed_before_proxy_headers_sent_callbacks_;
406  last_observed_proxy_ = proxy_info.proxy_server().host_port_pair();
407}
408
409void TestNetworkDelegate::OnSendHeaders(
410    URLRequest* request,
411    const HttpRequestHeaders& headers) {
412  int req_id = request->identifier();
413  InitRequestStatesIfNew(req_id);
414  event_order_[req_id] += "OnSendHeaders\n";
415  EXPECT_TRUE(next_states_[req_id] & kStageSendHeaders) <<
416      event_order_[req_id];
417  next_states_[req_id] =
418      kStageHeadersReceived |
419      kStageCompletedError;
420}
421
422int TestNetworkDelegate::OnHeadersReceived(
423    URLRequest* request,
424    const CompletionCallback& callback,
425    const HttpResponseHeaders* original_response_headers,
426    scoped_refptr<HttpResponseHeaders>* override_response_headers,
427    GURL* allowed_unsafe_redirect_url) {
428  int req_id = request->identifier();
429  event_order_[req_id] += "OnHeadersReceived\n";
430  InitRequestStatesIfNew(req_id);
431  EXPECT_TRUE(next_states_[req_id] & kStageHeadersReceived) <<
432      event_order_[req_id];
433  next_states_[req_id] =
434      kStageBeforeRedirect |
435      kStageResponseStarted |
436      kStageAuthRequired |
437      kStageCompletedError;  // e.g. proxy resolution problem
438
439  // Basic authentication sends a second request from the URLRequestHttpJob
440  // layer before the URLRequest reports that a response has started.
441  next_states_[req_id] |= kStageBeforeSendHeaders;
442
443  if (!redirect_on_headers_received_url_.is_empty()) {
444    *override_response_headers =
445        new net::HttpResponseHeaders(original_response_headers->raw_headers());
446    (*override_response_headers)->ReplaceStatusLine("HTTP/1.1 302 Found");
447    (*override_response_headers)->RemoveHeader("Location");
448    (*override_response_headers)->AddHeader(
449        "Location: " + redirect_on_headers_received_url_.spec());
450
451    redirect_on_headers_received_url_ = GURL();
452
453    if (!allowed_unsafe_redirect_url_.is_empty())
454      *allowed_unsafe_redirect_url = allowed_unsafe_redirect_url_;
455  }
456
457  return OK;
458}
459
460void TestNetworkDelegate::OnBeforeRedirect(URLRequest* request,
461                                           const GURL& new_location) {
462  load_timing_info_before_redirect_ = LoadTimingInfo();
463  request->GetLoadTimingInfo(&load_timing_info_before_redirect_);
464  has_load_timing_info_before_redirect_ = true;
465  EXPECT_FALSE(load_timing_info_before_redirect_.request_start_time.is_null());
466  EXPECT_FALSE(load_timing_info_before_redirect_.request_start.is_null());
467
468  int req_id = request->identifier();
469  InitRequestStatesIfNew(req_id);
470  event_order_[req_id] += "OnBeforeRedirect\n";
471  EXPECT_TRUE(next_states_[req_id] & kStageBeforeRedirect) <<
472      event_order_[req_id];
473  next_states_[req_id] =
474      kStageBeforeURLRequest |  // HTTP redirects trigger this.
475      kStageBeforeSendHeaders |  // Redirects from the network delegate do not
476                                 // trigger onBeforeURLRequest.
477      kStageCompletedError;
478
479  // A redirect can lead to a file or a data URL. In this case, we do not send
480  // headers.
481  next_states_[req_id] |= kStageResponseStarted;
482}
483
484void TestNetworkDelegate::OnResponseStarted(URLRequest* request) {
485  LoadTimingInfo load_timing_info;
486  request->GetLoadTimingInfo(&load_timing_info);
487  EXPECT_FALSE(load_timing_info.request_start_time.is_null());
488  EXPECT_FALSE(load_timing_info.request_start.is_null());
489
490  int req_id = request->identifier();
491  InitRequestStatesIfNew(req_id);
492  event_order_[req_id] += "OnResponseStarted\n";
493  EXPECT_TRUE(next_states_[req_id] & kStageResponseStarted) <<
494      event_order_[req_id];
495  next_states_[req_id] = kStageCompletedSuccess | kStageCompletedError;
496  if (request->status().status() == URLRequestStatus::FAILED) {
497    error_count_++;
498    last_error_ = request->status().error();
499  }
500}
501
502void TestNetworkDelegate::OnRawBytesRead(const URLRequest& request,
503                                         int bytes_read) {
504}
505
506void TestNetworkDelegate::OnCompleted(URLRequest* request, bool started) {
507  int req_id = request->identifier();
508  InitRequestStatesIfNew(req_id);
509  event_order_[req_id] += "OnCompleted\n";
510  // Expect "Success -> (next_states_ & kStageCompletedSuccess)"
511  // is logically identical to
512  // Expect "!(Success) || (next_states_ & kStageCompletedSuccess)"
513  EXPECT_TRUE(!request->status().is_success() ||
514              (next_states_[req_id] & kStageCompletedSuccess)) <<
515      event_order_[req_id];
516  EXPECT_TRUE(request->status().is_success() ||
517              (next_states_[req_id] & kStageCompletedError)) <<
518      event_order_[req_id];
519  next_states_[req_id] = kStageURLRequestDestroyed;
520  completed_requests_++;
521  if (request->status().status() == URLRequestStatus::FAILED) {
522    error_count_++;
523    last_error_ = request->status().error();
524  } else if (request->status().status() == URLRequestStatus::CANCELED) {
525    canceled_requests_++;
526  } else {
527    DCHECK_EQ(URLRequestStatus::SUCCESS, request->status().status());
528  }
529}
530
531void TestNetworkDelegate::OnURLRequestDestroyed(URLRequest* request) {
532  int req_id = request->identifier();
533  InitRequestStatesIfNew(req_id);
534  event_order_[req_id] += "OnURLRequestDestroyed\n";
535  EXPECT_TRUE(next_states_[req_id] & kStageURLRequestDestroyed) <<
536      event_order_[req_id];
537  next_states_[req_id] = kStageDestruction;
538  destroyed_requests_++;
539}
540
541void TestNetworkDelegate::OnPACScriptError(int line_number,
542                                           const base::string16& error) {
543}
544
545NetworkDelegate::AuthRequiredResponse TestNetworkDelegate::OnAuthRequired(
546    URLRequest* request,
547    const AuthChallengeInfo& auth_info,
548    const AuthCallback& callback,
549    AuthCredentials* credentials) {
550  load_timing_info_before_auth_ = LoadTimingInfo();
551  request->GetLoadTimingInfo(&load_timing_info_before_auth_);
552  has_load_timing_info_before_auth_ = true;
553  EXPECT_FALSE(load_timing_info_before_auth_.request_start_time.is_null());
554  EXPECT_FALSE(load_timing_info_before_auth_.request_start.is_null());
555
556  int req_id = request->identifier();
557  InitRequestStatesIfNew(req_id);
558  event_order_[req_id] += "OnAuthRequired\n";
559  EXPECT_TRUE(next_states_[req_id] & kStageAuthRequired) <<
560      event_order_[req_id];
561  next_states_[req_id] = kStageBeforeSendHeaders |
562      kStageAuthRequired |  // For example, proxy auth followed by server auth.
563      kStageHeadersReceived |  // Request canceled by delegate simulates empty
564                               // response.
565      kStageResponseStarted |  // data: URLs do not trigger sending headers
566      kStageBeforeRedirect |   // a delegate can trigger a redirection
567      kStageCompletedError;    // request cancelled before callback
568  return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
569}
570
571bool TestNetworkDelegate::OnCanGetCookies(const URLRequest& request,
572                                          const CookieList& cookie_list) {
573  bool allow = true;
574  if (cookie_options_bit_mask_ & NO_GET_COOKIES)
575    allow = false;
576
577  if (!allow) {
578    blocked_get_cookies_count_++;
579  }
580
581  return allow;
582}
583
584bool TestNetworkDelegate::OnCanSetCookie(const URLRequest& request,
585                                         const std::string& cookie_line,
586                                         CookieOptions* options) {
587  bool allow = true;
588  if (cookie_options_bit_mask_ & NO_SET_COOKIE)
589    allow = false;
590
591  if (!allow) {
592    blocked_set_cookie_count_++;
593  } else {
594    set_cookie_count_++;
595  }
596
597  return allow;
598}
599
600bool TestNetworkDelegate::OnCanAccessFile(const URLRequest& request,
601                                          const base::FilePath& path) const {
602  return can_access_files_;
603}
604
605bool TestNetworkDelegate::OnCanThrottleRequest(
606    const URLRequest& request) const {
607  return can_throttle_requests_;
608}
609
610int TestNetworkDelegate::OnBeforeSocketStreamConnect(
611    SocketStream* socket,
612    const CompletionCallback& callback) {
613  return OK;
614}
615
616// static
617std::string ScopedCustomUrlRequestTestHttpHost::value_("127.0.0.1");
618
619ScopedCustomUrlRequestTestHttpHost::ScopedCustomUrlRequestTestHttpHost(
620  const std::string& new_value)
621    : old_value_(value_),
622      new_value_(new_value) {
623  value_ = new_value_;
624}
625
626ScopedCustomUrlRequestTestHttpHost::~ScopedCustomUrlRequestTestHttpHost() {
627  DCHECK_EQ(value_, new_value_);
628  value_ = old_value_;
629}
630
631// static
632const std::string& ScopedCustomUrlRequestTestHttpHost::value() {
633  return value_;
634}
635
636TestJobInterceptor::TestJobInterceptor() : main_intercept_job_(NULL) {
637}
638
639URLRequestJob* TestJobInterceptor::MaybeCreateJob(
640    URLRequest* request,
641    NetworkDelegate* network_delegate) const {
642  URLRequestJob* job = main_intercept_job_;
643  main_intercept_job_ = NULL;
644  return job;
645}
646
647void TestJobInterceptor::set_main_intercept_job(URLRequestJob* job) {
648  main_intercept_job_ = job;
649}
650
651}  // namespace net
652