env_chromium_unittest.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_path.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/test/test_suite.h" 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "env_chromium.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using namespace leveldb_env; 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using namespace leveldb; 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(ErrorEncoding, OnlyAMethod) { 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const MethodID in_method = kSequentialFileRead; 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const Status s = MakeIOError("Somefile.txt", "message", in_method); 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MethodID method; 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int error = -75; 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(METHOD_ONLY, 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ParseMethodAndError(s.ToString().c_str(), &method, &error)); 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(in_method, method); 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(-75, error); 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(ErrorEncoding, PlatformFileError) { 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const MethodID in_method = kWritableFileClose; 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::PlatformFileError pfe = 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::PLATFORM_FILE_ERROR_INVALID_OPERATION; 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const Status s = MakeIOError("Somefile.txt", "message", in_method, pfe); 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MethodID method; 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int error; 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(METHOD_AND_PFE, 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ParseMethodAndError(s.ToString().c_str(), &method, &error)); 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(in_method, method); 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(pfe, error); 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(ErrorEncoding, Errno) { 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const MethodID in_method = kWritableFileFlush; 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int some_errno = ENOENT; 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const Status s = 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MakeIOError("Somefile.txt", "message", in_method, some_errno); 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MethodID method; 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int error; 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(METHOD_AND_ERRNO, 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ParseMethodAndError(s.ToString().c_str(), &method, &error)); 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(in_method, method); 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(some_errno, error); 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(ErrorEncoding, NoEncodedMessage) { 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Status s = Status::IOError("Some message", "from leveldb itself"); 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MethodID method = kRandomAccessFileRead; 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int error = 4; 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(NONE, ParseMethodAndError(s.ToString().c_str(), &method, &error)); 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(kRandomAccessFileRead, method); 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(4, error); 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MyEnv : public ChromiumEnv { 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MyEnv() : directory_syncs_(0) {} 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int directory_syncs() { return directory_syncs_; } 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected: 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void DidSyncDir(const std::string& fname) { 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ++directory_syncs_; 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ChromiumEnv::DidSyncDir(fname); 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int directory_syncs_; 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(ChromiumEnv, DirectorySyncing) { 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MyEnv env; 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::ScopedTempDir dir; 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dir.CreateUniqueTempDir(); 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath dir_path = dir.path(); 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string some_data = "some data"; 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Slice data = some_data; 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string manifest_file_name = 84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FilePathToString(dir_path.Append(FILE_PATH_LITERAL("MANIFEST-001"))); 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WritableFile* manifest_file; 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Status s = env.NewWritableFile(manifest_file_name, &manifest_file); 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(s.ok()); 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manifest_file->Append(data); 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, env.directory_syncs()); 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manifest_file->Append(data); 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, env.directory_syncs()); 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::string sst_file_name = 94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch FilePathToString(dir_path.Append(FILE_PATH_LITERAL("000003.sst"))); 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WritableFile* sst_file; 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) s = env.NewWritableFile(sst_file_name, &sst_file); 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(s.ok()); 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sst_file->Append(data); 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, env.directory_syncs()); 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manifest_file->Append(data); 102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1, env.directory_syncs()); 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) manifest_file->Append(data); 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1, env.directory_syncs()); 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int main(int argc, char** argv) { return base::TestSuite(argc, argv).Run(); } 108