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