]>
git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/env/mock_env_test.cc
1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
5 #include "env/mock_env.h"
10 #include "rocksdb/env.h"
11 #include "util/testharness.h"
15 class MockEnvTest
: public testing::Test
{
18 const EnvOptions soptions_
;
21 : env_(new MockEnv(Env::Default())) {
23 ~MockEnvTest() override
{ delete env_
; }
26 TEST_F(MockEnvTest
, Corrupt
) {
27 const std::string kGood
= "this is a good string, synced to disk";
28 const std::string kCorrupted
= "this part may be corrupted";
29 const std::string kFileName
= "/dir/f";
30 std::unique_ptr
<WritableFile
> writable_file
;
31 ASSERT_OK(env_
->NewWritableFile(kFileName
, &writable_file
, soptions_
));
32 ASSERT_OK(writable_file
->Append(kGood
));
33 ASSERT_TRUE(writable_file
->GetFileSize() == kGood
.size());
36 scratch
.resize(kGood
.size() + kCorrupted
.size() + 16);
38 std::unique_ptr
<RandomAccessFile
> rand_file
;
39 ASSERT_OK(env_
->NewRandomAccessFile(kFileName
, &rand_file
, soptions_
));
40 ASSERT_OK(rand_file
->Read(0, kGood
.size(), &result
, &(scratch
[0])));
41 ASSERT_EQ(result
.compare(kGood
), 0);
43 // Sync + corrupt => no change
44 ASSERT_OK(writable_file
->Fsync());
45 ASSERT_OK(dynamic_cast<MockEnv
*>(env_
)->CorruptBuffer(kFileName
));
47 ASSERT_OK(rand_file
->Read(0, kGood
.size(), &result
, &(scratch
[0])));
48 ASSERT_EQ(result
.compare(kGood
), 0);
50 // Add new data and corrupt it
51 ASSERT_OK(writable_file
->Append(kCorrupted
));
52 ASSERT_TRUE(writable_file
->GetFileSize() == kGood
.size() + kCorrupted
.size());
54 ASSERT_OK(rand_file
->Read(kGood
.size(), kCorrupted
.size(),
55 &result
, &(scratch
[0])));
56 ASSERT_EQ(result
.compare(kCorrupted
), 0);
58 ASSERT_OK(dynamic_cast<MockEnv
*>(env_
)->CorruptBuffer(kFileName
));
60 ASSERT_OK(rand_file
->Read(kGood
.size(), kCorrupted
.size(),
61 &result
, &(scratch
[0])));
62 ASSERT_NE(result
.compare(kCorrupted
), 0);
65 TEST_F(MockEnvTest
, FakeSleeping
) {
67 auto s
= env_
->GetCurrentTime(&now
);
69 env_
->FakeSleepForMicroseconds(3 * 1000 * 1000);
70 int64_t after_sleep
= 0;
71 s
= env_
->GetCurrentTime(&after_sleep
);
73 auto delta
= after_sleep
- now
;
74 // this will be true unless test runs for 2 seconds
75 ASSERT_TRUE(delta
== 3 || delta
== 4);
78 } // namespace rocksdb
80 int main(int argc
, char** argv
) {
81 ::testing::InitGoogleTest(&argc
, argv
);
82 return RUN_ALL_TESTS();