#!/usr/bin/python
###
### Copyright (C) 2011 Texas Instruments
###
### Licensed under the Apache License, Version 2.0 (the "License");
### you may not use this file except in compliance with the License.
### You may obtain a copy of the License at
###
### http://www.apache.org/licenses/LICENSE-2.0
###
### Unless required by applicable law or agreed to in writing, software
### distributed under the License is distributed on an "AS IS" BASIS,
### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
### See the License for the specific language governing permissions and
### limitations under the License.
###
#
# TI Android Audio team master test runner script.
#
import sys, os, os.path, time
import signal
import TestFlinger
###
### Configure tests here
###
### Each element is a dict that will be passed to the TestCase
### constructor. See the documentation for TestCase.__init__()
### for key/value pair documentation.
###
g_tests = [
# These first tests are simply to verify that the test
# framework is working.
{ 'filename': '/bin/true',
'args': None,
'timeout': None,
'expect-fail': False, },
{ 'filename': '/bin/false',
'args': None,
'timeout': None,
'expect-fail': True, },
{ 'filename': 'test-signal',
'args': None,
'timeout': None,
'expect-signal': True, },
# Actual product tests here
{ 'filename': 'music-monkey.py',
'timeout': 60*30, },
]
# These executables are known to be needed for the tests.
# They must be available explicitly or in the current PATH.
g_required_executables = [
'/bin/bash',
'/bin/false',
'/bin/sh',
'/bin/true',
'adb',
'bash',
'monkeyrunner',
'pgrep',
'python',
'sh',
]
# These are files that
g_required_files = [
]
###
### Signal handler
###
g_tcase = None
def sigint_handler(signum, stack_frame):
global g_tcase
print
print "Received SIGINT, aborting current test..."
if g_tcase is not None:
g_tcase.kill()
sys.exit(signum)
###
### Utility functions
###
def check_for_executable(name):
"""Checks that executable is available (either explicitly or in the PATH
returns True if so, False if not.
"""
err = os.system("which %s > /dev/null" % (name,))
return (err == 0)
def check_for_file(name):
return os.path.exists(name)
def check_adb_server_running():
"""Checks that the ADB server is currently running. Returns True if
so, False otherwise. Uses the pgrep command.
"""
err = os.system("pgrep adb > /dev/null")
return (err == 0)
def sanity_check():
"""Checks that required binaries are available and functioning in a sane manner,
returns True if so, False if something is missing. It checks that things like
adb and monkeyrunner are in the path
"""
rv = True
for F in g_required_executables:
ok = check_for_executable(F)
if not ok:
print "ERROR: cannot find the executable '%s'" % (F,)
rv = False
for F in g_required_files:
ok = check_for_file(F)
if not ok:
print "ERROR: cannot find the file '%s'" % (F,)
rv = False
ok = check_adb_server_running()
if not ok:
print "ERROR: the adb server must be running before starting tests"
rv = False
return rv
###
### Main test script
###
def main(argv = []):
global g_tests, g_tcase
g_tcase = None
signal.signal(signal.SIGINT, sigint_handler)
if not sanity_check():
return 1
err = os.system("adb root")
if err != 0:
print "ERROR: could not set adb to run as root. Aborting."
return 1
time.sleep(2.0) # Wait for device to restart its server
log = TestFlinger.setup_logfile()
for N in g_tests:
tcase = TestFlinger.TestCase(N, log)
g_tcase = tcase
ok = tcase.start()
if not ok:
print "ERROR: could not start test '%s'. Skipping" % (N['filename'],)
if ok:
tcase.wait()
verdict = tcase.verdict()
verdict = N['filename'] + ": " + verdict
else:
verdict = N['filename'] + ": FAIL"
print verdict
log.write("\n" + verdict + "\n")
log.flush()
TestFlinger.close_logfile(log)
return 0
if __name__ == "__main__":
rv = main(sys.argv)
sys.exit(rv)