blob: 0789b3c6337d37fd651840ba9d9e41550c604fad [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "base/test/test_suite.h"
#include "env_chromium.h"
#include "testing/gtest/include/gtest/gtest.h"
using namespace leveldb_env;
using namespace leveldb;
TEST(ErrorEncoding, OnlyAMethod) {
const MethodID in_method = kSequentialFileRead;
const Status s = MakeIOError("Somefile.txt", "message", in_method);
MethodID method;
int error = -75;
EXPECT_EQ(METHOD_ONLY,
ParseMethodAndError(s.ToString().c_str(), &method, &error));
EXPECT_EQ(in_method, method);
EXPECT_EQ(-75, error);
}
TEST(ErrorEncoding, PlatformFileError) {
const MethodID in_method = kWritableFileClose;
const base::PlatformFileError pfe =
base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
const Status s = MakeIOError("Somefile.txt", "message", in_method, pfe);
MethodID method;
int error;
EXPECT_EQ(METHOD_AND_PFE,
ParseMethodAndError(s.ToString().c_str(), &method, &error));
EXPECT_EQ(in_method, method);
EXPECT_EQ(pfe, error);
}
TEST(ErrorEncoding, Errno) {
const MethodID in_method = kWritableFileFlush;
const int some_errno = ENOENT;
const Status s =
MakeIOError("Somefile.txt", "message", in_method, some_errno);
MethodID method;
int error;
EXPECT_EQ(METHOD_AND_ERRNO,
ParseMethodAndError(s.ToString().c_str(), &method, &error));
EXPECT_EQ(in_method, method);
EXPECT_EQ(some_errno, error);
}
TEST(ErrorEncoding, NoEncodedMessage) {
Status s = Status::IOError("Some message", "from leveldb itself");
MethodID method = kRandomAccessFileRead;
int error = 4;
EXPECT_EQ(NONE, ParseMethodAndError(s.ToString().c_str(), &method, &error));
EXPECT_EQ(kRandomAccessFileRead, method);
EXPECT_EQ(4, error);
}
class MyEnv : public ChromiumEnv {
public:
MyEnv() : directory_syncs_(0) {}
int directory_syncs() { return directory_syncs_; }
protected:
virtual void DidSyncDir(const std::string& fname) {
++directory_syncs_;
ChromiumEnv::DidSyncDir(fname);
}
private:
int directory_syncs_;
};
TEST(ChromiumEnv, DirectorySyncing) {
MyEnv env;
base::ScopedTempDir dir;
dir.CreateUniqueTempDir();
base::FilePath dir_path = dir.path();
std::string some_data = "some data";
Slice data = some_data;
std::string manifest_file_name =
FilePathToString(dir_path.Append(FILE_PATH_LITERAL("MANIFEST-001")));
WritableFile* manifest_file;
Status s = env.NewWritableFile(manifest_file_name, &manifest_file);
EXPECT_TRUE(s.ok());
manifest_file->Append(data);
EXPECT_EQ(0, env.directory_syncs());
manifest_file->Append(data);
EXPECT_EQ(0, env.directory_syncs());
std::string sst_file_name =
FilePathToString(dir_path.Append(FILE_PATH_LITERAL("000003.sst")));
WritableFile* sst_file;
s = env.NewWritableFile(sst_file_name, &sst_file);
EXPECT_TRUE(s.ok());
sst_file->Append(data);
EXPECT_EQ(0, env.directory_syncs());
manifest_file->Append(data);
EXPECT_EQ(1, env.directory_syncs());
manifest_file->Append(data);
EXPECT_EQ(1, env.directory_syncs());
}
int main(int argc, char** argv) { return base::TestSuite(argc, argv).Run(); }