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