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