blob: 4ad3b9714bfeb484bd6256f9f8447ecec8215f27 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "paimon/fs/local/local_file.h"
#include <cstring>
#include <string>
#include <utility>
#include "gtest/gtest.h"
#include "paimon/testing/utils/testharness.h"
namespace paimon::test {
TEST(LocalFileTest, TestReadWriteEmptyContent) {
auto test_root_dir = UniqueTestDirectory::Create();
ASSERT_TRUE(test_root_dir);
std::string test_root = test_root_dir->Str();
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create(test_root));
if (dir->Exists().ok()) {
ASSERT_TRUE(dir->Delete().ok());
}
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_TRUE(success);
std::string path = test_root + "/test.txt";
ASSERT_OK_AND_ASSIGN(auto file, LocalFile::Create(path));
if (file->Exists().ok()) {
ASSERT_TRUE(file->Delete().ok());
}
ASSERT_OK_AND_ASSIGN(bool is_exist, file->Exists());
ASSERT_FALSE(is_exist);
ASSERT_OK(file->OpenFile(/*is_read_file=*/false));
const char* str = "";
const int32_t str_size = 0;
ASSERT_OK_AND_ASSIGN(int32_t write_size, file->Write(str, str_size));
ASSERT_EQ(write_size, str_size);
ASSERT_OK(file->Flush());
ASSERT_TRUE(file->Exists().value());
ASSERT_OK(file->Close());
ASSERT_OK_AND_ASSIGN(auto file2, LocalFile::Create(path));
ASSERT_OK(file2->OpenFile(/*is_read_file=*/true));
char buffer[10];
ASSERT_OK_AND_ASSIGN(int32_t read_len, file2->Read(buffer, 10));
ASSERT_EQ(0, read_len);
}
TEST(LocalFileTest, TestSimple) {
auto test_root_dir = UniqueTestDirectory::Create();
ASSERT_TRUE(test_root_dir);
std::string test_root = test_root_dir->Str();
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create(test_root));
if (dir->Exists().ok()) {
ASSERT_OK(dir->Delete());
}
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_TRUE(success);
std::string path = test_root + "/test.txt";
ASSERT_OK_AND_ASSIGN(auto file, LocalFile::Create(path));
if (file->Exists().ok()) {
ASSERT_OK(file->Delete());
}
ASSERT_OK_AND_ASSIGN(bool is_exist, file->Exists());
ASSERT_FALSE(is_exist);
ASSERT_OK(file->OpenFile(/*is_read_file=*/false));
const char* str = "test_data";
const int32_t str_size = 9;
ASSERT_OK_AND_ASSIGN(int32_t write_size, file->Write(str, str_size));
ASSERT_EQ(write_size, str_size);
ASSERT_OK(file->Flush());
ASSERT_OK(file->Close());
ASSERT_OK_AND_ASSIGN(bool is_file, file->IsFile());
ASSERT_TRUE(is_file);
ASSERT_OK_AND_ASSIGN(bool is_dir, file->IsDir());
ASSERT_FALSE(is_dir);
std::vector<std::string> file_list;
ASSERT_NOK(file->List(&file_list));
ASSERT_OK_AND_ASSIGN(size_t len, file->Length());
ASSERT_EQ(len, str_size);
ASSERT_OK_AND_ASSIGN(auto file2, LocalFile::Create(path));
ASSERT_OK(file2->Exists());
ASSERT_OK(file2->OpenFile(true));
char str_read[str_size + 1];
{
ASSERT_OK_AND_ASSIGN(int32_t read_size, file2->Read(str_read, 4));
ASSERT_EQ(read_size, 4);
str_read[read_size] = '\0';
ASSERT_EQ(strcmp(str_read, "test"), 0);
}
{
ASSERT_OK_AND_ASSIGN(int64_t pos, file2->Tell());
ASSERT_EQ(pos, 4);
ASSERT_OK(file2->Seek(5, SEEK_SET));
ASSERT_OK_AND_ASSIGN(int32_t read_size, file2->Read(str_read, 4));
ASSERT_EQ(read_size, 4);
str_read[read_size] = '\0';
ASSERT_EQ(strcmp(str_read, "data"), 0);
}
{
ASSERT_OK_AND_ASSIGN(int32_t read_size, file2->Read(str_read, str_size, 0));
ASSERT_EQ(read_size, str_size);
str_read[read_size] = '\0';
ASSERT_EQ(strcmp(str_read, "test_data"), 0);
}
// dir already exists
ASSERT_OK_AND_ASSIGN(success, dir->Mkdir());
ASSERT_FALSE(success);
ASSERT_OK(file2->Delete());
ASSERT_FALSE(file2->Exists().value());
}
TEST(LocalFileTest, TestUsage) {
std::string test_root = "local_file_test_usage";
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create(test_root));
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_TRUE(success);
std::vector<std::string> file_list;
ASSERT_OK(dir->List(&file_list));
std::string path_deep_dir = test_root + "/tmp2";
ASSERT_OK_AND_ASSIGN(auto deep_dir, LocalFile::Create(path_deep_dir));
ASSERT_OK_AND_ASSIGN(success, deep_dir->Mkdir());
ASSERT_TRUE(success);
std::unique_ptr<LocalFile> parent_deep_dir = deep_dir->GetParentFile();
ASSERT_EQ(parent_deep_dir->GetPath(), dir->GetPath());
ASSERT_OK(deep_dir->Delete());
ASSERT_OK(parent_deep_dir->Delete());
ASSERT_OK(dir->Delete());
}
TEST(LocalFileTest, TestOpenFile) {
auto test_root_dir = UniqueTestDirectory::Create();
ASSERT_TRUE(test_root_dir);
std::string test_root = test_root_dir->Str();
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create(test_root));
if (dir->Exists().ok()) {
ASSERT_OK(dir->Delete());
}
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_TRUE(success);
std::string path = test_root + "/test.txt";
ASSERT_OK_AND_ASSIGN(auto file, LocalFile::Create(path));
if (file->Exists().ok()) {
ASSERT_OK(file->Delete());
}
ASSERT_OK_AND_ASSIGN(bool is_exist, file->Exists());
ASSERT_FALSE(is_exist);
ASSERT_NOK_WITH_MSG(file->OpenFile(/*is_read_file=*/true), "file not exist");
ASSERT_NOK_WITH_MSG(dir->OpenFile(/*is_read_file=*/true), "cannot open a directory");
std::string path3 = "test.txt";
ASSERT_OK_AND_ASSIGN(auto file3, LocalFile::Create(path3));
ASSERT_OK(file3->OpenFile(/*is_read_file=*/false));
ASSERT_OK_AND_ASSIGN(int64_t modify_time, file3->LastModifiedTimeMs());
ASSERT_GE(modify_time, -1);
ASSERT_OK_AND_ASSIGN(auto dir2, LocalFile::Create("/"));
ASSERT_OK_AND_ASSIGN(success, dir2->Mkdir());
ASSERT_FALSE(success);
ASSERT_OK_AND_ASSIGN(auto dir3, LocalFile::Create(test_root + "/"));
ASSERT_OK_AND_ASSIGN(success, dir3->Mkdir());
ASSERT_FALSE(success);
}
TEST(LocalFileTest, TestMkdir) {
auto test_root_dir = UniqueTestDirectory::Create();
ASSERT_TRUE(test_root_dir);
std::string test_root = test_root_dir->Str();
{
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create(test_root + "tmp/local/f/1"));
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_FALSE(success);
}
{
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create(test_root + "tmp1"));
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_TRUE(success);
}
{
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create(test_root + "tmp1/f2/"));
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_TRUE(success);
}
{
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create("/"));
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_FALSE(success);
}
{
ASSERT_OK_AND_ASSIGN(auto dir, LocalFile::Create(""));
ASSERT_OK_AND_ASSIGN(bool success, dir->Mkdir());
ASSERT_FALSE(success);
}
}
} // namespace paimon::test