Skip to content

Commit

Permalink
Refactor ls and mkdir methods
Browse files Browse the repository at this point in the history
  • Loading branch information
GregoryKogan committed Dec 10, 2023
1 parent 2e2a506 commit 574ada7
Show file tree
Hide file tree
Showing 9 changed files with 119 additions and 292 deletions.
19 changes: 9 additions & 10 deletions src/CLI/CLI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,21 +103,22 @@ auto CLI::basename(std::vector<std::string> args) -> void {
auto CLI::ls(std::vector<std::string> args) -> void {
bool verbose = false;

std::string path;
std::vector<Metadata> files;

if (args.empty()) {
files = file_system_.ls(".");
path = ".";
} else if (args.size() == 1) {
if (args[0] == "-l") {
verbose = true;
files = file_system_.ls(".");
path = ".";
} else {
files = file_system_.ls(args[0]);
path = args[0];
}
} else if (args.size() == 2) {
if (args[1] == "-l") {
verbose = true;
files = file_system_.ls(args[0]);
path = args[0];
} else {
std::cout << "Wrong arguments. Usage: ls [-l] <path>\n";
return;
Expand All @@ -127,12 +128,10 @@ auto CLI::ls(std::vector<std::string> args) -> void {
return;
}

if (!files.empty()) {
std::cout << Metadata::to_string(files[0], verbose) << '\n';
for (auto it = files.begin() + 1; it != files.end(); ++it) {
std::cout << "|----" << Metadata::to_string(*it, verbose) << '\n';
}
}
files = file_system_.ls(path);

std::cout << file_system_.basename(path) << "\n";
for (auto const &file : files) { std::cout << "|----" << Metadata::to_string(file, verbose) << '\n'; }
}

auto CLI::mkdir(std::vector<std::string> args) -> void {
Expand Down
6 changes: 5 additions & 1 deletion src/FileSystem/FileSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ auto FileSystem::ls(std::string const &path) const -> std::vector<Metadata> {
auto dir = Directory::from_bytes(dir_reader.read());

auto child_clusters = dir.list_files();
child_clusters.insert(child_clusters.begin(), dir_cluster.value());
std::vector<Metadata> metadata_list;
for (auto const &child_cluster : child_clusters) {
auto metadata_handler = handler_builder_.build_metadata_handler(child_cluster);
Expand All @@ -60,6 +59,11 @@ auto FileSystem::mkdir(std::string const &path) -> void {
auto parent_dir_path = dirname(path);
auto dir_name = basename(path);

auto existing_children = ls(parent_dir_path);
for (auto const &child : existing_children) {
if (child.get_name() == dir_name) throw std::invalid_argument("Directory already exists");
}

auto parent_dir_cluster = path_resolver_.search(parent_dir_path, working_dir_cluster_);
if (!parent_dir_cluster.has_value()) throw std::invalid_argument("Parent directory does not exist");

Expand Down
8 changes: 0 additions & 8 deletions src/FileSystem/FileSystem.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,4 @@ class FileSystem {
void read_settings();
[[nodiscard]] auto is_root_dir_created() noexcept -> bool;
auto create_root_dir() -> void;
// [[nodiscard]] auto root_dir_size() const noexcept -> std::uint64_t;
// [[nodiscard]] auto root_dir_file_data() const -> FileData;

// [[nodiscard]] auto search(std::string const &path) const -> std::optional<FileData>;

// [[nodiscard]] auto get_parent_dir_data(std::string const &path) -> std::optional<FileData>;
// auto write_new_dir(FileData const &parent_dir_data, std::string const &dir_name) -> FileData;
// auto update_parent_dir(FileData const &parent_dir_data, FileData const &new_file_data) -> void;
};
118 changes: 0 additions & 118 deletions test/directory.cpp

This file was deleted.

77 changes: 38 additions & 39 deletions test/dirname_basename.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,78 +9,77 @@ class DirnameBasenameTest : public testing::Test {
std::uint64_t const SIZE = 1024;
std::uint64_t const CLUSTER_SIZE = 64;

std::unique_ptr<FileSystem> file_system_;
FileSystem file_system_;
// NOLINTEND(cppcoreguidelines-non-private-member-variables-in-classes)

void SetUp() override {
FileSystem::make(PATH, {SIZE, CLUSTER_SIZE});

file_system_ = std::make_unique<FileSystem>(PATH);
file_system_ = FileSystem(PATH);
}

void TearDown() override { std::filesystem::remove(PATH); }
};

TEST_F(DirnameBasenameTest, Dirname) {
EXPECT_EQ(file_system_->dirname("/"), "/");
EXPECT_EQ(file_system_->dirname("/a"), "/");
EXPECT_EQ(file_system_->dirname("/a/"), "/");
EXPECT_EQ(file_system_->dirname("/a/b"), "/a");
EXPECT_EQ(file_system_->dirname("/a/b/"), "/a");
EXPECT_EQ(file_system_->dirname("/a/b/c"), "/a/b");
EXPECT_EQ(file_system_->dirname("/a/b/c/"), "/a/b");

EXPECT_EQ(file_system_->dirname("a"), ".");
EXPECT_EQ(file_system_.dirname("/"), "/");
EXPECT_EQ(file_system_.dirname("/a"), "/");
EXPECT_EQ(file_system_.dirname("/a/"), "/");
EXPECT_EQ(file_system_.dirname("/a/b"), "/a");
EXPECT_EQ(file_system_.dirname("/a/b/"), "/a");
EXPECT_EQ(file_system_.dirname("/a/b/c"), "/a/b");
EXPECT_EQ(file_system_.dirname("/a/b/c/"), "/a/b");

EXPECT_EQ(file_system_.dirname("a"), ".");
}

TEST_F(DirnameBasenameTest, Basename) {
EXPECT_EQ(file_system_->basename("/"), "/");
EXPECT_EQ(file_system_->basename("/a"), "a");
EXPECT_EQ(file_system_->basename("/a/"), "a");
EXPECT_EQ(file_system_->basename("/a/b"), "b");
EXPECT_EQ(file_system_->basename("/a/b/"), "b");
EXPECT_EQ(file_system_->basename("/a/b/c"), "c");
EXPECT_EQ(file_system_->basename("/a/b/c/"), "c");

EXPECT_EQ(file_system_->basename("a"), "a");
EXPECT_EQ(file_system_.basename("/"), "/");
EXPECT_EQ(file_system_.basename("/a"), "a");
EXPECT_EQ(file_system_.basename("/a/"), "a");
EXPECT_EQ(file_system_.basename("/a/b"), "b");
EXPECT_EQ(file_system_.basename("/a/b/"), "b");
EXPECT_EQ(file_system_.basename("/a/b/c"), "c");
EXPECT_EQ(file_system_.basename("/a/b/c/"), "c");

EXPECT_EQ(file_system_.basename("a"), "a");
}

TEST_F(DirnameBasenameTest, DirnameMeaningfulFilenames) {
EXPECT_EQ(file_system_->dirname("/user"), "/");
EXPECT_EQ(file_system_->dirname("/user/"), "/");
EXPECT_EQ(file_system_->dirname("/user/desktop"), "/user");
EXPECT_EQ(file_system_->dirname("/user/desktop/"), "/user");
EXPECT_EQ(file_system_->dirname("/user/desktop/file.txt"), "/user/desktop");
EXPECT_EQ(file_system_->dirname("/user/desktop/file.txt/"), "/user/desktop");
EXPECT_EQ(file_system_.dirname("/user"), "/");
EXPECT_EQ(file_system_.dirname("/user/"), "/");
EXPECT_EQ(file_system_.dirname("/user/desktop"), "/user");
EXPECT_EQ(file_system_.dirname("/user/desktop/"), "/user");
EXPECT_EQ(file_system_.dirname("/user/desktop/file.txt"), "/user/desktop");
EXPECT_EQ(file_system_.dirname("/user/desktop/file.txt/"), "/user/desktop");
}

TEST_F(DirnameBasenameTest, BasenameMeaningfulFilenames) {
EXPECT_EQ(file_system_->basename("/user"), "user");
EXPECT_EQ(file_system_->basename("/user/"), "user");
EXPECT_EQ(file_system_->basename("/user/desktop"), "desktop");
EXPECT_EQ(file_system_->basename("/user/desktop/"), "desktop");
EXPECT_EQ(file_system_->basename("/user/desktop/file.txt"), "file.txt");
EXPECT_EQ(file_system_->basename("/user/desktop/file.txt/"), "file.txt");
EXPECT_EQ(file_system_.basename("/user"), "user");
EXPECT_EQ(file_system_.basename("/user/"), "user");
EXPECT_EQ(file_system_.basename("/user/desktop"), "desktop");
EXPECT_EQ(file_system_.basename("/user/desktop/"), "desktop");
EXPECT_EQ(file_system_.basename("/user/desktop/file.txt"), "file.txt");
EXPECT_EQ(file_system_.basename("/user/desktop/file.txt/"), "file.txt");
}

TEST_F(DirnameBasenameTest, DirnameEmpty) { EXPECT_THROW(auto res = file_system_->dirname(""), std::invalid_argument); }
TEST_F(DirnameBasenameTest, DirnameEmpty) { EXPECT_THROW(auto res = file_system_.dirname(""), std::invalid_argument); }

TEST_F(DirnameBasenameTest, BasenameEmpty) {
EXPECT_THROW(auto res = file_system_->basename(""), std::invalid_argument);
EXPECT_THROW(auto res = file_system_.basename(""), std::invalid_argument);
}

TEST_F(DirnameBasenameTest, DirnameRoot) { EXPECT_EQ(file_system_->dirname("/"), "/"); }
TEST_F(DirnameBasenameTest, DirnameRoot) { EXPECT_EQ(file_system_.dirname("/"), "/"); }

TEST_F(DirnameBasenameTest, BasenameRoot) { EXPECT_EQ(file_system_->basename("/"), "/"); }
TEST_F(DirnameBasenameTest, BasenameRoot) { EXPECT_EQ(file_system_.basename("/"), "/"); }

TEST_F(DirnameBasenameTest, DirnameLong) {
std::string const path = "/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z";

EXPECT_EQ(file_system_->dirname(path), "/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y");
EXPECT_EQ(file_system_.dirname(path), "/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y");
}

TEST_F(DirnameBasenameTest, BasenameLong) {
std::string const path = "/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z";

EXPECT_EQ(file_system_->basename(path), "z");
EXPECT_EQ(file_system_.basename(path), "z");
}
42 changes: 25 additions & 17 deletions test/fat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
class FATTest : public testing::Test {
protected:
// NOLINTBEGIN(cppcoreguidelines-non-private-member-variables-in-classes)
std::shared_ptr<FAT> fat_;
FAT fat_;
const std::string PATH = "fat_test.fs";
const std::uint64_t SIZE = 1024;
const std::uint64_t CLUSTER_SIZE = 64;
Expand All @@ -18,41 +18,49 @@ class FATTest : public testing::Test {
auto ofs = std::make_unique<std::ofstream>(PATH, std::ios::binary | std::ios::out | std::ios::in);
if (!ifs->is_open() || !ofs->is_open()) throw std::runtime_error("Cannot open file " + PATH);

auto disk_reader = std::make_shared<DiskReader>(std::move(ifs), DiskHandler::DiskOffset(0));
auto disk_writer = std::make_shared<DiskWriter>(std::move(ofs), DiskHandler::DiskOffset(0));
auto disk_reader = DiskReader(std::move(ifs), 0, 0);
auto disk_writer = DiskWriter(std::move(ofs), 0);

fat_ = std::make_shared<FAT>(disk_reader, disk_writer, DiskHandler::DiskOffset(FSMaker::get_fat_offset()),
FSMaker::calculate_fat_entries_count({SIZE, CLUSTER_SIZE}));
fat_ = FAT(disk_reader, disk_writer, FSMaker::get_fat_offset(),
FSMaker::calculate_fat_entries_count({SIZE, CLUSTER_SIZE}));
}

void TearDown() override { std::filesystem::remove(PATH); }
};

TEST_F(FATTest, EntriesCount) {
EXPECT_EQ(fat_->entries_count(), FSMaker::calculate_fat_entries_count({SIZE, CLUSTER_SIZE}));
EXPECT_EQ(fat_.entries_count(), FSMaker::calculate_fat_entries_count({SIZE, CLUSTER_SIZE}));
}

TEST_F(FATTest, Allocate) {
auto const cluster = fat_->allocate();
auto const cluster = fat_.allocate();
EXPECT_EQ(cluster, 0);
EXPECT_TRUE(fat_->is_allocated(cluster));
EXPECT_TRUE(fat_->is_last(cluster));
EXPECT_TRUE(fat_.is_allocated(cluster));
EXPECT_TRUE(fat_.is_last(cluster));
}

TEST_F(FATTest, AllocateMultiple) {
auto const first_cluster = fat_->allocate(5);

auto const first_cluster = fat_.allocate();
auto current_cluster = first_cluster;
for (int i = 0; i < 4; ++i) current_cluster = fat_.allocate_next(current_cluster);

current_cluster = first_cluster;
for (std::uint64_t i = 0; i < 4; ++i) {
EXPECT_TRUE(fat_->is_allocated(current_cluster));
EXPECT_FALSE(fat_->is_last(current_cluster));
current_cluster = fat_->get_next(current_cluster);
EXPECT_TRUE(fat_.is_allocated(current_cluster));
EXPECT_FALSE(fat_.is_last(current_cluster));
current_cluster = fat_.get_next(current_cluster);
}
EXPECT_TRUE(fat_->is_allocated(current_cluster));
EXPECT_TRUE(fat_->is_last(current_cluster));
EXPECT_TRUE(fat_.is_allocated(current_cluster));
EXPECT_TRUE(fat_.is_last(current_cluster));
}

TEST_F(FATTest, AllocateTooMany) { EXPECT_THROW(auto res = fat_->allocate(1000), std::runtime_error); }
TEST_F(FATTest, AllocateTooMany) {
EXPECT_THROW(
[this]() {
for (int i = 0; i < 100; ++i) { auto tmp = fat_.allocate(); }
}(),
std::runtime_error);
}

TEST_F(FATTest, EmptyEntryBytes) {
auto const empty_entry_bytes = FAT::empty_entry_bytes();
Expand Down
Loading

0 comments on commit 574ada7

Please sign in to comment.