Fix tests when run against ChromiumEnv

There are a couple differences between ChromiumEnv and
PosixEnv/WindowsEnv which cause test failures that are fixed (or at
least patched over) in this change:

* NewSequentialFile() and NewRandomAccessFile() return Status::IOError
  rather than Status::NotFound when a file is not found, due to
  https://crbug.com/760362. This means a few tests need to expect a
  different error result.
* GetChildren() never returns the '.' or '..' entries.
* As allowed by the documentation for Env::Schedule(), ChromiumEnv may
  execute functions on multiple threads and guarantees no sequencing.
  EnvTest.RunMany assumed that functions ran in order. The test has been
  updated.
This commit is contained in:
Reilly Grant 2023-03-28 14:37:48 -07:00
parent fb644cb445
commit 89ea7f2643
3 changed files with 36 additions and 11 deletions

View File

@ -1722,8 +1722,13 @@ TEST_F(DBTest, DestroyEmptyDir) {
ASSERT_TRUE(env.FileExists(dbname)); ASSERT_TRUE(env.FileExists(dbname));
std::vector<std::string> children; std::vector<std::string> children;
ASSERT_LEVELDB_OK(env.GetChildren(dbname, &children)); ASSERT_LEVELDB_OK(env.GetChildren(dbname, &children));
#if defined(LEVELDB_PLATFORM_CHROMIUM)
// Chromium's file system abstraction always filters out '.' and '..'.
ASSERT_EQ(0, children.size());
#else
// The stock Env's do not filter out '.' and '..' special files. // The stock Env's do not filter out '.' and '..' special files.
ASSERT_EQ(2, children.size()); ASSERT_EQ(2, children.size());
#endif // defined(LEVELDB_PLATFORM_CHROMIUM)
ASSERT_LEVELDB_OK(DestroyDB(dbname, opts)); ASSERT_LEVELDB_OK(DestroyDB(dbname, opts));
ASSERT_TRUE(!env.FileExists(dbname)); ASSERT_TRUE(!env.FileExists(dbname));

View File

@ -328,7 +328,12 @@ TEST_F(RecoveryTest, ManifestMissing) {
RemoveManifestFile(); RemoveManifestFile();
Status status = OpenWithStatus(); Status status = OpenWithStatus();
#if defined(LEVELDB_PLATFORM_CHROMIUM)
// TODO(crbug.com/760362): See comment in MakeIOError() from env_chromium.cc.
ASSERT_TRUE(status.IsIOError());
#else
ASSERT_TRUE(status.IsCorruption()); ASSERT_TRUE(status.IsCorruption());
#endif // defined(LEVELDB_PLATFORM_CHROMIUM)
} }
} // namespace leveldb } // namespace leveldb

View File

@ -96,40 +96,45 @@ TEST_F(EnvTest, RunMany) {
struct RunState { struct RunState {
port::Mutex mu; port::Mutex mu;
port::CondVar cvar{&mu}; port::CondVar cvar{&mu};
int last_id = 0; int run_count = 0;
}; };
struct Callback { struct Callback {
RunState* state_; // Pointer to shared state. RunState* const state_; // Pointer to shared state.
const int id_; // Order# for the execution of this callback. bool run = false;
Callback(RunState* s, int id) : state_(s), id_(id) {} Callback(RunState* s) : state_(s) {}
static void Run(void* arg) { static void Run(void* arg) {
Callback* callback = reinterpret_cast<Callback*>(arg); Callback* callback = reinterpret_cast<Callback*>(arg);
RunState* state = callback->state_; RunState* state = callback->state_;
MutexLock l(&state->mu); MutexLock l(&state->mu);
ASSERT_EQ(state->last_id, callback->id_ - 1); state->run_count++;
state->last_id = callback->id_; callback->run = true;
state->cvar.Signal(); state->cvar.Signal();
} }
}; };
RunState state; RunState state;
Callback callback1(&state, 1); Callback callback1(&state);
Callback callback2(&state, 2); Callback callback2(&state);
Callback callback3(&state, 3); Callback callback3(&state);
Callback callback4(&state, 4); Callback callback4(&state);
env_->Schedule(&Callback::Run, &callback1); env_->Schedule(&Callback::Run, &callback1);
env_->Schedule(&Callback::Run, &callback2); env_->Schedule(&Callback::Run, &callback2);
env_->Schedule(&Callback::Run, &callback3); env_->Schedule(&Callback::Run, &callback3);
env_->Schedule(&Callback::Run, &callback4); env_->Schedule(&Callback::Run, &callback4);
MutexLock l(&state.mu); MutexLock l(&state.mu);
while (state.last_id != 4) { while (state.run_count != 4) {
state.cvar.Wait(); state.cvar.Wait();
} }
ASSERT_TRUE(callback1.run);
ASSERT_TRUE(callback2.run);
ASSERT_TRUE(callback3.run);
ASSERT_TRUE(callback4.run);
} }
struct State { struct State {
@ -175,11 +180,21 @@ TEST_F(EnvTest, TestOpenNonExistentFile) {
RandomAccessFile* random_access_file; RandomAccessFile* random_access_file;
Status status = Status status =
env_->NewRandomAccessFile(non_existent_file, &random_access_file); env_->NewRandomAccessFile(non_existent_file, &random_access_file);
#if defined(LEVELDB_PLATFORM_CHROMIUM)
// TODO(crbug.com/760362): See comment in MakeIOError() from env_chromium.cc.
ASSERT_TRUE(status.IsIOError());
#else
ASSERT_TRUE(status.IsNotFound()); ASSERT_TRUE(status.IsNotFound());
#endif // defined(LEVELDB_PLATFORM_CHROMIUM)
SequentialFile* sequential_file; SequentialFile* sequential_file;
status = env_->NewSequentialFile(non_existent_file, &sequential_file); status = env_->NewSequentialFile(non_existent_file, &sequential_file);
#if defined(LEVELDB_PLATFORM_CHROMIUM)
// TODO(crbug.com/760362): See comment in MakeIOError() from env_chromium.cc.
ASSERT_TRUE(status.IsIOError());
#else
ASSERT_TRUE(status.IsNotFound()); ASSERT_TRUE(status.IsNotFound());
#endif // defined(LEVELDB_PLATFORM_CHROMIUM)
} }
TEST_F(EnvTest, ReopenWritableFile) { TEST_F(EnvTest, ReopenWritableFile) {