#!/usr/bin/env python3
#
# Copyright (C) 2012 Richard Purdie
#
# SPDX-License-Identifier: GPL-2.0-only
#

import os
import sys, logging
import warnings
warnings.simplefilter("default")
sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(__file__)), 'lib'))

import unittest
try:
    import bb
    import hashserv
    import layerindexlib
except RuntimeError as exc:
    sys.exit(str(exc))

tests = ["bb.tests.codeparser",
         "bb.tests.color",
         "bb.tests.cooker",
         "bb.tests.cow",
         "bb.tests.data",
         "bb.tests.event",
         "bb.tests.fetch",
         "bb.tests.parse",
         "bb.tests.persist_data",
         "bb.tests.runqueue",
         "bb.tests.siggen",
         "bb.tests.utils",
         "bb.tests.compression",
         "hashserv.tests",
         "layerindexlib.tests.layerindexobj",
         "layerindexlib.tests.restapi",
         "layerindexlib.tests.cooker"]

for t in tests:
    t = '.'.join(t.split('.')[:3])
    __import__(t)


# Set-up logging
class StdoutStreamHandler(logging.StreamHandler):
    """Special handler so that unittest is able to capture stdout"""
    def __init__(self):
        # Override __init__() because we don't want to set self.stream here
        logging.Handler.__init__(self)

    @property
    def stream(self):
        # We want to dynamically write wherever sys.stdout is pointing to
        return sys.stdout


handler = StdoutStreamHandler()
bb.logger.addHandler(handler)
bb.logger.setLevel(logging.DEBUG)


ENV_HELP = """\
Environment variables:
  BB_SKIP_NETTESTS      set to 'yes' in order to skip tests using network
                        connection
  BB_TMPDIR_NOCLEAN     set to 'yes' to preserve test tmp directories
"""

class main(unittest.main):
    def _print_help(self, *args, **kwargs):
        super(main, self)._print_help(*args, **kwargs)
        print(ENV_HELP)


if __name__ == '__main__':
        main(defaultTest=tests, buffer=True)
