url_request_job_factory_impl_unittest.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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_job_factory_impl.h"
6
7#include "base/bind.h"
8#include "base/memory/weak_ptr.h"
9#include "net/url_request/url_request.h"
10#include "net/url_request/url_request_job.h"
11#include "net/url_request/url_request_test_util.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14namespace net {
15
16namespace {
17
18class MockURLRequestJob : public URLRequestJob {
19 public:
20  MockURLRequestJob(URLRequest* request,
21                    NetworkDelegate* network_delegate,
22                    const URLRequestStatus& status)
23      : URLRequestJob(request, network_delegate),
24        status_(status),
25        weak_factory_(this) {}
26
27  virtual void Start() OVERRIDE {
28    // Start reading asynchronously so that all error reporting and data
29    // callbacks happen as they would for network requests.
30    base::MessageLoop::current()->PostTask(
31        FROM_HERE,
32        base::Bind(&MockURLRequestJob::StartAsync, weak_factory_.GetWeakPtr()));
33  }
34
35 protected:
36  virtual ~MockURLRequestJob() {}
37
38 private:
39  void StartAsync() {
40    SetStatus(status_);
41    NotifyHeadersComplete();
42  }
43
44  URLRequestStatus status_;
45  base::WeakPtrFactory<MockURLRequestJob> weak_factory_;
46};
47
48class DummyProtocolHandler : public URLRequestJobFactory::ProtocolHandler {
49 public:
50  virtual URLRequestJob* MaybeCreateJob(
51      URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE {
52    return new MockURLRequestJob(
53        request,
54        network_delegate,
55        URLRequestStatus(URLRequestStatus::SUCCESS, OK));
56  }
57};
58
59TEST(URLRequestJobFactoryTest, NoProtocolHandler) {
60  TestDelegate delegate;
61  TestURLRequestContext request_context;
62  TestURLRequest request(GURL("foo://bar"), &delegate, &request_context, NULL);
63  request.Start();
64
65  base::MessageLoop::current()->Run();
66  EXPECT_EQ(URLRequestStatus::FAILED, request.status().status());
67  EXPECT_EQ(ERR_UNKNOWN_URL_SCHEME, request.status().error());
68}
69
70TEST(URLRequestJobFactoryTest, BasicProtocolHandler) {
71  TestDelegate delegate;
72  URLRequestJobFactoryImpl job_factory;
73  TestURLRequestContext request_context;
74  request_context.set_job_factory(&job_factory);
75  job_factory.SetProtocolHandler("foo", new DummyProtocolHandler);
76  TestURLRequest request(GURL("foo://bar"), &delegate, &request_context, NULL);
77  request.Start();
78
79  base::MessageLoop::current()->Run();
80  EXPECT_EQ(URLRequestStatus::SUCCESS, request.status().status());
81  EXPECT_EQ(OK, request.status().error());
82}
83
84TEST(URLRequestJobFactoryTest, DeleteProtocolHandler) {
85  URLRequestJobFactoryImpl job_factory;
86  TestURLRequestContext request_context;
87  request_context.set_job_factory(&job_factory);
88  job_factory.SetProtocolHandler("foo", new DummyProtocolHandler);
89  job_factory.SetProtocolHandler("foo", NULL);
90}
91
92}  // namespace
93
94}  // namespace net
95