#!/usr/bin/env python3

# Test every patch from files folder and output error on failure
#
# Copyright (C) 2016 Intel Corporation
#
# SPDX-License-Identifier: GPL-2.0-only

import os
import subprocess
import sys

currentdir = os.path.dirname(os.path.abspath(__file__))
patchesdir = os.path.join(currentdir, 'files')
topdir     = os.path.dirname(currentdir)
parentdir  = os.path.dirname(topdir)

# path to the repo root
repodir = os.path.dirname(os.path.dirname(parentdir))

def print_results(passcount, failcount, skipcount, xpasscount, xfailcount, xskipcount, errorcount):
    total = passcount + skipcount + failcount + xpasscount + xfailcount + xskipcount + errorcount
    print("============================================================================")
    print("Testsuite summary for %s" % os.path.basename(topdir))
    print("============================================================================")
    print("# TOTAL: %s" % str(total))
    print("# XPASS: %s" % str(xpasscount))
    print("# XFAIL: %s" % str(xfailcount))
    print("# XSKIP: %s" % str(xskipcount))
    print("# PASS: %s" % str(passcount))
    print("# FAIL: %s" % str(failcount))
    print("# SKIP: %s" % str(skipcount))
    print("# ERROR: %s" % str(errorcount))
    print("============================================================================")

# Once the tests are in oe-core, we can remove the testdir param and use os.path.dirname to get relative paths
def test(root, patch):
    res = True
    patchpath = os.path.abspath(os.path.join(root, patch))
    
    cmd     = 'patchtest --base-commit HEAD --repodir %s --testdir %s/tests --patch %s' % (repodir, topdir, patchpath)
    results = subprocess.check_output(cmd, stderr=subprocess.STDOUT, universal_newlines=True, shell=True)

    return results

if __name__ == '__main__':
    passcount = 0
    failcount = 0
    skipcount = 0
    xpasscount = 0
    xfailcount = 0
    xskipcount = 0
    errorcount = 0

    results = None
        
    for root, dirs, patches in os.walk(patchesdir):
        for patch in patches:
            results = test(root, patch)

            a = patch.split('.')
            klass, testname = a[0], a[1]
            expected_result = a[-1]
            testid          = ".%s.%s" % (klass,testname)

            for resultline in results.splitlines():
                if testid in resultline:
                    result, _ = resultline.split(':', 1)

                    if expected_result.upper() == "FAIL" and result.upper() == "FAIL":
                        xfailcount = xfailcount + 1
                        print("XFAIL: %s (file: %s)" % (testid.strip("."), os.path.basename(patch)))
                    elif expected_result.upper() == "PASS" and result.upper() == "PASS":
                        xpasscount = xpasscount + 1
                        print("XPASS: %s (file: %s)" % (testid.strip("."), os.path.basename(patch)))
                    elif expected_result.upper() == "SKIP" and result.upper() == "SKIP":
                        xskipcount = xskipcount + 1
                        print("XSKIP: %s (file: %s)" % (testid.strip("."), os.path.basename(patch)))
                    else:
                        print("%s: %s (%s)" % (result.upper(), testid.strip("."), os.path.basename(patch)))
                        if result.upper() == "PASS":
                            passcount = passcount + 1
                        elif result.upper() == "FAIL":
                            failcount = failcount + 1
                        elif result.upper() == "SKIP":
                            skipcount = skipcount + 1
                        else:
                            print("Bad result on test %s against %s" % (testid.strip("."), os.path.basename(patch)))
                            errorcount = errorcount + 1
                    break
            else:
                print ("No test for=%s" % patch)

    print_results(passcount, failcount, skipcount, xpasscount, xfailcount, xskipcount, errorcount)
