xref: /aosp_15_r20/external/leveldb/util/testutil.h (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
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.
4 
5 #ifndef STORAGE_LEVELDB_UTIL_TESTUTIL_H_
6 #define STORAGE_LEVELDB_UTIL_TESTUTIL_H_
7 
8 #include "gmock/gmock.h"
9 #include "gtest/gtest.h"
10 #include "helpers/memenv/memenv.h"
11 #include "leveldb/env.h"
12 #include "leveldb/slice.h"
13 #include "util/random.h"
14 
15 namespace leveldb {
16 namespace test {
17 
18 MATCHER(IsOK, "") { return arg.ok(); }
19 
20 // Macros for testing the results of functions that return leveldb::Status or
21 // absl::StatusOr<T> (for any type T).
22 #define EXPECT_LEVELDB_OK(expression) \
23   EXPECT_THAT(expression, leveldb::test::IsOK())
24 #define ASSERT_LEVELDB_OK(expression) \
25   ASSERT_THAT(expression, leveldb::test::IsOK())
26 
27 // Returns the random seed used at the start of the current test run.
RandomSeed()28 inline int RandomSeed() {
29   return testing::UnitTest::GetInstance()->random_seed();
30 }
31 
32 // Store in *dst a random string of length "len" and return a Slice that
33 // references the generated data.
34 Slice RandomString(Random* rnd, int len, std::string* dst);
35 
36 // Return a random key with the specified length that may contain interesting
37 // characters (e.g. \x00, \xff, etc.).
38 std::string RandomKey(Random* rnd, int len);
39 
40 // Store in *dst a string of length "len" that will compress to
41 // "N*compressed_fraction" bytes and return a Slice that references
42 // the generated data.
43 Slice CompressibleString(Random* rnd, double compressed_fraction, size_t len,
44                          std::string* dst);
45 
46 // A wrapper that allows injection of errors.
47 class ErrorEnv : public EnvWrapper {
48  public:
49   bool writable_file_error_;
50   int num_writable_file_errors_;
51 
ErrorEnv()52   ErrorEnv()
53       : EnvWrapper(NewMemEnv(Env::Default())),
54         writable_file_error_(false),
55         num_writable_file_errors_(0) {}
~ErrorEnv()56   ~ErrorEnv() override { delete target(); }
57 
NewWritableFile(const std::string & fname,WritableFile ** result)58   Status NewWritableFile(const std::string& fname,
59                          WritableFile** result) override {
60     if (writable_file_error_) {
61       ++num_writable_file_errors_;
62       *result = nullptr;
63       return Status::IOError(fname, "fake error");
64     }
65     return target()->NewWritableFile(fname, result);
66   }
67 
NewAppendableFile(const std::string & fname,WritableFile ** result)68   Status NewAppendableFile(const std::string& fname,
69                            WritableFile** result) override {
70     if (writable_file_error_) {
71       ++num_writable_file_errors_;
72       *result = nullptr;
73       return Status::IOError(fname, "fake error");
74     }
75     return target()->NewAppendableFile(fname, result);
76   }
77 };
78 
79 }  // namespace test
80 }  // namespace leveldb
81 
82 #endif  // STORAGE_LEVELDB_UTIL_TESTUTIL_H_
83