11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/sdch_dictionary_fetcher.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/stringprintf.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/thread_task_runner_handle.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/sdch_manager.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request_data_job.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request_filter.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request_interceptor.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request_test_util.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace net { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const char* kSampleBufferContext = "This is a sample buffer."; 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const char* kTestDomain = "top.domain.test"; 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass URLRequestSpecifiedResponseJob : public URLRequestSimpleJob { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci URLRequestSpecifiedResponseJob(URLRequest* request, 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NetworkDelegate* network_delegate) 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : URLRequestSimpleJob(request, network_delegate) {} 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static void AddUrlHandler() { 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance(); 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci jobs_requested_ = 0; 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->AddHostnameHandler("http", kTestDomain, 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &URLRequestSpecifiedResponseJob::Factory); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static void RemoveUrlHandler() { 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::URLRequestFilter* filter = net::URLRequestFilter::GetInstance(); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci filter->RemoveHostnameHandler("http", kTestDomain); 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci jobs_requested_ = 0; 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static URLRequestJob* Factory( 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci URLRequest* request, 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::NetworkDelegate* network_delegate, 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& scheme) { 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++jobs_requested_; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new URLRequestSpecifiedResponseJob(request, network_delegate); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static std::string ExpectedResponseForURL(const GURL& url) { 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return base::StringPrintf("Response for %s\n%s\nEnd Response for %s\n", 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url.spec().c_str(), kSampleBufferContext, 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url.spec().c_str()); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static int jobs_requested() { return jobs_requested_; } 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~URLRequestSpecifiedResponseJob() {}; 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual int GetData(std::string* mime_type, 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* charset, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* data, 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CompletionCallback& callback) const OVERRIDE { 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL url(request_->url()); 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *data = ExpectedResponseForURL(url); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return OK; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static int jobs_requested_; 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint URLRequestSpecifiedResponseJob::jobs_requested_(0); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SdchTestDelegate : public SdchFetcher::Delegate { 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct DictionaryAdditions { 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DictionaryAdditions(const std::string& dictionary_text, 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& dictionary_url) 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : dictionary_text(dictionary_text), 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dictionary_url(dictionary_url) {} 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string dictionary_text; 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL dictionary_url; 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void AddSdchDictionary(const std::string& dictionary_text, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& dictionary_url) OVERRIDE { 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dictionary_additions.push_back( 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DictionaryAdditions(dictionary_text, dictionary_url)); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void GetDictionaryAdditions(std::vector<DictionaryAdditions>* out) { 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci out->swap(dictionary_additions); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dictionary_additions.clear(); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<DictionaryAdditions> dictionary_additions; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SdchDictionaryFetcherTest : public ::testing::Test { 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SdchDictionaryFetcherTest() {} 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetUp() OVERRIDE { 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!fetcher_.get()); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci URLRequestSpecifiedResponseJob::AddUrlHandler(); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_delegate_.reset(new SdchTestDelegate); 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_.reset(new TestURLRequestContext); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_.reset(new SdchDictionaryFetcher( 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_delegate_.get(), context_.get())); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void TearDown() OVERRIDE { 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci URLRequestSpecifiedResponseJob::RemoveUrlHandler(); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_.reset(); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_.reset(); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher_delegate_.reset(); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SdchDictionaryFetcher* fetcher() { return fetcher_.get(); } 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SdchTestDelegate* manager() { return fetcher_delegate_.get(); } 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // May not be called outside the SetUp()/TearDown() interval. 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int JobsRequested() { 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return URLRequestSpecifiedResponseJob::jobs_requested(); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL PathToGurl(const char* path) { 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string gurl_string("http://"); 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gurl_string += kTestDomain; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gurl_string += "/"; 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gurl_string += path; 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return GURL(gurl_string); 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<SdchTestDelegate> fetcher_delegate_; 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<TestURLRequestContext> context_; 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<SdchDictionaryFetcher> fetcher_; 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Schedule a fetch and make sure it happens. 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(SdchDictionaryFetcherTest, Basic) { 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL dictionary_url(PathToGurl("dictionary")); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher()->Schedule(dictionary_url); 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, JobsRequested()); 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<SdchTestDelegate::DictionaryAdditions> additions; 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manager()->GetDictionaryAdditions(&additions); 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1u, additions.size()); 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(URLRequestSpecifiedResponseJob::ExpectedResponseForURL( 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dictionary_url), additions[0].dictionary_text); 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Multiple fetches of the same URL should result in only one request. 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(SdchDictionaryFetcherTest, Multiple) { 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL dictionary_url(PathToGurl("dictionary")); 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher()->Schedule(dictionary_url); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher()->Schedule(dictionary_url); 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher()->Schedule(dictionary_url); 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, JobsRequested()); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<SdchTestDelegate::DictionaryAdditions> additions; 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manager()->GetDictionaryAdditions(&additions); 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(1u, additions.size()); 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(URLRequestSpecifiedResponseJob::ExpectedResponseForURL( 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dictionary_url), additions[0].dictionary_text); 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A cancel should result in no actual requests being generated. 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(SdchDictionaryFetcherTest, Cancel) { 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL dictionary_url_1(PathToGurl("dictionary_1")); 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL dictionary_url_2(PathToGurl("dictionary_2")); 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL dictionary_url_3(PathToGurl("dictionary_3")); 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher()->Schedule(dictionary_url_1); 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher()->Schedule(dictionary_url_2); 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher()->Schedule(dictionary_url_3); 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fetcher()->Cancel(); 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop().RunUntilIdle(); 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Synchronous execution may have resulted in a single job being scheduled. 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_GE(1, JobsRequested()); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 194