c69d33b0ec
This change adds a native Windows port (port_windows.h) and a Windows Env (WindowsEnv). Note1: "small" is defined when including <Windows.h> so some parameters were renamed to avoid conflict. Note2: leveldb::Env defines the method: "DeleteFile" which is also a constant defined when including <Windows.h>. The solution was to ensure this macro is defined in env.h which forces the function, when compiled, to be either DeleteFileA or DeleteFileW when building for MBCS or UNICODE respectively. This resolves #519 on GitHub. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=236364778
64 lines
1.9 KiB
C++
64 lines
1.9 KiB
C++
// Copyright (c) 2018 The LevelDB Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
|
|
#include "leveldb/env.h"
|
|
|
|
#include "port/port.h"
|
|
#include "util/env_windows_test_helper.h"
|
|
#include "util/testharness.h"
|
|
|
|
namespace leveldb {
|
|
|
|
static const int kMMapLimit = 4;
|
|
|
|
class EnvWindowsTest {
|
|
public:
|
|
Env* env_;
|
|
EnvWindowsTest() : env_(Env::Default()) {}
|
|
|
|
static void SetFileLimits(int mmap_limit) {
|
|
EnvWindowsTestHelper::SetReadOnlyMMapLimit(mmap_limit);
|
|
}
|
|
};
|
|
|
|
TEST(EnvWindowsTest, TestOpenOnRead) {
|
|
// Write some test data to a single file that will be opened |n| times.
|
|
std::string test_dir;
|
|
ASSERT_OK(env_->GetTestDirectory(&test_dir));
|
|
std::string test_file = test_dir + "/open_on_read.txt";
|
|
|
|
FILE* f = fopen(test_file.c_str(), "w");
|
|
ASSERT_TRUE(f != nullptr);
|
|
const char kFileData[] = "abcdefghijklmnopqrstuvwxyz";
|
|
fputs(kFileData, f);
|
|
fclose(f);
|
|
|
|
// Open test file some number above the sum of the two limits to force
|
|
// leveldb::WindowsEnv to switch from mapping the file into memory
|
|
// to basic file reading.
|
|
const int kNumFiles = kMMapLimit + 5;
|
|
leveldb::RandomAccessFile* files[kNumFiles] = {0};
|
|
for (int i = 0; i < kNumFiles; i++) {
|
|
ASSERT_OK(env_->NewRandomAccessFile(test_file, &files[i]));
|
|
}
|
|
char scratch;
|
|
Slice read_result;
|
|
for (int i = 0; i < kNumFiles; i++) {
|
|
ASSERT_OK(files[i]->Read(i, 1, &read_result, &scratch));
|
|
ASSERT_EQ(kFileData[i], read_result[0]);
|
|
}
|
|
for (int i = 0; i < kNumFiles; i++) {
|
|
delete files[i];
|
|
}
|
|
ASSERT_OK(env_->DeleteFile(test_file));
|
|
}
|
|
|
|
} // namespace leveldb
|
|
|
|
int main(int argc, char** argv) {
|
|
// All tests currently run with the same read-only file limits.
|
|
leveldb::EnvWindowsTest::SetFileLimits(leveldb::kMMapLimit);
|
|
return leveldb::test::RunAllTests();
|
|
}
|