@ -23,6 +23,7 @@ import sys
import subprocess
import subprocess
import tempfile
import tempfile
import re
import re
import logging
TEST_EXIT_PASSED = 0
TEST_EXIT_PASSED = 0
TEST_EXIT_SKIPPED = 77
TEST_EXIT_SKIPPED = 77
@ -141,6 +142,7 @@ def main():
parser . add_argument ( ' --force ' , ' -f ' , action = ' store_true ' , help = ' run tests even on platforms where they are disabled by default (e.g. windows). ' )
parser . add_argument ( ' --force ' , ' -f ' , action = ' store_true ' , help = ' run tests even on platforms where they are disabled by default (e.g. windows). ' )
parser . add_argument ( ' --help ' , ' -h ' , ' -? ' , action = ' store_true ' , help = ' print help text and exit ' )
parser . add_argument ( ' --help ' , ' -h ' , ' -? ' , action = ' store_true ' , help = ' print help text and exit ' )
parser . add_argument ( ' --jobs ' , ' -j ' , type = int , default = 4 , help = ' how many test scripts to run in parallel. Default=4. ' )
parser . add_argument ( ' --jobs ' , ' -j ' , type = int , default = 4 , help = ' how many test scripts to run in parallel. Default=4. ' )
parser . add_argument ( ' --quiet ' , ' -q ' , action = ' store_true ' , help = ' only print results summary and failure logs ' )
parser . add_argument ( ' --nozmq ' , action = ' store_true ' , help = ' do not run the zmq tests ' )
parser . add_argument ( ' --nozmq ' , action = ' store_true ' , help = ' do not run the zmq tests ' )
args , unknown_args = parser . parse_known_args ( )
args , unknown_args = parser . parse_known_args ( )
@ -152,6 +154,10 @@ def main():
config = configparser . ConfigParser ( )
config = configparser . ConfigParser ( )
config . read_file ( open ( os . path . dirname ( __file__ ) + " /config.ini " ) )
config . read_file ( open ( os . path . dirname ( __file__ ) + " /config.ini " ) )
# Set up logging
logging_level = logging . INFO if args . quiet else logging . DEBUG
logging . basicConfig ( format = ' %(message)s ' , level = logging_level )
enable_wallet = config [ " components " ] . getboolean ( " ENABLE_WALLET " )
enable_wallet = config [ " components " ] . getboolean ( " ENABLE_WALLET " )
enable_utils = config [ " components " ] . getboolean ( " ENABLE_UTILS " )
enable_utils = config [ " components " ] . getboolean ( " ENABLE_UTILS " )
enable_bitcoind = config [ " components " ] . getboolean ( " ENABLE_BITCOIND " )
enable_bitcoind = config [ " components " ] . getboolean ( " ENABLE_BITCOIND " )
@ -233,7 +239,7 @@ def run_tests(test_list, src_dir, build_dir, exeext, jobs=1, enable_coverage=Fal
if enable_coverage :
if enable_coverage :
coverage = RPCCoverage ( )
coverage = RPCCoverage ( )
flags . append ( coverage . flag )
flags . append ( coverage . flag )
print ( " Initializing coverage directory at %s \n " % coverage . dir )
logging . debug ( " Initializing coverage directory at %s " % coverage . dir )
else :
else :
coverage = None
coverage = None
@ -249,16 +255,20 @@ def run_tests(test_list, src_dir, build_dir, exeext, jobs=1, enable_coverage=Fal
job_queue = TestHandler ( jobs , tests_dir , test_list , flags )
job_queue = TestHandler ( jobs , tests_dir , test_list , flags )
max_len_name = len ( max ( test_list , key = len ) )
max_len_name = len ( max ( test_list , key = len ) )
results = BOLD [ 1 ] + " %s | %s | %s \n \n " % ( " TEST " . ljust ( max_len_name ) , " STATUS " , " DURATION " ) + BOLD [ 0 ]
results = " \n " + BOLD [ 1 ] + " %s | %s | %s \n \n " % ( " TEST " . ljust ( max_len_name ) , " STATUS " , " DURATION " ) + BOLD [ 0 ]
for _ in range ( len ( test_list ) ) :
for _ in range ( len ( test_list ) ) :
( name , stdout , stderr , status , duration ) = job_queue . get_next ( )
( name , stdout , stderr , status , duration ) = job_queue . get_next ( )
all_passed = all_passed and status != " Failed "
all_passed = all_passed and status != " Failed "
time_sum + = duration
time_sum + = duration
print ( ' \n ' + BOLD [ 1 ] + name + BOLD [ 0 ] + " : " )
if status == " Passed " :
print ( ' ' if status == " Passed " else stdout + ' \n ' , end = ' ' )
logging . debug ( " \n %s %s %s passed, Duration: %s s " % ( BOLD [ 1 ] , name , BOLD [ 0 ] , duration ) )
print ( ' ' if stderr == ' ' else ' stderr: \n ' + stderr + ' \n ' , end = ' ' )
elif status == " Skipped " :
print ( " Status: %s %s %s , Duration: %s s \n " % ( BOLD [ 1 ] , status , BOLD [ 0 ] , duration ) )
logging . debug ( " \n %s %s %s skipped " % ( BOLD [ 1 ] , name , BOLD [ 0 ] ) )
else :
print ( " \n %s %s %s failed, Duration: %s s \n " % ( BOLD [ 1 ] , name , BOLD [ 0 ] , duration ) )
print ( BOLD [ 1 ] + ' stdout: \n ' + BOLD [ 0 ] + stdout + ' \n ' )
print ( BOLD [ 1 ] + ' stderr: \n ' + BOLD [ 0 ] + stderr + ' \n ' )
results + = " %s | %s | %s s \n " % ( name . ljust ( max_len_name ) , status . ljust ( 7 ) , duration )
results + = " %s | %s | %s s \n " % ( name . ljust ( max_len_name ) , status . ljust ( 7 ) , duration )
@ -269,7 +279,7 @@ def run_tests(test_list, src_dir, build_dir, exeext, jobs=1, enable_coverage=Fal
if coverage :
if coverage :
coverage . report_rpc_coverage ( )
coverage . report_rpc_coverage ( )
print ( " Cleaning up coverage data " )
logging . debug ( " Cleaning up coverage data " )
coverage . cleanup ( )
coverage . cleanup ( )
sys . exit ( not all_passed )
sys . exit ( not all_passed )