run_page_cycler.py revision ce8d9d1672e8321466aab745083233239422557d
1ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project#!/usr/bin/python 2ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 3ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project"""Run page cycler tests using Android instrumentation. 4ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 5ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project First, you need to get an SD card or sdcard image that has page cycler tests. 6ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 7ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Usage: 8ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Run a single page cycler test: 9ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project run_page_cycler.py "file:///sdcard/android/page_cycler/moz/start.html?auto=1\&iterations=10" 10ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project""" 11ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 12ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport logging 13ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport optparse 14ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport os 15ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport subprocess 16ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport sys 17ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport time 18ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 19ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 20ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 21ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectdef main(options, args): 22ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project """Run the tests. Will call sys.exit when complete. 23ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 24ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project """ 25ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 26ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project # Set up logging format. 27ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project log_level = logging.INFO 28ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if options.verbose: 29ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project log_level = logging.DEBUG 30ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project logging.basicConfig(level=log_level, 31ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project format='%(message)s') 32ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 33ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project # Include all tests if none are specified. 34ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if not args: 35ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project print "need a URL, e.g. file:///sdcard/android/page_cycler/moz/start.html" 36ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project sys.exit(1) 37ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project else: 38ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project path = ' '.join(args); 39ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 40ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project adb_cmd = "adb "; 41ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if options.adb_options: 42ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project adb_cmd += options.adb_options 43ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 44ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project logging.info("Running the test ...") 45ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 46ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project # Count crashed tests. 47ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project crashed_tests = [] 48ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 49ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project timeout_ms = '0' 50ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if options.time_out_ms: 51ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project timeout_ms = options.time_out_ms 52ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 53ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project # Run test until it's done 54ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 55ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project run_load_test_cmd_prefix = adb_cmd + " shell am instrument" 56ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project run_load_test_cmd_postfix = " -w com.android.dumprendertree/.LayoutTestsAutoRunner" 57ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 58ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project # Call LoadTestsAutoTest::runTest. 59309f464807fcf7e3055657e6f6d2de7882218fbaGuang Zhu run_load_test_cmd = run_load_test_cmd_prefix + " -e class com.android.dumprendertree.LoadTestsAutoTest#runPageCyclerTest -e path \"" + path + "\" -e timeout " + timeout_ms + run_load_test_cmd_postfix 60ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 61ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project (adb_output, adb_error) = subprocess.Popen(run_load_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 6260ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu fail_flag = False 6360ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu for line in adb_output.splitlines(): 6460ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu line = line.strip() 6560ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu if line.find('INSTRUMENTATION_CODE') == 0: 6660ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu if not line[22:] == '-1': 6760ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu fail_flag = True 6860ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu break 6960ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu if (line.find('INSTRUMENTATION_FAILED') != -1 or 7060ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu line.find('Process crashed.') != -1): 7160ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu fail_flag = True 7260ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu break 7360ef21a5daff22dca1c562da8d131c67c8587353Guang Zhu if fail_flag: 74ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project logging.error("Error happened : " + adb_output) 75ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project sys.exit(1) 76ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 77ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project logging.info(adb_output); 78ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project logging.info(adb_error); 79ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project logging.info("Done\n"); 80ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 81ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project # Pull results from /sdcard/load_test_result.txt 82ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project results_dir = options.results_directory 83ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if not os.path.exists(results_dir): 84ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project os.makedirs(results_dir) 85ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if not os.path.isdir(results_dir): 86ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project logging.error("Cannot create results dir: " + results_dir) 87ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project sys.exit(1) 88ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 89ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project result_file = "/sdcard/load_test_result.txt" 90ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project shell_cmd_str = adb_cmd + " pull " + result_file + " " + results_dir 91ce8d9d1672e8321466aab745083233239422557dGuang Zhu (adb_output, err) = subprocess.Popen( 92ce8d9d1672e8321466aab745083233239422557dGuang Zhu shell_cmd_str, shell=True, 93ce8d9d1672e8321466aab745083233239422557dGuang Zhu stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 94ce8d9d1672e8321466aab745083233239422557dGuang Zhu if not os.path.isfile(os.path.join(results_dir, "load_test_result.txt")): 95ce8d9d1672e8321466aab745083233239422557dGuang Zhu logging.error("Failed to pull result file.") 96ce8d9d1672e8321466aab745083233239422557dGuang Zhu logging.error("adb stdout:") 97ce8d9d1672e8321466aab745083233239422557dGuang Zhu logging.error(adb_output) 98ce8d9d1672e8321466aab745083233239422557dGuang Zhu logging.error("adb stderr:") 99ce8d9d1672e8321466aab745083233239422557dGuang Zhu logging.error(err) 100ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project logging.info("Results are stored under: " + results_dir + "/load_test_result.txt\n") 101ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 102ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectif '__main__' == __name__: 103ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project option_parser = optparse.OptionParser() 104ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project option_parser.add_option("", "--time-out-ms", 105ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project default=None, 106ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project help="set the timeout for each test") 107ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project option_parser.add_option("", "--verbose", action="store_true", 108ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project default=False, 109ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project help="include debug-level logging") 110ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project option_parser.add_option("", "--adb-options", 111ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project default=None, 112ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project help="pass options to adb, such as -d -e, etc"); 113ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project option_parser.add_option("", "--results-directory", 114ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project default="layout-test-results", 115ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project help="directory which results are stored.") 116ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 117ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project options, args = option_parser.parse_args(); 118ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project main(options, args) 119