#!/usr/bin/env python

"""
A simple testing framework for emulator using python's unit testing framework.

Type:

./dotest.py -h

for available options.
"""

import sys
import os
import unittest
import logging
import re
import time
import psutil
from subprocess import PIPE

# Add parent directory to current module. Then, emu_test module is recognized.
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)),
                             os.pardir))
from emu_test.utils import emu_argparser
from emu_test.utils import emu_unittest

# Provides a regular expression for matching fail message
TIMEOUT_REGEX = re.compile(r"(^\d+)([smhd])?$")

main_logger = logging.getLogger()
def printResult(emuResult):
    def getTestName(id):
        return id.rsplit('.', 1)[-1]
    print
    main_logger.info("Test Summary")
    main_logger.info("Run %d tests (%d fail, %d pass, %d xfail, %d xpass)",
           emuResult.testsRun, len(emuResult.failures)+len(emuResult.errors), len(emuResult.passes),
           len(emuResult.expectedFailures), len(emuResult.unexpectedSuccesses))
    if len(emuResult.errors) > 0 or len(emuResult.failures) > 0:
        for x in emuResult.errors:
            if x[1].splitlines()[-1] == "TimeoutError":
                main_logger.info("TIMEOUT: %s", getTestName(x[0].id()))
            else:
                main_logger.info("FAIL: %s", getTestName(x[0].id()))
        for x in emuResult.failures:
            main_logger.info("FAIL: %s", getTestName(x[0].id()))

    if len(emuResult.passes) > 0:
        main_logger.info('------------------------------------------------------')
    for x in emuResult.passes:
        main_logger.info("PASS: %s, boot time: %s", getTestName(x.id()), x.boot_time)

    if len(emuResult.expectedFailures) > 0:
        main_logger.info('------------------------------------------------------')
    for x in emuResult.expectedFailures:
        main_logger.info("Expected Failure: %s", getTestName(x[0].id()))

    if len(emuResult.unexpectedSuccesses) > 0:
        main_logger.info('------------------------------------------------------')
    for x in emuResult.unexpectedSuccesses:
        main_logger.info("Unexpected Success: %s", getTestName(x.id()))

    main_logger.info('')
    main_logger.info("Test successful - %s", emuResult.wasSuccessful())

def setupLogger():
    """Create main_logger that will be used by test driver"""
    global main_logger
    log_formatter = logging.Formatter('%(message)s')
    file_name = 'main_%s.log' % time.strftime("%Y%m%d-%H%M%S")
    if emu_argparser.emu_args.session_dir is None:
        emu_argparser.emu_args.session_dir = time.strftime("%Y%m%d-%H%M%S")
    if not os.path.exists(emu_argparser.emu_args.session_dir):
        os.makedirs(emu_argparser.emu_args.session_dir)

    file_handler = logging.FileHandler(os.path.join(emu_argparser.emu_args.session_dir, file_name))
    file_handler.setFormatter(log_formatter)
    # Test summary goes to standard error, since we rely on stderr to parse test results in buildbot
    console_handler = logging.StreamHandler(sys.stderr)
    console_handler.setFormatter(log_formatter)

    main_logger.addHandler(file_handler)
    main_logger.addHandler(console_handler)
    main_logger.setLevel(getattr(logging, emu_argparser.emu_args.loglevel.upper()))

def findSystemAVDs():
    """Find available AVDs in system"""
    # avd is searched in the order of $ANDROID_AVD_HOME,$ANDROID_SDK_HOME/.android/avd and $HOME/.android/avd
    avd_list_proc = psutil.Popen(['emulator', "-list-avds"], stdout=PIPE, stderr=PIPE)
    (output, err) = avd_list_proc.communicate()
    logging.getLogger().debug(output)
    logging.getLogger().debug(err)
    avd_list = [x.strip() for x in output.splitlines()]
    main_logger.info("Found %d AVDs - %s", len(avd_list), avd_list)
    return avd_list

# Run the test case
if __name__ == '__main__':

    os.environ["SHELL"] = "/bin/bash"

    emu_argparser.emu_args = emu_argparser.get_parser().parse_args()
    setupLogger()
    main_logger.info(emu_argparser.emu_args)

    if emu_argparser.emu_args.avd_list is None:
        emu_argparser.emu_args.avd_list = findSystemAVDs()

    test_root_dir=os.path.dirname(os.path.realpath(__file__))
    emuSuite = unittest.TestLoader().discover(start_dir=test_root_dir, pattern=emu_argparser.emu_args.pattern)
    emuRunner = emu_unittest.EmuTextTestRunner(stream=sys.stdout)
    emuResult = emuRunner.run(emuSuite)
    printResult(emuResult)

    sys.exit(not emuResult.wasSuccessful())
