run_reliability_tests.py revision 17f8fa6b24da34724b4497622f374b27f3041e1c
14010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu#!/usr/bin/python2.4 24010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 34010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu"""Run reliability tests using Android instrumentation. 44010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 54010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu A test file consists of list web sites to test is needed as a parameter 64010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 74010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu Usage: 84010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu run_reliability_tests.py path/to/url/list 94010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu""" 104010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 114010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhuimport logging 124010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhuimport optparse 1317f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhuimport os 144010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhuimport subprocess 154010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhuimport sys 1617f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhuimport time 174010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 184010ac35b1e49d659d7a32cc191302b8e2d8758aGuang ZhuTEST_LIST_FILE = "/sdcard/android/reliability_tests_list.txt" 194010ac35b1e49d659d7a32cc191302b8e2d8758aGuang ZhuTEST_STATUS_FILE = "/sdcard/android/reliability_running_test.txt" 204010ac35b1e49d659d7a32cc191302b8e2d8758aGuang ZhuTEST_TIMEOUT_FILE = "/sdcard/android/reliability_timeout_test.txt" 214010ac35b1e49d659d7a32cc191302b8e2d8758aGuang ZhuHTTP_URL_FILE = "urllist_http" 224010ac35b1e49d659d7a32cc191302b8e2d8758aGuang ZhuHTTPS_URL_FILE = "urllist_https" 234010ac35b1e49d659d7a32cc191302b8e2d8758aGuang ZhuNUM_URLS = 25 244010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 254010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 264010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhudef DumpRenderTreeFinished(adb_cmd): 274010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu """Check if DumpRenderTree finished running. 284010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 294010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu Args: 304010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu adb_cmd: adb command string 314010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 324010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu Returns: 334010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu True if DumpRenderTree has finished, False otherwise 344010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu """ 354010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 364010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu # pull test status file and look for "#DONE" 374010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu shell_cmd_str = adb_cmd + " shell cat " + TEST_STATUS_FILE 384010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu adb_output = subprocess.Popen(shell_cmd_str, 394010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu shell=True, stdout=subprocess.PIPE, 404010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu stderr=subprocess.PIPE).communicate()[0] 414010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu return adb_output.strip() == "#DONE" 424010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 434010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 4465455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhudef RemoveDeviceFile(adb_cmd, file_name): 4565455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu shell_cmd_str = adb_cmd + " shell rm " + file_name 4665455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu subprocess.Popen(shell_cmd_str, 4765455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu shell=True, stdout=subprocess.PIPE, 4865455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu stderr=subprocess.PIPE).communicate() 494010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 504010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 5117f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhudef Bugreport(url, bugreport_dir, adb_cmd): 5217f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu """Pull a bugreport from the device.""" 5317f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu bugreport_filename = "%s/reliability_bugreport_%d.txt" % (bugreport_dir, 5417f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu int(time.time())) 5517f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu 5617f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu # prepend the report with url 5717f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu handle = open(bugreport_filename, "w") 5817f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu handle.writelines("Bugreport for crash in url - %s\n\n" % url) 5917f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu handle.close() 6017f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu 6117f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu cmd = "%s bugreport >> %s" % (adb_cmd, bugreport_filename) 6217f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu os.system(cmd) 6317f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu 6417f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu 654010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhudef main(options, args): 664010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu """Send the url list to device and start testing, restart if crashed.""" 674010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 684010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu # Set up logging format. 694010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu log_level = logging.INFO 704010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if options.verbose: 714010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu log_level = logging.DEBUG 724010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.basicConfig(level=log_level, 734010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu format="%(message)s") 744010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 754010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu # Include all tests if none are specified. 764010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if not args: 7765455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu print "Missing URL list file" 7865455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu sys.exit(1) 794010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu else: 804010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu path = args[0] 814010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 824010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if not options.crash_file: 8365455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu print "Missing crash file name, use --crash-file to specify" 844010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu sys.exit(1) 854010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu else: 864010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu crashed_file = options.crash_file 874010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 884010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if not options.timeout_file: 8965455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu print "Missing timeout file, use --timeout-file to specify" 904010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu sys.exit(1) 914010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu else: 924010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu timedout_file = options.timeout_file 934010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 943e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu if not options.delay: 953e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu manual_delay = 0 963e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu else: 973e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu manual_delay = options.delay 983e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu 9917f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu if not options.bugreport: 10017f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu bugreport_dir = "." 10117f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu else: 10217f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu bugreport_dir = options.bugreport 10317f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu if not os.path.exists(bugreport_dir): 10417f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu os.makedirs(bugreport_dir) 10517f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu if not os.path.isdir(bugreport_dir): 10617f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu logging.error("Cannot create results dir: " + bugreport_dir) 10717f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu sys.exit(1) 10817f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu 1094010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu adb_cmd = "adb " 1104010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if options.adb_options: 1114010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu adb_cmd += options.adb_options + " " 1124010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1134010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu # push url list to device 1144010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu test_cmd = adb_cmd + " push \"" + path + "\" \"" + TEST_LIST_FILE + "\"" 1154010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu proc = subprocess.Popen(test_cmd, shell=True, 1164010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu stdout=subprocess.PIPE, 1174010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu stderr=subprocess.PIPE) 1184010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu (adb_output, adb_error) = proc.communicate() 1194010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if proc.returncode != 0: 1204010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.error("failed to push url list to device.") 1214010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.error(adb_output) 1224010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.error(adb_error) 1234010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu sys.exit(1) 1244010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 12565455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu # clean up previous results 12665455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu RemoveDeviceFile(adb_cmd, TEST_STATUS_FILE) 12765455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu RemoveDeviceFile(adb_cmd, TEST_TIMEOUT_FILE) 12865455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu 1294010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.info("Running the test ...") 1304010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1314010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu # Count crashed tests. 1324010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu crashed_tests = [] 1334010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1344010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if options.time_out_ms: 1354010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu timeout_ms = options.time_out_ms 1364010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1374010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu # Run test until it's done 1384010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu test_cmd_prefix = adb_cmd + " shell am instrument" 1394010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu test_cmd_postfix = " -w com.android.dumprendertree/.LayoutTestsAutoRunner" 1404010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1414010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu # Call ReliabilityTestsAutoTest#startReliabilityTests 1424010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu test_cmd = (test_cmd_prefix + " -e class " 14365455a1a46e3bec020befd27ff5ad6bfdab61a7dGuang Zhu "com.android.dumprendertree.ReliabilityTest#" 1443e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu "runReliabilityTest -e timeout %s -e delay %s %s" % 1453e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu (str(timeout_ms), str(manual_delay), test_cmd_postfix)) 1464010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1474010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu adb_output = subprocess.Popen(test_cmd, shell=True, 1484010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu stdout=subprocess.PIPE, 1494010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu stderr=subprocess.PIPE).communicate()[0] 1504010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu while not DumpRenderTreeFinished(adb_cmd): 1514010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.error("DumpRenderTree exited before all URLs are visited.") 1524010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu shell_cmd_str = adb_cmd + " shell cat " + TEST_STATUS_FILE 1534010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu crashed_test = subprocess.Popen(shell_cmd_str, shell=True, 1544010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu stdout=subprocess.PIPE).communicate()[0] 1554010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.info(crashed_test + " CRASHED") 1564010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu crashed_tests.append(crashed_test) 15717f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu Bugreport(crashed_test, bugreport_dir, adb_cmd) 1584010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.info("Resuming reliability test runner...") 1594010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1604010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu adb_output = subprocess.Popen(test_cmd, shell=True, stdout=subprocess.PIPE, 1614010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu stderr=subprocess.PIPE).communicate()[0] 1624010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1634010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if (adb_output.find("INSTRUMENTATION_FAILED") != -1 or 1644010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu adb_output.find("Process crashed.") != -1): 1654010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.error("Error happened : " + adb_output) 1664010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu sys.exit(1) 1674010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1684010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.info(adb_output) 1694010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.info("Done\n") 1704010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1714010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu if crashed_tests: 1724010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu file_handle = open(crashed_file, "w") 1734010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu file_handle.writelines("\n".join(crashed_tests)) 1744010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.info("Crashed URL list stored in: " + crashed_file) 1754010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu file_handle.close() 1764010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu else: 1774010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu logging.info("No crash found.") 1784010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1794010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu test_cmd = (adb_cmd + "pull \"" + TEST_TIMEOUT_FILE + "\" \"" 1804010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu + timedout_file + "\"") 1814010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1824010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu subprocess.Popen(test_cmd, shell=True, stdout=subprocess.PIPE, 1834010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu stderr=subprocess.PIPE).communicate() 1844010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1854010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu 1864010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhuif "__main__" == __name__: 1874010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu option_parser = optparse.OptionParser() 1883e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu option_parser.add_option("-t", "--time-out-ms", 1894010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu default=60000, 1904010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu help="set the timeout for each test") 1913e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu option_parser.add_option("-v", "--verbose", action="store_true", 1924010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu default=False, 1934010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu help="include debug-level logging") 1943e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu option_parser.add_option("-a", "--adb-options", 1954010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu default=None, 1964010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu help="pass options to adb, such as -d -e, etc") 1973e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu option_parser.add_option("-c", "--crash-file", 1984010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu default="reliability_crashed_sites.txt", 1994010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu help="the list of sites that cause browser to crash") 2003e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu option_parser.add_option("-f", "--timeout-file", 2014010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu default="reliability_timedout_sites.txt", 20217f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu help="the list of sites that timedout during test") 2033e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu option_parser.add_option("-d", "--delay", 2043e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu default=0, 2053e8950c0c73f9c1574ce3388c754009edf6bc930Guang Zhu help="add a manual delay between pages (in ms)") 20617f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu option_parser.add_option("-b", "--bugreport", 20717f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu default=".", 20817f8fa6b24da34724b4497622f374b27f3041e1cGuang Zhu help="the directory to store bugreport for crashes") 2094010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu opts, arguments = option_parser.parse_args() 2104010ac35b1e49d659d7a32cc191302b8e2d8758aGuang Zhu main(opts, arguments) 211