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; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) URLRequestFilter* filter = URLRequestFilter::GetInstance(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL kUrl1("http://foo.com/"); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<URLRequest> request1(request_context.CreateRequest( 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrl1, DEFAULT_PRIORITY, &delegate, NULL)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL kUrl2("http://bar.com/"); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<URLRequest> request2(request_context.CreateRequest( 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrl2, DEFAULT_PRIORITY, &delegate, NULL)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check AddUrlHandler checks for invalid URLs. 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(filter->AddUrlHandler(GURL(), &FactoryA)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check URL matching. 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter->ClearHandlers(); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(filter->AddUrlHandler(kUrl1, &FactoryA)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<URLRequestJob> found = 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->MaybeInterceptRequest(request1.get(), NULL); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(job_a, found.get()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(job_a != NULL); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_a = NULL; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(filter->hit_count(), 1); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we don't match other URLs. 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), NULL) == NULL); 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1, filter->hit_count()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can remove URL matching. 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->RemoveUrlHandler(kUrl1); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), NULL) == NULL); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1, filter->hit_count()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check hostname matching. 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter->ClearHandlers(); 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0, filter->hit_count()); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->AddHostnameHandler(kUrl1.scheme(), kUrl1.host(), &FactoryB); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<URLRequestJob> found = 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->MaybeInterceptRequest(request1.get(), NULL); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(job_b, found.get()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(job_b != NULL); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) job_b = NULL; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1, filter->hit_count()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we don't match other hostnames. 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), NULL) == NULL); 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1, filter->hit_count()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can remove hostname matching. 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->RemoveHostnameHandler(kUrl1.scheme(), kUrl1.host()); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), NULL) == NULL); 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1, filter->hit_count()); 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Check URLRequestInterceptor hostname matching. 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter->ClearHandlers(); 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0, filter->hit_count()); 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter->AddHostnameInterceptor( 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrl1.scheme(), kUrl1.host(), 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<net::URLRequestInterceptor>(new TestURLRequestInterceptor())); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<URLRequestJob> found = 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->MaybeInterceptRequest(request1.get(), NULL); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(job_c, found.get()); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(job_c != NULL); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_c = NULL; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1, filter->hit_count()); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Check URLRequestInterceptor URL matching. 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter->ClearHandlers(); 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(0, filter->hit_count()); 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter->AddUrlInterceptor( 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrl2, 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<net::URLRequestInterceptor>(new TestURLRequestInterceptor())); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_refptr<URLRequestJob> found = 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->MaybeInterceptRequest(request2.get(), NULL); 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(job_c, found.get()); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(job_c != NULL); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) job_c = NULL; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(1, filter->hit_count()); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) filter->ClearHandlers(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 147