From 5b87dcaf94c7333fb6206d489d37bb646fb15ad8 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 16 Feb 2021 16:42:54 +0200 Subject: [PATCH] lib: cpu-limit - Allow time comparisons to be more relaxed This should fix random failures. --- src/lib/test-cpu-limit.c | 41 ++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/lib/test-cpu-limit.c b/src/lib/test-cpu-limit.c index 5bf0b97997..05868baf3c 100644 --- a/src/lib/test-cpu-limit.c +++ b/src/lib/test-cpu-limit.c @@ -9,6 +9,11 @@ #include #include +/* The CPU limits aren't exact. Allow this much leniency in the time + comparisons. */ +#define ALLOW_MSECS_BELOW 100 +#define ALLOW_MSECS_ABOVE 1500 + static bool limit_exceeded1, limit_exceeded2; static const char *const test_path = ".test.cpulimit"; @@ -22,7 +27,7 @@ static void cpu_limit_callback2(void *context ATTR_UNUSED) limit_exceeded2 = TRUE; } -static time_t get_cpu_time(void) +static struct timeval get_cpu_time(void) { struct rusage rusage; struct timeval cpu_usage; @@ -32,8 +37,7 @@ static time_t get_cpu_time(void) i_fatal("getrusage() failed: %m"); cpu_usage = rusage.ru_utime; timeval_add(&cpu_usage, &rusage.ru_stime); - - return timeval_round(&cpu_usage); + return cpu_usage; } static void test_cpu_loop_once(void) @@ -55,7 +59,8 @@ static void test_cpu_loop_once(void) static void test_cpu_limit_simple(void) { struct cpu_limit *climit; - time_t usage; + struct timeval usage, cpu; + int diff_msecs; test_begin("cpu limit - simple"); @@ -68,7 +73,10 @@ static void test_cpu_limit_simple(void) test_cpu_loop_once(); cpu_limit_deinit(&climit); - test_assert((get_cpu_time() - usage) == 2); + cpu = get_cpu_time(); + diff_msecs = timeval_diff_msecs(&cpu, &usage); + test_assert(diff_msecs >= 2000-ALLOW_MSECS_BELOW); + test_assert(diff_msecs <= 2000+ALLOW_MSECS_ABOVE); lib_signals_deinit(); test_end(); @@ -77,8 +85,9 @@ static void test_cpu_limit_simple(void) static void test_cpu_limit_nested(void) { struct cpu_limit *climit1, *climit2; - time_t usage1, usage2; + struct timeval usage1, usage2, cpu; unsigned int n; + int diff_msecs; test_begin("cpu limit - nested"); @@ -96,11 +105,17 @@ static void test_cpu_limit_nested(void) test_cpu_loop_once(); cpu_limit_deinit(&climit2); - test_assert((get_cpu_time() - usage2) == 1); + cpu = get_cpu_time(); + diff_msecs = timeval_diff_msecs(&cpu, &usage2); + test_assert(diff_msecs >= 1000-ALLOW_MSECS_BELOW); + test_assert(diff_msecs <= 1000+ALLOW_MSECS_ABOVE); } cpu_limit_deinit(&climit1); - test_assert((get_cpu_time() - usage1) == 3); + cpu = get_cpu_time(); + diff_msecs = timeval_diff_msecs(&cpu, &usage1); + test_assert(diff_msecs >= 3000-ALLOW_MSECS_BELOW); + test_assert(diff_msecs <= 3000+ALLOW_MSECS_ABOVE); lib_signals_deinit(); test_end(); @@ -127,11 +142,17 @@ static void test_cpu_limit_nested(void) test_cpu_loop_once(); cpu_limit_deinit(&climit2); - test_assert((get_cpu_time() - usage2) == 1); + cpu = get_cpu_time(); + diff_msecs = timeval_diff_msecs(&cpu, &usage2); + test_assert(diff_msecs >= 1000-ALLOW_MSECS_BELOW); + test_assert(diff_msecs <= 1000+ALLOW_MSECS_ABOVE); } cpu_limit_deinit(&climit1); - test_assert((get_cpu_time() - usage1) == 3); + cpu = get_cpu_time(); + diff_msecs = timeval_diff_msecs(&cpu, &usage1); + test_assert(diff_msecs >= 3000-ALLOW_MSECS_BELOW); + test_assert(diff_msecs <= 3000+ALLOW_MSECS_ABOVE); i_unlink_if_exists(test_path); lib_signals_deinit(); -- 2.47.3