mock_time_env.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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. #pragma once
  6. #include "rocksdb/env.h"
  7. namespace ROCKSDB_NAMESPACE {
  8. class MockTimeEnv : public EnvWrapper {
  9. public:
  10. explicit MockTimeEnv(Env* base) : EnvWrapper(base) {}
  11. virtual Status GetCurrentTime(int64_t* time) override {
  12. assert(time != nullptr);
  13. assert(current_time_ <=
  14. static_cast<uint64_t>(std::numeric_limits<int64_t>::max()));
  15. *time = static_cast<int64_t>(current_time_);
  16. return Status::OK();
  17. }
  18. virtual uint64_t NowMicros() override {
  19. assert(current_time_ <= std::numeric_limits<uint64_t>::max() / 1000000);
  20. return current_time_ * 1000000;
  21. }
  22. virtual uint64_t NowNanos() override {
  23. assert(current_time_ <= std::numeric_limits<uint64_t>::max() / 1000000000);
  24. return current_time_ * 1000000000;
  25. }
  26. uint64_t RealNowMicros() { return target()->NowMicros(); }
  27. void set_current_time(uint64_t time) {
  28. assert(time >= current_time_);
  29. current_time_ = time;
  30. }
  31. private:
  32. std::atomic<uint64_t> current_time_{0};
  33. };
  34. } // namespace ROCKSDB_NAMESPACE