#!/usr/bin/python
# Copyright (C) 2014-2018 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
#
# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <http://www.gnu.org/licenses/>.
"""Benchmark output validator

Given a benchmark output file in json format and a benchmark schema file,
validate the output against the schema.
"""

from __future__ import print_function
import json
import sys
import os

try:
    import import_bench as bench
except ImportError:
    print('Import Error: Output will not be validated.')
    # Return success because we don't want the bench target to fail just
    # because the jsonschema module was not found.
    sys.exit(os.EX_OK)


def print_and_exit(message, exitcode):
    """Prints message to stderr and returns the exit code.

    Args:
        message: The message to print
        exitcode: The exit code to return

    Returns:
        The passed exit code
    """
    print(message, file=sys.stderr)
    return exitcode


def main(args):
    """Main entry point

    Args:
        args: The command line arguments to the program

    Returns:
        0 on success or a non-zero failure code

    Exceptions:
        Exceptions thrown by validate_bench
    """
    if len(args) != 2:
        return print_and_exit("Usage: %s <bench.out file> <bench.out schema>"
                % sys.argv[0], os.EX_USAGE)

    try:
        bench.parse_bench(args[0], args[1])
    except IOError as e:
        return print_and_exit("IOError(%d): %s" % (e.errno, e.strerror),
                os.EX_OSFILE)

    except bench.validator.ValidationError as e:
        return print_and_exit("Invalid benchmark output: %s" % e.message,
            os.EX_DATAERR)

    except bench.validator.SchemaError as e:
        return print_and_exit("Invalid schema: %s" % e.message, os.EX_DATAERR)

    print("Benchmark output in %s is valid." % args[0])
    return os.EX_OK


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
