]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Assert-crash on i_rand_limit(0) and add unit tests
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 17 Jan 2020 09:30:53 +0000 (11:30 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 5 Feb 2020 12:09:29 +0000 (12:09 +0000)
src/lib/rand.c
src/lib/test-lib.inc
src/lib/test-random.c

index bdbde4cf16d4516fa6b4d7d6ab8a51e0baf73702..ff7675dcc651d35230f42abea932a91f12adb65b 100644 (file)
@@ -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;
index e83dda4d2eb5f5812f76ac2c120e5f05b2f0f112..f05ea9a566ffa46c6b5b68c59f3cda0dad78ac3f 100644 (file)
@@ -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)
index 6e93b533546e7737b3b5d3df966cb5b19b3f49c6..6c83ff6b88438455cf56c0e63cf633294e40db9a 100644 (file)
@@ -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;
 }