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