1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. 2 // This source code is licensed under both the GPLv2 (found in the 3 // COPYING file in the root directory) and Apache 2.0 License 4 // (found in the LICENSE.Apache file in the root directory). 5 6 #pragma once 7 8 #include "rocksdb/env.h" 9 10 namespace ROCKSDB_NAMESPACE { 11 12 class MockTimeEnv : public EnvWrapper { 13 public: MockTimeEnv(Env * base)14 explicit MockTimeEnv(Env* base) : EnvWrapper(base) {} 15 GetCurrentTime(int64_t * time)16 virtual Status GetCurrentTime(int64_t* time) override { 17 assert(time != nullptr); 18 assert(current_time_ <= 19 static_cast<uint64_t>(std::numeric_limits<int64_t>::max())); 20 *time = static_cast<int64_t>(current_time_); 21 return Status::OK(); 22 } 23 NowMicros()24 virtual uint64_t NowMicros() override { 25 assert(current_time_ <= std::numeric_limits<uint64_t>::max() / 1000000); 26 return current_time_ * 1000000; 27 } 28 NowNanos()29 virtual uint64_t NowNanos() override { 30 assert(current_time_ <= std::numeric_limits<uint64_t>::max() / 1000000000); 31 return current_time_ * 1000000000; 32 } 33 RealNowMicros()34 uint64_t RealNowMicros() { return target()->NowMicros(); } 35 set_current_time(uint64_t time)36 void set_current_time(uint64_t time) { 37 assert(time >= current_time_); 38 current_time_ = time; 39 } 40 41 private: 42 std::atomic<uint64_t> current_time_{0}; 43 }; 44 45 } // namespace ROCKSDB_NAMESPACE 46