From 9ed138f5e578ba96256ff3d3d69f01c8c4bc0d05 Mon Sep 17 00:00:00 2001 From: Gregg Zigler Date: Thu, 17 Nov 2022 13:50:46 -0800 Subject: [PATCH] pytest: add tests for devtools/mkfunding Issue #5363 documented an earlier bug in mkfunding. These tests validate that fix as well as checking that basic usage produces the proper response and exit status. Changelog-None --- tests/test_mkfunding.py | 152 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 tests/test_mkfunding.py diff --git a/tests/test_mkfunding.py b/tests/test_mkfunding.py new file mode 100644 index 000000000..ffae3e29d --- /dev/null +++ b/tests/test_mkfunding.py @@ -0,0 +1,152 @@ +# Blackbox tests for myfunding devtool +# +# Devtool usage: mkfunding +# +# +# +# +# To run tests in this file only, enter this: +# $ pytest tests/test_mkfunding.py +# + +import subprocess +import sys +import traceback + +# good command-line values used in test cases +TIMEOUT = 10 +EXECUTABLE = 'devtools/mkfunding' +INPUT_TXID = '16835ac8c154b616baac524163f41fb0c4f82c7b972ad35d4d6f18d854f6856b' +INPUT_TXOUTPUT = '1' +INPUT_AMOUNT = '0.01btc' +FEERATE_PER_KW = '253' +INPUT_PRIVKEY = '76edf0c303b9e692da9cb491abedef46ca5b81d32f102eb4648461b239cb0f99' +LOCAL_FUNDING_PRIVKEY = '0000000000000000000000000000000000000000000000000000000000000010' +REMOTE_FUNDING_PRIVKEY = '0000000000000000000000000000000000000000000000000000000000000020' + + +def subprocess_run(args): + try: + response = subprocess.run( + args, + timeout=TIMEOUT, + capture_output=True, + encoding='utf-8') + print("*** returncode ***") + print(response.returncode) + print("*** stderr ***") + print(response.stderr) + print("*** stdout ***") + print(response.stdout.strip()) + return response + except Exception: + # Get current system exception + ex_type, ex_value, ex_traceback = sys.exc_info() + + # Extract unformatter stack traces as tuples + trace_back = traceback.extract_tb(ex_traceback) + + # Format stacktrace + stack_trace = list() + + for trace in trace_back: + stack_trace.append( + "File : %s , Line : %d, Func.Name : %s, Message : %s" % + (trace[0], trace[1], trace[2], trace[3])) + + print("Exception type : %s" % ex_type.__name__) + print("Exception message : %s" % ex_value) + print("Stack trace : %s" % stack_trace) + + +def test_mkfunding_bad_usage(): + response = subprocess_run([EXECUTABLE]) + assert response.returncode == 1 + assert 'Usage:' in response.stderr + + +def test_mkfunding_bad_input_txid(): + response = subprocess_run( + [EXECUTABLE, + 'alpha', 'beta', 'gamma', 'delta', 'epsilon', + 'zeta', 'eta']) + assert response.returncode == 1 + assert 'Bad input-txid' in response.stderr + + +def test_mkfunding_bad_input_amount(): + response = subprocess_run( + [EXECUTABLE, + INPUT_TXID, INPUT_TXOUTPUT, + 'gamma', 'delta', 'epsilon', 'zeta', 'eta']) + assert response.returncode == 1 + assert 'Bad input-amount' in response.stderr + + +def test_mkfunding_bad_input_privkey(): + response = subprocess_run( + [EXECUTABLE, + INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT, + FEERATE_PER_KW, + 'epsilon', 'zeta', 'eta']) + assert response.returncode == 1 + assert 'Parsing input-privkey' in response.stderr + + +def test_mkfunding_bad_local_funding_privkey(): + response = subprocess_run( + [EXECUTABLE, + INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT, + FEERATE_PER_KW, INPUT_PRIVKEY, + 'zeta', 'eta']) + assert response.returncode == 1 + assert 'Parsing local-funding-privkey' in response.stderr + + +def test_mkfunding_bad_remote_funding_privkey(): + response = subprocess_run( + [EXECUTABLE, + INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT, + FEERATE_PER_KW, INPUT_PRIVKEY, + LOCAL_FUNDING_PRIVKEY, + 'eta']) + assert response.returncode == 1 + assert 'Parsing remote-funding-privkey' in response.stderr + + +def test_mkfunding_bad_privkeys(): + bad_privkey = ('0' * 64) + response = subprocess_run( + [EXECUTABLE, + INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT, + FEERATE_PER_KW, + bad_privkey, bad_privkey, bad_privkey]) + assert response.returncode == 1 + assert 'Bad privkeys' in response.stderr + + +def test_mkfunding_bad_cantaffordfee(): + input_amount_less_than_fee = '0.00000122btc' + response = subprocess_run( + [EXECUTABLE, + INPUT_TXID, INPUT_TXOUTPUT, + input_amount_less_than_fee, + FEERATE_PER_KW, INPUT_PRIVKEY, + LOCAL_FUNDING_PRIVKEY, REMOTE_FUNDING_PRIVKEY]) + assert response.returncode == 1 + assert 'can\'t afford fee' in response.stderr + + +def test_mkfunding_good_noabort(): + response = subprocess_run( + [EXECUTABLE, + INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT, + FEERATE_PER_KW, INPUT_PRIVKEY, + LOCAL_FUNDING_PRIVKEY, REMOTE_FUNDING_PRIVKEY]) + # prior to bug fix for issue #5363, + # subprocess_run had a return code of -6 (abort) + assert response.returncode == 0 + assert 'funding sig' in response.stdout + assert 'funding witnesses' in response.stdout + assert 'funding amount' in response.stdout + assert 'funding txid' in response.stdout