blob: 1b1ee715c0daa99ef0ded178812da81a6cb643f1 [file] [log] [blame]
Taylor Brandstetterb3c68102016-05-27 14:15:43 -07001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef RTC_BASE_FAKECLOCK_H_
12#define RTC_BASE_FAKECLOCK_H_
Taylor Brandstetterb3c68102016-05-27 14:15:43 -070013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "rtc_base/criticalsection.h"
15#include "rtc_base/timedelta.h"
16#include "rtc_base/timeutils.h"
Taylor Brandstetterb3c68102016-05-27 14:15:43 -070017
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020018namespace 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_;
danilchap3c6abd22017-09-06 05:46:29 -070045 int64_t time_ RTC_GUARDED_BY(lock_) = 0;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020046};
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
Taylor Brandstetterb3c68102016-05-27 14:15:43 -070070
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020071#endif // RTC_BASE_FAKECLOCK_H_