From: Timo Sirainen Date: Fri, 17 Jan 2020 09:30:53 +0000 (+0200) Subject: lib: Assert-crash on i_rand_limit(0) and add unit tests X-Git-Tag: 2.3.10~110 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8647e345635831f65b247a158a6ef6d2c8b254d0;p=thirdparty%2Fdovecot%2Fcore.git lib: Assert-crash on i_rand_limit(0) and add unit tests --- diff --git a/src/lib/rand.c b/src/lib/rand.c index bdbde4cf16..ff7675dcc6 100644 --- a/src/lib/rand.c +++ b/src/lib/rand.c @@ -15,6 +15,8 @@ uint32_t i_rand(void) uint32_t i_rand_limit(uint32_t upper_bound) { + i_assert(upper_bound > 0); + return arc4random_uniform(upper_bound); } #else @@ -27,6 +29,8 @@ uint32_t i_rand(void) uint32_t i_rand_limit(uint32_t upper_bound) { + i_assert(upper_bound > 0); + uint32_t val, min = -upper_bound % upper_bound; while((val = i_rand()) < min); return val % upper_bound; diff --git a/src/lib/test-lib.inc b/src/lib/test-lib.inc index e83dda4d2e..f05ea9a566 100644 --- a/src/lib/test-lib.inc +++ b/src/lib/test-lib.inc @@ -78,6 +78,7 @@ TEST(test_printf_format_fix) FATAL(fatal_printf_format_fix) TEST(test_priorityq) TEST(test_random) +FATAL(fatal_random) TEST(test_seq_range_array) TEST(test_stats_dist) TEST(test_str) diff --git a/src/lib/test-random.c b/src/lib/test-random.c index 6e93b53354..6c83ff6b88 100644 --- a/src/lib/test-random.c +++ b/src/lib/test-random.c @@ -34,7 +34,34 @@ static void test_random_median(void) test_end(); } +static void test_random_limits(void) +{ + test_begin("random limits"); + test_assert(i_rand_limit(1) == 0); + test_assert(i_rand_minmax(0, 0) == 0); + test_assert(i_rand_minmax(UINT32_MAX, UINT32_MAX) == UINT32_MAX); + test_end(); +} + void test_random(void) { test_random_median(); + test_random_limits(); +} + +enum fatal_test_state fatal_random(unsigned int stage) +{ + switch (stage) { + case 0: + test_begin("random fatals"); + test_expect_fatal_string("min_val <= max_val"); + (void)i_rand_minmax(1, 0); + return FATAL_TEST_FAILURE; + case 1: + test_expect_fatal_string("upper_bound > 0"); + (void)i_rand_limit(0); + return FATAL_TEST_FAILURE; + } + test_end(); + return FATAL_TEST_FINISHED; }