diff --git a/test/src/unit-capi-array.cc b/test/src/unit-capi-array.cc index c03fd2df8bb..9732ba24d32 100644 --- a/test/src/unit-capi-array.cc +++ b/test/src/unit-capi-array.cc @@ -58,7 +58,6 @@ #include "tiledb/sm/enums/encryption_type.h" #include "tiledb/sm/enums/serialization_type.h" #include "tiledb/sm/fragment/fragment_identifier.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/serialization/array.h" #include "tiledb/sm/serialization/fragments.h" diff --git a/test/src/unit-capi-filestore.cc b/test/src/unit-capi-filestore.cc index 17d4e01dfc8..5a1f5174d51 100644 --- a/test/src/unit-capi-filestore.cc +++ b/test/src/unit-capi-filestore.cc @@ -37,7 +37,6 @@ #include "test/support/src/vfs_helpers.h" #include "tiledb/sm/c_api/tiledb.h" #include "tiledb/sm/c_api/tiledb_experimental.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/misc/constants.h" using namespace tiledb::test; diff --git a/test/src/unit-capi-fragment_info.cc b/test/src/unit-capi-fragment_info.cc index 86fb7fc3b96..bf1a1cbcd5f 100644 --- a/test/src/unit-capi-fragment_info.cc +++ b/test/src/unit-capi-fragment_info.cc @@ -33,7 +33,6 @@ #include "test/support/src/helpers.h" #include "test/support/src/serialization_wrappers.h" #include "tiledb/sm/c_api/tiledb.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include #include diff --git a/test/src/unit-capi-group.cc b/test/src/unit-capi-group.cc index c008297bc03..eb379a2b9de 100644 --- a/test/src/unit-capi-group.cc +++ b/test/src/unit-capi-group.cc @@ -44,7 +44,6 @@ #include "tiledb/common/stdx_string.h" #include "tiledb/sm/c_api/tiledb.h" #include "tiledb/sm/enums/encryption_type.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/misc/tdb_time.h" #include diff --git a/test/src/unit-capi-metadata.cc b/test/src/unit-capi-metadata.cc index 84b7d05c8e9..abdc107fd05 100644 --- a/test/src/unit-capi-metadata.cc +++ b/test/src/unit-capi-metadata.cc @@ -35,7 +35,6 @@ #include "tiledb/sm/c_api/tiledb.h" #include "tiledb/sm/c_api/tiledb_struct_def.h" #include "tiledb/sm/enums/encryption_type.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/misc/tdb_time.h" #ifdef _WIN32 diff --git a/test/src/unit-cppapi-group.cc b/test/src/unit-cppapi-group.cc index c0a12c884b9..2387d7add5e 100644 --- a/test/src/unit-cppapi-group.cc +++ b/test/src/unit-cppapi-group.cc @@ -44,7 +44,6 @@ #include "tiledb/sm/c_api/tiledb.h" #include "tiledb/sm/cpp_api/group.h" #include "tiledb/sm/enums/encryption_type.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include #include diff --git a/test/src/unit-s3.cc b/test/src/unit-s3.cc index bddb320920b..36c65d0fa29 100644 --- a/test/src/unit-s3.cc +++ b/test/src/unit-s3.cc @@ -38,7 +38,6 @@ #include "tiledb/common/thread_pool/thread_pool.h" #include "tiledb/sm/config/config.h" #include "tiledb/sm/filesystem/s3.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/misc/tdb_time.h" #include @@ -110,8 +109,15 @@ TEST_CASE_METHOD(S3Fx, "Test S3 multiupload abort path", "[s3]") { write_buffer[i] = (char)('a' + (i % 26)); for (const int nth_failure : {2, 5, 10}) { - auto _ = UnitTestConfig::instance().s3_fail_every_nth_upload_request.set( - nth_failure); + auto fail_every_nth_upload = + tiledb::sm::intercept::s3_get_make_upload_part_req().and_also( + [nth_failure]( + unsigned part_num, bool& success, bool& induced_failure) { + if (part_num % nth_failure == 0) { + success = false; + induced_failure = true; + } + }); // Write one large file, the write will fail auto largefile = diff --git a/test/src/unit-vfs.cc b/test/src/unit-vfs.cc index 4144a371402..d856713e1a7 100644 --- a/test/src/unit-vfs.cc +++ b/test/src/unit-vfs.cc @@ -47,7 +47,6 @@ #endif #include "test/support/src/vfs_helpers.h" #include "tiledb/sm/filesystem/vfs.h" -#include "tiledb/sm/global_state/unit_test_config.h" #ifdef _WIN32 #include "tiledb/sm/filesystem/path_win.h" #endif diff --git a/test/support/src/helpers.cc b/test/support/src/helpers.cc index b768c885d75..968198ec820 100644 --- a/test/support/src/helpers.cc +++ b/test/support/src/helpers.cc @@ -53,7 +53,6 @@ #include "tiledb/sm/cpp_api/tiledb" #include "tiledb/sm/enums/encryption_type.h" #include "tiledb/sm/filesystem/uri.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/misc/constants.h" #include "tiledb/sm/misc/tile_overlap.h" #include "tiledb/sm/serialization/array.h" diff --git a/tiledb/sm/array/array.cc b/tiledb/sm/array/array.cc index fe1e6e64dce..75df673adbe 100644 --- a/tiledb/sm/array/array.cc +++ b/tiledb/sm/array/array.cc @@ -51,7 +51,6 @@ #include "tiledb/sm/enums/query_type.h" #include "tiledb/sm/enums/serialization_type.h" #include "tiledb/sm/fragment/fragment_metadata.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/misc/parallel_functions.h" #include "tiledb/sm/misc/tdb_time.h" #include "tiledb/sm/object/object.h" diff --git a/tiledb/sm/filesystem/s3.cc b/tiledb/sm/filesystem/s3.cc index aac9794952d..1814ac04e7c 100644 --- a/tiledb/sm/filesystem/s3.cc +++ b/tiledb/sm/filesystem/s3.cc @@ -69,7 +69,6 @@ #include "tiledb/common/unique_rwlock.h" #include "tiledb/platform/platform.h" #include "tiledb/sm/config/config_iter.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/misc/tdb_math.h" #ifdef _WIN32 @@ -228,6 +227,10 @@ using namespace tiledb::common; namespace tiledb::sm { +namespace intercept { +DEFINE_INTERCEPT(s3_get_make_upload_part_req, unsigned, bool&, bool&); +} + S3Parameters::Headers S3Parameters::load_headers(const Config& cfg) { Headers ret; auto iter = ConfigIter(cfg, constants::s3_header_prefix); @@ -1884,14 +1887,11 @@ Status S3::get_make_upload_part_req( bool success = upload_part_outcome.IsSuccess(); bool induced_failure = false; - static const UnitTestConfig& unit_test_cfg = UnitTestConfig::instance(); - if (unit_test_cfg.s3_fail_every_nth_upload_request.is_set() && - ctx.upload_part_num % - unit_test_cfg.s3_fail_every_nth_upload_request.get() == - 0) { - success = false; - induced_failure = true; - } + INTERCEPT( + intercept::s3_get_make_upload_part_req, + ctx.upload_part_num, + success, + induced_failure); if (!success) { UniqueReadLock unique_rl(&multipart_upload_rwlock_); diff --git a/tiledb/sm/filesystem/s3.h b/tiledb/sm/filesystem/s3.h index be1a02ee054..cea824723b6 100644 --- a/tiledb/sm/filesystem/s3.h +++ b/tiledb/sm/filesystem/s3.h @@ -42,6 +42,7 @@ #include "tiledb/common/rwlock.h" #include "tiledb/common/status.h" #include "tiledb/common/thread_pool/thread_pool.h" +#include "tiledb/common/util/intercept.h" #include "tiledb/platform/platform.h" #include "tiledb/sm/buffer/buffer.h" #include "tiledb/sm/config/config.h" @@ -99,6 +100,10 @@ class S3Exception : public StatusException { } }; +namespace intercept { +DECLARE_INTERCEPT(s3_get_make_upload_part_req, unsigned int, bool&, bool&); +} + namespace { /** diff --git a/tiledb/sm/global_state/unit_test_config.h b/tiledb/sm/global_state/unit_test_config.h deleted file mode 100644 index 4bce6dd3437..00000000000 --- a/tiledb/sm/global_state/unit_test_config.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - * @file unit_test_config.h - * - * @section LICENSE - * - * The MIT License - * - * @copyright Copyright (c) 2018-2021 TileDB, Inc. - * - * 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. - * - * @section DESCRIPTION - * - * This file declares the UnitTestConfig class. - */ - -#ifndef TILEDB_UNIT_TEST_CONFIG_H -#define TILEDB_UNIT_TEST_CONFIG_H - -#include -#include - -#include "tiledb/common/assert.h" -#include "tiledb/common/macros.h" - -using namespace tiledb::common; - -namespace tiledb { -namespace sm { - -/** - * A global singleton for communication between unit tests and their classes - * under test. - */ -class UnitTestConfig { - public: - /** Singleton instance. Thread-safe. */ - static UnitTestConfig& instance() { - static UnitTestConfig self; - return self; - } - - template - class SetSentinel; - - /** Wraps an attribute type to determine if it has been intentionally set. */ - template - class Attribute { - friend class SetSentinel; - - public: - /** Constructor. */ - Attribute() = default; - - DISABLE_COPY_AND_COPY_ASSIGN(Attribute); - DISABLE_MOVE_AND_MOVE_ASSIGN(Attribute); - - /** Destructor. */ - ~Attribute() = default; - - /** - * Returns true if the internal attribute has been set. - * - * @return bool - */ - bool is_set() const { - return attr_.has_value(); - } - - /** - * Sets the internal attribute. - * - * @param attr the internal attribute value to set. - * @returns Sentinel object that resets the attribute to its old value on - * destruction. - */ - SetSentinel set(auto&& attr); - - /** - * Unsets the internal attribute. - */ - void reset() { - attr_.reset(); - } - - /** - * Returns value of the internal attribute. - * - * @return T the internal attribute value. - */ - const T& get() const { - passert(attr_.has_value()); - return attr_.value(); - } - - private: - void assign(std::optional&& value) { - attr_ = std::move(value); - } - - /** Attribute value. */ - std::optional attr_; - }; - - template - class [[nodiscard]] SetSentinel { - friend class Attribute; - - public: - ~SetSentinel() { - attribute_.assign(std::move(old_value_)); - } - - DISABLE_COPY_AND_COPY_ASSIGN(SetSentinel); - DISABLE_MOVE_AND_MOVE_ASSIGN(SetSentinel); - - private: - SetSentinel(Attribute& attribute, std::optional&& old_value) - : attribute_(attribute) - , old_value_(std::move(old_value)) { - } - - Attribute& attribute_; - std::optional old_value_; - }; - - /** For every nth multipart upload request, return a non-OK status. */ - Attribute s3_fail_every_nth_upload_request; - - private: - /** Constructor. */ - UnitTestConfig() = default; - - /** Destructor. */ - ~UnitTestConfig() = default; - - DISABLE_COPY_AND_COPY_ASSIGN(UnitTestConfig); - DISABLE_MOVE_AND_MOVE_ASSIGN(UnitTestConfig); -}; - -template -inline UnitTestConfig::SetSentinel UnitTestConfig::Attribute::set( - auto&& attr) { - auto old_value = attr_; - attr_.emplace(std::forward(attr)); - return SetSentinel(*this, std::move(old_value)); -} - -} // namespace sm -} // namespace tiledb - -#endif // TILEDB_UNIT_TEST_CONFIG_H diff --git a/tiledb/sm/group/group.cc b/tiledb/sm/group/group.cc index 97b522d8889..646f0987032 100644 --- a/tiledb/sm/group/group.cc +++ b/tiledb/sm/group/group.cc @@ -40,7 +40,6 @@ #include "tiledb/sm/enums/datatype.h" #include "tiledb/sm/enums/encryption_type.h" #include "tiledb/sm/enums/query_type.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/group/group_details_v1.h" #include "tiledb/sm/group/group_details_v2.h" #include "tiledb/sm/group/group_member_v1.h" diff --git a/tiledb/sm/group/group_details.cc b/tiledb/sm/group/group_details.cc index eb9ce211e25..eb967a1f918 100644 --- a/tiledb/sm/group/group_details.cc +++ b/tiledb/sm/group/group_details.cc @@ -37,7 +37,6 @@ #include "tiledb/sm/enums/encryption_type.h" #include "tiledb/sm/enums/query_type.h" #include "tiledb/sm/filesystem/uri.h" -#include "tiledb/sm/global_state/unit_test_config.h" #include "tiledb/sm/group/group_details_v1.h" #include "tiledb/sm/group/group_details_v2.h" #include "tiledb/sm/group/group_member_v1.h"