1#!/usr/bin/python 2 3"""Run layout tests on the device. 4 5 It runs the specified tests on the device, downloads the summaries to the temporary directory 6 and optionally shows the detailed results the host's default browser. 7 8 Usage: 9 run_layout_tests.py --show-results-in-browser test-relative-path 10""" 11 12import logging 13import optparse 14import os 15import re 16import sys 17import subprocess 18import tempfile 19import webbrowser 20 21import run_apache2 22 23#TODO: These should not be hardcoded 24RESULTS_ABSOLUTE_PATH = "/sdcard/layout-test-results/" 25DETAILS_HTML = "details.html" 26SUMMARY_TXT = "summary.txt" 27 28def main(path, options): 29 tmpdir = tempfile.gettempdir() 30 31 # Restart the server 32 if run_apache2.main("restart", options) == False: 33 return 34 35 # Run the tests in path 36 adb_cmd = "adb" 37 if options.serial: 38 adb_cmd += " -s " + options.serial 39 cmd = adb_cmd + " shell am instrument " 40 cmd += "-e class com.android.dumprendertree2.scriptsupport.Starter#startLayoutTests " 41 cmd += "-e path \"" + path + "\" " 42 cmd += "-w com.android.dumprendertree2/com.android.dumprendertree2.scriptsupport.ScriptTestRunner" 43 44 logging.info("Running the tests...") 45 logging.debug("Command = %s" % cmd) 46 (stdoutdata, stderrdata) = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 47 if stderrdata != "": 48 logging.info("Failed to start tests:\n%s", stderrdata) 49 return 50 if re.search("^INSTRUMENTATION_STATUS_CODE: -1", stdoutdata, re.MULTILINE) != None: 51 logging.info("Failed to run the tests. Is DumpRenderTree2 installed on the device?") 52 return 53 if re.search("^OK \([0-9]+ tests?\)", stdoutdata, re.MULTILINE) == None: 54 logging.info("DumpRenderTree2 failed to run correctly:\n%s", stdoutdata) 55 return 56 57 logging.info("Downloading the summaries...") 58 59 # Download the txt summary to tmp folder 60 summary_txt_tmp_path = os.path.join(tmpdir, SUMMARY_TXT) 61 cmd = "rm -f " + summary_txt_tmp_path + ";" 62 cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + SUMMARY_TXT + " " + summary_txt_tmp_path 63 subprocess.Popen(cmd, shell=True).wait() 64 65 # Download the html summary to tmp folder 66 details_html_tmp_path = os.path.join(tmpdir, DETAILS_HTML) 67 cmd = "rm -f " + details_html_tmp_path + ";" 68 cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + DETAILS_HTML + " " + details_html_tmp_path 69 subprocess.Popen(cmd, shell=True).wait() 70 71 # Print summary to console 72 logging.info("All done.\n") 73 cmd = "cat " + summary_txt_tmp_path 74 os.system(cmd) 75 logging.info("") 76 77 # Open the browser with summary 78 if options.show_results_in_browser != "false": 79 webbrowser.open(details_html_tmp_path) 80 81if __name__ == "__main__": 82 option_parser = optparse.OptionParser(usage="Usage: %prog [options] test-relative-path") 83 option_parser.add_option("", "--show-results-in-browser", default="true", 84 help="Show the results the host's default web browser, default=true") 85 option_parser.add_option("", "--tests-root-directory", 86 help="The directory from which to take the tests, default is external/webkit/LayoutTests in this checkout of the Android tree") 87 option_parser.add_option("-s", "--serial", default=None, help="Specify the serial number of device to run test on") 88 options, args = option_parser.parse_args(); 89 90 logging.basicConfig(level=logging.INFO, format='%(message)s') 91 92 if len(args) > 1: 93 logging.fatal("Usage: run_layout_tests.py [options] test-relative-path") 94 else: 95 if len(args) < 1: 96 path = ""; 97 else: 98 path = args[0] 99 main(path, options); 100