summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorChristian Franke <chris@opensourcerouting.org>2017-07-12 18:44:44 +0200
committerChristian Franke <chris@opensourcerouting.org>2017-07-12 18:44:44 +0200
commit6c968614b592cfaf1b03869dbaa0d4fcd94ef6bc (patch)
tree3cfc9ba1ec7a01c4e3a494ac5d179ba4daa71aba /tests
parentMerge pull request #793 from opensourcerouting/hash-double-init (diff)
downloadfrr-6c968614b592cfaf1b03869dbaa0d4fcd94ef6bc.tar.xz
frr-6c968614b592cfaf1b03869dbaa0d4fcd94ef6bc.zip
tests: update prng to return better pseudo random numbers
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/helpers/c/prng.c42
-rw-r--r--tests/helpers/c/prng.h2
-rw-r--r--tests/lib/test_srcdest_table.c8
3 files changed, 21 insertions, 31 deletions
diff --git a/tests/helpers/c/prng.c b/tests/helpers/c/prng.c
index 4b9fd5715..0f78366fc 100644
--- a/tests/helpers/c/prng.c
+++ b/tests/helpers/c/prng.c
@@ -4,6 +4,7 @@
*
* Copyright (C) 2012 by Open Source Routing.
* Copyright (C) 2012 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2017 Christian Franke
*
* This file is part of Quagga
*
@@ -32,49 +33,32 @@
struct prng
{
- unsigned long long state1;
- unsigned long long state2;
+ uint64_t state;
};
-static char
-prng_bit(struct prng *prng)
-{
- prng->state1 *= 2416;
- prng->state1 += 374441;
- prng->state1 %= 1771875;
-
- if (prng->state1 % 2)
- {
- prng->state2 *= 84589;
- prng->state2 += 45989;
- prng->state2 %= 217728;
- }
-
- return prng->state2 % 2;
-}
-
struct prng*
prng_new(unsigned long long seed)
{
struct prng *rv = calloc(sizeof(*rv), 1);
assert(rv);
- rv->state1 = rv->state2 = seed;
+ rv->state = seed;
return rv;
}
-unsigned int
+/*
+ * This implementation has originally been provided to musl libc by
+ * Szabolcs Nagy <nsz at port70 dot net> in 2013 under the terms of
+ * the MIT license.
+ * It is a simple LCG which D.E. Knuth attributes to C.E. Haynes in
+ * TAOCP Vol2 3.3.4
+ */
+int
prng_rand(struct prng *prng)
{
- unsigned int i, rv = 0;
-
- for (i = 0; i < 32; i++)
- {
- rv |= prng_bit(prng);
- rv <<= 1;
- }
- return rv;
+ prng->state = 6364136223846793005ULL*prng->state + 1;
+ return prng->state>>33;
}
const char *
diff --git a/tests/helpers/c/prng.h b/tests/helpers/c/prng.h
index 6cc6289a1..7b2ab924e 100644
--- a/tests/helpers/c/prng.h
+++ b/tests/helpers/c/prng.h
@@ -27,7 +27,7 @@
struct prng;
struct prng* prng_new(unsigned long long seed);
-unsigned int prng_rand(struct prng*);
+int prng_rand(struct prng*);
const char * prng_fuzz(struct prng*,
const char *string,
const char *charset,
diff --git a/tests/lib/test_srcdest_table.c b/tests/lib/test_srcdest_table.c
index 792e2696e..111b11a1e 100644
--- a/tests/lib/test_srcdest_table.c
+++ b/tests/lib/test_srcdest_table.c
@@ -386,7 +386,13 @@ static void
test_state_del_one_route(struct test_state *test,
struct prng *prng)
{
- unsigned int which_route = prng_rand(prng) % test->log->count;
+ unsigned int which_route;
+
+ if (test->log->count == 0)
+ return;
+
+ which_route = prng_rand(prng) % test->log->count;
+
struct route_node *rn;
struct prefix *dst_p, *src_p;
struct prefix_ipv6 dst6_p, src6_p;