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() 4731e446c3db9031f69641c8ce7be8e396aeb60caaSteve Block if stderrdata != "": 4831e446c3db9031f69641c8ce7be8e396aeb60caaSteve Block logging.info("Failed to start tests:\n%s", stderrdata) 4931e446c3db9031f69641c8ce7be8e396aeb60caaSteve Block return 5042bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block if re.search("^INSTRUMENTATION_STATUS_CODE: -1", stdoutdata, re.MULTILINE) != None: 5142bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block logging.info("Failed to run the tests. Is DumpRenderTree2 installed on the device?") 5242bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block return 5331e446c3db9031f69641c8ce7be8e396aeb60caaSteve Block if re.search("^OK \([0-9]+ tests?\)", stdoutdata, re.MULTILINE) == None: 5431e446c3db9031f69641c8ce7be8e396aeb60caaSteve Block logging.info("DumpRenderTree2 failed to run correctly:\n%s", stdoutdata) 5531e446c3db9031f69641c8ce7be8e396aeb60caaSteve Block return 565fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski 575fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski logging.info("Downloading the summaries...") 585fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski 595fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski # Download the txt summary to tmp folder 605fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski summary_txt_tmp_path = os.path.join(tmpdir, SUMMARY_TXT) 615c27bc1c64a06ccec64da81bd0217b7aa3592786Steve Block cmd = "rm -f " + summary_txt_tmp_path + ";" 6282c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + SUMMARY_TXT + " " + summary_txt_tmp_path 6342bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block subprocess.Popen(cmd, shell=True).wait() 645fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski 655fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski # Download the html summary to tmp folder 665fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski details_html_tmp_path = os.path.join(tmpdir, DETAILS_HTML) 675c27bc1c64a06ccec64da81bd0217b7aa3592786Steve Block cmd = "rm -f " + details_html_tmp_path + ";" 6882c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu cmd += adb_cmd + " pull " + RESULTS_ABSOLUTE_PATH + DETAILS_HTML + " " + details_html_tmp_path 6942bf092c47c4af5fbc85283bccdb97fbe4ab76a9Steve Block subprocess.Popen(cmd, shell=True).wait() 705fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski 715fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski # Print summary to console 725fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski logging.info("All done.\n") 735fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski cmd = "cat " + summary_txt_tmp_path 745fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski os.system(cmd) 755fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski logging.info("") 765fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski 775fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski # Open the browser with summary 78d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block if options.show_results_in_browser != "false": 79d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block webbrowser.open(details_html_tmp_path) 805fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowski 815fb9ff420d378c5c83e116efadefb669791098d5Maksymilian Osowskiif __name__ == "__main__": 82d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block option_parser = optparse.OptionParser(usage="Usage: %prog [options] test-relative-path") 83d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block option_parser.add_option("", "--show-results-in-browser", default="true", 84d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block help="Show the results the host's default web browser, default=true") 8578fbc54c182cfc6b21fe745213b02b7ea18775e7Maksymilian Osowski option_parser.add_option("", "--tests-root-directory", 8678fbc54c182cfc6b21fe745213b02b7ea18775e7Maksymilian Osowski help="The directory from which to take the tests, default is external/webkit/LayoutTests in this checkout of the Android tree") 8782c11b42f1564904eb4407d6e30a31ea02d81644Guang Zhu option_parser.add_option("-s", "--serial", default=None, help="Specify the serial number of device to run test on") 88d210fd26b2f32fec26c2e7bb355de8b5b3e25b79Steve Block options, args = option_parser.parse_args(); 89fc16915d327888e110d04564eed58306d6e8585bSteve Block 90fc16915d327888e110d04564eed58306d6e8585bSteve Block logging.basicConfig(level=logging.INFO, format='%(message)s') 91fc16915d327888e110d04564eed58306d6e8585bSteve Block 92fc16915d327888e110d04564eed58306d6e8585bSteve Block if len(args) > 1: 93fc16915d327888e110d04564eed58306d6e8585bSteve Block logging.fatal("Usage: run_layout_tests.py [options] test-relative-path") 94fc16915d327888e110d04564eed58306d6e8585bSteve Block else: 95fc16915d327888e110d04564eed58306d6e8585bSteve Block if len(args) < 1: 96fc16915d327888e110d04564eed58306d6e8585bSteve Block path = ""; 97fc16915d327888e110d04564eed58306d6e8585bSteve Block else: 98fc16915d327888e110d04564eed58306d6e8585bSteve Block path = args[0] 99fc16915d327888e110d04564eed58306d6e8585bSteve Block main(path, options); 100