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