Branch data Line data Source code
1 : : // Copyright (c) 2023 The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #include <test/util/random.h>
6 : :
7 : : #include <logging.h>
8 : : #include <random.h>
9 : : #include <uint256.h>
10 : : #include <util/check.h>
11 : :
12 : : #include <cstdlib>
13 : : #include <iostream>
14 : :
15 : : std::atomic<bool> g_seeded_g_prng_zero{false};
16 : :
17 : : extern void MakeRandDeterministicDANGEROUS(const uint256& seed) noexcept;
18 : :
19 : 621 : void SeedRandomStateForTest(SeedRand seedtype)
20 : : {
21 : 621 : constexpr auto RANDOM_CTX_SEED{"RANDOM_CTX_SEED"};
22 : :
23 : : // Do this once, on the first call, regardless of seedtype, because once
24 : : // MakeRandDeterministicDANGEROUS is called, the output of GetRandHash is
25 : : // no longer truly random. It should be enough to get the seed once for the
26 : : // process.
27 : 726 : static const uint256 ctx_seed = []() {
28 : : // If RANDOM_CTX_SEED is set, use that as seed.
29 [ - + ]: 105 : if (const char* num{std::getenv(RANDOM_CTX_SEED)}) {
30 [ # # ]: 0 : if (auto num_parsed{uint256::FromUserHex(num)}) {
31 : 0 : return *num_parsed;
32 : : } else {
33 : 0 : std::cerr << RANDOM_CTX_SEED << " must consist of up to " << uint256::size() * 2 << " hex digits (\"0x\" prefix allowed), it was set to: '" << num << "'.\n";
34 : 0 : std::abort();
35 : : }
36 : : }
37 : : // Otherwise use a (truly) random value.
38 : 105 : return GetRandHash();
39 [ + + + - : 621 : }();
+ - ]
40 : :
41 [ + + ]: 621 : g_seeded_g_prng_zero = seedtype == SeedRand::ZEROS;
42 : 621 : if constexpr (G_FUZZING) {
43 : : Assert(g_seeded_g_prng_zero); // Only SeedRandomStateForTest(SeedRand::ZEROS) is allowed in fuzz tests
44 : : }
45 [ + + ]: 621 : const uint256& seed{seedtype == SeedRand::FIXED_SEED ? ctx_seed : uint256::ZERO};
46 [ + - ]: 621 : LogInfo("Setting random seed for current tests to %s=%s\n", RANDOM_CTX_SEED, seed.GetHex());
47 : 621 : MakeRandDeterministicDANGEROUS(seed);
48 : 621 : }
|