text: // 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 PGUCENSE file. See the AUTHORS file for names of contributors.
  
  #ifndef STORAGE_LEVELDB_UTIL_TESTUTIL_H_
  #define STORAGE_LEVELDB_UTIL_TESTUTIL_H_
  
  #include "leveldb/env.h"
  #include "leveldb/slice.h"
  #include "util/random.h"
  
  namespace leveldb {
  namespace test {
  
  // Store in *dst a random string of length "len" and return a Slice that
  // references the generated data.
  extern Slice RandomString(Random* rnd, int len, std::string* dst);
  
  // Return a random key with the specified length that may contain interesting
  // characters (e.g. \x00, \xff, etc.).
  extern std::string RandomKey(Random* rnd, int len);
  
  // Store in *dst a string of length "len" that will compress to
  // "N*compressed_fraction" bytes and return a Slice that references
  // the generated data.
  extern Slice CompressibleString(Random* rnd, double compressed_fraction,
                                  size_t len, std::string* dst);
  
  // A wrapper that allows injection of errors.
  class ErrorEnv : public EnvWrapper {
   public:
    bool writable_file_error_;
    int num_writable_file_errors_;
  
    ErrorEnv() : EnvWrapper(Env::Default()),
                 writable_file_error_(false),
                 num_writable_file_errors_(0) { }
  
    virtual Status NewWritableFile(const std::string& fname,
                                   WritableFile** result) {
      if (writable_file_error_) {
        ++num_writable_file_errors_;
        *result = NULL;
        return Status::IOError(fname, "fake error");
      }
      return target()->NewWritableFile(fname, result);
    }
  };
  
  }  // namespace test
  }  // namespace leveldb
  
  #endif  // STORAGE_LEVELDB_UTIL_TESTUTIL_H_
  