url_request_filter_unittest.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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/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_interceptor.h" 12#include "net/url_request/url_request_job.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" 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 39URLRequestTestJob* job_c; 40 41class TestURLRequestInterceptor : public URLRequestInterceptor { 42 public: 43 virtual ~TestURLRequestInterceptor() {} 44 45 virtual URLRequestJob* MaybeInterceptRequest( 46 URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE { 47 job_c = new URLRequestTestJob(request, network_delegate); 48 return job_c; 49 } 50}; 51 52TEST(URLRequestFilter, BasicMatching) { 53 TestDelegate delegate; 54 TestURLRequestContext request_context; 55 56 GURL url_1("http://foo.com/"); 57 TestURLRequest request_1( 58 url_1, DEFAULT_PRIORITY, &delegate, &request_context); 59 60 GURL url_2("http://bar.com/"); 61 TestURLRequest request_2( 62 url_2, DEFAULT_PRIORITY, &delegate, &request_context); 63 64 // Check AddUrlHandler checks for invalid URLs. 65 EXPECT_FALSE(URLRequestFilter::GetInstance()->AddUrlHandler(GURL(), 66 &FactoryA)); 67 68 // Check URL matching. 69 URLRequestFilter::GetInstance()->ClearHandlers(); 70 EXPECT_TRUE(URLRequestFilter::GetInstance()->AddUrlHandler(url_1, 71 &FactoryA)); 72 { 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); 77 job_a = NULL; 78 } 79 EXPECT_EQ(URLRequestFilter::GetInstance()->hit_count(), 1); 80 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()); 85 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()); 91 92 // Check hostname matching. 93 URLRequestFilter::GetInstance()->ClearHandlers(); 94 EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 95 URLRequestFilter::GetInstance()->AddHostnameHandler(url_1.scheme(), 96 url_1.host(), 97 &FactoryB); 98 { 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); 103 job_b = NULL; 104 } 105 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 106 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()); 111 112 // Check we can remove hostname matching. 113 URLRequestFilter::GetInstance()->RemoveHostnameHandler(url_1.scheme(), 114 url_1.host()); 115 EXPECT_TRUE(URLRequestFilter::Factory( 116 &request_1, NULL, url_1.scheme()) == NULL); 117 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 118 119 // Check ProtocolHandler hostname matching. 120 URLRequestFilter::GetInstance()->ClearHandlers(); 121 EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 122 URLRequestFilter::GetInstance()->AddHostnameInterceptor( 123 url_1.scheme(), url_1.host(), 124 scoped_ptr<net::URLRequestInterceptor>(new TestURLRequestInterceptor())); 125 { 126 scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 127 &request_1, NULL, url_1.scheme()); 128 EXPECT_EQ(job_c, found); 129 EXPECT_TRUE(job_c != NULL); 130 job_c = NULL; 131 } 132 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 133 134 // Check ProtocolHandler URL matching. 135 URLRequestFilter::GetInstance()->ClearHandlers(); 136 EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 137 URLRequestFilter::GetInstance()->AddUrlInterceptor( 138 url_2, 139 scoped_ptr<net::URLRequestInterceptor>(new TestURLRequestInterceptor())); 140 { 141 scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 142 &request_2, NULL, url_2.scheme()); 143 EXPECT_EQ(job_c, found); 144 EXPECT_TRUE(job_c != NULL); 145 job_c = NULL; 146 } 147 EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 148 149 URLRequestFilter::GetInstance()->ClearHandlers(); 150} 151 152} // namespace 153 154} // namespace net 155