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