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