Home | History | Annotate | Download | only in domain_reliability
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef COMPONENTS_DOMAIN_RELIABILITY_TEST_UTIL_H_
      6 #define COMPONENTS_DOMAIN_RELIABILITY_TEST_UTIL_H_
      7 
      8 #include "base/callback_forward.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "components/domain_reliability/config.h"
     11 #include "components/domain_reliability/scheduler.h"
     12 #include "components/domain_reliability/uploader.h"
     13 #include "components/domain_reliability/util.h"
     14 #include "net/base/host_port_pair.h"
     15 
     16 namespace net {
     17 class URLRequestStatus;
     18 }  // namespace net
     19 
     20 namespace domain_reliability {
     21 
     22 // A simple test callback that remembers whether it's been called.
     23 class TestCallback {
     24  public:
     25   TestCallback();
     26   ~TestCallback();
     27 
     28   // Returns a callback that can be called only once.
     29   const base::Closure& callback() const { return callback_; }
     30   // Returns whether the callback returned by |callback()| has been called.
     31   bool called() const { return called_; }
     32 
     33  private:
     34   void OnCalled();
     35 
     36   base::Closure callback_;
     37   bool called_;
     38 };
     39 
     40 class MockUploader : public DomainReliabilityUploader {
     41  public:
     42   typedef base::Callback<void(const std::string& report_json,
     43                               const GURL& upload_url,
     44                               const UploadCallback& upload_callback)>
     45       UploadRequestCallback;
     46 
     47   MockUploader(const UploadRequestCallback& callback);
     48 
     49   virtual ~MockUploader();
     50 
     51   virtual bool discard_uploads() const;
     52 
     53   // DomainReliabilityUploader implementation:
     54   virtual void UploadReport(const std::string& report_json,
     55                             const GURL& upload_url,
     56                             const UploadCallback& callback) OVERRIDE;
     57 
     58   virtual void set_discard_uploads(bool discard_uploads) OVERRIDE;
     59 
     60  private:
     61   UploadRequestCallback callback_;
     62   bool discard_uploads_;
     63 };
     64 
     65 class MockTime : public MockableTime {
     66  public:
     67   MockTime();
     68 
     69   // N.B.: Tasks (and therefore Timers) scheduled to run in the future will
     70   // never be run if MockTime is destroyed before the mock time is advanced
     71   // to their scheduled time.
     72   virtual ~MockTime();
     73 
     74   // MockableTime implementation:
     75   virtual base::Time Now() OVERRIDE;
     76   virtual base::TimeTicks NowTicks() OVERRIDE;
     77   virtual scoped_ptr<MockableTime::Timer> CreateTimer() OVERRIDE;
     78 
     79   // Pretends that |delta| has passed, and runs tasks that would've happened
     80   // during that interval (with |Now()| returning proper values while they
     81   // execute!)
     82   void Advance(base::TimeDelta delta);
     83 
     84   // Queues |task| to be run after |delay|. (Lighter-weight than mocking an
     85   // entire message pump.)
     86   void AddTask(base::TimeDelta delay, const base::Closure& task);
     87 
     88  private:
     89   // Key used to store tasks in the task map. Includes the time the task should
     90   // run and a sequence number to disambiguate tasks with the same time.
     91   struct TaskKey {
     92     TaskKey(base::TimeTicks time, int sequence_number)
     93         : time(time),
     94           sequence_number(sequence_number) {}
     95 
     96     base::TimeTicks time;
     97     int sequence_number;
     98   };
     99 
    100   // Comparator for TaskKey; sorts by time, then by sequence number.
    101   struct TaskKeyCompare {
    102     bool operator() (const TaskKey& lhs, const TaskKey& rhs) const {
    103       return lhs.time < rhs.time ||
    104              (lhs.time == rhs.time &&
    105               lhs.sequence_number < rhs.sequence_number);
    106     }
    107   };
    108 
    109   typedef std::map<TaskKey, base::Closure, TaskKeyCompare> TaskMap;
    110 
    111   void AdvanceToInternal(base::TimeTicks target_ticks);
    112 
    113   int elapsed_sec() { return (now_ticks_ - epoch_ticks_).InSeconds(); }
    114 
    115   base::Time now_;
    116   base::TimeTicks now_ticks_;
    117   base::TimeTicks epoch_ticks_;
    118   int task_sequence_number_;
    119   TaskMap tasks_;
    120 };
    121 
    122 scoped_ptr<const DomainReliabilityConfig> MakeTestConfig();
    123 scoped_ptr<const DomainReliabilityConfig> MakeTestConfigWithDomain(
    124     const std::string& domain);
    125 DomainReliabilityScheduler::Params MakeTestSchedulerParams();
    126 
    127 }  // namespace domain_reliability
    128 
    129 #endif  // COMPONENTS_DOMAIN_RELIABILITY_TEST_UTIL_H_
    130