#!/usr/bin/env python3

import sys
import time
import os
import string
sys.path.insert(0, "python")
import libxml2

#
# the testsuite description
#
DIR="xinclude-test-suite"
CONF="testdescr.xml"
LOG="check-xinclude-test-suite.log"

log = open(LOG, "w")

os.chdir(DIR)

test_nr = 0
test_succeed = 0
test_failed = 0
test_error = 0
#
# Error and warning handlers
#
error_nr = 0
error_msg = ''

def errorHandler(ctx, str):
    global error_nr
    global error_msg

    if string.find(str, "error:") >= 0:
	error_nr = error_nr + 1
    if len(error_msg) < 300:
        if len(error_msg) == 0 or error_msg[-1] == '\n':
	    error_msg = error_msg + "   >>" + str
	else:
	    error_msg = error_msg + str

libxml2.registerErrorHandler(errorHandler, None)

def testXInclude(filename, id):
    global error_nr
    global error_msg
    global log

    error_nr = 0
    error_msg = ''

    print("testXInclude(%s, %s)" % (filename, id))
    return 1

def runTest(test, basedir):
    global test_nr
    global test_failed
    global test_error
    global test_succeed
    global error_msg
    global log

    fatal_error = 0
    uri = test.prop('href')
    id = test.prop('id')
    type = test.prop('type')
    if uri == None:
        print("Test without ID:", uri)
	return -1
    if id == None:
        print("Test without URI:", id)
	return -1
    if type == None:
        print("Test without URI:", id)
	return -1
    if basedir != None:
	URI = basedir + "/" + uri
    else:
        URI = uri
    if os.access(URI, os.R_OK) == 0:
        print("Test %s missing: base %s uri %s" % (URI, basedir, uri))
	return -1

    expected = None
    outputfile = None
    diff = None
    if type != 'error':
	output = test.xpathEval('string(output)')
	if output == 'No output file.':
	    output = None
	if output == '':
	    output = None
	if output != None:
	    if basedir != None:
		output = basedir + "/" + output
	    if os.access(output, os.R_OK) == 0:
		print("Result for %s missing: %s" % (id, output))
		output = None
	    else:
		try:
		    f = open(output)
		    expected = f.read()
		    outputfile = output
		except:
		    print("Result for %s unreadable: %s" % (id, output))

    try:
        # print "testing %s" % (URI)
	doc = libxml2.parseFile(URI)
    except:
        doc = None
    if doc != None:
        res = doc.xincludeProcess()
	if res >= 0 and expected != None:
	    result = doc.serialize()
	    if result != expected:
	        print("Result for %s differs" % (id))
		open("xinclude.res", "w").write(result)
		diff = os.popen("diff %s xinclude.res" % outputfile).read()

	doc.freeDoc()
    else:
        print("Failed to parse %s" % (URI))
	res = -1

    

    test_nr = test_nr + 1
    if type == 'success':
	if res > 0:
	    test_succeed = test_succeed + 1
	elif res == 0:
	    test_failed = test_failed + 1
	    print("Test %s: no substitution done ???" % (id))
	elif res < 0:
	    test_error = test_error + 1
	    print("Test %s: failed valid XInclude processing" % (id))
    elif type == 'error':
	if res > 0:
	    test_error = test_error + 1
	    print("Test %s: failed to detect invalid XInclude processing" % (id))
	elif res == 0:
	    test_failed = test_failed + 1
	    print("Test %s: Invalid but no substitution done" % (id))
	elif res < 0:
	    test_succeed = test_succeed + 1
    elif type == 'optional':
	if res > 0:
	    test_succeed = test_succeed + 1
	else:
	    print("Test %s: failed optional test" % (id))

    # Log the ontext
    if res != 1:
	log.write("Test ID %s\n" % (id))
	log.write("   File: %s\n" % (URI))
	content = string.strip(test.content)
	while content[-1] == '\n':
	    content = content[0:-1]
	log.write("   %s:%s\n\n" % (type, content))
	if error_msg != '':
	    log.write("   ----\n%s   ----\n" % (error_msg))
	    error_msg = ''
	log.write("\n")
    if diff != None:
        log.write("diff from test %s:\n" %(id))
	log.write("   -----------\n%s\n   -----------\n" % (diff));

    return 0
	    

def runTestCases(case):
    creator = case.prop('creator')
    if creator != None:
	print("=>", creator)
    base = case.getBase(None)
    basedir = case.prop('basedir')
    if basedir != None:
	base = libxml2.buildURI(basedir, base)
    test = case.children
    while test != None:
        if test.name == 'testcase':
	    runTest(test, base)
	if test.name == 'testcases':
	    runTestCases(test)
        test = test.__next__
        
conf = libxml2.parseFile(CONF)
if conf == None:
    print("Unable to load %s" % CONF)
    sys.exit(1)

testsuite = conf.getRootElement()
if testsuite.name != 'testsuite':
    print("Expecting TESTSUITE root element: aborting")
    sys.exit(1)

profile = testsuite.prop('PROFILE')
if profile != None:
    print(profile)

start = time.time()

case = testsuite.children
while case != None:
    if case.name == 'testcases':
	old_test_nr = test_nr
	old_test_succeed = test_succeed
	old_test_failed = test_failed
	old_test_error = test_error
        runTestCases(case)
	print("   Ran %d tests: %d suceeded, %d failed and %d generated an error" % (
	       test_nr - old_test_nr, test_succeed - old_test_succeed,
	       test_failed - old_test_failed, test_error - old_test_error))
    case = case.__next__

conf.freeDoc()
log.close()

print("Ran %d tests: %d suceeded, %d failed and %d generated an error in %.2f s." % (
      test_nr, test_succeed, test_failed, test_error, time.time() - start))
