From 15cc7b0b87081fd51a5720b41cea734feda92728 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sun, 4 Aug 2024 09:55:01 -0500 Subject: [PATCH] updated build system --- scripts/run_tests.cmd | 12 +++ scripts/run_tests.sh | 15 +++ support/include/utils/common.hpp | 53 ++++++---- support/include/utils/config.hpp | 13 +++ support/src/utils/common.cpp | 12 ++- support/test/src/utils/common_test.cpp | 130 ++++++++++++++++++++++++- 6 files changed, 208 insertions(+), 27 deletions(-) create mode 100644 scripts/run_tests.cmd create mode 100755 scripts/run_tests.sh diff --git a/scripts/run_tests.cmd b/scripts/run_tests.cmd new file mode 100644 index 00000000..53e9f543 --- /dev/null +++ b/scripts/run_tests.cmd @@ -0,0 +1,12 @@ +@echo off + +setlocal + +set ARG1=%~1 +set ARG2=%~2 +set ARG3=%~3 + +pushd "%~dp0%" + call mingw64 -no-start ./run_tests.sh "%ARG1%" "%ARG2%" "%ARG3%" 1 0 +popd + diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh new file mode 100755 index 00000000..80b7d3d1 --- /dev/null +++ b/scripts/run_tests.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +PROJECT_SCRIPTS_DIR=$(realpath "$0") +PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}") +. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5" 0 + +pushd "${PROJECT_DIST_DIR}" +if [ -e "./${PROJECT_NAME}_test${PROJECT_APP_BINARY_EXT}" ]; then + for APP in ${PROJECT_APP_LIST[@]}; do + if [[ "$APP" == *_test${PROJECT_APP_BINARY_EXT} ]]; then + "./${PROJECT_NAME}_test${PROJECT_APP_BINARY_EXT}" || exit 1 + fi + done +fi +popd diff --git a/support/include/utils/common.hpp b/support/include/utils/common.hpp index f34b0bdc..8ff5e0cb 100644 --- a/support/include/utils/common.hpp +++ b/support/include/utils/common.hpp @@ -33,7 +33,7 @@ struct result final { [[nodiscard]] operator bool() const { return ok; } }; -[[nodiscard]] inline auto +[[nodiscard]] inline constexpr auto calculate_read_size(std::uint64_t total_size, std::size_t read_size, std::uint64_t offset) -> std::size_t { return static_cast( @@ -56,16 +56,24 @@ compare_version_strings(std::wstring_view version1, [[nodiscard]] auto create_uuid_wstring() -> std::wstring; #endif // defined(PROJECT_ENABLE_STDUUID) +template +[[nodiscard]] inline constexpr auto +divide_with_ceiling(result_t numerator, data_t denominator) -> result_t; + #if defined(PROJECT_ENABLE_LIBSODIUM) -template -[[nodiscard]] inline auto generate_random() -> data_type; +template +[[nodiscard]] inline auto generate_random() -> data_t; -template -[[nodiscard]] inline auto -generate_random_between(const data_type &begin, - const data_type &end) -> data_type; +template +[[nodiscard]] inline auto generate_random(std::size_t size) -> data_t; -[[nodiscard]] auto generate_random_string(std::uint16_t length) -> std::string; +template +[[nodiscard]] inline auto generate_random_between(data_t begin, + data_t end) -> data_t; + +[[nodiscard]] auto generate_random_string(std::size_t length) -> std::string; + +[[nodiscard]] auto generate_random_wstring(std::size_t length) -> std::wstring; #endif // defined(PROJECT_ENABLE_LIBSODIUM) [[nodiscard]] auto @@ -85,8 +93,8 @@ get_next_available_port(std::uint16_t first_port, [[nodiscard]] auto resolve_variables(std::wstring_view str) -> std::wstring; template -[[nodiscard]] inline constexpr auto -divide_with_ceiling(result_t numerator, data_t denominator) -> result_t { +inline constexpr auto divide_with_ceiling(result_t numerator, + data_t denominator) -> result_t { static_assert(std::is_integral_v>, "denominator must be an integral type"); @@ -96,18 +104,27 @@ divide_with_ceiling(result_t numerator, data_t denominator) -> result_t { } #if defined(PROJECT_ENABLE_LIBSODIUM) -template -[[nodiscard]] inline auto generate_random() -> data_type { - data_type ret{}; +template inline auto generate_random() -> data_t { + static_assert(!is_collection>::value, + "data_t is a vector or collection"); + data_t ret{}; randombytes_buf(&ret, sizeof(ret)); return ret; } -template -[[nodiscard]] inline auto -generate_random_between(const data_type &begin, - const data_type &end) -> data_type { - return begin + generate_random() % ((end + data_type{1}) - begin); +template +inline auto generate_random(std::size_t size) -> data_t { + static_assert(is_collection>::value, + "data_t is not a vector or collection"); + data_t ret; + ret.resize(size); + randombytes_buf(ret.data(), ret.size() * sizeof(typename data_t::value_type)); + return ret; +} + +template +inline auto generate_random_between(data_t begin, data_t end) -> data_t { + return begin + generate_random() % ((end + data_t{1}) - begin); } #endif // defined(PROJECT_ENABLE_LIBSODIUM) } // namespace repertory::utils diff --git a/support/include/utils/config.hpp b/support/include/utils/config.hpp index d0b6f79d..11136ead 100644 --- a/support/include/utils/config.hpp +++ b/support/include/utils/config.hpp @@ -308,6 +308,19 @@ template struct overloaded : Ts... { }; template overloaded(Ts...) -> overloaded; +template struct is_collection { + static const bool value = false; +}; + +template +struct is_collection> : std::true_type {}; + +template struct is_collection> : std::true_type {}; + +template <> struct is_collection : std::true_type {}; + +template <> struct is_collection : std::true_type {}; + struct file_deleter final { void operator()(FILE *file) { if (file != nullptr) { diff --git a/support/src/utils/common.cpp b/support/src/utils/common.cpp index e7f298a1..79dd536b 100644 --- a/support/src/utils/common.cpp +++ b/support/src/utils/common.cpp @@ -84,18 +84,22 @@ auto create_uuid_wstring() -> std::wstring { #endif // defined(PROJECT_ENABLE_STDUUID) #if defined(PROJECT_ENABLE_LIBSODIUM) -auto generate_random_string(std::uint16_t length) -> std::string { +auto generate_random_string(std::size_t length) -> std::string { std::string ret; ret.resize(length); - for (std::uint16_t i = 0U; i < length; i++) { + for (std::size_t i = 0U; i < length; i++) { do { ret[i] = static_cast(generate_random() % 74 + 48); - } while (((ret[i] >= 91) && (ret[i] <= 96)) || - ((ret[i] >= 58) && (ret[i] <= 64))); + } while (((ret.at(i) >= 91) && (ret.at(i) <= 96)) || + ((ret.at(i) >= 58) && (ret.at(i) <= 64))); } return ret; } + +auto generate_random_wstring(std::size_t length) -> std::wstring { + return utils::string::from_utf8(generate_random_string(length)); +} #endif // defined(PROJECT_ENABLE_LIBSODIUM) auto get_environment_variable(std::string_view variable) -> std::string { diff --git a/support/test/src/utils/common_test.cpp b/support/test/src/utils/common_test.cpp index 9f1c4ae2..c1ad9e85 100644 --- a/support/test/src/utils/common_test.cpp +++ b/support/test/src/utils/common_test.cpp @@ -20,18 +20,47 @@ SOFTWARE. */ #include "gtest/gtest.h" +#include #include "utils/common.hpp" namespace repertory { +TEST(utils_common, calculate_read_size) { + auto read_size = utils::calculate_read_size(0U, 0U, 0U); + EXPECT_EQ(0U, read_size); + + read_size = utils::calculate_read_size(5U, 0U, 0U); + EXPECT_EQ(0U, read_size); + + read_size = utils::calculate_read_size(0U, 6U, 7U); + EXPECT_EQ(0U, read_size); + + read_size = utils::calculate_read_size(7U, 1U, 7U); + EXPECT_EQ(0U, read_size); + + read_size = utils::calculate_read_size(5U, 5U, 0U); + EXPECT_EQ(5U, read_size); + + read_size = utils::calculate_read_size(5U, 5U, 1U); + EXPECT_EQ(4U, read_size); +} + TEST(utils_common, version_equal) { + EXPECT_EQ(0, utils::compare_version_strings("", "")); EXPECT_EQ(0, utils::compare_version_strings("1.0", "1.0")); EXPECT_EQ(0, utils::compare_version_strings("1.0.0", "1.0")); EXPECT_EQ(0, utils::compare_version_strings("1.0.0.0", "1.0")); EXPECT_EQ(0, utils::compare_version_strings("1.0.0.0", "1.0.0")); + + EXPECT_EQ(0, utils::compare_version_strings(L"", L"")); + EXPECT_EQ(0, utils::compare_version_strings(L"1.0", L"1.0")); + EXPECT_EQ(0, utils::compare_version_strings(L"1.0.0", L"1.0")); + EXPECT_EQ(0, utils::compare_version_strings(L"1.0.0.0", L"1.0")); + EXPECT_EQ(0, utils::compare_version_strings(L"1.0.0.0", L"1.0.0")); } TEST(utils_common, version_greater) { + EXPECT_EQ(1, utils::compare_version_strings("1.0.1", "")); EXPECT_EQ(1, utils::compare_version_strings("1.0.1", "1.0")); EXPECT_EQ(1, utils::compare_version_strings("1.0.1", "1.0.0")); EXPECT_EQ(1, utils::compare_version_strings("1.0.1", "1.0.0.0")); @@ -41,9 +70,21 @@ TEST(utils_common, version_greater) { EXPECT_EQ(1, utils::compare_version_strings("1.0", "0.9.9")); EXPECT_EQ(1, utils::compare_version_strings("1.0.1", "0.9.9")); EXPECT_EQ(1, utils::compare_version_strings("1.0.1.0", "0.9.9")); + + EXPECT_EQ(1, utils::compare_version_strings("1.0.1", "")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0.1", L"1.0")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0.1", L"1.0.0")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0.1", L"1.0.0.0")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0.1.0", L"1.0")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0.1.0", L"1.0.0")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0.1.0", L"1.0.0.0")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0", L"0.9.9")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0.1", L"0.9.9")); + EXPECT_EQ(1, utils::compare_version_strings(L"1.0.1.0", L"0.9.9")); } TEST(utils_common, version_less) { + EXPECT_EQ(-1, utils::compare_version_strings("", "1.0")); EXPECT_EQ(-1, utils::compare_version_strings("0.9.9", "1.0")); EXPECT_EQ(-1, utils::compare_version_strings("0.9.9", "1.0.1")); EXPECT_EQ(-1, utils::compare_version_strings("0.9.9", "1.0.1.0")); @@ -53,15 +94,94 @@ TEST(utils_common, version_less) { EXPECT_EQ(-1, utils::compare_version_strings("1.0.0", "1.0.1.0")); EXPECT_EQ(-1, utils::compare_version_strings("1.0.0.0", "1.0.1")); EXPECT_EQ(-1, utils::compare_version_strings("1.0.0.0", "1.0.1.0")); + + EXPECT_EQ(-1, utils::compare_version_strings(L"", L"1.0")); + EXPECT_EQ(-1, utils::compare_version_strings(L"0.9.9", L"1.0")); + EXPECT_EQ(-1, utils::compare_version_strings(L"0.9.9", L"1.0.1")); + EXPECT_EQ(-1, utils::compare_version_strings(L"0.9.9", L"1.0.1.0")); + EXPECT_EQ(-1, utils::compare_version_strings(L"1.0", L"1.0.1")); + EXPECT_EQ(-1, utils::compare_version_strings(L"1.0", L"1.0.1.0")); + EXPECT_EQ(-1, utils::compare_version_strings(L"1.0.0", L"1.0.1")); + EXPECT_EQ(-1, utils::compare_version_strings(L"1.0.0", L"1.0.1.0")); + EXPECT_EQ(-1, utils::compare_version_strings(L"1.0.0.0", L"1.0.1")); + EXPECT_EQ(-1, utils::compare_version_strings(L"1.0.0.0", L"1.0.1.0")); } #if defined(PROJECT_ENABLE_STDUUID) TEST(utils_common, create_uuid_string) { - const auto uuid1 = utils::create_uuid_string(); - const auto uuid2 = utils::create_uuid_string(); - ASSERT_EQ(36U, uuid1.size()); - ASSERT_EQ(36U, uuid2.size()); - ASSERT_STRNE(uuid1.c_str(), uuid2.c_str()); + { + const auto uuid1 = utils::create_uuid_string(); + const auto uuid2 = utils::create_uuid_string(); + ASSERT_EQ(36U, uuid1.size()); + ASSERT_EQ(36U, uuid2.size()); + ASSERT_STRNE(uuid1.c_str(), uuid2.c_str()); + } + { + const auto uuid1 = utils::create_uuid_wstring(); + const auto uuid2 = utils::create_uuid_wstring(); + ASSERT_EQ(36U, uuid1.size()); + ASSERT_EQ(36U, uuid2.size()); + ASSERT_STRNE(uuid1.c_str(), uuid2.c_str()); + } } #endif // defined(PROJECT_ENABLE_STDUUID) + +#if defined(PROJECT_ENABLE_LIBSODIUM) +TEST(utils_common, generate_random) { + { + auto r1 = utils::generate_random(); + auto r2 = utils::generate_random(); + EXPECT_NE(r1, r2); + } + + { + auto r1 = utils::generate_random>(6U); + auto r2 = utils::generate_random>(6U); + EXPECT_EQ(6U, r1.size()); + EXPECT_EQ(r1.size(), r2.size()); + EXPECT_NE(r1, r2); + } + + { + auto r1 = utils::generate_random>(); + auto r2 = utils::generate_random>(); + EXPECT_EQ(4U, r1.size()); + EXPECT_EQ(r1.size(), r2.size()); + EXPECT_NE(0, std::memcmp(r1.data(), r2.data(), r1.size())); + } + + { + auto r1 = utils::generate_random(6U); + auto r2 = utils::generate_random(6U); + EXPECT_EQ(6U, r1.size()); + EXPECT_EQ(r1.size(), r2.size()); + EXPECT_NE(0, std::memcmp(r1.data(), r2.data(), r1.size())); + } + + { + auto r1 = utils::generate_random(6U); + auto r2 = utils::generate_random(6U); + EXPECT_EQ(6U, r1.size()); + EXPECT_EQ(r1.size(), r2.size()); + EXPECT_NE(0, std::memcmp(r1.data(), r2.data(), r1.size())); + } +} +#endif // defined(PROJECT_ENABLE_LIBSODIUM) + +TEST(utils_common, divide_with_ceiling) { + auto r = utils::divide_with_ceiling(12, 5); + EXPECT_EQ(3, r); + + r = utils::divide_with_ceiling(12, 4); + EXPECT_EQ(3, r); + + r = utils::divide_with_ceiling(1, 2); + EXPECT_EQ(1, r); + + r = utils::divide_with_ceiling(2, 2); + EXPECT_EQ(1, r); + + r = utils::divide_with_ceiling(0, 2); + EXPECT_EQ(0, r); +} } // namespace repertory