#!/usr/bin/python3

# If you have any poo, fling it now!

BASE_PATH="https://test.netsurf-browser.org/cgi-bin/monkey-index.cgi"
MONKEY_PATH="./nsmonkey"

# Otherwise let's begin...

import sys
import getopt
import yaml

import multiprocessing as mp

from urllib import request
from io import StringIO

import monkey_driver as driver

mp.set_start_method('fork')

def child_run_test(parts):
    outcapture = StringIO()
    errcapture = StringIO()
    oldout = sys.stdout
    olderr = sys.stderr
    sys.stdout = outcapture
    sys.stderr = errcapture
    try:
        driver.run_preloaded_test(MONKEY_PATH, parts)
    except:
        sys.stdout = oldout
        sys.stderr = olderr
        print("FAIL:")
        print("STDOUT:\n{}\n".format(outcapture.getvalue()))
        print("STDERR:\n{}\n".format(errcapture.getvalue()))
        print("RERAISE:")
        raise
    else:
        sys.stdout = oldout
        sys.stderr = olderr
        if verbose == True:
            print("STDOUT:\n{}\n".format(outcapture.getvalue()))

def run_test(parts):
    p = mp.Process(target=child_run_test, args=(parts, ))
    p.start()
    p.join()
    return p.exitcode

def print_usage():
    print('Usage:')
    print('  ' + sys.argv[0] + ' [-v] [-h]')

def parse_argv(argv):
    verbose=False
    try:
        opts, args = getopt.getopt(argv,"hv",[])
    except getopt.GetoptError:
        print_usage()
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            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)
