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