url_request_filter_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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_filter.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "net/url_request/url_request.h"
9#include "net/url_request/url_request_context.h"
10#include "net/url_request/url_request_job.h"
11#include "net/url_request/url_request_job_factory.h"
12#include "net/url_request/url_request_test_job.h"
13#include "net/url_request/url_request_test_util.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace net {
17
18namespace {
19
20URLRequestTestJob* job_a;
21
22URLRequestJob* FactoryA(URLRequest* request,
23                        NetworkDelegate* network_delegate,
24                        const std::string& scheme) {
25  job_a = new URLRequestTestJob(request, network_delegate);
26  return job_a;
27}
28
29URLRequestTestJob* job_b;
30
31URLRequestJob* FactoryB(URLRequest* request,
32                        NetworkDelegate* network_delegate,
33                        const std::string& scheme) {
34  job_b = new URLRequestTestJob(request, network_delegate);
35  return job_b;
36}
37
38URLRequestTestJob* job_c;
39
40class TestProtocolHandler : public URLRequestJobFactory::ProtocolHandler {
41 public:
42  virtual ~TestProtocolHandler() {}
43
44  virtual URLRequestJob* MaybeCreateJob(
45      URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE {
46    job_c = new URLRequestTestJob(request, network_delegate);
47    return job_c;
48  }
49};
50
51TEST(URLRequestFilter, BasicMatching) {
52  TestDelegate delegate;
53  TestURLRequestContext request_context;
54
55  GURL url_1("http://foo.com/");
56  TestURLRequest request_1(url_1, &delegate, &request_context, NULL);
57
58  GURL url_2("http://bar.com/");
59  TestURLRequest request_2(url_2, &delegate, &request_context, NULL);
60
61  // Check AddUrlHandler checks for invalid URLs.
62  EXPECT_FALSE(URLRequestFilter::GetInstance()->AddUrlHandler(GURL(),
63                                                              &FactoryA));
64
65  // Check URL matching.
66  URLRequestFilter::GetInstance()->ClearHandlers();
67  EXPECT_TRUE(URLRequestFilter::GetInstance()->AddUrlHandler(url_1,
68                                                             &FactoryA));
69  {
70    scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory(
71        &request_1, NULL, url_1.scheme());
72    EXPECT_EQ(job_a, found);
73    EXPECT_TRUE(job_a != NULL);
74    job_a = NULL;
75  }
76  EXPECT_EQ(URLRequestFilter::GetInstance()->hit_count(), 1);
77
78  // Check we don't match other URLs.
79  EXPECT_TRUE(URLRequestFilter::Factory(
80      &request_2, NULL, url_2.scheme()) == NULL);
81  EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
82
83  // Check we can remove URL matching.
84  URLRequestFilter::GetInstance()->RemoveUrlHandler(url_1);
85  EXPECT_TRUE(URLRequestFilter::Factory(
86      &request_1, NULL, url_1.scheme()) == NULL);
87  EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
88
89  // Check hostname matching.
90  URLRequestFilter::GetInstance()->ClearHandlers();
91  EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count());
92  URLRequestFilter::GetInstance()->AddHostnameHandler(url_1.scheme(),
93                                                      url_1.host(),
94                                                      &FactoryB);
95  {
96    scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory(
97        &request_1, NULL, url_1.scheme());
98    EXPECT_EQ(job_b, found);
99    EXPECT_TRUE(job_b != NULL);
100    job_b = NULL;
101  }
102  EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
103
104  // Check we don't match other hostnames.
105  EXPECT_TRUE(URLRequestFilter::Factory(
106      &request_2, NULL, url_2.scheme()) == NULL);
107  EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
108
109  // Check we can remove hostname matching.
110  URLRequestFilter::GetInstance()->RemoveHostnameHandler(url_1.scheme(),
111                                                         url_1.host());
112  EXPECT_TRUE(URLRequestFilter::Factory(
113      &request_1, NULL, url_1.scheme()) == NULL);
114  EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
115
116  // Check ProtocolHandler hostname matching.
117  URLRequestFilter::GetInstance()->ClearHandlers();
118  EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count());
119  URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
120      url_1.scheme(), url_1.host(),
121      scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(
122          new TestProtocolHandler()));
123  {
124    scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory(
125        &request_1, NULL, url_1.scheme());
126    EXPECT_EQ(job_c, found);
127    EXPECT_TRUE(job_c != NULL);
128    job_c = NULL;
129  }
130  EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
131
132  // Check ProtocolHandler URL matching.
133  URLRequestFilter::GetInstance()->ClearHandlers();
134  EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count());
135  URLRequestFilter::GetInstance()->AddUrlProtocolHandler(
136      url_2,
137      scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(
138          new TestProtocolHandler()));
139  {
140    scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory(
141        &request_2, NULL, url_2.scheme());
142    EXPECT_EQ(job_c, found);
143    EXPECT_TRUE(job_c != NULL);
144    job_c = NULL;
145  }
146  EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
147
148  URLRequestFilter::GetInstance()->ClearHandlers();
149}
150
151}  // namespace
152
153}  // namespace net
154