00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_MOCK_TIMER_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_MOCK_TIMER_H_
00021
00022 #include <set>
00023
00024 #include "base/scoped_ptr.h"
00025 #include "net/instaweb/util/public/abstract_mutex.h"
00026 #include "net/instaweb/util/public/basictypes.h"
00027 #include "net/instaweb/util/public/timer.h"
00028
00029 namespace net_instaweb {
00030
00031 class Function;
00032
00033 class MockTimer : public Timer {
00034 public:
00036 static const int64 kApr_5_2010_ms;
00037
00043 class Alarm {
00044 private:
00045 static const int kIndexUninitialized = -1;
00046
00047 public:
00048 Alarm(int64 wakeup_time_us, Function* closure);
00049 virtual ~Alarm();
00050
00051 int64 wakeup_time_us() const { return wakeup_time_us_; }
00052
00056 int Compare(const Alarm* that) const;
00057
00058 Function* closure() { return closure_; }
00059 void CallRun();
00060 void CallCancel();
00061
00062 private:
00063 friend class MockTimer;
00064
00069 void SetIndex(int index_);
00070
00071 int index_;
00072 int64 wakeup_time_us_;
00073 Function* closure_;
00074
00075 DISALLOW_COPY_AND_ASSIGN(Alarm);
00076 };
00077
00080 struct CompareAlarms {
00081 bool operator()(const Alarm* a, const Alarm* b) const {
00082 return a->Compare(b) < 0;
00083 }
00084 };
00085
00086 explicit MockTimer(int64 time_ms);
00087 virtual ~MockTimer();
00088
00091 void SetTimeUs(int64 new_time_us);
00092 void SetTimeMs(int64 new_time_ms) { SetTimeUs(1000 * new_time_ms); }
00093
00095 void AdvanceUs(int64 delta_us) { SetTimeUs(time_us_ + delta_us); }
00096
00098 void AdvanceMs(int64 delta_ms) { AdvanceUs(1000 * delta_ms); }
00099
00101 virtual int64 NowUs() const;
00102 virtual void SleepUs(int64 us) { AdvanceUs(us); }
00103 virtual void SleepMs(int64 ms) { AdvanceUs(1000 * ms); }
00104
00111 Alarm* AddAlarm(int64 wakeup_time_us, Function* alarm);
00112
00114 void CancelAlarm(Alarm* alarm);
00115
00119 void set_mutex(AbstractMutex* mutex) { mutex_.reset(mutex); }
00120
00121 private:
00122 int64 time_us_;
00123 int next_index_;
00124 typedef std::set<Alarm*, CompareAlarms> AlarmOrderedSet;
00125 AlarmOrderedSet alarms_;
00126 scoped_ptr<AbstractMutex> mutex_;
00127
00128 DISALLOW_COPY_AND_ASSIGN(MockTimer);
00129 };
00130
00131 }
00132
00133 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_MOCK_TIMER_H_