import __main__ as main
import os
import sys
import nagios_report

def run(test):
    """
    run takes a function and tries it out.
    If it returns nothing or 0 everything is fine and run prints an OK message
    with the function name.
    >>> def this_works_fine(): return
    >>> run(this_works_fine)
    0 nagios_test.py - OK - this_works_fine
    0
    >>> def this_also_works_fine(): return 0
    >>> run(this_also_works_fine)
    0 nagios_test.py - OK - this_also_works_fine
    0

    If the function returns something else it will be printed as a warning.
    >>> run(lambda : "this is a warning")
    1 nagios_test.py - WARNING - this is a warning
    1

    Errors raised will result in a CRITICAL nagios string.
    >>> def failure(): raise Exception("something went wrong")
    >>> run(failure)
    2 nagios_test.py - CRITICAL - something went wrong
    2
    """
    try:
        name = os.path.basename(main.__file__)
    except AttributeError: 
        name = sys.argv[0]
    ok, warn, fail, unknown = nagios_report.functions_for_system(name)
    try:
        warning = test()
        if warning and warning != 0:
            code = warn(warning)
        else:
            code = ok(test.__name__)
    except Exception as exc:
        code = fail(exc.message or str(exc))
    return code


if __name__ == "__main__":
    import doctest
    doctest.testmod()