#!/usr/bin/env python3

# Copyright (c) 2013-2017 Intel Corporation
#
# SPDX-License-Identifier: GPL-2.0-only
#

# DESCRIPTION
# This script runs tests defined in meta/lib/oeqa/selftest/
# It's purpose is to automate the testing of different bitbake tools.
# To use it you just need to source your build environment setup script and
# add the meta-selftest layer to your BBLAYERS.
# Call the script as: "oe-selftest -a" to run all the tests in meta/lib/oeqa/selftest/
# Call the script as: "oe-selftest -r <module>.<Class>.<method>" to run just a single test
# E.g: "oe-selftest -r bblayers.BitbakeLayers" will run just the BitbakeLayers class from meta/lib/oeqa/selftest/bblayers.py



import os
import sys
import argparse
import logging

scripts_path = os.path.dirname(os.path.realpath(__file__))
lib_path = scripts_path + '/lib'
sys.path = sys.path + [lib_path]
import argparse_oe
import scriptutils
import scriptpath
scriptpath.add_oe_lib_path()
scriptpath.add_bitbake_lib_path()

from oeqa.utils import load_test_components
from oeqa.core.exception import OEQAPreRun

logger = scriptutils.logger_create('oe-selftest', stream=sys.stdout, keepalive=True)

def main():
    description = "Script that runs unit tests against bitbake and other Yocto related tools. The goal is to validate tools functionality and metadata integrity. Refer to https://wiki.yoctoproject.org/wiki/Oe-selftest for more information."
    parser = argparse_oe.ArgumentParser(description=description)

    comp_name, comp = load_test_components(logger, 'oe-selftest').popitem()
    comp.register_commands(logger, parser)

    try:
        args = parser.parse_args()
        results = args.func(logger, args)
        ret = 0 if results.wasSuccessful() else 1
    except SystemExit as err:
        if err.code != 0:
            raise err
        ret = err.code
    except OEQAPreRun as pr:
        ret = 1

    return ret

if __name__ == '__main__':
    try:
        ret = main()
    except Exception:
        ret = 1
        import traceback
        traceback.print_exc()
    sys.exit(ret)
