diff --git a/src/utils/PugsUtils.cpp b/src/utils/PugsUtils.cpp index 6186f6fdc9fd974918787ffd9ed335cddf28b482..ad9e12e7ec4cdd01305cf8701c327894c7942304 100644 --- a/src/utils/PugsUtils.cpp +++ b/src/utils/PugsUtils.cpp @@ -30,11 +30,13 @@ pugsVersion() os << "HEAD: " << rang::style::bold << RevisionInfo::gitHead() << rang::style::reset << '\n'; os << "hash: " << rang::style::bold << RevisionInfo::gitHash() << rang::style::reset << " ("; + // LCOV_EXCL_START Cannot cover both situations at same time if (RevisionInfo::gitIsClean()) { os << rang::fgB::green << "clean" << rang::fg::reset; } else { os << rang::fgB::red << "dirty" << rang::fg::reset; } + // LCOV_EXCL_STOP os << ")\n"; os << "-------------------------------------------------------"; @@ -63,7 +65,7 @@ setDefaultOMPEnvironment() { if constexpr (std::string_view{PUGS_BUILD_KOKKOS_DEVICES} == std::string_view{"OpenMP"}) { setenv("OMP_PROC_BIND", "spread", 0); - setenv("OMP_PLACES", "treads", 0); + setenv("OMP_PLACES", "threads", 0); } } diff --git a/src/utils/PugsUtils.hpp b/src/utils/PugsUtils.hpp index 54bcc6d0567b00fda6a25d865d7cb0b759bfb2bd..7429a75b3be20ec3d62028cc9180a2017f7b4f15 100644 --- a/src/utils/PugsUtils.hpp +++ b/src/utils/PugsUtils.hpp @@ -21,6 +21,8 @@ parallel_reduce(size_t size, const ArrayType& array, ReturnType& value, const st Kokkos::parallel_reduce(label, size, array, value); } +void setDefaultOMPEnvironment(); + std::string pugsBuildInfo(); std::string pugsVersion(); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 746f5d7b1b820818a6069853a2ea0bc130025321..0502c414a76e536dc6d2a0d1d49bc260a930b84d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -80,8 +80,9 @@ add_executable (unit_tests test_NameProcessor.cpp test_OStreamProcessor.cpp test_ParseError.cpp - test_PugsFunctionAdapter.cpp test_PugsAssert.cpp + test_PugsFunctionAdapter.cpp + test_PugsUtils.cpp test_RevisionInfo.cpp test_SparseMatrixDescriptor.cpp test_SymbolTable.cpp diff --git a/tests/test_PugsUtils.cpp b/tests/test_PugsUtils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b966ae8f0c0bab490c9f7e3e4441ffdd329aeec1 --- /dev/null +++ b/tests/test_PugsUtils.cpp @@ -0,0 +1,110 @@ +#include <catch2/catch.hpp> + +#include <utils/BuildInfo.hpp> +#include <utils/PugsUtils.hpp> +#include <utils/RevisionInfo.hpp> +#include <utils/pugs_build_info.hpp> + +#include <rang.hpp> + +#include <string> + +// clazy:excludeall=non-pod-global-static + +TEST_CASE("PugsUtils", "[utils]") +{ + SECTION("checking infos") + { + const std::string pugs_version = [] { + std::stringstream os; + + os << "pugs version: " << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n'; + + os << "-------------------- " << rang::fg::green << "git info" << rang::fg::reset << " -------------------------" + << '\n'; + os << "tag: " << rang::style::bold << RevisionInfo::gitTag() << rang::style::reset << '\n'; + os << "HEAD: " << rang::style::bold << RevisionInfo::gitHead() << rang::style::reset << '\n'; + os << "hash: " << rang::style::bold << RevisionInfo::gitHash() << rang::style::reset << " ("; + + if (RevisionInfo::gitIsClean()) { + os << rang::fgB::green << "clean" << rang::fg::reset; + } else { + os << rang::fgB::red << "dirty" << rang::fg::reset; + } + os << ")\n"; + os << "-------------------------------------------------------"; + + return os.str(); + }(); + + REQUIRE(pugsVersion() == pugs_version); + + const std::string build_info = [] { + std::ostringstream os; + + os << "-------------------- " << rang::fg::green << "build info" << rang::fg::reset << " -----------------------" + << '\n'; + os << "type: " << rang::style::bold << BuildInfo::type() << rang::style::reset << '\n'; + os << "compiler: " << rang::style::bold << BuildInfo::compiler() << rang::style::reset << '\n'; + os << "kokkos: " << rang::style::bold << BuildInfo::kokkosDevices() << rang::style::reset << '\n'; + os << "MPI: " << rang::style::bold << BuildInfo::mpiLibrary() << rang::style::reset << '\n'; + os << "PETSc: " << rang::style::bold << BuildInfo::petscLibrary() << rang::style::reset << '\n'; + os << "-------------------------------------------------------"; + + return os.str(); + }(); + + REQUIRE(pugsBuildInfo() == build_info); + } + + SECTION("checking OMP environment setting") + { + if constexpr (std::string_view{PUGS_BUILD_KOKKOS_DEVICES} == std::string_view{"OpenMP"}) { + const std::string saved_omp_proc_bind = []() { + char* value = getenv("OMP_PROC_BIND"); + if (value != nullptr) { + return std::string{value}; + } else { + return std::string{}; + } + }(); + + const std::string saved_omp_places = []() { + char* value = getenv("OMP_PLACES"); + if (value != nullptr) { + return std::string{value}; + } else { + return std::string{}; + } + }(); + + unsetenv("OMP_PROC_BIND"); + unsetenv("OMP_PLACES"); + + setDefaultOMPEnvironment(); + REQUIRE(std::string{getenv("OMP_PROC_BIND")} == std::string{"spread"}); + REQUIRE(std::string{getenv("OMP_PLACES")} == std::string{"threads"}); + + unsetenv("OMP_PROC_BIND"); + unsetenv("OMP_PLACES"); + + setenv("OMP_PROC_BIND", "foo", 1); + setenv("OMP_PLACES", "bar", 1); + + setDefaultOMPEnvironment(); + REQUIRE(std::string{getenv("OMP_PROC_BIND")} == std::string{"foo"}); + REQUIRE(std::string{getenv("OMP_PLACES")} == std::string{"bar"}); + + unsetenv("OMP_PROC_BIND"); + unsetenv("OMP_PLACES"); + + if (saved_omp_proc_bind.size() != 0) { + setenv("OMP_PROC_BIND", saved_omp_proc_bind.c_str(), 1); + } + + if (saved_omp_places.size() != 0) { + setenv("OMP_PLACES", saved_omp_places.c_str(), 1); + } + } + } +}