| // Copyright 2018 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_TEST_SCOPED_MOCK_CLOCK_OVERRIDE_H_ | 
 | #define BASE_TEST_SCOPED_MOCK_CLOCK_OVERRIDE_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/time/time.h" | 
 | #include "base/time/time_override.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | // Override the return value of Time::Now(), Time::NowFromSystemTime(), | 
 | // TimeTicks::Now(), and ThreadTicks::Now() through a simple advanceable clock. | 
 | // | 
 | // This utility is intended to support tests that: | 
 | // | 
 | //   - Depend on large existing codebases that call TimeXYZ::Now() directly or | 
 | //   - Have no ability to inject a TickClock into the code getting the time | 
 | //     (e.g. integration tests in which a TickClock would be several layers | 
 | //     removed from the test code) | 
 | // | 
 | // NOTE: Overriding Time/TimeTicks altogether via | 
 | // TaskEnvironment::TimeSource::MOCK_TIME is now the preferred way of overriding | 
 | // time in unit tests. | 
 | // | 
 | // NOTE: ScopedMockClockOverride should be created while single-threaded and | 
 | // before the first call to Now() to avoid threading issues and inconsistencies | 
 | // in returned values. Nested overrides are not allowed. | 
 | class ScopedMockClockOverride { | 
 |  public: | 
 |   ScopedMockClockOverride(); | 
 |  | 
 |   ScopedMockClockOverride(const ScopedMockClockOverride&) = delete; | 
 |   ScopedMockClockOverride& operator=(const ScopedMockClockOverride&) = delete; | 
 |  | 
 |   ~ScopedMockClockOverride(); | 
 |  | 
 |   static Time Now(); | 
 |   static TimeTicks NowTicks(); | 
 |   static ThreadTicks NowThreadTicks(); | 
 |  | 
 |   void Advance(TimeDelta delta); | 
 |  | 
 |  private: | 
 |   std::unique_ptr<base::subtle::ScopedTimeClockOverrides> time_clock_overrides_; | 
 |   TimeDelta offset_; | 
 |   static ScopedMockClockOverride* scoped_mock_clock_; | 
 | }; | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_TEST_SCOPED_MOCK_CLOCK_OVERRIDE_H_ |