aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcoFalke <falke.marco@gmail.com>2019-05-14 09:00:55 -0400
committerMarcoFalke <falke.marco@gmail.com>2019-05-14 09:00:58 -0400
commit3503a69ba23714546944205dfeacfd557dd2e56c (patch)
treecf5404a4e86feb050f19ec6b910c300d4c0f4c77
parent6f4ba6492a1265688acb2b95835388d39c918573 (diff)
parenta407b6fdf34f77eb347378674da9cf80394897de (diff)
Merge #15963: [tests] Make random seed logged and settable
a407b6fdf3 [tests] Make random seed logged and settable (John Newbery) Pull request description: This allows tests which use randomness to be reproducibly run on failure. ACKs for commit a407b6: jonatack: re-ACK a407b6fdf34f77eb347378674da9cf80394897de jb55: great! utACK a407b6fdf34f77eb347378674da9cf80394897de Tree-SHA512: e1e89e6e76d11ddec71a8f0f077227e4b46303f80461b170900d3f95d4dcc4187b0d1decfd63562ea970aaaf530ef032a3e64ed1669aac29033d95161855fda3
-rwxr-xr-xtest/functional/test_framework/test_framework.py19
1 files changed, 19 insertions, 0 deletions
diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py
index 555d55d97f..2187bf5f5f 100755
--- a/test/functional/test_framework/test_framework.py
+++ b/test/functional/test_framework/test_framework.py
@@ -10,6 +10,7 @@ import logging
import argparse
import os
import pdb
+import random
import shutil
import sys
import tempfile
@@ -129,6 +130,8 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
help="use bitcoin-cli instead of RPC for all commands")
parser.add_argument("--perf", dest="perf", default=False, action="store_true",
help="profile running nodes with perf for the duration of the test")
+ parser.add_argument("--randomseed", type=int,
+ help="set a random seed for deterministically reproducing a previous test run")
self.add_options(parser)
self.options = parser.parse_args()
@@ -158,6 +161,22 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
self.options.tmpdir = tempfile.mkdtemp(prefix=TMPDIR_PREFIX)
self._start_logging()
+ # Seed the PRNG. Note that test runs are reproducible if and only if
+ # a single thread accesses the PRNG. For more information, see
+ # https://docs.python.org/3/library/random.html#notes-on-reproducibility.
+ # The network thread shouldn't access random. If we need to change the
+ # network thread to access randomness, it should instantiate its own
+ # random.Random object.
+ seed = self.options.randomseed
+
+ if seed is None:
+ seed = random.randrange(sys.maxsize)
+ else:
+ self.log.debug("User supplied random seed {}".format(seed))
+
+ random.seed(seed)
+ self.log.debug("PRNG seed is: {}".format(seed))
+
self.log.debug('Setting up network thread')
self.network_thread = NetworkThread()
self.network_thread.start()