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 "helpers/memenv/memenv.h"
9 #include "leveldb/env.h"
10 #include "leveldb/slice.h"
11 #include "util/random.h"
12 
13 namespace leveldb {
14 namespace test {
15 
16 // Store in *dst a random string of length "len" and return a Slice that
17 // references the generated data.
18 Slice RandomString(Random* rnd, int len, std::string* dst);
19 
20 // Return a random key with the specified length that may contain interesting
21 // characters (e.g. \x00, \xff, etc.).
22 std::string RandomKey(Random* rnd, int len);
23 
24 // Store in *dst a string of length "len" that will compress to
25 // "N*compressed_fraction" bytes and return a Slice that references
26 // the generated data.
27 Slice CompressibleString(Random* rnd, double compressed_fraction, size_t len,
28                          std::string* dst);
29 
30 // A wrapper that allows injection of errors.
31 class ErrorEnv : public EnvWrapper {
32  public:
33   bool writable_file_error_;
34   int num_writable_file_errors_;
35 
ErrorEnv()36   ErrorEnv()
37       : EnvWrapper(NewMemEnv(Env::Default())),
38         writable_file_error_(false),
39         num_writable_file_errors_(0) {}
~ErrorEnv()40   ~ErrorEnv() override { delete target(); }
41 
NewWritableFile(const std::string & fname,WritableFile ** result)42   Status NewWritableFile(const std::string& fname,
43                          WritableFile** result) override {
44     if (writable_file_error_) {
45       ++num_writable_file_errors_;
46       *result = nullptr;
47       return Status::IOError(fname, "fake error");
48     }
49     return target()->NewWritableFile(fname, result);
50   }
51 
NewAppendableFile(const std::string & fname,WritableFile ** result)52   Status NewAppendableFile(const std::string& fname,
53                            WritableFile** result) override {
54     if (writable_file_error_) {
55       ++num_writable_file_errors_;
56       *result = nullptr;
57       return Status::IOError(fname, "fake error");
58     }
59     return target()->NewAppendableFile(fname, result);
60   }
61 };
62 
63 }  // namespace test
64 }  // namespace leveldb
65 
66 #endif  // STORAGE_LEVELDB_UTIL_TESTUTIL_H_
67