OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/file_util.h" | 5 #include "base/file_util.h" |
6 #include "base/files/file.h" | 6 #include "base/files/file.h" |
7 #include "base/files/file_enumerator.h" | 7 #include "base/files/file_enumerator.h" |
8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
9 #include "base/files/scoped_temp_dir.h" | 9 #include "base/files/scoped_temp_dir.h" |
10 #include "base/test/test_suite.h" | 10 #include "base/test/test_suite.h" |
11 #include "env_chromium_stdio.h" | 11 #include "third_party/leveldatabase/env_chromium_stdio.h" |
12 #if defined(OS_WIN) | 12 #if defined(OS_WIN) |
13 #include "env_chromium_win.h" | 13 #include "third_party/leveldatabase/env_chromium_win.h" |
14 #endif | 14 #endif |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "third_party/leveldatabase/env_idb.h" | 16 #include "third_party/leveldatabase/env_idb.h" |
17 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 17 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
18 | 18 |
19 using namespace leveldb_env; | |
20 using namespace leveldb; | |
21 | |
22 #define FPL FILE_PATH_LITERAL | 19 #define FPL FILE_PATH_LITERAL |
23 | 20 |
| 21 using leveldb::DB; |
| 22 using leveldb::Env; |
| 23 using leveldb::IDBEnv; |
| 24 using leveldb::Options; |
| 25 using leveldb::ReadOptions; |
| 26 using leveldb::Slice; |
| 27 using leveldb::Status; |
| 28 using leveldb::WritableFile; |
| 29 using leveldb::WriteOptions; |
| 30 using leveldb_env::ChromiumEnvStdio; |
| 31 using leveldb_env::MethodID; |
| 32 |
24 TEST(ErrorEncoding, OnlyAMethod) { | 33 TEST(ErrorEncoding, OnlyAMethod) { |
25 const MethodID in_method = kSequentialFileRead; | 34 const MethodID in_method = leveldb_env::kSequentialFileRead; |
26 const Status s = MakeIOError("Somefile.txt", "message", in_method); | 35 const Status s = MakeIOError("Somefile.txt", "message", in_method); |
27 MethodID method; | 36 MethodID method; |
28 int error = -75; | 37 int error = -75; |
29 EXPECT_EQ(METHOD_ONLY, | 38 EXPECT_EQ(leveldb_env::METHOD_ONLY, |
30 ParseMethodAndError(s.ToString().c_str(), &method, &error)); | 39 ParseMethodAndError(s.ToString().c_str(), &method, &error)); |
31 EXPECT_EQ(in_method, method); | 40 EXPECT_EQ(in_method, method); |
32 EXPECT_EQ(-75, error); | 41 EXPECT_EQ(-75, error); |
33 } | 42 } |
34 | 43 |
35 TEST(ErrorEncoding, FileError) { | 44 TEST(ErrorEncoding, FileError) { |
36 const MethodID in_method = kWritableFileClose; | 45 const MethodID in_method = leveldb_env::kWritableFileClose; |
37 const base::File::Error fe = base::File::FILE_ERROR_INVALID_OPERATION; | 46 const base::File::Error fe = base::File::FILE_ERROR_INVALID_OPERATION; |
38 const Status s = MakeIOError("Somefile.txt", "message", in_method, fe); | 47 const Status s = MakeIOError("Somefile.txt", "message", in_method, fe); |
39 MethodID method; | 48 MethodID method; |
40 int error; | 49 int error; |
41 EXPECT_EQ(METHOD_AND_PFE, | 50 EXPECT_EQ(leveldb_env::METHOD_AND_PFE, |
42 ParseMethodAndError(s.ToString().c_str(), &method, &error)); | 51 ParseMethodAndError(s.ToString().c_str(), &method, &error)); |
43 EXPECT_EQ(in_method, method); | 52 EXPECT_EQ(in_method, method); |
44 EXPECT_EQ(fe, error); | 53 EXPECT_EQ(fe, error); |
45 } | 54 } |
46 | 55 |
47 TEST(ErrorEncoding, Errno) { | 56 TEST(ErrorEncoding, Errno) { |
48 const MethodID in_method = kWritableFileFlush; | 57 const MethodID in_method = leveldb_env::kWritableFileFlush; |
49 const int some_errno = ENOENT; | 58 const int some_errno = ENOENT; |
50 const Status s = | 59 const Status s = |
51 MakeIOError("Somefile.txt", "message", in_method, some_errno); | 60 MakeIOError("Somefile.txt", "message", in_method, some_errno); |
52 MethodID method; | 61 MethodID method; |
53 int error; | 62 int error; |
54 EXPECT_EQ(METHOD_AND_ERRNO, | 63 EXPECT_EQ(leveldb_env::METHOD_AND_ERRNO, |
55 ParseMethodAndError(s.ToString().c_str(), &method, &error)); | 64 ParseMethodAndError(s.ToString().c_str(), &method, &error)); |
56 EXPECT_EQ(in_method, method); | 65 EXPECT_EQ(in_method, method); |
57 EXPECT_EQ(some_errno, error); | 66 EXPECT_EQ(some_errno, error); |
58 } | 67 } |
59 | 68 |
60 #if defined(OS_WIN) | 69 #if defined(OS_WIN) |
61 TEST(ErrorEncoding, ErrnoWin32) { | 70 TEST(ErrorEncoding, ErrnoWin32) { |
62 const MethodID in_method = kWritableFileFlush; | 71 const MethodID in_method = leveldb_env::kWritableFileFlush; |
63 const DWORD some_errno = ERROR_FILE_NOT_FOUND; | 72 const DWORD some_errno = ERROR_FILE_NOT_FOUND; |
64 const Status s = | 73 const Status s = |
65 MakeIOErrorWin("Somefile.txt", "message", in_method, some_errno); | 74 MakeIOErrorWin("Somefile.txt", "message", in_method, some_errno); |
66 MethodID method; | 75 MethodID method; |
67 int error; | 76 int error; |
68 EXPECT_EQ(METHOD_AND_ERRNO, | 77 EXPECT_EQ(leveldb_env::METHOD_AND_ERRNO, |
69 ParseMethodAndError(s.ToString().c_str(), &method, &error)); | 78 ParseMethodAndError(s.ToString().c_str(), &method, &error)); |
70 EXPECT_EQ(in_method, method); | 79 EXPECT_EQ(in_method, method); |
71 EXPECT_EQ(some_errno, error); | 80 EXPECT_EQ(some_errno, error); |
72 } | 81 } |
73 #endif | 82 #endif |
74 | 83 |
75 TEST(ErrorEncoding, NoEncodedMessage) { | 84 TEST(ErrorEncoding, NoEncodedMessage) { |
76 Status s = Status::IOError("Some message", "from leveldb itself"); | 85 Status s = Status::IOError("Some message", "from leveldb itself"); |
77 MethodID method = kRandomAccessFileRead; | 86 MethodID method = leveldb_env::kRandomAccessFileRead; |
78 int error = 4; | 87 int error = 4; |
79 EXPECT_EQ(NONE, ParseMethodAndError(s.ToString().c_str(), &method, &error)); | 88 EXPECT_EQ(leveldb_env::NONE, |
80 EXPECT_EQ(kRandomAccessFileRead, method); | 89 ParseMethodAndError(s.ToString().c_str(), &method, &error)); |
| 90 EXPECT_EQ(leveldb_env::kRandomAccessFileRead, method); |
81 EXPECT_EQ(4, error); | 91 EXPECT_EQ(4, error); |
82 } | 92 } |
83 | 93 |
84 template <typename T> | 94 template <typename T> |
85 class MyEnv : public T { | 95 class MyEnv : public T { |
86 public: | 96 public: |
87 MyEnv() : directory_syncs_(0) {} | 97 MyEnv() : directory_syncs_(0) {} |
88 int directory_syncs() { return directory_syncs_; } | 98 int directory_syncs() { return directory_syncs_; } |
89 | 99 |
90 protected: | 100 protected: |
91 virtual void DidSyncDir(const std::string& fname) { | 101 virtual void DidSyncDir(const std::string& fname) { |
92 ++directory_syncs_; | 102 ++directory_syncs_; |
93 ChromiumEnv::DidSyncDir(fname); | 103 leveldb_env::ChromiumEnv::DidSyncDir(fname); |
94 } | 104 } |
95 | 105 |
96 private: | 106 private: |
97 int directory_syncs_; | 107 int directory_syncs_; |
98 }; | 108 }; |
99 | 109 |
100 template <typename T> | 110 template <typename T> |
101 class ChromiumEnvMultiPlatformTests : public ::testing::Test { | 111 class ChromiumEnvMultiPlatformTests : public ::testing::Test { |
102 public: | 112 public: |
103 }; | 113 }; |
104 | 114 |
105 #if defined(OS_WIN) | 115 #if defined(OS_WIN) |
106 typedef ::testing::Types<ChromiumEnvStdio, ChromiumEnvWin> ChromiumEnvMultiPlatf
ormTestsTypes; | 116 typedef ::testing::Types<ChromiumEnvStdio, ChromiumEnvWin> |
| 117 ChromiumEnvMultiPlatformTestsTypes; |
107 #else | 118 #else |
108 typedef ::testing::Types<ChromiumEnvStdio> ChromiumEnvMultiPlatformTestsTypes; | 119 typedef ::testing::Types<ChromiumEnvStdio> ChromiumEnvMultiPlatformTestsTypes; |
109 #endif | 120 #endif |
110 TYPED_TEST_CASE(ChromiumEnvMultiPlatformTests, ChromiumEnvMultiPlatformTestsType
s); | 121 TYPED_TEST_CASE(ChromiumEnvMultiPlatformTests, |
| 122 ChromiumEnvMultiPlatformTestsTypes); |
111 | 123 |
112 TYPED_TEST(ChromiumEnvMultiPlatformTests, DirectorySyncing) { | 124 TYPED_TEST(ChromiumEnvMultiPlatformTests, DirectorySyncing) { |
113 MyEnv<TypeParam> env; | 125 MyEnv<TypeParam> env; |
114 | 126 |
115 base::ScopedTempDir dir; | 127 base::ScopedTempDir dir; |
116 ASSERT_TRUE(dir.CreateUniqueTempDir()); | 128 ASSERT_TRUE(dir.CreateUniqueTempDir()); |
117 base::FilePath dir_path = dir.path(); | 129 base::FilePath dir_path = dir.path(); |
118 std::string some_data = "some data"; | 130 std::string some_data = "some data"; |
119 Slice data = some_data; | 131 Slice data = some_data; |
120 | 132 |
121 std::string manifest_file_name = | 133 std::string manifest_file_name = leveldb_env::FilePathToString( |
122 FilePathToString(dir_path.Append(FILE_PATH_LITERAL("MANIFEST-001"))); | 134 dir_path.Append(FILE_PATH_LITERAL("MANIFEST-001"))); |
123 WritableFile* manifest_file_ptr; | 135 WritableFile* manifest_file_ptr; |
124 Status s = env.NewWritableFile(manifest_file_name, &manifest_file_ptr); | 136 Status s = env.NewWritableFile(manifest_file_name, &manifest_file_ptr); |
125 EXPECT_TRUE(s.ok()); | 137 EXPECT_TRUE(s.ok()); |
126 scoped_ptr<WritableFile> manifest_file(manifest_file_ptr); | 138 scoped_ptr<WritableFile> manifest_file(manifest_file_ptr); |
127 manifest_file->Append(data); | 139 manifest_file->Append(data); |
128 EXPECT_EQ(0, env.directory_syncs()); | 140 EXPECT_EQ(0, env.directory_syncs()); |
129 manifest_file->Append(data); | 141 manifest_file->Append(data); |
130 EXPECT_EQ(0, env.directory_syncs()); | 142 EXPECT_EQ(0, env.directory_syncs()); |
131 | 143 |
132 std::string sst_file_name = | 144 std::string sst_file_name = leveldb_env::FilePathToString( |
133 FilePathToString(dir_path.Append(FILE_PATH_LITERAL("000003.sst"))); | 145 dir_path.Append(FILE_PATH_LITERAL("000003.sst"))); |
134 WritableFile* sst_file_ptr; | 146 WritableFile* sst_file_ptr; |
135 s = env.NewWritableFile(sst_file_name, &sst_file_ptr); | 147 s = env.NewWritableFile(sst_file_name, &sst_file_ptr); |
136 EXPECT_TRUE(s.ok()); | 148 EXPECT_TRUE(s.ok()); |
137 scoped_ptr<WritableFile> sst_file(sst_file_ptr); | 149 scoped_ptr<WritableFile> sst_file(sst_file_ptr); |
138 sst_file->Append(data); | 150 sst_file->Append(data); |
139 EXPECT_EQ(0, env.directory_syncs()); | 151 EXPECT_EQ(0, env.directory_syncs()); |
140 | 152 |
141 manifest_file->Append(data); | 153 manifest_file->Append(data); |
142 EXPECT_EQ(1, env.directory_syncs()); | 154 EXPECT_EQ(1, env.directory_syncs()); |
143 manifest_file->Append(data); | 155 manifest_file->Append(data); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 EXPECT_TRUE(status.ok()); | 260 EXPECT_TRUE(status.ok()); |
249 EXPECT_EQ(1U, result.size()); | 261 EXPECT_EQ(1U, result.size()); |
250 | 262 |
251 // And a second time should also return one result | 263 // And a second time should also return one result |
252 status = env->GetChildren(dir.AsUTF8Unsafe(), &result); | 264 status = env->GetChildren(dir.AsUTF8Unsafe(), &result); |
253 EXPECT_TRUE(status.ok()); | 265 EXPECT_TRUE(status.ok()); |
254 EXPECT_EQ(1U, result.size()); | 266 EXPECT_EQ(1U, result.size()); |
255 } | 267 } |
256 | 268 |
257 int main(int argc, char** argv) { return base::TestSuite(argc, argv).Run(); } | 269 int main(int argc, char** argv) { return base::TestSuite(argc, argv).Run(); } |
OLD | NEW |