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 12 import logging 13 import optparse 14 import os 15 import re 16 import sys 17 import subprocess 18 import tempfile 19 import webbrowser 20 21 import run_apache2 22 23 #TODO: These should not be hardcoded 24 RESULTS_ABSOLUTE_PATH = "/sdcard/layout-test-results/" 25 DETAILS_HTML = "details.html" 26 SUMMARY_TXT = "summary.txt" 27 28 def 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 81 if __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