url_request_filter_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job_factory.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_job.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestTestJob* job_a; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestJob* FactoryA(URLRequest* request, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_a = new URLRequestTestJob(request, network_delegate); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job_a; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestTestJob* job_b; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestJob* FactoryB(URLRequest* request, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkDelegate* network_delegate, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& scheme) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_b = new URLRequestTestJob(request, network_delegate); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return job_b; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)URLRequestTestJob* job_c; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestProtocolHandler : public URLRequestJobFactory::ProtocolHandler { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestProtocolHandler() {} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual URLRequestJob* MaybeCreateJob( 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_c = new URLRequestTestJob(request, network_delegate); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return job_c; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(URLRequestFilter, BasicMatching) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestDelegate delegate; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLRequestContext request_context; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_1("http://foo.com/"); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLRequest request_1(url_1, &delegate, &request_context, NULL); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_2("http://bar.com/"); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestURLRequest request_2(url_2, &delegate, &request_context, NULL); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check AddUrlHandler checks for invalid URLs. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(URLRequestFilter::GetInstance()->AddUrlHandler(GURL(), 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FactoryA)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check URL matching. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::GetInstance()->AddUrlHandler(url_1, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FactoryA)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(job_a, found); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(job_a != NULL); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_a = NULL; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(URLRequestFilter::GetInstance()->hit_count(), 1); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we don't match other URLs. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::Factory( 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_2, NULL, url_2.scheme()) == NULL); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can remove URL matching. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->RemoveUrlHandler(url_1); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::Factory( 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()) == NULL); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check hostname matching. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->AddHostnameHandler(url_1.scheme(), 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_1.host(), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FactoryB); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(job_b, found); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(job_b != NULL); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_b = NULL; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we don't match other hostnames. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::Factory( 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_2, NULL, url_2.scheme()) == NULL); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can remove hostname matching. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRequestFilter::GetInstance()->RemoveHostnameHandler(url_1.scheme(), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_1.host()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(URLRequestFilter::Factory( 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()) == NULL); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check ProtocolHandler hostname matching. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestFilter::GetInstance()->AddHostnameProtocolHandler( 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_1.scheme(), url_1.host(), 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>( 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestProtocolHandler())); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_1, NULL, url_1.scheme()); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(job_c, found); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(job_c != NULL); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_c = NULL; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check ProtocolHandler URL matching. 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, URLRequestFilter::GetInstance()->hit_count()); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestFilter::GetInstance()->AddUrlProtocolHandler( 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_2, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestProtocolHandler())); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLRequestJob> found = URLRequestFilter::Factory( 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &request_2, NULL, url_2.scheme()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(job_c, found); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(job_c != NULL); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_c = NULL; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, URLRequestFilter::GetInstance()->hit_count()); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRequestFilter::GetInstance()->ClearHandlers(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 154