url_request_filter_unittest.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_filter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/url_request/url_request_interceptor.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_job.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestTestJob* job_a; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestJob* FactoryA(URLRequest* request, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_a = new URLRequestTestJob(request, network_delegate); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job_a; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestTestJob* job_b; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestJob* FactoryB(URLRequest* request, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_b = new URLRequestTestJob(request, network_delegate); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job_b; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)URLRequestTestJob* job_c; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class TestURLRequestInterceptor : public URLRequestInterceptor { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~TestURLRequestInterceptor() {} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual URLRequestJob* MaybeInterceptRequest( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_c = new URLRequestTestJob(request, network_delegate); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return job_c; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(URLRequestFilter, BasicMatching) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate delegate; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext request_context; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_1("http://foo.com/"); 570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) TestURLRequest request_1( 580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) url_1, DEFAULT_PRIORITY, &delegate, &request_context); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_2("http://bar.com/"); 610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) TestURLRequest request_2( 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) url_2, DEFAULT_PRIORITY, &delegate, &request_context); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check AddUrlHandler checks for invalid URLs. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(URLRequestFilter::GetInstance()->AddUrlHandler(GURL(), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FactoryA)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check URL matching. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::GetInstance()->AddUrlHandler(url_1, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FactoryA)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(job_a, found); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(job_a != NULL); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_a = NULL; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestFilter::GetInstance()->hit_count(), 1); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we don't match other URLs. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::Factory( 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_2, NULL, url_2.scheme()) == NULL); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can remove URL matching. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->RemoveUrlHandler(url_1); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::Factory( 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()) == NULL); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check hostname matching. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->AddHostnameHandler(url_1.scheme(), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_1.host(), 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FactoryB); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(job_b, found); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(job_b != NULL); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_b = NULL; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we don't match other hostnames. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::Factory( 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_2, NULL, url_2.scheme()) == NULL); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can remove hostname matching. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->RemoveHostnameHandler(url_1.scheme(), 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_1.host()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::Factory( 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()) == NULL); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check ProtocolHandler hostname matching. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) URLRequestFilter::GetInstance()->AddHostnameInterceptor( 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_1.scheme(), url_1.host(), 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<net::URLRequestInterceptor>(new TestURLRequestInterceptor())); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(job_c, found); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(job_c != NULL); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_c = NULL; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check ProtocolHandler URL matching. 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) URLRequestFilter::GetInstance()->AddUrlInterceptor( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_2, 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<net::URLRequestInterceptor>(new TestURLRequestInterceptor())); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_2, NULL, url_2.scheme()); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(job_c, found); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(job_c != NULL); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_c = NULL; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 155