Browse Source

test suite: deterministic testing fixes

The MMGen Project 2 years ago
parent
commit
23214cf9bb

+ 26 - 0
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 <mmgen@tuta.io>
+# 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]

+ 2 - 2
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)
 

+ 1 - 14
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)))

+ 3 - 2
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) )

+ 6 - 0
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'