fuse unit tests and fixes
This commit is contained in:
parent
2bd847b833
commit
74109d1195
@ -170,6 +170,17 @@ public:
|
|||||||
return file_path;
|
return file_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static auto create_directory_and_test(std::string &dir_name) -> std::string {
|
||||||
|
dir_name += std::to_string(++idx);
|
||||||
|
|
||||||
|
auto dir_path = utils::path::combine(mount_location, {dir_name});
|
||||||
|
EXPECT_TRUE(utils::file::directory(dir_path).create());
|
||||||
|
|
||||||
|
EXPECT_TRUE(utils::file::directory(dir_path).exists());
|
||||||
|
EXPECT_FALSE(utils::file::file(dir_path).exists());
|
||||||
|
return dir_path;
|
||||||
|
}
|
||||||
|
|
||||||
static auto create_root_file(std::string &file_name) -> std::string {
|
static auto create_root_file(std::string &file_name) -> std::string {
|
||||||
auto file_path = create_file_and_test(file_name);
|
auto file_path = create_file_and_test(file_name);
|
||||||
auto api_path = utils::path::create_api_path(file_name);
|
auto api_path = utils::path::create_api_path(file_name);
|
||||||
@ -204,11 +215,18 @@ public:
|
|||||||
EXPECT_TRUE(unmounted);
|
EXPECT_TRUE(unmounted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rmdir_and_test(std::string_view dir_path) {
|
||||||
|
EXPECT_TRUE(utils::file::directory(dir_path).remove());
|
||||||
|
EXPECT_FALSE(utils::file::directory(dir_path).exists());
|
||||||
|
|
||||||
|
EXPECT_FALSE(utils::file::file(dir_path).exists());
|
||||||
|
}
|
||||||
|
|
||||||
static void unlink_file_and_test(std::string_view file_path) {
|
static void unlink_file_and_test(std::string_view file_path) {
|
||||||
EXPECT_TRUE(utils::file::file(file_path).remove());
|
EXPECT_TRUE(utils::file::file(file_path).remove());
|
||||||
EXPECT_FALSE(utils::file::file(file_path).exists());
|
EXPECT_FALSE(utils::file::file(file_path).exists());
|
||||||
|
|
||||||
EXPECT_FALSE(utils::file::directory(file_path).exists());
|
EXPECT_FALSE(utils::file::directory(file_path).exists());
|
||||||
EXPECT_FALSE(utils::file::file(file_path).exists());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unlink_root_file(const std::string &file_path) {
|
static void unlink_root_file(const std::string &file_path) {
|
||||||
|
75
repertory/repertory_test/src/fuse_drive_chmod_test.cpp
Normal file
75
repertory/repertory_test/src/fuse_drive_chmod_test.cpp
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
|
||||||
|
#include "fixtures/fuse_fixture.hpp"
|
||||||
|
|
||||||
|
namespace repertory {
|
||||||
|
TYPED_TEST_CASE(fuse_test, fuse_provider_types);
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_chmod_if_owner) {
|
||||||
|
std::string file_name{"chmod_test"};
|
||||||
|
auto file_path = this->create_file_and_test(file_name);
|
||||||
|
|
||||||
|
EXPECT_EQ(0, chmod(file_path.c_str(), S_IRUSR | S_IWUSR));
|
||||||
|
std::this_thread::sleep_for(SLEEP_SECONDS);
|
||||||
|
|
||||||
|
struct stat64 unix_st{};
|
||||||
|
stat64(file_path.c_str(), &unix_st);
|
||||||
|
EXPECT_EQ(static_cast<std::uint32_t>(S_IRUSR | S_IWUSR),
|
||||||
|
ACCESSPERMS & unix_st.st_mode);
|
||||||
|
|
||||||
|
this->unlink_file_and_test(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_not_chmod_if_not_owner) {
|
||||||
|
std::string file_name{"chmod_test"};
|
||||||
|
auto file_path = this->create_root_file(file_name);
|
||||||
|
|
||||||
|
EXPECT_EQ(-1, chmod(file_path.c_str(), S_IRUSR | S_IWUSR));
|
||||||
|
EXPECT_EQ(EPERM, errno);
|
||||||
|
|
||||||
|
this->unlink_root_file(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_not_chmod_setgid_if_not_root) {
|
||||||
|
std::string file_name{"chmod_test"};
|
||||||
|
auto file_path = this->create_file_and_test(file_name);
|
||||||
|
|
||||||
|
EXPECT_EQ(-1, chmod(file_path.c_str(), S_IRUSR | S_IWUSR | S_ISGID));
|
||||||
|
EXPECT_EQ(EPERM, errno);
|
||||||
|
|
||||||
|
this->unlink_file_and_test(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_not_chmod_setuid_if_not_root) {
|
||||||
|
std::string file_name{"chmod_test"};
|
||||||
|
auto file_path = this->create_file_and_test(file_name);
|
||||||
|
|
||||||
|
EXPECT_EQ(-1, chmod(file_path.c_str(), S_IRUSR | S_IWUSR | S_ISUID));
|
||||||
|
EXPECT_EQ(EPERM, errno);
|
||||||
|
|
||||||
|
this->unlink_file_and_test(file_path);
|
||||||
|
}
|
||||||
|
} // namespace repertory
|
||||||
|
|
||||||
|
#endif // !defined(_WIN32)
|
113
repertory/repertory_test/src/fuse_drive_chown_test.cpp
Normal file
113
repertory/repertory_test/src/fuse_drive_chown_test.cpp
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
|
||||||
|
#include "fixtures/fuse_fixture.hpp"
|
||||||
|
|
||||||
|
namespace repertory {
|
||||||
|
TYPED_TEST_CASE(fuse_test, fuse_provider_types);
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_not_chmod_set_sticky_if_not_root) {
|
||||||
|
std::string file_name{"chown_test"};
|
||||||
|
auto file_path = this->create_file_and_test(file_name);
|
||||||
|
|
||||||
|
EXPECT_EQ(-1, chmod(file_path.c_str(), S_IRUSR | S_IWUSR | S_ISVTX));
|
||||||
|
EXPECT_EQ(EPERM, errno);
|
||||||
|
|
||||||
|
this->unlink_file_and_test(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_chown_group_if_owner_and_a_member_of_the_group) {
|
||||||
|
std::string file_name{"chown_test"};
|
||||||
|
auto file_path = this->create_file_and_test(file_name);
|
||||||
|
|
||||||
|
struct stat64 unix_st{};
|
||||||
|
EXPECT_EQ(0, stat64(file_path.c_str(), &unix_st));
|
||||||
|
|
||||||
|
EXPECT_EQ(0, chown(file_path.c_str(), static_cast<uid_t>(-1), getgid()));
|
||||||
|
std::this_thread::sleep_for(SLEEP_SECONDS);
|
||||||
|
|
||||||
|
struct stat64 unix_st2{};
|
||||||
|
stat64(file_path.c_str(), &unix_st2);
|
||||||
|
EXPECT_EQ(getgid(), unix_st2.st_gid);
|
||||||
|
EXPECT_EQ(unix_st.st_uid, unix_st2.st_uid);
|
||||||
|
|
||||||
|
this->unlink_file_and_test(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test,
|
||||||
|
can_not_chown_group_if_owner_but_not_a_member_of_the_group) {
|
||||||
|
std::string file_name{"chown_test"};
|
||||||
|
auto file_path = this->create_file_and_test(file_name);
|
||||||
|
|
||||||
|
struct stat64 unix_st{};
|
||||||
|
EXPECT_EQ(0, stat64(file_path.c_str(), &unix_st));
|
||||||
|
|
||||||
|
EXPECT_EQ(-1, chown(file_path.c_str(), static_cast<uid_t>(-1), 0));
|
||||||
|
EXPECT_EQ(EPERM, errno);
|
||||||
|
|
||||||
|
struct stat64 unix_st2{};
|
||||||
|
stat64(file_path.c_str(), &unix_st2);
|
||||||
|
EXPECT_EQ(unix_st.st_gid, unix_st2.st_gid);
|
||||||
|
EXPECT_EQ(unix_st.st_uid, unix_st2.st_uid);
|
||||||
|
|
||||||
|
this->unlink_file_and_test(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_not_chown_group_if_not_the_owner) {
|
||||||
|
std::string file_name{"chown_test"};
|
||||||
|
auto file_path = this->create_root_file(file_name);
|
||||||
|
|
||||||
|
struct stat64 unix_st{};
|
||||||
|
EXPECT_EQ(0, stat64(file_path.c_str(), &unix_st));
|
||||||
|
|
||||||
|
EXPECT_EQ(-1, chown(file_path.c_str(), static_cast<uid_t>(-1), getgid()));
|
||||||
|
EXPECT_EQ(EPERM, errno);
|
||||||
|
|
||||||
|
struct stat64 unix_st2{};
|
||||||
|
stat64(file_path.c_str(), &unix_st2);
|
||||||
|
EXPECT_EQ(unix_st.st_gid, unix_st2.st_gid);
|
||||||
|
EXPECT_EQ(unix_st.st_uid, unix_st2.st_uid);
|
||||||
|
|
||||||
|
this->unlink_root_file(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_not_chown_user_if_not_root) {
|
||||||
|
std::string file_name{"chown_test"};
|
||||||
|
auto file_path = this->create_file_and_test(file_name);
|
||||||
|
|
||||||
|
struct stat64 unix_st{};
|
||||||
|
EXPECT_EQ(0, stat64(file_path.c_str(), &unix_st));
|
||||||
|
|
||||||
|
EXPECT_EQ(-1, chown(file_path.c_str(), 0, static_cast<gid_t>(-1)));
|
||||||
|
EXPECT_EQ(EPERM, errno);
|
||||||
|
|
||||||
|
struct stat64 unix_st2{};
|
||||||
|
stat64(file_path.c_str(), &unix_st2);
|
||||||
|
EXPECT_EQ(unix_st.st_gid, unix_st2.st_gid);
|
||||||
|
EXPECT_EQ(unix_st.st_uid, unix_st2.st_uid);
|
||||||
|
|
||||||
|
this->unlink_file_and_test(file_path);
|
||||||
|
}
|
||||||
|
} // namespace repertory
|
||||||
|
|
||||||
|
#endif // !defined(_WIN32)
|
51
repertory/repertory_test/src/fuse_drive_directory_test.cpp
Normal file
51
repertory/repertory_test/src/fuse_drive_directory_test.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
|
||||||
|
#include "fixtures/fuse_fixture.hpp"
|
||||||
|
|
||||||
|
namespace repertory {
|
||||||
|
TYPED_TEST_CASE(fuse_test, fuse_provider_types);
|
||||||
|
|
||||||
|
TYPED_TEST(fuse_test, can_create_and_remove_directory) {
|
||||||
|
auto dir_name = std::string{"dir"} + std::to_string(++this->idx);
|
||||||
|
|
||||||
|
auto dir_path = utils::path::combine(this->mount_location, {dir_name});
|
||||||
|
EXPECT_EQ(0, mkdir(dir_path.c_str(),
|
||||||
|
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP));
|
||||||
|
|
||||||
|
EXPECT_TRUE(utils::file::is_directory(dir_path));
|
||||||
|
EXPECT_FALSE(utils::file::is_file(dir_path));
|
||||||
|
|
||||||
|
struct stat64 unix_st{};
|
||||||
|
stat64(dir_path.c_str(), &unix_st);
|
||||||
|
|
||||||
|
EXPECT_EQ(getgid(), unix_st.st_gid);
|
||||||
|
EXPECT_EQ(getuid(), unix_st.st_uid);
|
||||||
|
|
||||||
|
EXPECT_EQ(static_cast<std::uint32_t>(S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP |
|
||||||
|
S_IXGRP),
|
||||||
|
ACCESSPERMS & unix_st.st_mode);
|
||||||
|
}
|
||||||
|
} // namespace repertory
|
||||||
|
|
||||||
|
#endif // !defined(_WIN32)
|
@ -1,29 +1,3 @@
|
|||||||
/*
|
|
||||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
#if !defined(_WIN32)
|
|
||||||
|
|
||||||
#include "fixtures/fuse_fixture.hpp"
|
|
||||||
|
|
||||||
namespace repertory {
|
|
||||||
// static void rmdir_and_test(const std::string &directory_path) {
|
// static void rmdir_and_test(const std::string &directory_path) {
|
||||||
// std::cout << __FUNCTION__ << std::endl;
|
// std::cout << __FUNCTION__ << std::endl;
|
||||||
// int ret = 0;
|
// int ret = 0;
|
||||||
@ -400,14 +374,6 @@ namespace repertory {
|
|||||||
// }
|
// }
|
||||||
// #endif
|
// #endif
|
||||||
//
|
//
|
||||||
// // file_path = create_file_and_test(mount_location, "chown_test");
|
|
||||||
// // test_chown(utils::path::create_api_path("chown_test"), file_path);
|
|
||||||
// // unlink_file_and_test(file_path);
|
|
||||||
// //
|
|
||||||
// // file_path = utils::path::combine(mount_location, {"mkdir_test"});
|
|
||||||
// // test_mkdir(utils::path::create_api_path("mkdir_test"), file_path);
|
|
||||||
// // rmdir_and_test(file_path);
|
|
||||||
// //
|
|
||||||
// // file_path = create_file_and_test(mount_location,
|
// // file_path = create_file_and_test(mount_location,
|
||||||
// // "write_read_test");
|
// // "write_read_test");
|
||||||
// // test_write_and_read(utils::path::create_api_path("write_read_test"),
|
// // test_write_and_read(utils::path::create_api_path("write_read_test"),
|
||||||
@ -514,136 +480,3 @@ namespace repertory {
|
|||||||
// // test_xattr_removexattr(file_path);
|
// // test_xattr_removexattr(file_path);
|
||||||
// // unlink_file_and_test(file_path);
|
// // unlink_file_and_test(file_path);
|
||||||
// // #endif
|
// // #endif
|
||||||
|
|
||||||
TYPED_TEST_CASE(fuse_test, fuse_provider_types);
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test, can_chmod_if_owner) {
|
|
||||||
std::string file_name{"chmod_test"};
|
|
||||||
auto file_path = this->create_file_and_test(file_name);
|
|
||||||
|
|
||||||
EXPECT_EQ(0, chmod(file_path.c_str(), S_IRUSR | S_IWUSR));
|
|
||||||
std::this_thread::sleep_for(SLEEP_SECONDS);
|
|
||||||
|
|
||||||
struct stat64 unix_st {};
|
|
||||||
stat64(file_path.c_str(), &unix_st);
|
|
||||||
EXPECT_EQ(static_cast<std::uint32_t>(S_IRUSR | S_IWUSR),
|
|
||||||
ACCESSPERMS & unix_st.st_mode);
|
|
||||||
|
|
||||||
this->unlink_file_and_test(file_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test, can_not_chmod_if_not_owner) {
|
|
||||||
std::string file_name{"chmod_test"};
|
|
||||||
auto file_path = this->create_root_file(file_name);
|
|
||||||
|
|
||||||
EXPECT_EQ(-1, chmod(file_path.c_str(), S_IRUSR | S_IWUSR));
|
|
||||||
EXPECT_EQ(EPERM, errno);
|
|
||||||
|
|
||||||
this->unlink_root_file(file_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test, can_not_chmod_setgid_if_not_root) {
|
|
||||||
std::string file_name{"chmod_test"};
|
|
||||||
auto file_path = this->create_file_and_test(file_name);
|
|
||||||
|
|
||||||
EXPECT_EQ(-1, chmod(file_path.c_str(), S_IRUSR | S_IWUSR | S_ISGID));
|
|
||||||
EXPECT_EQ(EPERM, errno);
|
|
||||||
|
|
||||||
this->unlink_file_and_test(file_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test, can_not_chmod_setuid_if_not_root) {
|
|
||||||
std::string file_name{"chmod_test"};
|
|
||||||
auto file_path = this->create_file_and_test(file_name);
|
|
||||||
|
|
||||||
EXPECT_EQ(-1, chmod(file_path.c_str(), S_IRUSR | S_IWUSR | S_ISUID));
|
|
||||||
EXPECT_EQ(EPERM, errno);
|
|
||||||
|
|
||||||
this->unlink_file_and_test(file_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test, can_not_chmod_set_sticky_if_not_root) {
|
|
||||||
std::string file_name{"chown_test"};
|
|
||||||
auto file_path = this->create_file_and_test(file_name);
|
|
||||||
|
|
||||||
EXPECT_EQ(-1, chmod(file_path.c_str(), S_IRUSR | S_IWUSR | S_ISVTX));
|
|
||||||
EXPECT_EQ(EPERM, errno);
|
|
||||||
|
|
||||||
this->unlink_file_and_test(file_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test, can_chown_group_if_owner_and_a_member_of_the_group) {
|
|
||||||
std::string file_name{"chown_test"};
|
|
||||||
auto file_path = this->create_file_and_test(file_name);
|
|
||||||
|
|
||||||
struct stat64 unix_st {};
|
|
||||||
EXPECT_EQ(0, stat64(file_path.c_str(), &unix_st));
|
|
||||||
|
|
||||||
EXPECT_EQ(0, chown(file_path.c_str(), static_cast<uid_t>(-1), getgid()));
|
|
||||||
std::this_thread::sleep_for(SLEEP_SECONDS);
|
|
||||||
|
|
||||||
struct stat64 unix_st2 {};
|
|
||||||
stat64(file_path.c_str(), &unix_st2);
|
|
||||||
EXPECT_EQ(getgid(), unix_st2.st_gid);
|
|
||||||
EXPECT_EQ(unix_st.st_uid, unix_st2.st_uid);
|
|
||||||
|
|
||||||
this->unlink_file_and_test(file_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test,
|
|
||||||
can_not_chown_group_if_owner_but_not_a_member_of_the_group) {
|
|
||||||
std::string file_name{"chown_test"};
|
|
||||||
auto file_path = this->create_file_and_test(file_name);
|
|
||||||
|
|
||||||
struct stat64 unix_st {};
|
|
||||||
EXPECT_EQ(0, stat64(file_path.c_str(), &unix_st));
|
|
||||||
|
|
||||||
EXPECT_EQ(-1, chown(file_path.c_str(), static_cast<uid_t>(-1), 0));
|
|
||||||
EXPECT_EQ(EPERM, errno);
|
|
||||||
|
|
||||||
struct stat64 unix_st2 {};
|
|
||||||
stat64(file_path.c_str(), &unix_st2);
|
|
||||||
EXPECT_EQ(unix_st.st_gid, unix_st2.st_gid);
|
|
||||||
EXPECT_EQ(unix_st.st_uid, unix_st2.st_uid);
|
|
||||||
|
|
||||||
this->unlink_file_and_test(file_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test, can_not_chown_group_if_not_the_owner) {
|
|
||||||
std::string file_name{"chown_test"};
|
|
||||||
auto file_path = this->create_root_file(file_name);
|
|
||||||
|
|
||||||
struct stat64 unix_st {};
|
|
||||||
EXPECT_EQ(0, stat64(file_path.c_str(), &unix_st));
|
|
||||||
|
|
||||||
EXPECT_EQ(-1, chown(file_path.c_str(), static_cast<uid_t>(-1), getgid()));
|
|
||||||
EXPECT_EQ(EPERM, errno);
|
|
||||||
|
|
||||||
struct stat64 unix_st2 {};
|
|
||||||
stat64(file_path.c_str(), &unix_st2);
|
|
||||||
EXPECT_EQ(unix_st.st_gid, unix_st2.st_gid);
|
|
||||||
EXPECT_EQ(unix_st.st_uid, unix_st2.st_uid);
|
|
||||||
|
|
||||||
this->unlink_root_file(file_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
TYPED_TEST(fuse_test, can_not_chown_user_if_not_root) {
|
|
||||||
std::string file_name{"chown_test"};
|
|
||||||
auto file_path = this->create_file_and_test(file_name);
|
|
||||||
|
|
||||||
struct stat64 unix_st {};
|
|
||||||
EXPECT_EQ(0, stat64(file_path.c_str(), &unix_st));
|
|
||||||
|
|
||||||
EXPECT_EQ(-1, chown(file_path.c_str(), 0, static_cast<gid_t>(-1)));
|
|
||||||
EXPECT_EQ(EPERM, errno);
|
|
||||||
|
|
||||||
struct stat64 unix_st2 {};
|
|
||||||
stat64(file_path.c_str(), &unix_st2);
|
|
||||||
EXPECT_EQ(unix_st.st_gid, unix_st2.st_gid);
|
|
||||||
EXPECT_EQ(unix_st.st_uid, unix_st2.st_uid);
|
|
||||||
|
|
||||||
this->unlink_file_and_test(file_path);
|
|
||||||
}
|
|
||||||
} // namespace repertory
|
|
||||||
|
|
||||||
#endif // !defined(_WIN32)
|
|
Loading…
x
Reference in New Issue
Block a user