diff options
Diffstat (limited to 'src/test/client/alternate_name.cc')
-rw-r--r-- | src/test/client/alternate_name.cc | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/test/client/alternate_name.cc b/src/test/client/alternate_name.cc new file mode 100644 index 000000000..7671eff9a --- /dev/null +++ b/src/test/client/alternate_name.cc @@ -0,0 +1,197 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2021 Red Hat + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#include <errno.h> + +#include <iostream> +#include <string> + +#include <fmt/format.h> + +#include "test/client/TestClient.h" + +TEST_F(TestClient, AlternateNameRemount) { + auto altname = std::string("foo"); + auto dir = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + ASSERT_EQ(0, client->mkdir(dir.c_str(), 0777, myperm, altname)); + + client->unmount(); + TearDown(); + SetUp(); + client->mount("/", myperm, true); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(dir.c_str(), &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname); + } + + ASSERT_EQ(0, client->rmdir(dir.c_str(), myperm)); +} + + +TEST_F(TestClient, AlternateNameMkdir) { + auto dir = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + ASSERT_EQ(0, client->mkdir(dir.c_str(), 0777, myperm, "foo")); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(dir.c_str(), &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, "foo"s); + } + + ASSERT_EQ(0, client->rmdir(dir.c_str(), myperm)); +} + +TEST_F(TestClient, AlternateNameLong) { + auto altname = std::string(4096+1024, '-'); + auto dir = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + ASSERT_EQ(0, client->mkdir(dir.c_str(), 0777, myperm, altname)); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(dir.c_str(), &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname); + } + + ASSERT_EQ(0, client->rmdir(dir.c_str(), myperm)); +} + +TEST_F(TestClient, AlternateNameCreat) { + auto altname = std::string("foo"); + auto file = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + int fd = client->open(file.c_str(), O_CREAT|O_WRONLY, myperm, 0777, altname); + ASSERT_LE(0, fd); + ASSERT_EQ(3, client->write(fd, "baz", 3, 0)); + ASSERT_EQ(0, client->close(fd)); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(file, &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname); + } +} + +TEST_F(TestClient, AlternateNameSymlink) { + auto altname = std::string("foo"); + auto file = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + int fd = client->open(file.c_str(), O_CREAT|O_WRONLY, myperm, 0777, altname); + ASSERT_LE(0, fd); + ASSERT_EQ(3, client->write(fd, "baz", 3, 0)); + ASSERT_EQ(0, client->close(fd)); + + auto file2 = file+"2"; + auto altname2 = altname+"2"; + ASSERT_EQ(0, client->symlink(file.c_str(), file2.c_str(), myperm, altname2)); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(file2, &wdr, myperm, false)); + ASSERT_EQ(wdr.alternate_name, altname2); + ASSERT_EQ(0, client->walk(file, &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname); + } +} + +TEST_F(TestClient, AlternateNameRename) { + auto altname = std::string("foo"); + auto file = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + int fd = client->open(file.c_str(), O_CREAT|O_WRONLY, myperm, 0777, altname); + ASSERT_LE(0, fd); + ASSERT_EQ(3, client->write(fd, "baz", 3, 0)); + ASSERT_EQ(0, client->close(fd)); + + auto file2 = file+"2"; + auto altname2 = altname+"2"; + + ASSERT_EQ(0, client->rename(file.c_str(), file2.c_str(), myperm, altname2)); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(file2, &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname2); + } +} + +TEST_F(TestClient, AlternateNameRenameExistMatch) { + auto altname = std::string("foo"); + auto file = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + int fd = client->open(file.c_str(), O_CREAT|O_WRONLY, myperm, 0777, altname); + ASSERT_LE(0, fd); + ASSERT_EQ(3, client->write(fd, "baz", 3, 0)); + ASSERT_EQ(0, client->close(fd)); + + auto file2 = file+"2"; + auto altname2 = altname+"2"; + + fd = client->open(file2.c_str(), O_CREAT|O_WRONLY, myperm, 0777, altname2); + ASSERT_LE(0, fd); + ASSERT_EQ(3, client->write(fd, "baz", 3, 0)); + ASSERT_EQ(0, client->close(fd)); + + ASSERT_EQ(0, client->rename(file.c_str(), file2.c_str(), myperm, altname2)); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(file2, &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname2); + } +} + +TEST_F(TestClient, AlternateNameRenameExistMisMatch) { + auto altname = std::string("foo"); + auto file = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + int fd = client->open(file.c_str(), O_CREAT|O_WRONLY, myperm, 0777, altname); + ASSERT_LE(0, fd); + ASSERT_EQ(3, client->write(fd, "baz", 3, 0)); + ASSERT_EQ(0, client->close(fd)); + + auto file2 = file+"2"; + auto altname2 = altname+"2"; + + fd = client->open(file2.c_str(), O_CREAT|O_WRONLY, myperm, 0777, altname+"mismatch"); + ASSERT_LE(0, fd); + ASSERT_EQ(3, client->write(fd, "baz", 3, 0)); + ASSERT_EQ(0, client->close(fd)); + + ASSERT_EQ(-EINVAL, client->rename(file.c_str(), file2.c_str(), myperm, altname2)); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(file2, &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname+"mismatch"); + } +} + +TEST_F(TestClient, AlternateNameLink) { + auto altname = std::string("foo"); + auto file = fmt::format("{}_{}", ::testing::UnitTest::GetInstance()->current_test_info()->name(), getpid()); + int fd = client->open(file.c_str(), O_CREAT|O_WRONLY, myperm, 0777, altname); + ASSERT_LE(0, fd); + ASSERT_EQ(3, client->write(fd, "baz", 3, 0)); + ASSERT_EQ(0, client->close(fd)); + + auto file2 = file+"2"; + auto altname2 = altname+"2"; + + ASSERT_EQ(0, client->link(file.c_str(), file2.c_str(), myperm, altname2)); + + { + Client::walk_dentry_result wdr; + ASSERT_EQ(0, client->walk(file2, &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname2); + ASSERT_EQ(0, client->walk(file, &wdr, myperm)); + ASSERT_EQ(wdr.alternate_name, altname); + } +} |