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