Skip to content

Commit 7fe2d94

Browse files
committed
Add tests for env-based timeouts
1 parent 8b3e8fb commit 7fe2d94

File tree

8 files changed

+110
-5
lines changed

8 files changed

+110
-5
lines changed

docs/user_guide/environment_variables.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,7 @@ The following environment variables can be used to configure the project's runti
1414

1515
- ``PPC_IGNORE_TEST_TIME_LIMIT``: Specifies that test time limits are ignored. Used by ``scripts/run_tests.py`` to disable time limit enforcement.
1616
Default: ``0``
17+
- ``PPC_TASK_MAX_TIME``: Maximum allowed execution time in seconds for functional tests.
18+
Default: ``1.0``
19+
- ``PPC_PERF_MAX_TIME``: Maximum allowed execution time in seconds for performance tests.
20+
Default: ``10.0``

modules/performance/include/performance.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,15 @@ class Perf {
7878
}
7979

8080
auto time_secs = perf_results_.time_sec;
81+
const auto max_time = ppc::util::GetPerfMaxTime();
8182
std::stringstream perf_res_str;
82-
if (time_secs < PerfResults::kMaxTime) {
83+
if (time_secs < max_time) {
8384
perf_res_str << std::fixed << std::setprecision(10) << time_secs;
8485
std::cout << test_id << ":" << type_test_name << ":" << perf_res_str.str() << '\n';
8586
} else {
8687
std::stringstream err_msg;
8788
err_msg << '\n' << "Task execute time need to be: ";
88-
err_msg << "time < " << PerfResults::kMaxTime << " secs." << '\n';
89+
err_msg << "time < " << max_time << " secs." << '\n';
8990
err_msg << "Original time in secs: " << time_secs << '\n';
9091
perf_res_str << std::fixed << std::setprecision(10) << -1.0;
9192
std::cout << test_id << ":" << type_test_name << ":" << perf_res_str.str() << '\n';

modules/performance/tests/perf_tests.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <chrono>
44
#include <cstdint>
5+
#include <cstdlib>
56
#include <filesystem>
67
#include <fstream>
78
#include <memory>
@@ -107,6 +108,29 @@ TEST(perf_tests, check_perf_pipeline_uint8_t_slow_test) {
107108
ASSERT_ANY_THROW(perf_analyzer.PrintPerfStatistic("check_perf_pipeline_uint8_t_slow_test"));
108109
}
109110

111+
TEST(perf_tests, slow_perf_respects_env_override) {
112+
const char* old = std::getenv("PPC_PERF_MAX_TIME");
113+
setenv("PPC_PERF_MAX_TIME", "12", 1);
114+
std::vector<uint8_t> in(128, 1);
115+
auto test_task = std::make_shared<ppc::test::FakePerfTask<std::vector<uint8_t>, uint8_t>>(in);
116+
Perf<std::vector<uint8_t>, uint8_t> perf_analyzer(test_task);
117+
PerfAttr perf_attr;
118+
perf_attr.num_running = 1;
119+
const auto t0 = std::chrono::high_resolution_clock::now();
120+
perf_attr.current_timer = [&] {
121+
auto current_time_point = std::chrono::high_resolution_clock::now();
122+
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(current_time_point - t0).count();
123+
return static_cast<double>(duration) * 1e-9;
124+
};
125+
perf_analyzer.PipelineRun(perf_attr);
126+
EXPECT_NO_THROW(perf_analyzer.PrintPerfStatistic("slow_perf_respects_env_override"));
127+
if (old) {
128+
setenv("PPC_PERF_MAX_TIME", old, 1);
129+
} else {
130+
unsetenv("PPC_PERF_MAX_TIME");
131+
}
132+
}
133+
110134
TEST(perf_tests, check_perf_task_exception) {
111135
std::vector<uint32_t> in(2000, 1);
112136

modules/task/include/task.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,12 +215,13 @@ class Task {
215215
.count();
216216
auto diff = static_cast<double>(duration) * 1e-9;
217217

218+
const auto max_time = ppc::util::GetTaskMaxTime();
218219
std::stringstream err_msg;
219-
if (diff < kMaxTestTime) {
220+
if (diff < max_time) {
220221
err_msg << "Test time:" << std::fixed << std::setprecision(10) << diff << '\n';
221222
} else {
222223
err_msg << "\nTask execute time need to be: ";
223-
err_msg << "time < " << kMaxTestTime << " secs.\n";
224+
err_msg << "time < " << max_time << " secs.\n";
224225
err_msg << "Original time in secs: " << diff << '\n';
225226
throw std::runtime_error(err_msg.str().c_str());
226227
}
@@ -249,7 +250,6 @@ class Task {
249250
StateOfTesting state_of_testing_ = kFunc;
250251
TypeOfTask type_of_task_ = kUnknown;
251252
StatusOfTask status_of_task_ = kEnabled;
252-
static constexpr double kMaxTestTime = 1.0;
253253
std::chrono::high_resolution_clock::time_point tmp_time_point_;
254254
enum class PipelineStage : uint8_t {
255255
kNone,

modules/task/tests/task_tests.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <chrono>
44
#include <cstddef>
55
#include <cstdint>
6+
#include <cstdlib>
67
#include <exception>
78
#include <fstream>
89
#include <memory>
@@ -72,6 +73,22 @@ TEST(task_tests, check_int32_t_slow) {
7273
ASSERT_ANY_THROW(test_task.PostProcessing());
7374
}
7475

76+
TEST(task_tests, slow_task_respects_env_override) {
77+
const char* old = std::getenv("PPC_TASK_MAX_TIME");
78+
setenv("PPC_TASK_MAX_TIME", "3", 1);
79+
std::vector<int32_t> in(20, 1);
80+
ppc::test::FakeSlowTask<std::vector<int32_t>, int32_t> test_task(in);
81+
ASSERT_EQ(test_task.Validation(), true);
82+
test_task.PreProcessing();
83+
test_task.Run();
84+
EXPECT_NO_THROW(test_task.PostProcessing());
85+
if (old) {
86+
setenv("PPC_TASK_MAX_TIME", old, 1);
87+
} else {
88+
unsetenv("PPC_TASK_MAX_TIME");
89+
}
90+
}
91+
7592
TEST(task_tests, check_validate_func) {
7693
std::vector<int32_t> in;
7794
ppc::test::TestTask<std::vector<int32_t>, int32_t> test_task(in);

modules/util/include/util.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ enum GTestParamIndex : uint8_t { kTaskGetter, kNameTest, kTestParams };
5252

5353
std::string GetAbsoluteTaskPath(const std::string& id_path, const std::string& relative_path);
5454
int GetNumThreads();
55+
double GetTaskMaxTime();
56+
double GetPerfMaxTime();
5557

5658
template <typename T>
5759
std::string GetNamespace() {

modules/util/src/util.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,22 @@ int ppc::util::GetNumThreads() {
2828
return 1;
2929
}
3030

31+
double ppc::util::GetTaskMaxTime() {
32+
const auto val = env::get<double>("PPC_TASK_MAX_TIME");
33+
if (val.has_value()) {
34+
return val.value();
35+
}
36+
return 1.0;
37+
}
38+
39+
double ppc::util::GetPerfMaxTime() {
40+
const auto val = env::get<double>("PPC_PERF_MAX_TIME");
41+
if (val.has_value()) {
42+
return val.value();
43+
}
44+
return 10.0;
45+
}
46+
3147
// List of environment variables that signal the application is running under
3248
// an MPI launcher. The array size must match the number of entries to avoid
3349
// looking up empty environment variable names.

modules/util/tests/util.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <gtest/gtest.h>
44

5+
#include <cstdlib>
56
#include <libenvpp/detail/get.hpp>
67
#include <string>
78

@@ -75,3 +76,43 @@ TEST(GetNamespaceTest, NoTerminatorCharactersInPrettyFunction) {
7576
std::string k_ns = ppc::util::GetNamespace<crazy::VeryLongTypeNameWithOnlyLettersAndUnderscores>();
7677
EXPECT_EQ(k_ns, "crazy");
7778
}
79+
80+
TEST(GetTaskMaxTime, ReturnsDefaultWhenUnset) {
81+
const char* old = std::getenv("PPC_TASK_MAX_TIME");
82+
unsetenv("PPC_TASK_MAX_TIME");
83+
EXPECT_DOUBLE_EQ(ppc::util::GetTaskMaxTime(), 1.0);
84+
if (old) {
85+
setenv("PPC_TASK_MAX_TIME", old, 1);
86+
}
87+
}
88+
89+
TEST(GetTaskMaxTime, ReadsFromEnvironment) {
90+
const char* old = std::getenv("PPC_TASK_MAX_TIME");
91+
setenv("PPC_TASK_MAX_TIME", "2.5", 1);
92+
EXPECT_DOUBLE_EQ(ppc::util::GetTaskMaxTime(), 2.5);
93+
if (old) {
94+
setenv("PPC_TASK_MAX_TIME", old, 1);
95+
} else {
96+
unsetenv("PPC_TASK_MAX_TIME");
97+
}
98+
}
99+
100+
TEST(GetPerfMaxTime, ReturnsDefaultWhenUnset) {
101+
const char* old = std::getenv("PPC_PERF_MAX_TIME");
102+
unsetenv("PPC_PERF_MAX_TIME");
103+
EXPECT_DOUBLE_EQ(ppc::util::GetPerfMaxTime(), 10.0);
104+
if (old) {
105+
setenv("PPC_PERF_MAX_TIME", old, 1);
106+
}
107+
}
108+
109+
TEST(GetPerfMaxTime, ReadsFromEnvironment) {
110+
const char* old = std::getenv("PPC_PERF_MAX_TIME");
111+
setenv("PPC_PERF_MAX_TIME", "12.5", 1);
112+
EXPECT_DOUBLE_EQ(ppc::util::GetPerfMaxTime(), 12.5);
113+
if (old) {
114+
setenv("PPC_PERF_MAX_TIME", old, 1);
115+
} else {
116+
unsetenv("PPC_PERF_MAX_TIME");
117+
}
118+
}

0 commit comments

Comments
 (0)