Home | History | Annotate | Download | only in tools
      1 # Copyright 2014 The Android Open Source Project
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
      4 # you may not use this file except in compliance with the License.
      5 # You may obtain a copy of the License at
      6 #
      7 #      http://www.apache.org/licenses/LICENSE-2.0
      8 #
      9 # Unless required by applicable law or agreed to in writing, software
     10 # distributed under the License is distributed on an "AS IS" BASIS,
     11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
     14 
     15 from multiprocessing import Process
     16 import os
     17 import os.path
     18 import tempfile
     19 import subprocess
     20 import time
     21 import string
     22 import sys
     23 import textwrap
     24 import its.device
     25 
     26 def main():
     27     """
     28         device0: device serial number for camera 0 testing
     29         device1: device serial number for camera 1 testing
     30         chart: [Experimental] another android device served as test chart
     31                display. When this argument presents, change of test scene will
     32                be handled automatically. Note that this argument requires
     33                special physical/hardware setup to work and may not work on
     34                all android devices.
     35     """
     36     auto_scenes = ["0", "1", "2", "3", "4"]
     37 
     38     device0_id = None
     39     device1_id = None
     40     chart_host_id = None
     41     scenes = None
     42 
     43     for s in sys.argv[1:]:
     44         if s[:8] == "device0=" and len(s) > 8:
     45             device0_id = s[8:]
     46         elif s[:8] == "device1=" and len(s) > 8:
     47             device1_id = s[8:]
     48         elif s[:7] == "scenes=" and len(s) > 7:
     49             scenes = s[7:].split(',')
     50         elif s[:6] == 'chart=' and len(s) > 6:
     51             chart_host_id = s[6:]
     52 
     53     #Sanity Check for camera 0 & 1 parallel testing
     54     device0_bfp = its.device.get_device_fingerprint(device0_id)
     55     device1_bfp = its.device.get_device_fingerprint(device1_id)
     56     chart_host_bfp = its.device.get_device_fingerprint(chart_host_id)
     57 
     58     assert device0_bfp is not None, "Can not connect to the device0"
     59     assert device0_bfp == device1_bfp, \
     60         "Not the same build: %s vs %s" % (device0_bfp, device1_bfp)
     61     assert chart_host_bfp is not None, "Can not connect to the chart device"
     62 
     63     if scenes is None:
     64         scenes = auto_scenes
     65 
     66     print ">>> Start the at %s" % time.strftime('%Y/%m/%d %H:%M:%S')
     67     for scene in scenes:
     68         cmds = []
     69         cmds.append(build_cmd(device0_id, chart_host_id, device1_id, 0, scene))
     70         cmds.append(build_cmd(device1_id, chart_host_id, device0_id, 1, scene))
     71 
     72         procs = []
     73         for cmd in cmds:
     74             print "running: ", cmd
     75             proc = Process(target=run_cmd, args=(cmd,))
     76             procs.append(proc)
     77             proc.start()
     78 
     79         for proc in procs:
     80             proc.join()
     81 
     82     shut_down_device_screen(device0_id)
     83     shut_down_device_screen(device1_id)
     84     shut_down_device_screen(chart_host_id)
     85 
     86     print ">>> End the test at %s" % time.strftime('%Y/%m/%d %H:%M:%S')
     87 
     88 def build_cmd(device_id, chart_host_id, result_device_id, camera_id, scene_id):
     89     """ Create a cmd list for run_all_tests.py
     90     Return a list of cmd & parameters
     91     """
     92     cmd = ['python',
     93             os.path.join(os.getcwd(),'tools/run_all_tests.py'),
     94             'device=%s' % device_id,
     95             'result=%s' % result_device_id,
     96             'camera=%i' % camera_id,
     97             'scenes=%s' % scene_id]
     98 
     99     # scene 5 is not automated and no chart is needed
    100     if scene_id != '5':
    101         cmd.append('chart=%s' % chart_host_id)
    102     else:
    103         cmd.append('skip_scene_validation')
    104 
    105     return cmd
    106 
    107 def run_cmd(cmd):
    108     """ Run shell command on a subprocess
    109     """
    110     proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    111     output, error = proc.communicate()
    112     print output, error
    113 
    114 def shut_down_device_screen(device_id):
    115     """ Shut Down Device Screen
    116 
    117     Returns:
    118         None
    119     """
    120 
    121     print 'Shutting down chart screen: ', device_id
    122     screen_id_arg = ('screen=%s' % device_id)
    123     cmd = ['python', os.path.join(os.environ['CAMERA_ITS_TOP'], 'tools',
    124                                   'turn_off_screen.py'), screen_id_arg]
    125     retcode = subprocess.call(cmd)
    126     assert retcode == 0
    127 
    128 if __name__ == '__main__':
    129     main()
    130