From b1426c9ed6987323e2a4cc1254a9f708154128f8 Mon Sep 17 00:00:00 2001 From: Ahmed Elsaka Date: Tue, 2 Sep 2025 21:10:22 +0200 Subject: [PATCH] set permission for kvs file - set permission for kvs file Fixes #99 --- src/cpp/src/kvs.cpp | 52 +++++++++++++- src/cpp/src/kvs.hpp | 4 +- src/cpp/src/kvsbuilder.cpp | 8 ++- src/cpp/src/kvsbuilder.hpp | 8 +++ src/cpp/tests/test_kvs.cpp | 108 ++++++++++++++--------------- src/cpp/tests/test_kvs_general.hpp | 1 + 6 files changed, 124 insertions(+), 57 deletions(-) diff --git a/src/cpp/src/kvs.cpp b/src/cpp/src/kvs.cpp index 26f3088a..bd0bfa40 100644 --- a/src/cpp/src/kvs.cpp +++ b/src/cpp/src/kvs.cpp @@ -38,6 +38,7 @@ Kvs::Kvs() , parser(std::make_unique()) , writer(std::make_unique()) , logger(std::make_unique("SKVS")) + , storage_mode_(score::os::Stat::Mode::kReadUser|score::os::Stat::Mode::kWriteUser|score::os::Stat::Mode::kReadGroup|score::os::Stat::Mode::kReadOthers) /* Default storage mode */ { } @@ -48,6 +49,7 @@ Kvs::Kvs(Kvs&& other) noexcept , parser(std::move(other.parser)) /* Not absolutely necessary, because a new JSON writer/parser object would also be okay*/ , writer(std::move(other.writer)) , logger(std::move(other.logger)) + , storage_mode_(other.storage_mode_) { { std::lock_guard lock(other.kvs_mutex); @@ -88,6 +90,7 @@ Kvs& Kvs::operator=(Kvs&& other) noexcept parser = std::move(other.parser); writer = std::move(other.writer); logger = std::move(other.logger); + storage_mode_ = other.storage_mode_; } return *this; } @@ -194,7 +197,7 @@ score::Result> Kvs::open_json(const score:: } /* Open KVS Instance */ -score::Result Kvs::open(const InstanceId& instance_id, OpenNeedDefaults need_defaults, OpenNeedKvs need_kvs, const std::string&& dir) +score::Result Kvs::open(const InstanceId& instance_id, OpenNeedDefaults need_defaults, OpenNeedKvs need_kvs, const std::string&& dir, score::os::Stat::Mode storage_mode) { score::Result result = score::MakeUnexpected(ErrorCode::UnmappedError); /* Redundant initialization needed, since Resul would call the implicitly-deleted default constructor of KVS */ @@ -221,6 +224,7 @@ score::Result Kvs::open(const InstanceId& instance_id, OpenNeedDefaults nee kvs.default_values = std::move(default_res.value()); kvs.filename_prefix = filename_prefix; kvs.flush_on_exit.store(true, std::memory_order_relaxed); + kvs.storage_mode_ = storage_mode; kvs.logger->LogInfo() << "opened KVS: instance '" << instance_id.id << "'"; kvs.logger->LogInfo() << "max snapshot count: " << KVS_MAX_SNAPSHOTS; result = std::move(kvs); @@ -397,6 +401,33 @@ score::ResultBlank Kvs::remove_key(const std::string_view key) { return result; } +score::Result Kvs::create_file_if_not_exist(const std::string& path) +{ + score::Result result = score::MakeUnexpected(ErrorCode::UnmappedError); + std::unique_lock lock(kvs_mutex, std::try_to_lock); + if (lock.owns_lock()) { + auto isFileExist = filesystem->standard->Exists(path); + if (!isFileExist.value()) { + std::ofstream out(path, std::ios::binary); + if (out) { + out.close(); + filesystem->standard->Permissions(path, this->storage_mode_); + result = true; + } else { + logger->LogError() << "Failed to create file '" << path << "'"; + result = score::MakeUnexpected(ErrorCode::PhysicalStorageFailure); + } + } else { + logger->LogInfo() << "File '" << path << "' already exists. Skipping creation."; + result = false; + } + } else { + result = score::MakeUnexpected(ErrorCode::MutexLockFailed); + } + return result; +} + + /* Helper Function to write JSON data to a file for flush process (also adds Hash file)*/ score::ResultBlank Kvs::write_json_data(const std::string& buf) { @@ -408,6 +439,15 @@ score::ResultBlank Kvs::write_json_data(const std::string& buf) if(!create_path_res.has_value()) { result = score::MakeUnexpected(ErrorCode::PhysicalStorageFailure); } else { + auto create_file_res = create_file_if_not_exist(json_path.Native()); + if (!create_file_res) { + logger->LogError() << "Failed to create KVS file '" << json_path << "'"; + result = score::MakeUnexpected(static_cast(*create_file_res.error())); + } else { + if (create_file_res.value()) { + logger->LogInfo() << "Created new KVS file '" << json_path << "'"; + } + } std::ofstream out(json_path.CStr(), std::ios::binary); if (!out.write(buf.data(), buf.size())) { result = score::MakeUnexpected(ErrorCode::PhysicalStorageFailure); @@ -415,6 +455,16 @@ score::ResultBlank Kvs::write_json_data(const std::string& buf) /* Write Hash File */ std::array hash_bytes = get_hash_bytes(buf); score::filesystem::Path fn_hash = filename_prefix.Native() + "_0.hash"; + auto create_hash_file_res = create_file_if_not_exist(fn_hash.Native()); + if(!create_hash_file_res) { + logger->LogError() << "Failed to create KVS hash file '" << fn_hash << "'"; + result = score::MakeUnexpected(static_cast(*create_hash_file_res.error())); + } + else { + if (create_hash_file_res.value()) { + logger->LogInfo() << "Created new KVS hash file '" << fn_hash << "'"; + } + } std::ofstream hout(fn_hash.CStr(), std::ios::binary); if (!hout.write(reinterpret_cast(hash_bytes.data()), hash_bytes.size())) { result = score::MakeUnexpected(ErrorCode::PhysicalStorageFailure); diff --git a/src/cpp/src/kvs.hpp b/src/cpp/src/kvs.hpp index d0a967e3..9f0ec435 100644 --- a/src/cpp/src/kvs.hpp +++ b/src/cpp/src/kvs.hpp @@ -157,7 +157,7 @@ class Kvs final { * IMPORTANT: Instead of using the Kvs::open method directly, it is recommended to use the KvsBuilder class. * */ - static score::Result open(const InstanceId& instance_id, OpenNeedDefaults need_defaults, OpenNeedKvs need_kvs, const std::string&& dir); + static score::Result open(const InstanceId& instance_id, OpenNeedDefaults need_defaults, OpenNeedKvs need_kvs, const std::string&& dir, score::os::Stat::Mode storage_mode); /** * @brief Sets whether the key-value store should flush its contents to @@ -383,12 +383,14 @@ class Kvs final { /* Logging */ std::unique_ptr logger; + score::os::Stat::Mode storage_mode_; /* Private Methods */ score::ResultBlank snapshot_rotate(); score::Result> parse_json_data(const std::string& data); score::Result> open_json(const score::filesystem::Path& prefix, OpenJsonNeedFile need_file); score::ResultBlank write_json_data(const std::string& buf); + score::Result create_file_if_not_exist(const std::string& path); }; diff --git a/src/cpp/src/kvsbuilder.cpp b/src/cpp/src/kvsbuilder.cpp index 267064a8..a97a2fb7 100644 --- a/src/cpp/src/kvsbuilder.cpp +++ b/src/cpp/src/kvsbuilder.cpp @@ -20,6 +20,7 @@ KvsBuilder::KvsBuilder(const InstanceId& instance_id) , need_defaults(false) , need_kvs(false) , directory("./data_folder/") /* Default Directory */ + , storage_mode_(score::os::Stat::Mode::kReadUser|score::os::Stat::Mode::kWriteUser|score::os::Stat::Mode::kReadGroup|score::os::Stat::Mode::kReadOthers) /* Default storage mode */ {} KvsBuilder& KvsBuilder::need_defaults_flag(bool flag) { @@ -37,6 +38,10 @@ KvsBuilder& KvsBuilder::dir(std::string&& dir_path) { return *this; } +KvsBuilder& KvsBuilder::storage_mode(score::os::Stat::Mode mode) { + storage_mode_ = mode; + return *this; +} score::Result KvsBuilder::build() { score::Result result = score::MakeUnexpected(ErrorCode::UnmappedError); @@ -50,7 +55,8 @@ score::Result KvsBuilder::build() { instance_id, need_defaults ? OpenNeedDefaults::Required : OpenNeedDefaults::Optional, need_kvs ? OpenNeedKvs::Required : OpenNeedKvs::Optional, - std::move(directory) + std::move(directory), + storage_mode_ ); return result; diff --git a/src/cpp/src/kvsbuilder.hpp b/src/cpp/src/kvsbuilder.hpp index 5a8095bb..87fbb3e5 100644 --- a/src/cpp/src/kvsbuilder.hpp +++ b/src/cpp/src/kvsbuilder.hpp @@ -87,6 +87,13 @@ class KvsBuilder final { */ KvsBuilder& dir(std::string&& dir_path); + /** + * @brief Specify the storage mode for the KVS files. + * @param mode The storage mode to use (storage file permissions). + * @return Reference to this builder (for chaining). + */ + KvsBuilder& storage_mode(score::os::Stat::Mode mode); + /** * @brief Builds and opens the Kvs instance with the configured options. * @@ -101,6 +108,7 @@ class KvsBuilder final { bool need_defaults; ///< Whether default values are required bool need_kvs; ///< Whether an existing KVS is required std::string directory; ///< Directory where to store the KVS Files + score::os::Stat::Mode storage_mode_; ///< Storage mode for the KVS files }; } /* namespace score::mw::per::kvs */ diff --git a/src/cpp/tests/test_kvs.cpp b/src/cpp/tests/test_kvs.cpp index 00cff590..b40ac9cf 100644 --- a/src/cpp/tests/test_kvs.cpp +++ b/src/cpp/tests/test_kvs.cpp @@ -17,13 +17,13 @@ TEST(kvs_constructor, move_constructor) { const std::uint32_t instance_b = 5; /* create object A */ - auto result_a = Kvs::open(InstanceId(instance_b), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result_a = Kvs::open(InstanceId(instance_b), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result_a); Kvs kvs_a = std::move(result_a.value()); kvs_a.flush_on_exit = false; /* create object B */ - auto result_b = Kvs::open(instance_id , OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result_b = Kvs::open(instance_id , OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result_b); Kvs kvs_b = std::move(result_b.value()); kvs_a.flush_on_exit = true; @@ -82,7 +82,7 @@ TEST(kvs_TEST, parse_json_data_sucess) { /* Success */ prepare_environment(); - auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); auto mock_parser = std::make_unique(); @@ -110,7 +110,7 @@ TEST(kvs_TEST, parse_json_data_failure) { /* Json Parser Failure */ - auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); auto mock_parser = std::make_unique(); @@ -165,7 +165,7 @@ TEST(kvs_open_json, open_json_success) { prepare_environment(); - auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); auto result = kvs->open_json(score::filesystem::Path(kvs_prefix), OpenJsonNeedFile::Required); @@ -250,7 +250,7 @@ TEST(kvs_set_flush_on_exit, set_flush_on_exit) { prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = true; result.value().set_flush_on_exit(false); @@ -267,7 +267,7 @@ TEST(kvs_set_flush_on_exit, set_flush_on_exit) { TEST(kvs_reset, reset_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -287,7 +287,7 @@ TEST(kvs_reset, reset_failure){ prepare_environment(); /* Mutex locked */ - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -303,7 +303,7 @@ TEST(kvs_get_all_keys, get_all_keys_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -331,7 +331,7 @@ TEST(kvs_get_all_keys, get_all_keys_failure){ prepare_environment(); /* Mutex locked */ - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; std::unique_lock lock(result.value().kvs_mutex); @@ -347,7 +347,7 @@ TEST(kvs_key_exists, key_exists_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -371,7 +371,7 @@ TEST(kvs_key_exists, key_exists_failure){ prepare_environment(); /* Mutex locked */ - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -387,7 +387,7 @@ TEST(kvs_get_value, get_value_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -420,7 +420,7 @@ TEST(kvs_get_value, get_value_failure){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -430,7 +430,7 @@ TEST(kvs_get_value, get_value_failure){ EXPECT_EQ(get_value_result.error(), ErrorCode::KeyNotFound); /* Mutex locked */ - result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; std::unique_lock lock(result.value().kvs_mutex); @@ -445,7 +445,7 @@ TEST(kvs_get_default_value, get_default_value_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -469,7 +469,7 @@ TEST(kvs_get_default_value, get_default_value_failure){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -485,7 +485,7 @@ TEST(kvs_reset_key, reset_key_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; ASSERT_TRUE(result.value().kvs.count("kvs")); /* Check Data existing */ @@ -515,7 +515,7 @@ TEST(kvs_reset_key, reset_key_failure){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -525,7 +525,7 @@ TEST(kvs_reset_key, reset_key_failure){ EXPECT_EQ(reset_key_result.error(), ErrorCode::KeyDefaultNotFound); /* Reset a key without default value */ - result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; result.value().default_values.clear(); // Clear default values to ensure no default value exists for "kvs" @@ -534,7 +534,7 @@ TEST(kvs_reset_key, reset_key_failure){ EXPECT_EQ(reset_key_result.error(), ErrorCode::KeyDefaultNotFound); /* Mutex locked */ - result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; std::unique_lock lock(result.value().kvs_mutex); @@ -549,7 +549,7 @@ TEST(kvs_has_default_value, has_default_value){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -575,7 +575,7 @@ TEST(kvs_has_default_value, has_default_value){ TEST(kvs_set_value, set_value_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -600,7 +600,7 @@ TEST(kvs_set_value, set_value_failure){ prepare_environment(); /* Mutex locked */ - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -615,7 +615,7 @@ TEST(kvs_set_value, set_value_failure){ TEST(kvs_remove_key, remove_key_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -634,7 +634,7 @@ TEST(kvs_remove_key, remove_key_failure){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -644,7 +644,7 @@ TEST(kvs_remove_key, remove_key_failure){ EXPECT_EQ(remove_key_result.error(), ErrorCode::KeyNotFound); /* Mutex locked */ - result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir)); + result = Kvs::open(instance_id, OpenNeedDefaults::Required, OpenNeedKvs::Required, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; std::unique_lock lock(result.value().kvs_mutex); @@ -668,7 +668,7 @@ TEST(kvs_write_json_data, write_json_data_success){ system(("rm -rf " + kvs_prefix + ".json").c_str()); system(("rm -rf " + kvs_prefix + ".hash").c_str()); - auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); kvs->filename_prefix = score::filesystem::Path(filename_prefix); /* Set the filename prefix to the test prefix */ @@ -705,7 +705,7 @@ TEST(kvs_write_json_data, write_json_data_filesystem_failure){ system(("rm -rf " + kvs_prefix + ".json").c_str()); system(("rm -rf " + kvs_prefix + ".hash").c_str()); - auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); /* Mock Filesystem */ @@ -735,7 +735,7 @@ TEST(kvs_write_json_data, write_json_data_permissions_failure){ system(("rm -rf " + kvs_prefix + ".json").c_str()); system(("rm -rf " + kvs_prefix + ".hash").c_str()); - auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(InstanceId(instance_id), OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); /* Test writing to a non-writable hash file */ @@ -766,7 +766,7 @@ TEST(kvs_snapshot_rotate, snapshot_rotate_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -796,7 +796,7 @@ TEST(kvs_snapshot_rotate, snapshot_rotate_max_snapshots){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -822,7 +822,7 @@ TEST(kvs_snapshot_rotate, snapshot_rotate_failure_renaming_json){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -846,7 +846,7 @@ TEST(kvs_snapshot_rotate, snapshot_rotate_failure_renaming_hash){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -870,7 +870,7 @@ TEST(kvs_snapshot_rotate, snapshot_rotate_failure_mutex){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -890,7 +890,7 @@ TEST(kvs_flush, flush_success_data){ system(("rm -rf " + kvs_prefix + ".json").c_str()); system(("rm -rf " + kvs_prefix + ".hash").c_str()); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -917,7 +917,7 @@ TEST(kvs_flush, flush_success_snapshot_rotate){ system(("rm -rf " + kvs_prefix + ".json").c_str()); system(("rm -rf " + kvs_prefix + ".hash").c_str()); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; EXPECT_FALSE(std::filesystem::exists(filename_prefix + "_1.json")); @@ -938,7 +938,7 @@ TEST(kvs_flush, flush_failure_mutex){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -956,7 +956,7 @@ TEST(kvs_flush, flush_failure_rotate_snapshots){ /* Test Folder for permission handling */ std::string permissions_dir = data_dir + "permissions/"; std::filesystem::create_directories(permissions_dir); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(permissions_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(permissions_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -973,7 +973,7 @@ TEST(kvs_flush, flush_failure_kvsvalue_invalid){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -991,7 +991,7 @@ TEST(kvs_flush, flush_failure_json_writer){ prepare_environment(); - auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); kvs.value().flush_on_exit = false; @@ -1011,7 +1011,7 @@ TEST(kvs_snapshot_count, snapshot_count_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -1034,7 +1034,7 @@ TEST(kvs_snapshot_count, snapshot_count_success){ TEST(kvs_snapshot_count, snapshot_count_invalid){ prepare_environment(); - auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); kvs.value().flush_on_exit = false; @@ -1056,7 +1056,7 @@ TEST(kvs_snapshot_restore, snapshot_restore_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -1099,7 +1099,7 @@ TEST(kvs_snapshot_restore, snapshot_restore_failure_invalid_snapshot_id){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -1120,7 +1120,7 @@ TEST(kvs_snapshot_restore, snapshot_restore_failure_open_json){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -1139,7 +1139,7 @@ TEST(kvs_snapshot_restore, snapshot_restore_failure_mutex){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -1155,7 +1155,7 @@ TEST(kvs_snapshot_restore, snapshot_restore_failure_snapshot_count){ prepare_environment(); - auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); kvs.value().flush_on_exit = false; @@ -1177,7 +1177,7 @@ TEST(kvs_snapshot_max_count, snapshot_max_count){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); EXPECT_EQ(result.value().snapshot_max_count(), KVS_MAX_SNAPSHOTS); result.value().flush_on_exit = false; @@ -1189,7 +1189,7 @@ TEST(kvs_get_filename, get_kvs_filename_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -1211,7 +1211,7 @@ TEST(kvs_get_filename, get_kvs_filename_failure){ prepare_environment(); - auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); kvs.value().flush_on_exit = false; @@ -1239,7 +1239,7 @@ TEST(kvs_get_filename, get_hashname_success){ prepare_environment(); - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = false; @@ -1262,7 +1262,7 @@ TEST(kvs_get_filename, get_hashname_failure){ prepare_environment(); - auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto kvs = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(kvs); kvs.value().flush_on_exit = false; @@ -1293,7 +1293,7 @@ TEST(kvs_destructor, destructor) { prepare_environment(); { - auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir)); + auto result = Kvs::open(instance_id, OpenNeedDefaults::Optional, OpenNeedKvs::Optional, std::string(data_dir), storage_mode); ASSERT_TRUE(result); result.value().flush_on_exit = true; } diff --git a/src/cpp/tests/test_kvs_general.hpp b/src/cpp/tests/test_kvs_general.hpp index 9cc1ed9f..3eea5e4b 100644 --- a/src/cpp/tests/test_kvs_general.hpp +++ b/src/cpp/tests/test_kvs_general.hpp @@ -55,6 +55,7 @@ const std::string data_dir = "./data_folder/"; const std::string default_prefix = data_dir + "kvs_"+std::to_string(instance)+"_default"; const std::string kvs_prefix = data_dir + "kvs_"+std::to_string(instance)+"_0"; const std::string filename_prefix = data_dir + "kvs_"+std::to_string(instance); +const score::os::Stat::Mode storage_mode = score::os::Stat::Mode::kReadUser | score::os::Stat::Mode::kWriteUser | score::os::Stat::Mode::kReadGroup | score::os::Stat::Mode::kReadOthers; const std::string default_json = R"({ "default": {