run_layout_tests.py revision 84cc2dbb1d9f935182fcbeb1ef68dc340d2ebade
15fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski#!/usr/bin/python
25fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
35fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski"""Run layout tests on the device.
45fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
55fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  It runs the specified tests on the device, downloads the summaries to the temporary directory
6d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block  and optionally shows the detailed results the host's default browser.
75fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
85fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  Usage:
9d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block    run_layout_tests.py --show-results-in-browser test-relative-path
105fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski"""
115fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
12d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Blockimport logging
13d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Blockimport optparse
145fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowskiimport os
1542bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Blockimport re
16d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Blockimport sys
175fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowskiimport subprocess
185fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowskiimport tempfile
19d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Blockimport webbrowser
205fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
21ae47ce00460538d7db688a269d8cbae5a2054b18Steve Blockimport run_apache2
22ae47ce00460538d7db688a269d8cbae5a2054b18Steve Block
235fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski#TODO: These should not be hardcoded
24bdebd0621b2a4422a30bea21ea549afd20a9e918Steve BlockRESULTS_ABSOLUTE_PATH = "/sdcard/layout-test-results/"
255fb9ff420d378c5c83e116efadefb669791098d5Maksymilian OsowskiDETAILS_HTML = "details.html"
265fb9ff420d378c5c83e116efadefb669791098d5Maksymilian OsowskiSUMMARY_TXT = "summary.txt"
275fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
28fc16915d327888e110d04564eed58306d6e8585bSteve Blockdef main(path, options):
295fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  tmpdir = tempfile.gettempdir()
305fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
312e367376690282a262cfcbd21d4c18862b48f38cMaksymilian Osowski  # Restart the server
32ae47ce00460538d7db688a269d8cbae5a2054b18Steve Block  if run_apache2.main("restart", options) == False:
33ae47ce00460538d7db688a269d8cbae5a2054b18Steve Block    return
342e367376690282a262cfcbd21d4c18862b48f38cMaksymilian Osowski
355fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  # Run the tests in path
3682c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu  adb_cmd = "adb"
3782c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu  if options.serial:
3882c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu    adb_cmd += " -s " + options.serial
3982c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu  cmd = adb_cmd + " shell am instrument "
405fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  cmd += "-e class com.android.dumprendertree2.scriptsupport.Starter#startLayoutTests "
415fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  cmd += "-e path \"" + path + "\" "
4242bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block  cmd += "-w com.android.dumprendertree2/com.android.dumprendertree2.scriptsupport.ScriptTestRunner"
435fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
445fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  logging.info("Running the tests...")
4584cc2dbb1d9f935182fcbeb1ef68dc340d2ebadePhilippe Marti  logging.debug("Command = %s" % cmd)
4642bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block  (stdoutdata, stderrdata) = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
4742bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block  if re.search("^INSTRUMENTATION_STATUS_CODE: -1", stdoutdata, re.MULTILINE) != None:
4842bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block    logging.info("Failed to run the tests. Is DumpRenderTree2 installed on the device?")
4942bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block    return
505fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
515fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  logging.info("Downloading the summaries...")
525fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
535fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  # Download the txt summary to tmp folder
545fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  summary_txt_tmp_path = os.path.join(tmpdir, SUMMARY_TXT)
555c27bc1c64a06ccec64da81bd0217b7aa3592786Steve Block  cmd = "rm -f " + summary_txt_tmp_path + ";"
5682c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu  cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + SUMMARY_TXT + " " + summary_txt_tmp_path
5742bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block  subprocess.Popen(cmd, shell=True).wait()
585fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
595fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  # Download the html summary to tmp folder
605fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  details_html_tmp_path = os.path.join(tmpdir, DETAILS_HTML)
615c27bc1c64a06ccec64da81bd0217b7aa3592786Steve Block  cmd = "rm -f " + details_html_tmp_path + ";"
6282c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu  cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + DETAILS_HTML + " " + details_html_tmp_path
6342bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block  subprocess.Popen(cmd, shell=True).wait()
645fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
655fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  # Print summary to console
665fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  logging.info("All done.\n")
675fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  cmd = "cat " + summary_txt_tmp_path
685fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  os.system(cmd)
695fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  logging.info("")
705fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
715fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski  # Open the browser with summary
72d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block  if options.show_results_in_browser != "false":
73d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block    webbrowser.open(details_html_tmp_path)
745fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski
755fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowskiif __name__ == "__main__":
76d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block  option_parser = optparse.OptionParser(usage="Usage: %prog [options] test-relative-path")
77d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block  option_parser.add_option("", "--show-results-in-browser", default="true",
78d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block                           help="Show the results the host's default web browser, default=true")
7978fbc54c182cfc6b21fe745213b02b7ea18775e7Maksymilian Osowski  option_parser.add_option("", "--tests-root-directory",
8078fbc54c182cfc6b21fe745213b02b7ea18775e7Maksymilian Osowski                           help="The directory from which to take the tests, default is external/webkit/LayoutTests in this checkout of the Android tree")
8182c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu  option_parser.add_option("-s", "--serial", default=None, help="Specify the serial number of device to run test on")
82d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block  options, args = option_parser.parse_args();
83fc16915d327888e110d04564eed58306d6e8585bSteve Block
84fc16915d327888e110d04564eed58306d6e8585bSteve Block  logging.basicConfig(level=logging.INFO, format='%(message)s')
85fc16915d327888e110d04564eed58306d6e8585bSteve Block
86fc16915d327888e110d04564eed58306d6e8585bSteve Block  if len(args) > 1:
87fc16915d327888e110d04564eed58306d6e8585bSteve Block    logging.fatal("Usage: run_layout_tests.py [options] test-relative-path")
88fc16915d327888e110d04564eed58306d6e8585bSteve Block  else:
89fc16915d327888e110d04564eed58306d6e8585bSteve Block    if len(args) < 1:
90fc16915d327888e110d04564eed58306d6e8585bSteve Block      path = "";
91fc16915d327888e110d04564eed58306d6e8585bSteve Block    else:
92fc16915d327888e110d04564eed58306d6e8585bSteve Block      path = args[0]
93fc16915d327888e110d04564eed58306d6e8585bSteve Block    main(path, options);
94