diff options
Diffstat (limited to 'test/monkey-see-monkey-do')
-rwxr-xr-x | test/monkey-see-monkey-do | 139 |
1 files changed, 93 insertions, 46 deletions
diff --git a/test/monkey-see-monkey-do b/test/monkey-see-monkey-do index 8de29fa53..72b8685ec 100755 --- a/test/monkey-see-monkey-do +++ b/test/monkey-see-monkey-do @@ -1,26 +1,52 @@ #!/usr/bin/python3 -# If you have any poo, fling it now! +''' +NetSurf automated test runner -BASE_PATH="https://test.netsurf-browser.org/cgi-bin/monkey-index.cgi" -MONKEY_PATH="./nsmonkey" +This script retrives a test plan from the NetSurf infrastructure and + executes it using the monkey frontend +''' -# Otherwise let's begin... +# If you have any poo, fling it now! import sys import getopt -import yaml - import multiprocessing as mp - -from urllib import request +from urllib import request, parse from io import StringIO - +import yaml import monkey_driver as driver +# Otherwise let's begin... + +BASE_PATH = "https://test.netsurf-browser.org/cgi-bin/monkey-index.cgi" +MONKEY_PATH = "./nsmonkey" + mp.set_start_method('fork') -def child_run_test(parts): +def decode_trace_line(l): + from re import findall, match + from subprocess import getstatusoutput + + caps = findall(r'./nsmonkey\(\+(0x[0-9a-f]+)\)', l); + if not caps: + return l + + exitcode, output = getstatusoutput( + "addr2line -e {} -a -p -f -C {} 2>/dev/null".format( + MONKEY_PATH, caps[0])) + if exitcode != 0: + return './nsmonkey(+{})'.format(caps[0]) + + m = match(r'0x(.+): (.+) at (.+):(.+)', output) + + return '{}:{}({})[0x{}]'.format( + m.group(3), m.group(4), m.group(2), m.group(1)) + +def decode_trace(s): + return "\n".join(decode_trace_line(l) for l in s.split("\n")) + +def child_run_test(verbose, parts): outcapture = StringIO() errcapture = StringIO() oldout = sys.stdout @@ -34,29 +60,31 @@ def child_run_test(parts): sys.stderr = olderr print("FAIL:") print("STDOUT:\n{}\n".format(outcapture.getvalue())) - print("STDERR:\n{}\n".format(errcapture.getvalue())) + print("STDERR:\n{}\n".format(decode_trace(errcapture.getvalue()))) print("RERAISE:") raise else: sys.stdout = oldout sys.stderr = olderr - if verbose == True: + if verbose: print("STDOUT:\n{}\n".format(outcapture.getvalue())) -def run_test(parts): - p = mp.Process(target=child_run_test, args=(parts, )) +def run_test(verbose, parts): + p = mp.Process(target=child_run_test, args=(verbose, parts, )) p.start() p.join() return p.exitcode def print_usage(): print('Usage:') - print(' ' + sys.argv[0] + ' [-v] [-h]') + print(' ' + sys.argv[0] + ' [-v] [-h] [-d <division>] [-g group]') def parse_argv(argv): - verbose=False + verbose = False + division = None + group = None try: - opts, args = getopt.getopt(argv,"hv",[]) + opts, args = getopt.getopt(argv, "hvd:g:", []) except getopt.GetoptError: print_usage() sys.exit(2) @@ -65,32 +93,51 @@ def parse_argv(argv): print_usage() sys.exit() elif opt in ("-v", "--verbose"): - verbose=True - return verbose - -verbose = parse_argv(sys.argv[1:]) - -print("Fetching tests...") -index = request.urlopen(BASE_PATH) -index = index.read() -print("Parsing tests...") -test_set = yaml.load_all(index) - -print("Running tests...") -ret = 0 -for test in test_set: - if test["kind"] == 'group': - print("Start group: {}".format(test["group"])) - print(" [ {} ]".format(test["description"])) - elif test["kind"] == 'test': - print(" => Run test: {}".format(test["filename"])) - ret = run_test(test["content"]) - if ret != 0: - break - -if ret != 0: - print("FAIL") - sys.exit(1) -else: - print("PASS") - sys.exit(0) + verbose = True + elif opt == '-d': + division = arg + elif opt == '-g': + group = arg + + return verbose, division, group + +def main(): + verbose, division, group = parse_argv(sys.argv[1:]) + + print("Fetching tests...") + data_dict = {} + if division is not None: + data_dict['division'] = division + if group is not None: + data_dict['group'] = group + + data = parse.urlencode(data_dict).encode() + req = request.Request(BASE_PATH, data=data) + index = request.urlopen(req) + index = index.read() + + print("Parsing tests...") + test_set = yaml.load_all(index, Loader=yaml.SafeLoader) + + print("Running tests...") + ret = 0 + for test in test_set: + if test["kind"] == 'group': + print("Start group: {}".format(test["group"])) + print(" [ {} ]".format(test["description"])) + elif test["kind"] == 'test': + print(" => Run test: {}".format(test["filename"])) + ret = run_test(verbose, test["content"]) + if ret != 0: + break + + if ret != 0: + print("FAIL") + sys.exit(1) + else: + print("PASS") + sys.exit(0) + + +if __name__ == "__main__": + main() |