From 10c1b1a548d0f416e1911a9aa1341994d42d107e Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 6 Jun 2013 15:45:47 +0200 Subject: [PATCH] Rewrite javascript test-runner. refs #4244 --- test/js/runtests | 130 ++++++++++++++++++++++++++++++++++++++++++++ test/js/runtests.sh | 26 --------- 2 files changed, 130 insertions(+), 26 deletions(-) create mode 100755 test/js/runtests delete mode 100755 test/js/runtests.sh diff --git a/test/js/runtests b/test/js/runtests new file mode 100755 index 000000000..27c810432 --- /dev/null +++ b/test/js/runtests @@ -0,0 +1,130 @@ +#!/usr/bin/env python + +import os +import sys +import subprocess +from optparse import OptionParser, BadOptionError, AmbiguousOptionError + + +APPLICATION = 'mocha' +DEFAULT_ARGS = ['--recursive', '--require', 'should'] + +REPORT_DIRECTORY = '../../build/log' + + +class PassThroughOptionParser(OptionParser): + """ + An unknown option pass-through implementation of OptionParser. + + When unknown arguments are encountered, bundle with largs and try again, + until rargs is depleted. + + sys.exit(status) will still be called if a known argument is passed + incorrectly (e.g. missing arguments or bad argument types, etc.) + + Borrowed from: http://stackoverflow.com/a/9307174 + """ + def _process_args(self, largs, rargs, values): + while rargs: + try: + OptionParser._process_args(self, largs, rargs, values) + except (BadOptionError, AmbiguousOptionError), error: + largs.append(error.opt_str) + + +def execute_command(command, return_output=False, shell=False): + prog = subprocess.Popen(command, shell=shell, + stdout=subprocess.PIPE + if return_output + else None) + return prog.wait() if not return_output else \ + prog.communicate()[0] + + +def get_report_directory(): + path = os.path.abspath(REPORT_DIRECTORY) + + try: + os.makedirs(REPORT_DIRECTORY) + except OSError: + pass + + return path + + +def get_script_directory(): + return os.path.dirname(os.path.abspath(sys.argv[0])) + + +def parse_commandline(): + parser = PassThroughOptionParser(usage='%prog [options] [additional arguments' + ' for {0}]'.format(APPLICATION)) + parser.add_option('-b', '--build', action='store_true', + help='Enable reporting.') + parser.add_option('-v', '--verbose', action='store_true', + help='Be more verbose.') + parser.add_option('-i', '--include', metavar='PATTERN', action='append', + help='Include only specific files/test cases.' + ' (Can be supplied multiple times.)') + parser.add_option('-e', '--exclude', metavar='PATTERN', action='append', + help='Exclude specific files/test cases. ' + '(Can be supplied multiple times.)') + return parser.parse_args() + + +def main(): + options, arguments = parse_commandline() + + # Environment preparation and verification + os.chdir(get_script_directory()) + application_path = execute_command('which {0}'.format(APPLICATION), + True, True).strip() + if not application_path: + print 'ERROR: {0} not found!'.format(APPLICATION) + return 2 + os.environ['NODE_PATH'] = os.environ.get('NODE_PATH', '') + \ + ':/usr/local/lib/node_modules' \ + ':/usr/lib/node_modules' + + # Commandline preparation + command_options, more_command_options = [], None + if options.include or options.exclude: + for pattern in (options.include or options.exclude): + command_options.append('--grep') + command_options.append(pattern) + if options.exclude: + command_options.append('--invert') + if options.build: + more_command_options = command_options[:len(command_options)] + \ + ['--reporter', 'mocha-cobertura-reporter'] + command_options.extend(['--reporter', 'xunit']) + elif options.verbose: + command_options.extend(['--reporter', 'spec']) + else: + command_options.extend(['--reporter', 'nyan']) + if not any(os.path.isfile(a) or os.path.isdir(a) for a in arguments): + arguments.append('.') + + # Application invocation.. + if more_command_options is None: + execute_command([application_path] + DEFAULT_ARGS + + command_options + arguments) + else: + result_data = execute_command([application_path] + DEFAULT_ARGS + + command_options + arguments, True) + coverage_data = execute_command([application_path] + DEFAULT_ARGS + + more_command_options + arguments, True) + # Result storage + report_directory = get_report_directory() + result_path = os.path.join(report_directory, 'mocha_results.xml') + coverage_path = os.path.join(report_directory, 'mocha_coverage.xml') + with open(result_path, 'w') as result_file: + result_file.write(result_data) + with open(coverage_path, 'w') as coverage_file: + coverage_file.write(coverage_data) + + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/test/js/runtests.sh b/test/js/runtests.sh deleted file mode 100755 index 496a9eab7..000000000 --- a/test/js/runtests.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -set -o nounset - -SCRIPTNAME=$(readlink -f $0) -DIR=$(dirname $SCRIPTNAME) -MOCHA=$(which mocha) -DEFAULT="--recursive --require should" - -if [[ ! -x $MOCHA ]]; then - echo "mocha not found!"; - exit 1 -fi - -# Make sure that the destination directory for logs and reports exists -mkdir -p $DIR/../../build/log - -cd $DIR - -# Don't know where node modules are -export NODE_PATH=.:/usr/local/lib/node_modules:/usr/lib/node_modules - -$MOCHA --reporter "xunit" $DEFAULT "$@" . > $DIR/../../build/log/mocha_results.xml -$MOCHA --reporter "mocha-cobertura-reporter" $DEFAULT "$@" . > $DIR/../../build/log/mocha_coverage.xml - -exit 0 \ No newline at end of file