Home | History | Annotate | Download | only in assets
      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 
     12 import logging
     13 import optparse
     14 import os
     15 import subprocess
     16 import sys
     17 import time
     18 
     19 
     20 
     21 def 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     print "  or remote:android-browser-test:80/page_cycler/"
     37     sys.exit(1)
     38   else:
     39     path = ' '.join(args);
     40 
     41   if path[:7] == "remote:":
     42     remote_path = path[7:]
     43   else:
     44     remote_path = None
     45 
     46   adb_cmd = "adb ";
     47   if options.adb_options:
     48     adb_cmd += options.adb_options
     49 
     50   logging.info("Running the test ...")
     51 
     52   # Count crashed tests.
     53   crashed_tests = []
     54 
     55   timeout_ms = '0'
     56   if options.time_out_ms:
     57     timeout_ms = options.time_out_ms
     58 
     59   # Run test until it's done
     60 
     61   run_load_test_cmd_prefix = adb_cmd + " shell am instrument"
     62   run_load_test_cmd_postfix = " -w com.android.dumprendertree/.LayoutTestsAutoRunner"
     63 
     64   # Call LoadTestsAutoTest::runTest.
     65   run_load_test_cmd = run_load_test_cmd_prefix + " -e class com.android.dumprendertree.LoadTestsAutoTest#runPageCyclerTest -e timeout " + timeout_ms
     66 
     67   if remote_path:
     68     if options.suite:
     69       run_load_test_cmd += " -e suite %s -e forward %s " % (options.suite,
     70                                                             remote_path)
     71     else:
     72       print "for network mode, need to specify --suite as well."
     73       sys.exit(1)
     74     if options.iteration:
     75       run_load_test_cmd += " -e iteration %s" % options.iteration
     76   else:
     77     run_load_test_cmd += " -e path \"%s\" " % path
     78 
     79 
     80   if options.drawtime:
     81     run_load_test_cmd += " -e drawtime true "
     82 
     83   if options.save_image:
     84     run_load_test_cmd += " -e saveimage \"%s\"" % options.save_image
     85 
     86   run_load_test_cmd += run_load_test_cmd_postfix
     87 
     88   (adb_output, adb_error) = subprocess.Popen(run_load_test_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
     89   fail_flag = False
     90   for line in adb_output.splitlines():
     91     line = line.strip()
     92     if line.find('INSTRUMENTATION_CODE') == 0:
     93       if not line[22:] == '-1':
     94         fail_flag = True
     95         break
     96     if (line.find('INSTRUMENTATION_FAILED') != -1 or
     97         line.find('Process crashed.') != -1):
     98       fail_flag = True
     99       break
    100   if fail_flag:
    101     logging.error("Error happened : " + adb_output)
    102     sys.exit(1)
    103 
    104   logging.info(adb_output);
    105   logging.info(adb_error);
    106   logging.info("Done\n");
    107 
    108   # Pull results from /sdcard/load_test_result.txt
    109   results_dir = options.results_directory
    110   if not os.path.exists(results_dir):
    111     os.makedirs(results_dir)
    112   if not os.path.isdir(results_dir):
    113     logging.error("Cannot create results dir: " + results_dir)
    114     sys.exit(1)
    115 
    116   result_file = "/sdcard/load_test_result.txt"
    117   shell_cmd_str = adb_cmd + " pull " + result_file + " " + results_dir
    118   (adb_output, err) = subprocess.Popen(
    119       shell_cmd_str, shell=True,
    120       stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
    121   if not os.path.isfile(os.path.join(results_dir, "load_test_result.txt")):
    122     logging.error("Failed to pull result file.")
    123     logging.error("adb stdout:")
    124     logging.error(adb_output)
    125     logging.error("adb stderr:")
    126     logging.error(err)
    127   logging.info("Results are stored under: " + results_dir + "/load_test_result.txt\n")
    128 
    129 if '__main__' == __name__:
    130   option_parser = optparse.OptionParser()
    131   option_parser.add_option("-t", "--time-out-ms",
    132                            default=None,
    133                            help="set the timeout for each test")
    134   option_parser.add_option("-v", "--verbose", action="store_true",
    135                            default=False,
    136                            help="include debug-level logging")
    137   option_parser.add_option("-a", "--adb-options",
    138                            default=None,
    139                            help="pass options to adb, such as -d -e, etc");
    140   option_parser.add_option("-r", "--results-directory",
    141                            default="layout-test-results",
    142                            help="directory which results are stored.")
    143 
    144   option_parser.add_option("-d", "--drawtime", action="store_true",
    145                            default=False,
    146                            help="log draw time for each page rendered.")
    147 
    148   option_parser.add_option("-s", "--save-image",
    149                            default=None,
    150                            help="stores rendered page to a location on device.")
    151 
    152   option_parser.add_option("-u", "--suite",
    153                            default=None,
    154                            help="(for network mode) specify the suite to"
    155                            " run by name")
    156 
    157   option_parser.add_option("-i", "--iteration",
    158                            default="5",
    159                            help="(for network mode) specify how many iterations"
    160                            " to run")
    161 
    162   options, args = option_parser.parse_args();
    163   main(options, args)
    164