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.
5 #include "net/url_request/url_request_filter.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "net/base/request_priority.h"
9 #include "net/url_request/url_request.h"
10 #include "net/url_request/url_request_context.h"
11 #include "net/url_request/url_request_job.h"
12 #include "net/url_request/url_request_job_factory.h"
13 #include "net/url_request/url_request_test_job.h"
14 #include "net/url_request/url_request_test_util.h"
15 #include "testing/gtest/include/gtest/gtest.h"
21 URLRequestTestJob* job_a;
23 URLRequestJob* FactoryA(URLRequest* request,
24 NetworkDelegate* network_delegate,
25 const std::string& scheme) {
26 job_a = new URLRequestTestJob(request, network_delegate);
30 URLRequestTestJob* job_b;
32 URLRequestJob* FactoryB(URLRequest* request,
33 NetworkDelegate* network_delegate,
34 const std::string& scheme) {
35 job_b = new URLRequestTestJob(request, network_delegate);
39 URLRequestTestJob* job_c;
41 class TestProtocolHandler : public URLRequestJobFactory::ProtocolHandler {
43 virtual ~TestProtocolHandler() {}
45 virtual URLRequestJob* MaybeCreateJob(
46 URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE {
47 job_c = new URLRequestTestJob(request, network_delegate);
52 TEST(URLRequestFilter, BasicMatching) {
53 TestDelegate delegate;
54 TestURLRequestContext request_context;
56 GURL url_1("http://foo.com/");
57 TestURLRequest request_1(
58 url_1, DEFAULT_PRIORITY, &delegate, &request_context);
60 GURL url_2("http://bar.com/");
61 TestURLRequest request_2(
62 url_2, DEFAULT_PRIORITY, &delegate, &request_context);
64 // Check AddUrlHandler checks for invalid URLs.
65 EXPECT_FALSE(URLRequestFilter::GetInstance()->AddUrlHandler(GURL(),
68 // Check URL matching.
69 URLRequestFilter::GetInstance()->ClearHandlers();
70 EXPECT_TRUE(URLRequestFilter::GetInstance()->AddUrlHandler(url_1,
73 scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory(
74 &request_1, NULL, url_1.scheme());
75 EXPECT_EQ(job_a, found);
76 EXPECT_TRUE(job_a != NULL);
79 EXPECT_EQ(URLRequestFilter::GetInstance()->hit_count(), 1);
81 // Check we don't match other URLs.
82 EXPECT_TRUE(URLRequestFilter::Factory(
83 &request_2, NULL, url_2.scheme()) == NULL);
84 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
86 // Check we can remove URL matching.
87 URLRequestFilter::GetInstance()->RemoveUrlHandler(url_1);
88 EXPECT_TRUE(URLRequestFilter::Factory(
89 &request_1, NULL, url_1.scheme()) == NULL);
90 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
92 // Check hostname matching.
93 URLRequestFilter::GetInstance()->ClearHandlers();
94 EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count());
95 URLRequestFilter::GetInstance()->AddHostnameHandler(url_1.scheme(),
99 scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory(
100 &request_1, NULL, url_1.scheme());
101 EXPECT_EQ(job_b, found);
102 EXPECT_TRUE(job_b != NULL);
105 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
107 // Check we don't match other hostnames.
108 EXPECT_TRUE(URLRequestFilter::Factory(
109 &request_2, NULL, url_2.scheme()) == NULL);
110 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
112 // Check we can remove hostname matching.
113 URLRequestFilter::GetInstance()->RemoveHostnameHandler(url_1.scheme(),
115 EXPECT_TRUE(URLRequestFilter::Factory(
116 &request_1, NULL, url_1.scheme()) == NULL);
117 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
119 // Check ProtocolHandler hostname matching.
120 URLRequestFilter::GetInstance()->ClearHandlers();
121 EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count());
122 URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
123 url_1.scheme(), url_1.host(),
124 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(
125 new TestProtocolHandler()));
127 scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory(
128 &request_1, NULL, url_1.scheme());
129 EXPECT_EQ(job_c, found);
130 EXPECT_TRUE(job_c != NULL);
133 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
135 // Check ProtocolHandler URL matching.
136 URLRequestFilter::GetInstance()->ClearHandlers();
137 EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count());
138 URLRequestFilter::GetInstance()->AddUrlProtocolHandler(
140 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(
141 new TestProtocolHandler()));
143 scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory(
144 &request_2, NULL, url_2.scheme());
145 EXPECT_EQ(job_c, found);
146 EXPECT_TRUE(job_c != NULL);
149 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count());
151 URLRequestFilter::GetInstance()->ClearHandlers();