cloud_print_url_fetcher_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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 "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop_proxy.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/cloud_print_url_fetcher.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/service_process.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/test/test_server.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_throttler_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FilePath::CharType kDocRoot[] = FILE_PATH_LITERAL("chrome/test/data");
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int g_request_context_getter_instances = 0;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TrackingTestURLRequestContextGetter
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public TestURLRequestContextGetter {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TrackingTestURLRequestContextGetter(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::MessageLoopProxy* io_message_loop_proxy,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequestThrottlerManager* throttler_manager)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : TestURLRequestContextGetter(io_message_loop_proxy),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        throttler_manager_(throttler_manager),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        context_(NULL) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_request_context_getter_instances++;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual TestURLRequestContext* GetURLRequestContext() OVERRIDE {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!context_.get()) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_.reset(new TestURLRequestContext(true));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_->set_throttler_manager(throttler_manager_);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_->Init();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return context_.get();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TrackingTestURLRequestContextGetter() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    g_request_context_getter_instances--;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not owned here.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestThrottlerManager* throttler_manager_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestURLRequestContext> context_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCloudPrintURLFetcher : public CloudPrintURLFetcher {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestCloudPrintURLFetcher(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::MessageLoopProxy* io_message_loop_proxy)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : io_message_loop_proxy_(io_message_loop_proxy) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::URLRequestContextGetter* GetRequestContextGetter() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new TrackingTestURLRequestContextGetter(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_message_loop_proxy_.get(), throttler_manager());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestThrottlerManager* throttler_manager() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &throttler_manager_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestCloudPrintURLFetcher() {}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We set this as the throttler manager for the
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TestURLRequestContext we create.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequestThrottlerManager throttler_manager_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintURLFetcherTest : public testing::Test,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 public CloudPrintURLFetcherDelegate {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintURLFetcherTest() : max_retries_(0), fetcher_(NULL) { }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a URLFetcher, using the program's main thread to do IO.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CreateFetcher(const GURL& url, int max_retries);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CloudPrintURLFetcher::Delegate
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction HandleRawResponse(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLFetcher* source,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLRequestStatus& status,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int response_code,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::ResponseCookies& cookies,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& data);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction OnRequestAuthError() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CloudPrintURLFetcher::STOP_PROCESSING;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetAuthHeader() {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return std::string();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy() {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return io_message_loop_proxy_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Test::SetUp();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_message_loop_proxy_ = base::MessageLoopProxy::current();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher_ = NULL;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Deleting the fetcher causes a task to be posted to the IO thread to
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // release references to the URLRequestContextGetter. We need to run all
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // pending tasks to execute that (this is the IO thread).
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoop::current()->RunAllPending();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, g_request_context_getter_instances);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLFetcher is designed to run on the main UI thread, but in our tests
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we assume that the current thread is the IO thread where the URLFetcher
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dispatches its requests to.  When we wish to simulate being used from
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a UI thread, we dispatch a worker thread to do so.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoopForIO io_loop_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_retries_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time start_time_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestCloudPrintURLFetcher> fetcher_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintURLFetcherBasicTest : public CloudPrintURLFetcherTest {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintURLFetcherBasicTest()
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : handle_raw_response_(false), handle_raw_data_(false) { }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CloudPrintURLFetcher::Delegate
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction HandleRawResponse(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLFetcher* source,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLRequestStatus& status,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int response_code,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::ResponseCookies& cookies,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& data);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction HandleRawData(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLFetcher* source,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& data);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction HandleJSONData(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLFetcher* source,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValue* json_data,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool succeeded);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetHandleRawResponse(bool handle_raw_response) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle_raw_response_ = handle_raw_response;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetHandleRawData(bool handle_raw_data) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handle_raw_data_ = handle_raw_data;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handle_raw_response_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handle_raw_data_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version of CloudPrintURLFetcherTest that tests overload protection.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintURLFetcherOverloadTest : public CloudPrintURLFetcherTest {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintURLFetcherOverloadTest() : response_count_(0) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CloudPrintURLFetcher::Delegate
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction HandleRawData(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLFetcher* source,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& data);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int response_count_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version of CloudPrintURLFetcherTest that tests backoff protection.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintURLFetcherRetryBackoffTest : public CloudPrintURLFetcherTest {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloudPrintURLFetcherRetryBackoffTest() : response_count_(0) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CloudPrintURLFetcher::Delegate
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual CloudPrintURLFetcher::ResponseAction HandleRawData(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::URLFetcher* source,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& data);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnRequestGiveUp();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int response_count_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintURLFetcherTest::CreateFetcher(const GURL& url, int max_retries) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher_ = new TestCloudPrintURLFetcher(io_message_loop_proxy());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registers an entry for test url. It only allows 3 requests to be sent
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in 200 milliseconds.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::URLRequestThrottlerEntry> entry(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new net::URLRequestThrottlerEntry(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fetcher_->throttler_manager(), "", 200, 3, 1, 2.0, 0.0, 256));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher_->throttler_manager()->OverrideEntryForTests(url, entry);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  max_retries_ = max_retries;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  start_time_ = Time::Now();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher_->StartGetRequest(url, this, max_retries_, std::string());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcher::ResponseAction
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcherTest::HandleRawResponse(
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLFetcher* source,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLRequestStatus& status,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int response_code,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::ResponseCookies& cookies,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(status.is_success());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, response_code);  // HTTP OK
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(data.empty());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintURLFetcher::CONTINUE_PROCESSING;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcher::ResponseAction
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcherBasicTest::HandleRawResponse(
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLFetcher* source,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLRequestStatus& status,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int response_code,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::ResponseCookies& cookies,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(status.is_success());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(200, response_code);  // HTTP OK
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(data.empty());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle_raw_response_) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the current message loop is not the IO loop, it will be shut down when
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the main loop returns and this thread subsequently goes out of scope.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CloudPrintURLFetcher::STOP_PROCESSING;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintURLFetcher::CONTINUE_PROCESSING;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcher::ResponseAction
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcherBasicTest::HandleRawData(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLFetcher* source,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should never get here if we returned true in HandleRawResponse
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(handle_raw_response_);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handle_raw_data_) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CloudPrintURLFetcher::STOP_PROCESSING;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintURLFetcher::CONTINUE_PROCESSING;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcher::ResponseAction
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcherBasicTest::HandleJSONData(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLFetcher* source,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* json_data,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool succeeded) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should never get here if we returned true in one of the above methods.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(handle_raw_response_);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(handle_raw_data_);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintURLFetcher::STOP_PROCESSING;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcher::ResponseAction
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcherOverloadTest::HandleRawData(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLFetcher* source,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const TimeDelta one_second = TimeDelta::FromMilliseconds(1000);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_count_++;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (response_count_ < 20) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher_->StartGetRequest(url,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              this,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              max_retries_,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::string());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We have already sent 20 requests continuously. And we expect that
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it takes more than 1 second due to the overload protection settings.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(Time::Now() - start_time_ >= one_second);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintURLFetcher::STOP_PROCESSING;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcher::ResponseAction
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPrintURLFetcherRetryBackoffTest::HandleRawData(
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::URLFetcher* source,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  response_count_++;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First attempt + 11 retries = 12 total responses.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(response_count_, 12);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CloudPrintURLFetcher::RETRY_REQUEST;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPrintURLFetcherRetryBackoffTest::OnRequestGiveUp() {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It takes more than 200 ms to finish all 11 requests.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Time::Now() - start_time_ >= TimeDelta::FromMilliseconds(200));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_message_loop_proxy()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/chromium/issues/detail?id=60426
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintURLFetcherBasicTest, DISABLED_HandleRawResponse) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestServer test_server(net::TestServer::TYPE_HTTP,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              net::TestServer::kLocalhost,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              FilePath(kDocRoot));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetHandleRawResponse(true);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateFetcher(test_server.GetURL("echo"), 0);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/chromium/issues/detail?id=60426
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintURLFetcherBasicTest, DISABLED_HandleRawData) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestServer test_server(net::TestServer::TYPE_HTTP,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              net::TestServer::kLocalhost,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              FilePath(kDocRoot));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetHandleRawData(true);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateFetcher(test_server.GetURL("echo"), 0);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintURLFetcherOverloadTest, Protect) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestServer test_server(net::TestServer::TYPE_HTTP,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              net::TestServer::kLocalhost,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              FilePath(kDocRoot));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server.GetURL("defaultresponse"));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateFetcher(url, 11);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/chromium/issues/detail?id=60426
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPrintURLFetcherRetryBackoffTest, DISABLED_GiveUp) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestServer test_server(net::TestServer::TYPE_HTTP,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              net::TestServer::kLocalhost,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              FilePath(kDocRoot));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server.GetURL("defaultresponse"));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateFetcher(url, 11);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoop::current()->Run();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace.
379