#!/usr/bin/python """Run page cycler tests using Android instrumentation. First, you need to get an SD card or sdcard image that has page cycler tests. Usage: Run a single page cycler test: run_page_cycler.py "file:///sdcard/android/page_cycler/moz/start.html?auto=1\&iterations=10" """ import logging import optparse import os import subprocess import sys import time def main(options, args): """Run the tests. Will call sys.exit when complete. """ # Set up logging format. log_level = logging.INFO if options.verbose: log_level = logging.DEBUG logging.basicConfig(level=log_level, format='%(message)s') # Include all tests if none are specified. if not args: print "need a URL, e.g. file:///sdcard/android/page_cycler/moz/start.html" sys.exit(1) else: path = ' '.join(args); adb_cmd = "adb "; if options.adb_options: adb_cmd += options.adb_options logging.info("Running the test ...") # Count crashed tests. crashed_tests = [] timeout_ms = '0' if options.time_out_ms: timeout_ms = options.time_out_ms # Run test until it's done run_load_test_cmd_prefix = adb_cmd + " shell am instrument" run_load_test_cmd_postfix = " -w com.android.dumprendertree/.LayoutTestsAutoRunner" # Call LoadTestsAutoTest::runTest. run_load_test_cmd = run_load_test_cmd_prefix + " -e class com.android.dumprendertree.LoadTestsAutoTest#runPageCyclerTest -e path \"" + path + "\" -e timeout " + timeout_ms if options.drawtime: run_load_test_cmd += " -e drawtime true " if options.save_image: run_load_test_cmd += " -e saveimage \"%s\"" % options.save_image run_load_test_cmd += run_load_test_cmd_postfix (adb_output, adb_error) = subprocess.Popen(run_load_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() fail_flag = False for line in adb_output.splitlines(): line = line.strip() if line.find('INSTRUMENTATION_CODE') == 0: if not line[22:] == '-1': fail_flag = True break if (line.find('INSTRUMENTATION_FAILED') != -1 or line.find('Process crashed.') != -1): fail_flag = True break if fail_flag: logging.error("Error happened : " + adb_output) sys.exit(1) logging.info(adb_output); logging.info(adb_error); logging.info("Done\n"); # Pull results from /sdcard/load_test_result.txt results_dir = options.results_directory if not os.path.exists(results_dir): os.makedirs(results_dir) if not os.path.isdir(results_dir): logging.error("Cannot create results dir: " + results_dir) sys.exit(1) result_file = "/sdcard/load_test_result.txt" shell_cmd_str = adb_cmd + " pull " + result_file + " " + results_dir (adb_output, err) = subprocess.Popen( shell_cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() if not os.path.isfile(os.path.join(results_dir, "load_test_result.txt")): logging.error("Failed to pull result file.") logging.error("adb stdout:") logging.error(adb_output) logging.error("adb stderr:") logging.error(err) logging.info("Results are stored under: " + results_dir + "/load_test_result.txt\n") if '__main__' == __name__: option_parser = optparse.OptionParser() option_parser.add_option("-t", "--time-out-ms", default=None, help="set the timeout for each test") option_parser.add_option("-v", "--verbose", action="store_true", default=False, help="include debug-level logging") option_parser.add_option("-a", "--adb-options", default=None, help="pass options to adb, such as -d -e, etc"); option_parser.add_option("-r", "--results-directory", default="layout-test-results", help="directory which results are stored.") option_parser.add_option("-d", "--drawtime", action="store_true", default=False, help="log draw time for each page rendered.") option_parser.add_option("-s", "--save-image", default=None, help="stores rendered page to a location on device.") options, args = option_parser.parse_args(); main(options, args)