Home | History | Annotate | Download | only in test
      1 #!/usr/bin/env python
      2 #
      3 # Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      4 #
      5 # Use of this source code is governed by a BSD-style license
      6 # that can be found in the LICENSE file in the root of the source
      7 # tree. An additional intellectual property rights grant can be found
      8 # in the file PATENTS.  All contributing project authors may
      9 # be found in the AUTHORS file in the root of the source tree.
     10 
     11 
     12 """Script to run tests with pre-configured command line arguments.
     13 
     14 NOTICE: This test is designed to be run from the build output folder! It is
     15 copied automatically during build.
     16 
     17 With this script, it's easier for anyone to enable/disable or extend a test that
     18 runs on the buildbots. It is also easier for developers to run the tests in the
     19 same way as they run on the bots.
     20 """
     21 
     22 import optparse
     23 import os
     24 import subprocess
     25 import sys
     26 
     27 _CURRENT_DIR = os.path.abspath(os.path.dirname(__file__))
     28 _HOME = os.environ.get('HOME', '')
     29 
     30 _VIE_AUTO_TEST_CMD_LIST = [
     31     'vie_auto_test',
     32     '--automated',
     33     '--capture_test_ensure_resolution_alignment_in_capture_device=false']
     34 _WIN_TESTS = {
     35     'vie_auto_test': _VIE_AUTO_TEST_CMD_LIST,
     36     'voe_auto_test': ['voe_auto_test',
     37                       '--automated'],
     38 }
     39 _MAC_TESTS = {
     40     'libjingle_peerconnection_objc_test': [
     41         ('libjingle_peerconnection_objc_test.app/Contents/MacOS/'
     42          'libjingle_peerconnection_objc_test')],
     43     'vie_auto_test': _VIE_AUTO_TEST_CMD_LIST,
     44     'voe_auto_test': ['voe_auto_test',
     45                       '--automated',
     46                       ('--gtest_filter='
     47                        '-VolumeTest.SetVolumeBeforePlayoutWorks' # bug 527
     48                        )],
     49 }
     50 _LINUX_TESTS = {
     51     'vie_auto_test': _VIE_AUTO_TEST_CMD_LIST,
     52     'voe_auto_test': ['voe_auto_test',
     53                       '--automated'],
     54     'audio_e2e_test': ['python',
     55                        'run_audio_test.py',
     56                        '--input=../../resources/e2e_audio_in.pcm',
     57                        '--output=/tmp/e2e_audio_out.pcm',
     58                        '--codec=L16',
     59                        '--harness=%s/audio_e2e_harness' % _CURRENT_DIR,
     60                        '--compare=%s/bin/compare-audio +16000 +wb' % _HOME,
     61                        '--regexp=(\d\.\d{3})'],
     62     'audioproc_perf': ['audioproc',
     63                        '-aecm', '-ns', '-agc', '--fixed_digital', '--perf',
     64                        '-pb', '../../resources/audioproc.aecdump'],
     65     'isac_fixed_perf': ['iSACFixtest',
     66                         '32000', '../../resources/speech_and_misc_wb.pcm',
     67                         'isac_speech_and_misc_wb.pcm'],
     68     'libjingle_peerconnection_java_unittest': [
     69         'libjingle_peerconnection_java_unittest'],
     70 }
     71 
     72 _CUSTOM_ENV = {
     73     'libjingle_peerconnection_java_unittest':
     74         {'LD_PRELOAD': '/usr/lib/x86_64-linux-gnu/libpulse.so.0'},
     75 }
     76 
     77 def main():
     78   parser = optparse.OptionParser('usage: %prog -t <test> [-t <test> ...]\n'
     79                                  'If no test is specified, all tests are run.')
     80   parser.add_option('-l', '--list', action='store_true', default=False,
     81                     help='Lists all currently supported tests.')
     82   parser.add_option('-t', '--test', action='append', default=[],
     83                     help='Which test to run. May be specified multiple times.')
     84   options, _ = parser.parse_args()
     85 
     86   if sys.platform.startswith('win'):
     87     test_dict = _WIN_TESTS
     88   elif sys.platform.startswith('linux'):
     89     test_dict = _LINUX_TESTS
     90   elif sys.platform.startswith('darwin'):
     91     test_dict = _MAC_TESTS
     92   else:
     93     parser.error('Unsupported platform: %s' % sys.platform)
     94 
     95   if options.list:
     96     print 'Available tests:'
     97     print 'Test name              Command line'
     98     print '=========              ============'
     99     for test, cmd_line in test_dict.items():
    100       print '%-20s   %s' % (test, ' '.join(cmd_line))
    101     return
    102 
    103   if not options.test:
    104     options.test = test_dict.keys()
    105   for test in options.test:
    106     if test not in test_dict:
    107       parser.error('Test "%s" is not supported (use --list to view supported '
    108                    'tests).')
    109 
    110   # Change current working directory to the script's dir to make the relative
    111   # paths always work.
    112   os.chdir(_CURRENT_DIR)
    113   print 'Changed working directory to: %s' % _CURRENT_DIR
    114 
    115   print 'Running WebRTC Buildbot tests: %s' % options.test
    116   for test in options.test:
    117     cmd_line = test_dict[test]
    118     env = os.environ.copy()
    119     if test in _CUSTOM_ENV:
    120       env.update(_CUSTOM_ENV[test])
    121 
    122     # Create absolute paths to test executables for non-Python tests.
    123     if cmd_line[0] != 'python':
    124       cmd_line[0] = os.path.join(_CURRENT_DIR, cmd_line[0])
    125 
    126     print 'Running: %s' % ' '.join(cmd_line)
    127     try:
    128       subprocess.check_call(cmd_line, env=env)
    129     except subprocess.CalledProcessError as e:
    130       print >> sys.stderr, ('An error occurred during test execution: return '
    131                             'code: %d' % e.returncode)
    132       return -1
    133 
    134   print 'Testing completed successfully.'
    135   return 0
    136 
    137 
    138 if __name__ == '__main__':
    139   sys.exit(main())
    140