blob: e91da14039ab44fff02208de9ded41706abf003a [file] [log] [blame]
#!/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())