Home | History | Annotate | Download | only in assets
      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