blob: 659ae10d7bda5d1b4611f6b7a53e5d2a6925377e [file] [log] [blame]
Henrik Kjellander67765182017-06-28 20:58:07 +02001/*
2 * Copyright 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_RTC_BASE_FAKECLOCK_H_
12#define WEBRTC_RTC_BASE_FAKECLOCK_H_
13
14#include "webrtc/base/criticalsection.h"
15#include "webrtc/base/timedelta.h"
16#include "webrtc/base/timeutils.h"
17
18namespace rtc {
19
20// Fake clock for use with unit tests, which does not tick on its own.
21// Starts at time 0.
22//
23// TODO(deadbeef): Unify with webrtc::SimulatedClock.
24class FakeClock : public ClockInterface {
25 public:
26 ~FakeClock() override {}
27
28 // ClockInterface implementation.
29 int64_t TimeNanos() const override;
30
31 // Methods that can be used by the test to control the time.
32
33 // Should only be used to set a time in the future.
34 void SetTimeNanos(int64_t nanos);
35 void SetTimeMicros(int64_t micros) {
36 SetTimeNanos(kNumNanosecsPerMicrosec * micros);
37 }
38
39 void AdvanceTime(TimeDelta delta);
40 void AdvanceTimeMicros(int64_t micros) {
41 AdvanceTime(rtc::TimeDelta::FromMicroseconds(micros));
42 }
43 private:
44 CriticalSection lock_;
45 int64_t time_ GUARDED_BY(lock_) = 0;
46};
47
48// Helper class that sets itself as the global clock in its constructor and
49// unsets it in its destructor.
50class ScopedFakeClock : public FakeClock {
51 public:
52 ScopedFakeClock();
53 ~ScopedFakeClock() override;
54
55 private:
56 ClockInterface* prev_clock_;
57};
58
59// Helper class to "undo" the fake clock temporarily.
60class ScopedRealClock {
61 public:
62 ScopedRealClock();
63 ~ScopedRealClock();
64
65 private:
66 ClockInterface* prev_clock_;
67};
68
69} // namespace rtc
70
71#endif // WEBRTC_RTC_BASE_FAKECLOCK_H_