blob: 48a3cef796280c27b1b29fe5f7ba64fcc8ec5bad [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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"
Torne (Richard Coles)0f1bc082013-11-06 12:27:47 +00008#include "net/base/request_priority.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +00009#include "net/url_request/url_request.h"
10#include "net/url_request/url_request_context.h"
Torne (Richard Coles)46d4c2b2014-06-09 12:00:27 +010011#include "net/url_request/url_request_interceptor.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000012#include "net/url_request/url_request_job.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000013#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"
16
17namespace net {
18
19namespace {
20
21URLRequestTestJob* job_a;
22
23URLRequestJob* FactoryA(URLRequest* request,
24 NetworkDelegate* network_delegate,
25 const std::string& scheme) {
26 job_a = new URLRequestTestJob(request, network_delegate);
27 return job_a;
28}
29
30URLRequestTestJob* job_b;
31
32URLRequestJob* FactoryB(URLRequest* request,
33 NetworkDelegate* network_delegate,
34 const std::string& scheme) {
35 job_b = new URLRequestTestJob(request, network_delegate);
36 return job_b;
37}
38
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000039URLRequestTestJob* job_c;
40
Torne (Richard Coles)46d4c2b2014-06-09 12:00:27 +010041class TestURLRequestInterceptor : public URLRequestInterceptor {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000042 public:
Torne (Richard Coles)46d4c2b2014-06-09 12:00:27 +010043 virtual ~TestURLRequestInterceptor() {}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000044
Torne (Richard Coles)46d4c2b2014-06-09 12:00:27 +010045 virtual URLRequestJob* MaybeInterceptRequest(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000046 URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE {
47 job_c = new URLRequestTestJob(request, network_delegate);
48 return job_c;
49 }
50};
51
Torne (Richard Coles)58218062012-11-14 11:43:16 +000052TEST(URLRequestFilter, BasicMatching) {
53 TestDelegate delegate;
54 TestURLRequestContext request_context;
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010055 URLRequestFilter* filter = URLRequestFilter::GetInstance();
Torne (Richard Coles)58218062012-11-14 11:43:16 +000056
57 GURL url_1("http://foo.com/");
Torne (Richard Coles)0f1bc082013-11-06 12:27:47 +000058 TestURLRequest request_1(
59 url_1, DEFAULT_PRIORITY, &delegate, &request_context);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000060
61 GURL url_2("http://bar.com/");
Torne (Richard Coles)0f1bc082013-11-06 12:27:47 +000062 TestURLRequest request_2(
63 url_2, DEFAULT_PRIORITY, &delegate, &request_context);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000064
65 // Check AddUrlHandler checks for invalid URLs.
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010066 EXPECT_FALSE(filter->AddUrlHandler(GURL(), &FactoryA));
Torne (Richard Coles)58218062012-11-14 11:43:16 +000067
68 // Check URL matching.
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010069 filter->ClearHandlers();
70 EXPECT_TRUE(filter->AddUrlHandler(url_1, &FactoryA));
Torne (Richard Coles)58218062012-11-14 11:43:16 +000071 {
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010072 scoped_refptr<URLRequestJob> found =
73 filter->MaybeInterceptRequest(&request_1, NULL);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000074 EXPECT_EQ(job_a, found);
75 EXPECT_TRUE(job_a != NULL);
76 job_a = NULL;
77 }
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010078 EXPECT_EQ(filter->hit_count(), 1);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000079
80 // Check we don't match other URLs.
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010081 EXPECT_TRUE(filter->MaybeInterceptRequest(&request_2, NULL) == NULL);
82 EXPECT_EQ(1, filter->hit_count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +000083
Torne (Richard Coles)58218062012-11-14 11:43:16 +000084 // Check we can remove URL matching.
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010085 filter->RemoveUrlHandler(url_1);
86 EXPECT_TRUE(filter->MaybeInterceptRequest(&request_1, NULL) == NULL);
87 EXPECT_EQ(1, filter->hit_count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +000088
89 // Check hostname matching.
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010090 filter->ClearHandlers();
91 EXPECT_EQ(0, filter->hit_count());
92 filter->AddHostnameHandler(url_1.scheme(), url_1.host(), &FactoryB);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000093 {
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +010094 scoped_refptr<URLRequestJob> found =
95 filter->MaybeInterceptRequest(&request_1, NULL);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000096 EXPECT_EQ(job_b, found);
97 EXPECT_TRUE(job_b != NULL);
98 job_b = NULL;
99 }
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100100 EXPECT_EQ(1, filter->hit_count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000101
102 // Check we don't match other hostnames.
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100103 EXPECT_TRUE(filter->MaybeInterceptRequest(&request_2, NULL) == NULL);
104 EXPECT_EQ(1, filter->hit_count());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000105
106 // Check we can remove hostname matching.
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100107 filter->RemoveHostnameHandler(url_1.scheme(), url_1.host());
108 EXPECT_TRUE(filter->MaybeInterceptRequest(&request_1, NULL) == NULL);
109 EXPECT_EQ(1, filter->hit_count());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000110
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100111 // Check URLRequestInterceptor hostname matching.
112 filter->ClearHandlers();
113 EXPECT_EQ(0, filter->hit_count());
114 filter->AddHostnameInterceptor(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000115 url_1.scheme(), url_1.host(),
Torne (Richard Coles)46d4c2b2014-06-09 12:00:27 +0100116 scoped_ptr<net::URLRequestInterceptor>(new TestURLRequestInterceptor()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000117 {
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100118 scoped_refptr<URLRequestJob> found =
119 filter->MaybeInterceptRequest(&request_1, NULL);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000120 EXPECT_EQ(job_c, found);
121 EXPECT_TRUE(job_c != NULL);
122 job_c = NULL;
123 }
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100124 EXPECT_EQ(1, filter->hit_count());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000125
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100126 // Check URLRequestInterceptor URL matching.
127 filter->ClearHandlers();
128 EXPECT_EQ(0, filter->hit_count());
129 filter->AddUrlInterceptor(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000130 url_2,
Torne (Richard Coles)46d4c2b2014-06-09 12:00:27 +0100131 scoped_ptr<net::URLRequestInterceptor>(new TestURLRequestInterceptor()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000132 {
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100133 scoped_refptr<URLRequestJob> found =
134 filter->MaybeInterceptRequest(&request_2, NULL);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000135 EXPECT_EQ(job_c, found);
136 EXPECT_TRUE(job_c != NULL);
137 job_c = NULL;
138 }
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100139 EXPECT_EQ(1, filter->hit_count());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000140
Torne (Richard Coles)f8ee7882014-06-20 14:52:04 +0100141 filter->ClearHandlers();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000142}
143
144} // namespace
145
146} // namespace net