zcashd/qa/zcash/smoke_tests.py

187 lines
7.3 KiB
Python
Raw Normal View History

2019-03-20 19:13:19 -07:00
#!/usr/bin/env python3
#
# Execute the standard smoke tests for Zcash releases.
#
import argparse
import sys
#
# Smoke test definitions
#
# (case, expected_mainnet, expected_testnet)
SMOKE_TESTS = [
# zcashd start/stop/restart flows
('1a', True, True), # zcashd start
('1b', True, True), # Graceful zcashd stop
('1c', True, True), # Ungraceful zcashd stop
('1d', True, True), # zcashd start; graceful zcashd stop; zcashd start
('1e', True, True), # zcashd start; ungraceful zcashd stop; zcashd start
# Control
('2a', True, True), # Run getinfo
('2b', True, True), # Run help
# Address generation
('3a', True, True), # Generate a Sprout z-addr
('3b', True, True), # Generate multiple Sprout z-addrs
('3c', True, True), # Generate a t-addr
('3d', True, True), # Generate multiple t-addrs
('3e', True, True), # Generate a Sapling z-addr
('3f', True, True), # Generate multiple Sapling z-addrs
# Transactions
('4a', True, True ), # Send funds from Sprout z-addr to same Sprout z-addr
('4b', True, True ), # Send funds from Sprout z-addr to a different Sprout z-addr
('4c', True, True ), # Send funds from Sprout z-addr to a t-addr
('4d', True, True ), # Send funds from t-addr to Sprout z-addr
('4e', True, True ), # Send funds from t-addr to t-addr
('4f', True, True ), # Send funds from t-addr to Sapling z-addr
('4g', True, True ), # Send funds from Sapling z-addr to same Sapling z-addr
('4h', True, True ), # Send funds from Sapling z-addr to a different Sapling z-addr
('4i', True, True ), # Send funds from Sapling z-addr to a t-addr
('4j', False, False), # Send funds from Sprout z-addr to Sapling z-addr
('4k', True, True ), # Send funds from Sprout z-addr to multiple Sprout z-addrs
('4l', True, True ), # Send funds from Sprout z-addr to multiple t-addrs
('4m', True, True ), # Send funds from Sprout z-addr to t-addr and Sprout z-addrs
('4n', False, False), # Send funds from Sprout z-addr to t-addr and Sapling z-addr
('4o', False, False), # Send funds from Sprout z-addr to multiple Sapling z-addrs
('4p', True, True ), # Send funds from t-addr to multiple t-addrs
('4q', True, True ), # Send funds from t-addr to multiple Sprout z-addrs
('4r', True, True ), # Send funds from t-addr to multiple Sapling z-addrs
('4s', False, False), # Send funds from t-addr to Sprout z-addr and Sapling z-addr
('4t', True, True ), # Send funds from Sapling z-addr to multiple Sapling z-addrs
('4u', False, False), # Send funds from Sapling z-addr to multiple Sprout z-addrs
('4v', True, True ), # Send funds from Sapling z-addr to multiple t-addrs
('4w', True, True ), # Send funds from Sapling z-addr to t-addr and Sapling z-addr
('4x', False, False), # Send funds from Sapling z-addr to Sapling z-addr and Sprout z-addr
('4y', True, True ), # Send funds from t-addr to Sprout z-addr using z_mergetoaddress
('4z', True, True ), # Send funds from 2 different t-addrs to Sprout z-addr using z_mergetoaddress
('4aa', False, False), # Send funds from the same 2 t-addrs to Sprout z-addr using z_mergetoaddress
('4bb', True, True ), # Send funds from 2 different t-addrs to Sapling z-addr using z_mergetoaddress
('4cc', True, True ), # Send funds from t-addr to Sapling z-addr using z_mergetoaddress
('4dd', True, True ), # Send funds from t-addr and Sprout z-addr to Sprout z-addr using z_mergetoaddress
('4ee', True, True ), # Send funds from t-addr and Sapling z-addr to Sapling z-addr using z_mergetoaddress
('4ff', True, True ), # Send funds from Sprout z-addr and Sprout z-addr to Sprout z-addr using z_mergetoaddress
('4gg', True, True ), # Send funds from Sapling z-addr and Sapling z-addr to Sapling z-addr using z_mergetoaddress
# Wallet
('5a', True, True), # After generating multiple z-addrs, run z_listaddresses
('5b', True, True), # Run z_validateaddress with a Sprout z-addr
('5c', True, True), # Run z_validateaddress with a Sapling z-addr
('5d', True, True), # After a transaction, run z_listunspent
('5e', True, True), # After a transaction, run z_listreceivedbyaddress
('5f', True, True), # After a transaction, run z_getbalance
('5g', True, True), # After a transaction, run z_gettotalbalance
('5h', True, True), # Run z_exportkey using a Sprout z-addr
('5i', True, True), # Run z_importkey using the zkey from a Sprout z-addr
('5j', True, True), # Run z_exportkey using a Sapling z-addr
('5k', True, True), # Run z_importkey using the zkey from a Sapling z-addr
('5l', True, True), # Run z_exportwallet
('5m', True, True), # Run z_importwallet
('5n', True, True), # Run z_shieldcoinbase
('5o', True, True), # Run getwalletinfo
# Network
('6a', True, True), # Run getpeerinfo
('6b', True, True), # Run getnetworkinfo
('6c', True, False), # Run getdeprecationinfo
('6d', True, True), # Run getconnectioncount
('6e', True, True), # Run getaddednodeinfo
# Mining
('7a', True, True), # Run getblocksubsidy
('7b', True, True), # Run getblocktemplate
('7c', True, True), # Run getmininginfo
('7d', True, True), # Run getnetworkhashps
('7e', True, True), # Run getnetworksolps
]
#
# Test stages
#
STAGES = [
]
STAGE_COMMANDS = {
}
def run_stage(stage):
print('Running stage %s' % stage)
print('=' * (len(stage) + 14))
print()
cmd = STAGE_COMMANDS[stage]
if cmd is not None:
ret = cmd()
else:
print('WARNING: stage not yet implemented, skipping')
ret = {}
print()
print('-' * (len(stage) + 15))
print('Finished stage %s' % stage)
print()
return ret
#
# Test driver
#
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--list-stages', dest='list', action='store_true')
parser.add_argument('--mainnet', action='store_true', help='Use mainnet instead of testnet')
parser.add_argument('stage', nargs='*', default=STAGES,
help='One of %s'%STAGES)
args = parser.parse_args()
# Check for list
if args.list:
for s in STAGES:
print(s)
sys.exit(0)
# Check validity of stages
for s in args.stage:
if s not in STAGES:
print("Invalid stage '%s' (choose from %s)" % (s, STAGES))
sys.exit(1)
# Run the stages
results = {}
for s in args.stage:
results.update(run_stage(s))
passed = True
print()
print('========================')
print(' Results')
print('========================')
print('Case | Expected | Actual')
print('========================')
for test_case in SMOKE_TESTS:
case = test_case[0]
expected = test_case[1 if args.mainnet else 2]
if case in results:
actual = results[case]
actual_str = '%s%s' % (
'Passed' if actual else 'Failed',
'' if expected == actual else '!!!'
)
passed &= (expected == actual)
else:
actual_str = ' N/A'
print('%s | %s | %s' % (
case.ljust(4),
' Passed ' if expected else ' Failed ',
actual_str
))
if not passed:
print()
print("!!! One or more smoke test stages failed !!!")
sys.exit(1)
if __name__ == '__main__':
main()