From 7fe2d940223546cfb057b4eda0ef9fc84e1b7567 Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy Date: Sat, 5 Jul 2025 19:08:27 +0200 Subject: [PATCH 1/8] Add tests for env-based timeouts --- docs/user_guide/environment_variables.rst | 4 ++ modules/performance/include/performance.hpp | 5 ++- modules/performance/tests/perf_tests.cpp | 24 ++++++++++++ modules/task/include/task.hpp | 6 +-- modules/task/tests/task_tests.cpp | 17 +++++++++ modules/util/include/util.hpp | 2 + modules/util/src/util.cpp | 16 ++++++++ modules/util/tests/util.cpp | 41 +++++++++++++++++++++ 8 files changed, 110 insertions(+), 5 deletions(-) diff --git a/docs/user_guide/environment_variables.rst b/docs/user_guide/environment_variables.rst index 63d6291ed..fe147e016 100644 --- a/docs/user_guide/environment_variables.rst +++ b/docs/user_guide/environment_variables.rst @@ -14,3 +14,7 @@ The following environment variables can be used to configure the project's runti - ``PPC_IGNORE_TEST_TIME_LIMIT``: Specifies that test time limits are ignored. Used by ``scripts/run_tests.py`` to disable time limit enforcement. Default: ``0`` +- ``PPC_TASK_MAX_TIME``: Maximum allowed execution time in seconds for functional tests. + Default: ``1.0`` +- ``PPC_PERF_MAX_TIME``: Maximum allowed execution time in seconds for performance tests. + Default: ``10.0`` diff --git a/modules/performance/include/performance.hpp b/modules/performance/include/performance.hpp index eaafc5378..9e344cc15 100644 --- a/modules/performance/include/performance.hpp +++ b/modules/performance/include/performance.hpp @@ -78,14 +78,15 @@ class Perf { } auto time_secs = perf_results_.time_sec; + const auto max_time = ppc::util::GetPerfMaxTime(); std::stringstream perf_res_str; - if (time_secs < PerfResults::kMaxTime) { + if (time_secs < max_time) { perf_res_str << std::fixed << std::setprecision(10) << time_secs; std::cout << test_id << ":" << type_test_name << ":" << perf_res_str.str() << '\n'; } else { std::stringstream err_msg; err_msg << '\n' << "Task execute time need to be: "; - err_msg << "time < " << PerfResults::kMaxTime << " secs." << '\n'; + err_msg << "time < " << max_time << " secs." << '\n'; err_msg << "Original time in secs: " << time_secs << '\n'; perf_res_str << std::fixed << std::setprecision(10) << -1.0; std::cout << test_id << ":" << type_test_name << ":" << perf_res_str.str() << '\n'; diff --git a/modules/performance/tests/perf_tests.cpp b/modules/performance/tests/perf_tests.cpp index 1888e39a3..0fafba64b 100644 --- a/modules/performance/tests/perf_tests.cpp +++ b/modules/performance/tests/perf_tests.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -107,6 +108,29 @@ TEST(perf_tests, check_perf_pipeline_uint8_t_slow_test) { ASSERT_ANY_THROW(perf_analyzer.PrintPerfStatistic("check_perf_pipeline_uint8_t_slow_test")); } +TEST(perf_tests, slow_perf_respects_env_override) { + const char* old = std::getenv("PPC_PERF_MAX_TIME"); + setenv("PPC_PERF_MAX_TIME", "12", 1); + std::vector in(128, 1); + auto test_task = std::make_shared, uint8_t>>(in); + Perf, uint8_t> perf_analyzer(test_task); + PerfAttr perf_attr; + perf_attr.num_running = 1; + const auto t0 = std::chrono::high_resolution_clock::now(); + perf_attr.current_timer = [&] { + auto current_time_point = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(current_time_point - t0).count(); + return static_cast(duration) * 1e-9; + }; + perf_analyzer.PipelineRun(perf_attr); + EXPECT_NO_THROW(perf_analyzer.PrintPerfStatistic("slow_perf_respects_env_override")); + if (old) { + setenv("PPC_PERF_MAX_TIME", old, 1); + } else { + unsetenv("PPC_PERF_MAX_TIME"); + } +} + TEST(perf_tests, check_perf_task_exception) { std::vector in(2000, 1); diff --git a/modules/task/include/task.hpp b/modules/task/include/task.hpp index f54b73b4c..41d9c79d7 100644 --- a/modules/task/include/task.hpp +++ b/modules/task/include/task.hpp @@ -215,12 +215,13 @@ class Task { .count(); auto diff = static_cast(duration) * 1e-9; + const auto max_time = ppc::util::GetTaskMaxTime(); std::stringstream err_msg; - if (diff < kMaxTestTime) { + if (diff < max_time) { err_msg << "Test time:" << std::fixed << std::setprecision(10) << diff << '\n'; } else { err_msg << "\nTask execute time need to be: "; - err_msg << "time < " << kMaxTestTime << " secs.\n"; + err_msg << "time < " << max_time << " secs.\n"; err_msg << "Original time in secs: " << diff << '\n'; throw std::runtime_error(err_msg.str().c_str()); } @@ -249,7 +250,6 @@ class Task { StateOfTesting state_of_testing_ = kFunc; TypeOfTask type_of_task_ = kUnknown; StatusOfTask status_of_task_ = kEnabled; - static constexpr double kMaxTestTime = 1.0; std::chrono::high_resolution_clock::time_point tmp_time_point_; enum class PipelineStage : uint8_t { kNone, diff --git a/modules/task/tests/task_tests.cpp b/modules/task/tests/task_tests.cpp index daedf15a0..9f36fbf37 100644 --- a/modules/task/tests/task_tests.cpp +++ b/modules/task/tests/task_tests.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -72,6 +73,22 @@ TEST(task_tests, check_int32_t_slow) { ASSERT_ANY_THROW(test_task.PostProcessing()); } +TEST(task_tests, slow_task_respects_env_override) { + const char* old = std::getenv("PPC_TASK_MAX_TIME"); + setenv("PPC_TASK_MAX_TIME", "3", 1); + std::vector in(20, 1); + ppc::test::FakeSlowTask, int32_t> test_task(in); + ASSERT_EQ(test_task.Validation(), true); + test_task.PreProcessing(); + test_task.Run(); + EXPECT_NO_THROW(test_task.PostProcessing()); + if (old) { + setenv("PPC_TASK_MAX_TIME", old, 1); + } else { + unsetenv("PPC_TASK_MAX_TIME"); + } +} + TEST(task_tests, check_validate_func) { std::vector in; ppc::test::TestTask, int32_t> test_task(in); diff --git a/modules/util/include/util.hpp b/modules/util/include/util.hpp index de86faa90..d7ab449ba 100644 --- a/modules/util/include/util.hpp +++ b/modules/util/include/util.hpp @@ -52,6 +52,8 @@ enum GTestParamIndex : uint8_t { kTaskGetter, kNameTest, kTestParams }; std::string GetAbsoluteTaskPath(const std::string& id_path, const std::string& relative_path); int GetNumThreads(); +double GetTaskMaxTime(); +double GetPerfMaxTime(); template std::string GetNamespace() { diff --git a/modules/util/src/util.cpp b/modules/util/src/util.cpp index 8f776bbe0..7fe8d6506 100644 --- a/modules/util/src/util.cpp +++ b/modules/util/src/util.cpp @@ -28,6 +28,22 @@ int ppc::util::GetNumThreads() { return 1; } +double ppc::util::GetTaskMaxTime() { + const auto val = env::get("PPC_TASK_MAX_TIME"); + if (val.has_value()) { + return val.value(); + } + return 1.0; +} + +double ppc::util::GetPerfMaxTime() { + const auto val = env::get("PPC_PERF_MAX_TIME"); + if (val.has_value()) { + return val.value(); + } + return 10.0; +} + // List of environment variables that signal the application is running under // an MPI launcher. The array size must match the number of entries to avoid // looking up empty environment variable names. diff --git a/modules/util/tests/util.cpp b/modules/util/tests/util.cpp index 53450443f..d9b313ad6 100644 --- a/modules/util/tests/util.cpp +++ b/modules/util/tests/util.cpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -75,3 +76,43 @@ TEST(GetNamespaceTest, NoTerminatorCharactersInPrettyFunction) { std::string k_ns = ppc::util::GetNamespace(); EXPECT_EQ(k_ns, "crazy"); } + +TEST(GetTaskMaxTime, ReturnsDefaultWhenUnset) { + const char* old = std::getenv("PPC_TASK_MAX_TIME"); + unsetenv("PPC_TASK_MAX_TIME"); + EXPECT_DOUBLE_EQ(ppc::util::GetTaskMaxTime(), 1.0); + if (old) { + setenv("PPC_TASK_MAX_TIME", old, 1); + } +} + +TEST(GetTaskMaxTime, ReadsFromEnvironment) { + const char* old = std::getenv("PPC_TASK_MAX_TIME"); + setenv("PPC_TASK_MAX_TIME", "2.5", 1); + EXPECT_DOUBLE_EQ(ppc::util::GetTaskMaxTime(), 2.5); + if (old) { + setenv("PPC_TASK_MAX_TIME", old, 1); + } else { + unsetenv("PPC_TASK_MAX_TIME"); + } +} + +TEST(GetPerfMaxTime, ReturnsDefaultWhenUnset) { + const char* old = std::getenv("PPC_PERF_MAX_TIME"); + unsetenv("PPC_PERF_MAX_TIME"); + EXPECT_DOUBLE_EQ(ppc::util::GetPerfMaxTime(), 10.0); + if (old) { + setenv("PPC_PERF_MAX_TIME", old, 1); + } +} + +TEST(GetPerfMaxTime, ReadsFromEnvironment) { + const char* old = std::getenv("PPC_PERF_MAX_TIME"); + setenv("PPC_PERF_MAX_TIME", "12.5", 1); + EXPECT_DOUBLE_EQ(ppc::util::GetPerfMaxTime(), 12.5); + if (old) { + setenv("PPC_PERF_MAX_TIME", old, 1); + } else { + unsetenv("PPC_PERF_MAX_TIME"); + } +} From f76beb30eb2522b31f5bc8914f0ce2981304361b Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy Date: Sun, 6 Jul 2025 12:18:28 +0200 Subject: [PATCH 2/8] Use envpp helpers in tests --- modules/performance/tests/perf_tests.cpp | 10 ++---- modules/task/tests/task_tests.cpp | 10 ++---- modules/util/tests/util.cpp | 39 +++++++++--------------- 3 files changed, 19 insertions(+), 40 deletions(-) diff --git a/modules/performance/tests/perf_tests.cpp b/modules/performance/tests/perf_tests.cpp index 0fafba64b..3484d6a11 100644 --- a/modules/performance/tests/perf_tests.cpp +++ b/modules/performance/tests/perf_tests.cpp @@ -2,9 +2,9 @@ #include #include -#include #include #include +#include #include #include #include @@ -109,8 +109,7 @@ TEST(perf_tests, check_perf_pipeline_uint8_t_slow_test) { } TEST(perf_tests, slow_perf_respects_env_override) { - const char* old = std::getenv("PPC_PERF_MAX_TIME"); - setenv("PPC_PERF_MAX_TIME", "12", 1); + env::detail::set_scoped_environment_variable scoped("PPC_PERF_MAX_TIME", "12"); std::vector in(128, 1); auto test_task = std::make_shared, uint8_t>>(in); Perf, uint8_t> perf_analyzer(test_task); @@ -124,11 +123,6 @@ TEST(perf_tests, slow_perf_respects_env_override) { }; perf_analyzer.PipelineRun(perf_attr); EXPECT_NO_THROW(perf_analyzer.PrintPerfStatistic("slow_perf_respects_env_override")); - if (old) { - setenv("PPC_PERF_MAX_TIME", old, 1); - } else { - unsetenv("PPC_PERF_MAX_TIME"); - } } TEST(perf_tests, check_perf_task_exception) { diff --git a/modules/task/tests/task_tests.cpp b/modules/task/tests/task_tests.cpp index 9f36fbf37..720ec5695 100644 --- a/modules/task/tests/task_tests.cpp +++ b/modules/task/tests/task_tests.cpp @@ -3,9 +3,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -74,19 +74,13 @@ TEST(task_tests, check_int32_t_slow) { } TEST(task_tests, slow_task_respects_env_override) { - const char* old = std::getenv("PPC_TASK_MAX_TIME"); - setenv("PPC_TASK_MAX_TIME", "3", 1); + env::detail::set_scoped_environment_variable scoped("PPC_TASK_MAX_TIME", "3"); std::vector in(20, 1); ppc::test::FakeSlowTask, int32_t> test_task(in); ASSERT_EQ(test_task.Validation(), true); test_task.PreProcessing(); test_task.Run(); EXPECT_NO_THROW(test_task.PostProcessing()); - if (old) { - setenv("PPC_TASK_MAX_TIME", old, 1); - } else { - unsetenv("PPC_TASK_MAX_TIME"); - } } TEST(task_tests, check_validate_func) { diff --git a/modules/util/tests/util.cpp b/modules/util/tests/util.cpp index d9b313ad6..8fadf7b5e 100644 --- a/modules/util/tests/util.cpp +++ b/modules/util/tests/util.cpp @@ -2,8 +2,7 @@ #include -#include -#include +#include #include #include "omp.h" @@ -78,41 +77,33 @@ TEST(GetNamespaceTest, NoTerminatorCharactersInPrettyFunction) { } TEST(GetTaskMaxTime, ReturnsDefaultWhenUnset) { - const char* old = std::getenv("PPC_TASK_MAX_TIME"); - unsetenv("PPC_TASK_MAX_TIME"); + const auto old = env::detail::get_environment_variable("PPC_TASK_MAX_TIME"); + if (old.has_value()) { + env::detail::delete_environment_variable("PPC_TASK_MAX_TIME"); + } EXPECT_DOUBLE_EQ(ppc::util::GetTaskMaxTime(), 1.0); - if (old) { - setenv("PPC_TASK_MAX_TIME", old, 1); + if (old.has_value()) { + env::detail::set_environment_variable("PPC_TASK_MAX_TIME", *old); } } TEST(GetTaskMaxTime, ReadsFromEnvironment) { - const char* old = std::getenv("PPC_TASK_MAX_TIME"); - setenv("PPC_TASK_MAX_TIME", "2.5", 1); + env::detail::set_scoped_environment_variable scoped("PPC_TASK_MAX_TIME", "2.5"); EXPECT_DOUBLE_EQ(ppc::util::GetTaskMaxTime(), 2.5); - if (old) { - setenv("PPC_TASK_MAX_TIME", old, 1); - } else { - unsetenv("PPC_TASK_MAX_TIME"); - } } TEST(GetPerfMaxTime, ReturnsDefaultWhenUnset) { - const char* old = std::getenv("PPC_PERF_MAX_TIME"); - unsetenv("PPC_PERF_MAX_TIME"); + const auto old = env::detail::get_environment_variable("PPC_PERF_MAX_TIME"); + if (old.has_value()) { + env::detail::delete_environment_variable("PPC_PERF_MAX_TIME"); + } EXPECT_DOUBLE_EQ(ppc::util::GetPerfMaxTime(), 10.0); - if (old) { - setenv("PPC_PERF_MAX_TIME", old, 1); + if (old.has_value()) { + env::detail::set_environment_variable("PPC_PERF_MAX_TIME", *old); } } TEST(GetPerfMaxTime, ReadsFromEnvironment) { - const char* old = std::getenv("PPC_PERF_MAX_TIME"); - setenv("PPC_PERF_MAX_TIME", "12.5", 1); + env::detail::set_scoped_environment_variable scoped("PPC_PERF_MAX_TIME", "12.5"); EXPECT_DOUBLE_EQ(ppc::util::GetPerfMaxTime(), 12.5); - if (old) { - setenv("PPC_PERF_MAX_TIME", old, 1); - } else { - unsetenv("PPC_PERF_MAX_TIME"); - } } From 9795606d59af6579f9d68a8eea04e5742cc6647a Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy Date: Sun, 6 Jul 2025 12:40:29 +0200 Subject: [PATCH 3/8] tidy --- modules/performance/tests/perf_tests.cpp | 1 - modules/util/tests/util.cpp | 7 ++++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/performance/tests/perf_tests.cpp b/modules/performance/tests/perf_tests.cpp index 3484d6a11..9baa5b390 100644 --- a/modules/performance/tests/perf_tests.cpp +++ b/modules/performance/tests/perf_tests.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include diff --git a/modules/util/tests/util.cpp b/modules/util/tests/util.cpp index 8fadf7b5e..318e9d92a 100644 --- a/modules/util/tests/util.cpp +++ b/modules/util/tests/util.cpp @@ -2,7 +2,8 @@ #include -#include +#include +#include #include #include "omp.h" @@ -77,7 +78,7 @@ TEST(GetNamespaceTest, NoTerminatorCharactersInPrettyFunction) { } TEST(GetTaskMaxTime, ReturnsDefaultWhenUnset) { - const auto old = env::detail::get_environment_variable("PPC_TASK_MAX_TIME"); + const auto old = env::get("PPC_TASK_MAX_TIME"); if (old.has_value()) { env::detail::delete_environment_variable("PPC_TASK_MAX_TIME"); } @@ -93,7 +94,7 @@ TEST(GetTaskMaxTime, ReadsFromEnvironment) { } TEST(GetPerfMaxTime, ReturnsDefaultWhenUnset) { - const auto old = env::detail::get_environment_variable("PPC_PERF_MAX_TIME"); + const auto old = env::get("PPC_PERF_MAX_TIME"); if (old.has_value()) { env::detail::delete_environment_variable("PPC_PERF_MAX_TIME"); } From f8db1f74fc9234f1bf998bd88a4c28e110a2b42b Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy Date: Sun, 6 Jul 2025 12:48:52 +0200 Subject: [PATCH 4/8] tidy 2 --- modules/performance/tests/perf_tests.cpp | 2 ++ modules/util/tests/util.cpp | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/performance/tests/perf_tests.cpp b/modules/performance/tests/perf_tests.cpp index 9baa5b390..5a59543f2 100644 --- a/modules/performance/tests/perf_tests.cpp +++ b/modules/performance/tests/perf_tests.cpp @@ -11,6 +11,8 @@ #include #include +#include + #include "performance/include/performance.hpp" #include "task/include/task.hpp" #include "util/include/util.hpp" diff --git a/modules/util/tests/util.cpp b/modules/util/tests/util.cpp index 318e9d92a..cc725e21b 100644 --- a/modules/util/tests/util.cpp +++ b/modules/util/tests/util.cpp @@ -84,7 +84,7 @@ TEST(GetTaskMaxTime, ReturnsDefaultWhenUnset) { } EXPECT_DOUBLE_EQ(ppc::util::GetTaskMaxTime(), 1.0); if (old.has_value()) { - env::detail::set_environment_variable("PPC_TASK_MAX_TIME", *old); + env::detail::set_environment_variable("PPC_TASK_MAX_TIME", std::to_string(old)); } } @@ -100,7 +100,7 @@ TEST(GetPerfMaxTime, ReturnsDefaultWhenUnset) { } EXPECT_DOUBLE_EQ(ppc::util::GetPerfMaxTime(), 10.0); if (old.has_value()) { - env::detail::set_environment_variable("PPC_PERF_MAX_TIME", *old); + env::detail::set_environment_variable("PPC_PERF_MAX_TIME", std::to_string(old)); } } From e3af4f75999fe9330fc24964641c1d5db4b7d488 Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy Date: Sun, 6 Jul 2025 12:50:29 +0200 Subject: [PATCH 5/8] fmt --- modules/performance/tests/perf_tests.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/performance/tests/perf_tests.cpp b/modules/performance/tests/perf_tests.cpp index 5a59543f2..573cb755f 100644 --- a/modules/performance/tests/perf_tests.cpp +++ b/modules/performance/tests/perf_tests.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -11,8 +12,6 @@ #include #include -#include - #include "performance/include/performance.hpp" #include "task/include/task.hpp" #include "util/include/util.hpp" From 7122c3559abb0348fbc786d02271b08f614fc20a Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy Date: Sun, 6 Jul 2025 13:01:04 +0200 Subject: [PATCH 6/8] fix --- modules/util/tests/util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/util/tests/util.cpp b/modules/util/tests/util.cpp index cc725e21b..748aa5988 100644 --- a/modules/util/tests/util.cpp +++ b/modules/util/tests/util.cpp @@ -84,7 +84,7 @@ TEST(GetTaskMaxTime, ReturnsDefaultWhenUnset) { } EXPECT_DOUBLE_EQ(ppc::util::GetTaskMaxTime(), 1.0); if (old.has_value()) { - env::detail::set_environment_variable("PPC_TASK_MAX_TIME", std::to_string(old)); + env::detail::set_environment_variable("PPC_TASK_MAX_TIME", std::to_string(*old)); } } @@ -100,7 +100,7 @@ TEST(GetPerfMaxTime, ReturnsDefaultWhenUnset) { } EXPECT_DOUBLE_EQ(ppc::util::GetPerfMaxTime(), 10.0); if (old.has_value()) { - env::detail::set_environment_variable("PPC_PERF_MAX_TIME", std::to_string(old)); + env::detail::set_environment_variable("PPC_PERF_MAX_TIME", std::to_string(*old)); } } From 426ec1aac705df1290ea6d98c26a662b455bca4c Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy Date: Sun, 6 Jul 2025 13:06:19 +0200 Subject: [PATCH 7/8] tidy 3 --- modules/performance/include/performance.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/performance/include/performance.hpp b/modules/performance/include/performance.hpp index 9e344cc15..21173ff82 100644 --- a/modules/performance/include/performance.hpp +++ b/modules/performance/include/performance.hpp @@ -10,6 +10,7 @@ #include #include "task/include/task.hpp" +#include "util.hpp" namespace ppc::performance { From e4fde35c0d650ffa4289d43cfe8f4bd8337ac593 Mon Sep 17 00:00:00 2001 From: Arseniy Obolenskiy Date: Sun, 6 Jul 2025 13:11:26 +0200 Subject: [PATCH 8/8] fix --- modules/performance/include/performance.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/performance/include/performance.hpp b/modules/performance/include/performance.hpp index 21173ff82..305d72659 100644 --- a/modules/performance/include/performance.hpp +++ b/modules/performance/include/performance.hpp @@ -10,7 +10,7 @@ #include #include "task/include/task.hpp" -#include "util.hpp" +#include "util/include/util.hpp" namespace ppc::performance {