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 15from multiprocessing import Process 16import os 17import os.path 18import tempfile 19import subprocess 20import time 21import string 22import sys 23import textwrap 24import its.device 25 26def 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 test 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 88def 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 107def 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 114def 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 128if __name__ == '__main__': 129 main() 130