From 23214cf9bb7f4c9c99be18964e16c1f10dd8cac8 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 31 Oct 2022 15:42:10 +0000 Subject: [PATCH] test suite: deterministic testing fixes --- mmgen/test.py | 26 ++++++++++++++++++++++++++ test/include/common.py | 4 ++-- test/overlay/fakemods/mmgen/crypto.py | 15 +-------------- test/overlay/fakemods/mmgen/util.py | 5 +++-- test/test_py_d/ts_regtest.py | 6 ++++++ 5 files changed, 38 insertions(+), 18 deletions(-) create mode 100755 mmgen/test.py diff --git a/mmgen/test.py b/mmgen/test.py new file mode 100755 index 00000000..94a84ef7 --- /dev/null +++ b/mmgen/test.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# +# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet +# Copyright (C)2013-2022 The MMGen Project +# Licensed under the GNU General Public License, Version 3: +# https://www.gnu.org/licenses +# Public project repositories: +# https://github.com/mmgen/mmgen +# https://gitlab.com/mmgen/mmgen + +""" +test.py: functions required by the MMGen test suite +""" + +import sys +from hashlib import sha256 +rand_h = sha256('.'.join(sys.argv).encode()) + +def fake_urandom(n): + + def gen(rounds): + for i in range(rounds): + rand_h.update(b'foo') + yield rand_h.digest() + + return b''.join(gen(int(n/32)+1))[:n] diff --git a/test/include/common.py b/test/include/common.py index f631aeee..d0baf992 100755 --- a/test/include/common.py +++ b/test/include/common.py @@ -66,8 +66,8 @@ ref_kafile_hash_preset = '1' def getrand(n): if g.test_suite_deterministic: - from mmgen.crypto import overlay_fake_data - return overlay_fake_data.urandom(n) + from mmgen.test import fake_urandom + return fake_urandom(n) else: return os.urandom(n) diff --git a/test/overlay/fakemods/mmgen/crypto.py b/test/overlay/fakemods/mmgen/crypto.py index 92411a59..22c8fe37 100644 --- a/test/overlay/fakemods/mmgen/crypto.py +++ b/test/overlay/fakemods/mmgen/crypto.py @@ -4,22 +4,9 @@ from .crypto_orig import * if overlay_fake_os.getenv('MMGEN_TEST_SUITE_DETERMINISTIC'): class overlay_fake_data: - - import sys - from hashlib import sha256 - rand_h = sha256('.'.join(sys.argv).encode()) - get_random = get_random add_user_random = add_user_random - - def urandom(n): - - def gen(rounds): - for i in range(rounds): - overlay_fake_data.rand_h.update(b'foo') - yield overlay_fake_data.rand_h.digest() - - return b''.join(gen(int(n/32)+1))[:n] + from .test import fake_urandom as urandom def get_random(length): return overlay_fake_data.urandom(len(overlay_fake_data.get_random(length))) diff --git a/test/overlay/fakemods/mmgen/util.py b/test/overlay/fakemods/mmgen/util.py index e4d6f169..842f5dcb 100644 --- a/test/overlay/fakemods/mmgen/util.py +++ b/test/overlay/fakemods/mmgen/util.py @@ -6,9 +6,10 @@ if overlay_fake_os.getenv('MMGEN_TEST_SUITE_DETERMINISTIC'): class overlay_fake_data: make_timestamp = make_timestamp make_timestr = make_timestr + time_iter = (1577836800 + (i*60) for i in range(1000000)) def make_timestamp(secs=None): - return overlay_fake_data.make_timestamp(1321009871) + return overlay_fake_data.make_timestamp( next(overlay_fake_data.time_iter) ) def make_timestr(secs=None): - return overlay_fake_data.make_timestr(1321009871) + return overlay_fake_data.make_timestr( next(overlay_fake_data.time_iter) ) diff --git a/test/test_py_d/ts_regtest.py b/test/test_py_d/ts_regtest.py index f0dc1ed3..bffddab4 100755 --- a/test/test_py_d/ts_regtest.py +++ b/test/test_py_d/ts_regtest.py @@ -195,6 +195,7 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared): ('fund_alice', "funding Alice's wallet"), ('generate', 'mining a block'), ('bob_bal1', "Bob's balance"), + ('generate_extra_deterministic', "generate extra blocks for deterministic run"), ), 'msg': ( 'message signing', @@ -519,6 +520,11 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared): addr = self.get_addr_from_addrlist('alice',sid,mmtype,0,addr_range='1-5') return self.fund_wallet_deterministic( 'alice', addr, '1-11', skip_passphrase=True ) + def generate_extra_deterministic(self): + if not self.deterministic: + return 'skip' + return self.generate(num_blocks=2) # do this so block count matches non-deterministic run + async def bob_recreate_tracking_wallet(self): if not self.deterministic: return 'skip'