2018-08-13 19:15:09 +02:00
|
|
|
//
|
2018-12-31 23:02:34 +01:00
|
|
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2019
|
2018-08-13 19:15:09 +02:00
|
|
|
//
|
|
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
//
|
2018-09-07 02:41:21 +02:00
|
|
|
#include "td/utils/common.h"
|
2018-09-10 03:08:15 +02:00
|
|
|
#include "td/utils/logging.h"
|
2018-08-13 19:15:09 +02:00
|
|
|
#include "td/utils/port/FileFd.h"
|
|
|
|
#include "td/utils/port/path.h"
|
2018-09-07 02:41:21 +02:00
|
|
|
#include "td/utils/Slice.h"
|
|
|
|
#include "td/utils/tests.h"
|
2018-08-13 19:15:09 +02:00
|
|
|
|
|
|
|
using namespace td;
|
|
|
|
|
|
|
|
TEST(Port, files) {
|
|
|
|
CSlice main_dir = "test_dir";
|
|
|
|
rmrf(main_dir).ignore();
|
2018-09-11 21:17:01 +02:00
|
|
|
ASSERT_TRUE(FileFd::open(main_dir, FileFd::Write).is_error());
|
2018-09-12 14:07:54 +02:00
|
|
|
ASSERT_TRUE(walk_path(main_dir, [](CSlice name, bool is_directory) { UNREACHABLE(); }).is_error());
|
2018-08-13 19:15:09 +02:00
|
|
|
mkdir(main_dir).ensure();
|
|
|
|
mkdir(PSLICE() << main_dir << TD_DIR_SLASH << "A").ensure();
|
|
|
|
mkdir(PSLICE() << main_dir << TD_DIR_SLASH << "B").ensure();
|
2018-09-12 02:21:23 +02:00
|
|
|
mkdir(PSLICE() << main_dir << TD_DIR_SLASH << "B" << TD_DIR_SLASH << "D").ensure();
|
2018-08-13 19:15:09 +02:00
|
|
|
mkdir(PSLICE() << main_dir << TD_DIR_SLASH << "C").ensure();
|
|
|
|
ASSERT_TRUE(FileFd::open(main_dir, FileFd::Write).is_error());
|
|
|
|
std::string fd_path = PSTRING() << main_dir << TD_DIR_SLASH << "t.txt";
|
2018-09-12 02:21:23 +02:00
|
|
|
std::string fd2_path = PSTRING() << main_dir << TD_DIR_SLASH << "C" << TD_DIR_SLASH << "t2.txt";
|
2018-08-13 19:15:09 +02:00
|
|
|
|
|
|
|
auto fd = FileFd::open(fd_path, FileFd::Write | FileFd::CreateNew).move_as_ok();
|
2018-09-12 02:21:23 +02:00
|
|
|
auto fd2 = FileFd::open(fd2_path, FileFd::Write | FileFd::CreateNew).move_as_ok();
|
|
|
|
fd2.close();
|
2018-09-11 21:17:01 +02:00
|
|
|
|
|
|
|
int cnt = 0;
|
|
|
|
const int ITER_COUNT = 1000;
|
|
|
|
for (int i = 0; i < ITER_COUNT; i++) {
|
2018-09-11 21:28:10 +02:00
|
|
|
walk_path(main_dir,
|
2018-09-13 20:22:25 +02:00
|
|
|
[&](CSlice name, bool is_directory) {
|
2018-09-11 21:28:10 +02:00
|
|
|
if (!is_directory) {
|
2018-09-12 02:21:23 +02:00
|
|
|
ASSERT_TRUE(name == fd_path || name == fd2_path);
|
2018-09-11 21:28:10 +02:00
|
|
|
}
|
|
|
|
cnt++;
|
|
|
|
})
|
|
|
|
.ensure();
|
2018-09-11 21:17:01 +02:00
|
|
|
}
|
2018-09-12 02:21:23 +02:00
|
|
|
ASSERT_EQ(7 * ITER_COUNT, cnt);
|
2018-09-11 21:17:01 +02:00
|
|
|
|
2018-08-13 19:15:09 +02:00
|
|
|
ASSERT_EQ(0u, fd.get_size());
|
|
|
|
ASSERT_EQ(12u, fd.write("Hello world!").move_as_ok());
|
|
|
|
ASSERT_EQ(4u, fd.pwrite("abcd", 1).move_as_ok());
|
|
|
|
char buf[100];
|
|
|
|
MutableSlice buf_slice(buf, sizeof(buf));
|
|
|
|
ASSERT_TRUE(fd.pread(buf_slice.substr(0, 4), 2).is_error());
|
|
|
|
fd.seek(11).ensure();
|
|
|
|
ASSERT_EQ(2u, fd.write("?!").move_as_ok());
|
|
|
|
|
|
|
|
ASSERT_TRUE(FileFd::open(main_dir, FileFd::Read | FileFd::CreateNew).is_error());
|
|
|
|
fd = FileFd::open(fd_path, FileFd::Read | FileFd::Create).move_as_ok();
|
|
|
|
ASSERT_EQ(13u, fd.get_size());
|
|
|
|
ASSERT_EQ(4u, fd.pread(buf_slice.substr(0, 4), 1).move_as_ok());
|
|
|
|
ASSERT_STREQ("abcd", buf_slice.substr(0, 4));
|
|
|
|
|
|
|
|
fd.seek(0).ensure();
|
|
|
|
ASSERT_EQ(13u, fd.read(buf_slice.substr(0, 13)).move_as_ok());
|
|
|
|
ASSERT_STREQ("Habcd world?!", buf_slice.substr(0, 13));
|
|
|
|
}
|