普通文本  |  184行  |  4.35 KB

#!/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)