| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | // Copyright (c) 2011 The LevelDB Authors. All rights reserved.// Use of this source code is governed by a BSD-style license that can be// found in the LICENSE file. See the AUTHORS file for names of contributors.//// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.#include "env/mock_env.h"#include <memory>#include <string>#include "rocksdb/env.h"#include "test_util/testharness.h"namespace ROCKSDB_NAMESPACE {class MockEnvTest : public testing::Test { public:  MockEnv* env_;  const EnvOptions soptions_;  MockEnvTest()      : env_(new MockEnv(Env::Default())) {  }  ~MockEnvTest() override { delete env_; }};TEST_F(MockEnvTest, Corrupt) {  const std::string kGood = "this is a good string, synced to disk";  const std::string kCorrupted = "this part may be corrupted";  const std::string kFileName = "/dir/f";  std::unique_ptr<WritableFile> writable_file;  ASSERT_OK(env_->NewWritableFile(kFileName, &writable_file, soptions_));  ASSERT_OK(writable_file->Append(kGood));  ASSERT_TRUE(writable_file->GetFileSize() == kGood.size());  std::string scratch;  scratch.resize(kGood.size() + kCorrupted.size() + 16);  Slice result;  std::unique_ptr<RandomAccessFile> rand_file;  ASSERT_OK(env_->NewRandomAccessFile(kFileName, &rand_file, soptions_));  ASSERT_OK(rand_file->Read(0, kGood.size(), &result, &(scratch[0])));  ASSERT_EQ(result.compare(kGood), 0);  // Sync + corrupt => no change  ASSERT_OK(writable_file->Fsync());  ASSERT_OK(dynamic_cast<MockEnv*>(env_)->CorruptBuffer(kFileName));  result.clear();  ASSERT_OK(rand_file->Read(0, kGood.size(), &result, &(scratch[0])));  ASSERT_EQ(result.compare(kGood), 0);  // Add new data and corrupt it  ASSERT_OK(writable_file->Append(kCorrupted));  ASSERT_TRUE(writable_file->GetFileSize() == kGood.size() + kCorrupted.size());  result.clear();  ASSERT_OK(rand_file->Read(kGood.size(), kCorrupted.size(),            &result, &(scratch[0])));  ASSERT_EQ(result.compare(kCorrupted), 0);  // Corrupted  ASSERT_OK(dynamic_cast<MockEnv*>(env_)->CorruptBuffer(kFileName));  result.clear();  ASSERT_OK(rand_file->Read(kGood.size(), kCorrupted.size(),            &result, &(scratch[0])));  ASSERT_NE(result.compare(kCorrupted), 0);}TEST_F(MockEnvTest, FakeSleeping) {  int64_t now = 0;  auto s = env_->GetCurrentTime(&now);  ASSERT_OK(s);  env_->FakeSleepForMicroseconds(3 * 1000 * 1000);  int64_t after_sleep = 0;  s = env_->GetCurrentTime(&after_sleep);  ASSERT_OK(s);  auto delta = after_sleep - now;  // this will be true unless test runs for 2 seconds  ASSERT_TRUE(delta == 3 || delta == 4);}}  // namespace ROCKSDB_NAMESPACEint main(int argc, char** argv) {  ::testing::InitGoogleTest(&argc, argv);  return RUN_ALL_TESTS();}
 |