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 <memory>
8
9 #include "base/macros.h"
10 #include "base/test/task_environment.h"
11 #include "net/base/request_priority.h"
12 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
13 #include "net/url_request/url_request.h"
14 #include "net/url_request/url_request_context.h"
15 #include "net/url_request/url_request_interceptor.h"
16 #include "net/url_request/url_request_job.h"
17 #include "net/url_request/url_request_test_job.h"
18 #include "net/url_request/url_request_test_util.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace net {
22
23 namespace {
24
25 class TestURLRequestInterceptor : public URLRequestInterceptor {
26 public:
TestURLRequestInterceptor()27 TestURLRequestInterceptor() : job_(nullptr) {}
28 ~TestURLRequestInterceptor() override = default;
29
30 // URLRequestInterceptor implementation:
MaybeInterceptRequest(URLRequest * request,NetworkDelegate * network_delegate) const31 URLRequestJob* MaybeInterceptRequest(
32 URLRequest* request,
33 NetworkDelegate* network_delegate) const override {
34 job_ = new URLRequestTestJob(request, network_delegate);
35 return job_;
36 }
37
38 // Is |job| the URLRequestJob generated during interception?
WasLastJobCreated(URLRequestJob * job) const39 bool WasLastJobCreated(URLRequestJob* job) const {
40 return job_ && job_ == job;
41 }
42
43 private:
44 mutable URLRequestTestJob* job_;
45
46 DISALLOW_COPY_AND_ASSIGN(TestURLRequestInterceptor);
47 };
48
TEST(URLRequestFilter,BasicMatching)49 TEST(URLRequestFilter, BasicMatching) {
50 base::test::TaskEnvironment task_environment(
51 base::test::TaskEnvironment::MainThreadType::IO);
52 TestDelegate delegate;
53 TestURLRequestContext request_context;
54 URLRequestFilter* filter = URLRequestFilter::GetInstance();
55
56 const GURL kUrl1("http://foo.com/");
57 std::unique_ptr<URLRequest> request1(request_context.CreateRequest(
58 kUrl1, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
59
60 const GURL kUrl2("http://bar.com/");
61 std::unique_ptr<URLRequest> request2(request_context.CreateRequest(
62 kUrl2, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
63
64 // Check AddUrlInterceptor checks for invalid URLs.
65 EXPECT_FALSE(filter->AddUrlInterceptor(
66 GURL(),
67 std::unique_ptr<URLRequestInterceptor>(new TestURLRequestInterceptor())));
68
69 // Check URLRequestInterceptor URL matching.
70 filter->ClearHandlers();
71 TestURLRequestInterceptor* interceptor = new TestURLRequestInterceptor();
72 EXPECT_TRUE(filter->AddUrlInterceptor(
73 kUrl1, std::unique_ptr<URLRequestInterceptor>(interceptor)));
74 {
75 std::unique_ptr<URLRequestJob> found(
76 filter->MaybeInterceptRequest(request1.get(), nullptr));
77 EXPECT_TRUE(interceptor->WasLastJobCreated(found.get()));
78 }
79 EXPECT_EQ(filter->hit_count(), 1);
80
81 // Check we don't match other URLs.
82 EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), nullptr) ==
83 nullptr);
84 EXPECT_EQ(1, filter->hit_count());
85
86 // Check we can remove URL matching.
87 filter->RemoveUrlHandler(kUrl1);
88 EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), nullptr) ==
89 nullptr);
90 EXPECT_EQ(1, filter->hit_count());
91
92 // Check hostname matching.
93 filter->ClearHandlers();
94 EXPECT_EQ(0, filter->hit_count());
95 interceptor = new TestURLRequestInterceptor();
96 filter->AddHostnameInterceptor(
97 kUrl1.scheme(), kUrl1.host(),
98 std::unique_ptr<URLRequestInterceptor>(interceptor));
99 {
100 std::unique_ptr<URLRequestJob> found(
101 filter->MaybeInterceptRequest(request1.get(), nullptr));
102 EXPECT_TRUE(interceptor->WasLastJobCreated(found.get()));
103 }
104 EXPECT_EQ(1, filter->hit_count());
105
106 // Check we don't match other hostnames.
107 EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), nullptr) ==
108 nullptr);
109 EXPECT_EQ(1, filter->hit_count());
110
111 // Check we can remove hostname matching.
112 filter->RemoveHostnameHandler(kUrl1.scheme(), kUrl1.host());
113 EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), nullptr) ==
114 nullptr);
115 EXPECT_EQ(1, filter->hit_count());
116
117 filter->ClearHandlers();
118 }
119
120 } // namespace
121
122 } // namespace net
123