// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_URL_REQUEST_URL_REQUEST_THROTTLER_TEST_SUPPORT_H_
#define NET_URL_REQUEST_URL_REQUEST_THROTTLER_TEST_SUPPORT_H_

#include <string>

#include "base/time.h"
#include "net/base/backoff_entry.h"
#include "net/url_request/url_request_throttler_header_interface.h"

namespace net {

class MockBackoffEntry : public BackoffEntry {
 public:
  explicit MockBackoffEntry(const BackoffEntry::Policy* const policy);
  virtual ~MockBackoffEntry();

  // BackoffEntry overrides.
  virtual base::TimeTicks ImplGetTimeNow() const override;

  void set_fake_now(const base::TimeTicks& now);

 private:
  base::TimeTicks fake_now_;
};

// Mocks the URLRequestThrottlerHeaderInterface, allowing testing code to
// pass arbitrary fake headers to the throttling code.
class MockURLRequestThrottlerHeaderAdapter
    : public URLRequestThrottlerHeaderInterface {
 public:
  // Constructs mock response headers with the given |response_code| and no
  // custom response header fields.
  explicit MockURLRequestThrottlerHeaderAdapter(int response_code);

  // Constructs mock response headers with the given |response_code| and
  // with a custom-retry header value |retry_value| if it is non-empty, and
  // a custom opt-out header value |opt_out_value| if it is non-empty.
  MockURLRequestThrottlerHeaderAdapter(const std::string& retry_value,
                                       const std::string& opt_out_value,
                                       int response_code);
  virtual ~MockURLRequestThrottlerHeaderAdapter();

  // URLRequestThrottlerHeaderInterface overrides.
  virtual std::string GetNormalizedValue(const std::string& key) const override;
  virtual int GetResponseCode() const override;

 private:
  std::string fake_retry_value_;
  std::string fake_opt_out_value_;
  int fake_response_code_;

  DISALLOW_COPY_AND_ASSIGN(MockURLRequestThrottlerHeaderAdapter);
};

}  // namespace net

#endif  // NET_URL_REQUEST_URL_REQUEST_THROTTLER_TEST_SUPPORT_H_
