Skip to content

Commit 9ed138f

Browse files
greggziglerendothermicdev
authored andcommitted
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
1 parent ddfdab1 commit 9ed138f

File tree

1 file changed

+152
-0
lines changed

1 file changed

+152
-0
lines changed

tests/test_mkfunding.py

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
# Blackbox tests for myfunding devtool
2+
#
3+
# Devtool usage: mkfunding
4+
# <input-txid> <input-txout> <input-amount>
5+
# <feerate-per-kw> <input-privkey>
6+
# <local-funding-privkey> <remote-funding-privkey>
7+
#
8+
# To run tests in this file only, enter this:
9+
# $ pytest tests/test_mkfunding.py
10+
#
11+
12+
import subprocess
13+
import sys
14+
import traceback
15+
16+
# good command-line values used in test cases
17+
TIMEOUT = 10
18+
EXECUTABLE = 'devtools/mkfunding'
19+
INPUT_TXID = '16835ac8c154b616baac524163f41fb0c4f82c7b972ad35d4d6f18d854f6856b'
20+
INPUT_TXOUTPUT = '1'
21+
INPUT_AMOUNT = '0.01btc'
22+
FEERATE_PER_KW = '253'
23+
INPUT_PRIVKEY = '76edf0c303b9e692da9cb491abedef46ca5b81d32f102eb4648461b239cb0f99'
24+
LOCAL_FUNDING_PRIVKEY = '0000000000000000000000000000000000000000000000000000000000000010'
25+
REMOTE_FUNDING_PRIVKEY = '0000000000000000000000000000000000000000000000000000000000000020'
26+
27+
28+
def subprocess_run(args):
29+
try:
30+
response = subprocess.run(
31+
args,
32+
timeout=TIMEOUT,
33+
capture_output=True,
34+
encoding='utf-8')
35+
print("*** returncode ***")
36+
print(response.returncode)
37+
print("*** stderr ***")
38+
print(response.stderr)
39+
print("*** stdout ***")
40+
print(response.stdout.strip())
41+
return response
42+
except Exception:
43+
# Get current system exception
44+
ex_type, ex_value, ex_traceback = sys.exc_info()
45+
46+
# Extract unformatter stack traces as tuples
47+
trace_back = traceback.extract_tb(ex_traceback)
48+
49+
# Format stacktrace
50+
stack_trace = list()
51+
52+
for trace in trace_back:
53+
stack_trace.append(
54+
"File : %s , Line : %d, Func.Name : %s, Message : %s" %
55+
(trace[0], trace[1], trace[2], trace[3]))
56+
57+
print("Exception type : %s" % ex_type.__name__)
58+
print("Exception message : %s" % ex_value)
59+
print("Stack trace : %s" % stack_trace)
60+
61+
62+
def test_mkfunding_bad_usage():
63+
response = subprocess_run([EXECUTABLE])
64+
assert response.returncode == 1
65+
assert 'Usage:' in response.stderr
66+
67+
68+
def test_mkfunding_bad_input_txid():
69+
response = subprocess_run(
70+
[EXECUTABLE,
71+
'alpha', 'beta', 'gamma', 'delta', 'epsilon',
72+
'zeta', 'eta'])
73+
assert response.returncode == 1
74+
assert 'Bad input-txid' in response.stderr
75+
76+
77+
def test_mkfunding_bad_input_amount():
78+
response = subprocess_run(
79+
[EXECUTABLE,
80+
INPUT_TXID, INPUT_TXOUTPUT,
81+
'gamma', 'delta', 'epsilon', 'zeta', 'eta'])
82+
assert response.returncode == 1
83+
assert 'Bad input-amount' in response.stderr
84+
85+
86+
def test_mkfunding_bad_input_privkey():
87+
response = subprocess_run(
88+
[EXECUTABLE,
89+
INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT,
90+
FEERATE_PER_KW,
91+
'epsilon', 'zeta', 'eta'])
92+
assert response.returncode == 1
93+
assert 'Parsing input-privkey' in response.stderr
94+
95+
96+
def test_mkfunding_bad_local_funding_privkey():
97+
response = subprocess_run(
98+
[EXECUTABLE,
99+
INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT,
100+
FEERATE_PER_KW, INPUT_PRIVKEY,
101+
'zeta', 'eta'])
102+
assert response.returncode == 1
103+
assert 'Parsing local-funding-privkey' in response.stderr
104+
105+
106+
def test_mkfunding_bad_remote_funding_privkey():
107+
response = subprocess_run(
108+
[EXECUTABLE,
109+
INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT,
110+
FEERATE_PER_KW, INPUT_PRIVKEY,
111+
LOCAL_FUNDING_PRIVKEY,
112+
'eta'])
113+
assert response.returncode == 1
114+
assert 'Parsing remote-funding-privkey' in response.stderr
115+
116+
117+
def test_mkfunding_bad_privkeys():
118+
bad_privkey = ('0' * 64)
119+
response = subprocess_run(
120+
[EXECUTABLE,
121+
INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT,
122+
FEERATE_PER_KW,
123+
bad_privkey, bad_privkey, bad_privkey])
124+
assert response.returncode == 1
125+
assert 'Bad privkeys' in response.stderr
126+
127+
128+
def test_mkfunding_bad_cantaffordfee():
129+
input_amount_less_than_fee = '0.00000122btc'
130+
response = subprocess_run(
131+
[EXECUTABLE,
132+
INPUT_TXID, INPUT_TXOUTPUT,
133+
input_amount_less_than_fee,
134+
FEERATE_PER_KW, INPUT_PRIVKEY,
135+
LOCAL_FUNDING_PRIVKEY, REMOTE_FUNDING_PRIVKEY])
136+
assert response.returncode == 1
137+
assert 'can\'t afford fee' in response.stderr
138+
139+
140+
def test_mkfunding_good_noabort():
141+
response = subprocess_run(
142+
[EXECUTABLE,
143+
INPUT_TXID, INPUT_TXOUTPUT, INPUT_AMOUNT,
144+
FEERATE_PER_KW, INPUT_PRIVKEY,
145+
LOCAL_FUNDING_PRIVKEY, REMOTE_FUNDING_PRIVKEY])
146+
# prior to bug fix for issue #5363,
147+
# subprocess_run had a return code of -6 (abort)
148+
assert response.returncode == 0
149+
assert 'funding sig' in response.stdout
150+
assert 'funding witnesses' in response.stdout
151+
assert 'funding amount' in response.stdout
152+
assert 'funding txid' in response.stdout

0 commit comments

Comments
 (0)