Blame xlate-test.py

Packit Service d1fe03
#!/usr/bin/env python3
Packit Service d1fe03
# encoding: utf-8
Packit Service d1fe03
Packit Service d1fe03
import os
Packit Service d1fe03
import sys
Packit Service d1fe03
import shlex
Packit Service d1fe03
import argparse
Packit Service d1fe03
from subprocess import Popen, PIPE
Packit Service d1fe03
Packit Service d1fe03
keywords = ("iptables-translate", "ip6tables-translate", "ebtables-translate")
Packit Service d1fe03
xtables_nft_multi = 'xtables-nft-multi'
Packit Service d1fe03
Packit Service d1fe03
if sys.stdout.isatty():
Packit Service d1fe03
    colors = {"magenta": "\033[95m", "green": "\033[92m", "yellow": "\033[93m",
Packit Service d1fe03
              "red": "\033[91m", "end": "\033[0m"}
Packit Service d1fe03
else:
Packit Service d1fe03
    colors = {"magenta": "", "green": "", "yellow": "", "red": "", "end": ""}
Packit Service d1fe03
Packit Service d1fe03
Packit Service d1fe03
def magenta(string):
Packit Service d1fe03
    return colors["magenta"] + string + colors["end"]
Packit Service d1fe03
Packit Service d1fe03
Packit Service d1fe03
def red(string):
Packit Service d1fe03
    return colors["red"] + string + colors["end"]
Packit Service d1fe03
Packit Service d1fe03
Packit Service d1fe03
def yellow(string):
Packit Service d1fe03
    return colors["yellow"] + string + colors["end"]
Packit Service d1fe03
Packit Service d1fe03
Packit Service d1fe03
def green(string):
Packit Service d1fe03
    return colors["green"] + string + colors["end"]
Packit Service d1fe03
Packit Service d1fe03
Packit Service d1fe03
def run_test(name, payload):
Packit Service d1fe03
    global xtables_nft_multi
Packit Service d1fe03
    test_passed = True
Packit Service d1fe03
    tests = passed = failed = errors = 0
Packit Service d1fe03
    result = []
Packit Service d1fe03
Packit Service d1fe03
    for line in payload:
Packit Service d1fe03
        if line.startswith(keywords):
Packit Service d1fe03
            tests += 1
Packit Service d1fe03
            process = Popen([ xtables_nft_multi ] + shlex.split(line), stdout=PIPE, stderr=PIPE)
Packit Service d1fe03
            (output, error) = process.communicate()
Packit Service d1fe03
            if process.returncode == 0:
Packit Service d1fe03
                translation = output.decode("utf-8").rstrip(" \n")
Packit Service d1fe03
                expected = next(payload).rstrip(" \n")
Packit Service d1fe03
                if translation != expected:
Packit Service d1fe03
                    test_passed = False
Packit Service d1fe03
                    failed += 1
Packit Service d1fe03
                    result.append(name + ": " + red("Fail"))
Packit Service d1fe03
                    result.append(magenta("src: ") + line.rstrip(" \n"))
Packit Service d1fe03
                    result.append(magenta("exp: ") + expected)
Packit Service d1fe03
                    result.append(magenta("res: ") + translation + "\n")
Packit Service d1fe03
                    test_passed = False
Packit Service d1fe03
                else:
Packit Service d1fe03
                    passed += 1
Packit Service d1fe03
            else:
Packit Service d1fe03
                test_passed = False
Packit Service d1fe03
                errors += 1
Packit Service d1fe03
                result.append(name + ": " + red("Error: ") + "iptables-translate failure")
Packit Service d1fe03
                result.append(error.decode("utf-8"))
Packit Service d1fe03
    if (passed == tests) and not args.test:
Packit Service d1fe03
        print(name + ": " + green("OK"))
Packit Service d1fe03
    if not test_passed:
Packit Service d1fe03
        print("\n".join(result))
Packit Service d1fe03
    if args.test:
Packit Service d1fe03
        print("1 test file, %d tests, %d tests passed, %d tests failed, %d errors" % (tests, passed, failed, errors))
Packit Service d1fe03
    else:
Packit Service d1fe03
        return tests, passed, failed, errors
Packit Service d1fe03
Packit Service d1fe03
Packit Service d1fe03
def load_test_files():
Packit Service d1fe03
    test_files = total_tests = total_passed = total_error = total_failed = 0
Packit Service d1fe03
    for test in sorted(os.listdir("extensions")):
Packit Service d1fe03
        if test.endswith(".txlate"):
Packit Service d1fe03
            with open("extensions/" + test, "r") as payload:
Packit Service d1fe03
                tests, passed, failed, errors = run_test(test, payload)
Packit Service d1fe03
                test_files += 1
Packit Service d1fe03
                total_tests += tests
Packit Service d1fe03
                total_passed += passed
Packit Service d1fe03
                total_failed += failed
Packit Service d1fe03
                total_error += errors
Packit Service d1fe03
Packit Service d1fe03
Packit Service d1fe03
    print("%d test files, %d tests, %d tests passed, %d tests failed, %d errors" % (test_files, total_tests, total_passed, total_failed, total_error))
Packit Service d1fe03
Packit Service d1fe03
def main():
Packit Service d1fe03
    global xtables_nft_multi
Packit Service d1fe03
    if not args.host:
Packit Service d1fe03
        os.putenv("XTABLES_LIBDIR", os.path.abspath("extensions"))
Packit Service d1fe03
        xtables_nft_multi = os.path.abspath(os.path.curdir) \
Packit Service d1fe03
                            + '/iptables/' + xtables_nft_multi
Packit Service d1fe03
Packit Service d1fe03
    if args.test:
Packit Service d1fe03
        if not args.test.endswith(".txlate"):
Packit Service d1fe03
            args.test += ".txlate"
Packit Service d1fe03
        try:
Packit Service d1fe03
            with open(args.test, "r") as payload:
Packit Service d1fe03
                run_test(args.test, payload)
Packit Service d1fe03
        except IOError:
Packit Service d1fe03
            print(red("Error: ") + "test file does not exist")
Packit Service d1fe03
    else:
Packit Service d1fe03
        load_test_files()
Packit Service d1fe03
Packit Service d1fe03
Packit Service d1fe03
parser = argparse.ArgumentParser()
Packit Service d1fe03
parser.add_argument('-H', '--host', action='store_true',
Packit Service d1fe03
                    help='Run tests against installed binaries')
Packit Service d1fe03
parser.add_argument("test", nargs="?", help="run only the specified test file")
Packit Service d1fe03
args = parser.parse_args()
Packit Service d1fe03
main()