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-ACKa407b6fdf3
jb55: great! utACKa407b6fdf3
Tree-SHA512: e1e89e6e76d11ddec71a8f0f077227e4b46303f80461b170900d3f95d4dcc4187b0d1decfd63562ea970aaaf530ef032a3e64ed1669aac29033d95161855fda3
This commit is contained in:
commit
3503a69ba2
1 changed files with 19 additions and 0 deletions
|
@ -10,6 +10,7 @@ import logging
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
import pdb
|
import pdb
|
||||||
|
import random
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
@ -129,6 +130,8 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
||||||
help="use bitcoin-cli instead of RPC for all commands")
|
help="use bitcoin-cli instead of RPC for all commands")
|
||||||
parser.add_argument("--perf", dest="perf", default=False, action="store_true",
|
parser.add_argument("--perf", dest="perf", default=False, action="store_true",
|
||||||
help="profile running nodes with perf for the duration of the test")
|
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.add_options(parser)
|
||||||
self.options = parser.parse_args()
|
self.options = parser.parse_args()
|
||||||
|
|
||||||
|
@ -158,6 +161,22 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
||||||
self.options.tmpdir = tempfile.mkdtemp(prefix=TMPDIR_PREFIX)
|
self.options.tmpdir = tempfile.mkdtemp(prefix=TMPDIR_PREFIX)
|
||||||
self._start_logging()
|
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.log.debug('Setting up network thread')
|
||||||
self.network_thread = NetworkThread()
|
self.network_thread = NetworkThread()
|
||||||
self.network_thread.start()
|
self.network_thread.start()
|
||||||
|
|
Loading…
Reference in a new issue