Home | History | Annotate | Download | only in android
      1 #!/usr/bin/env python
      2 #
      3 # Copyright 2013 The Chromium Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 """Runs semi-automated update testing on a non-rooted device.
      8 
      9 This script will help verify that app data is preserved during an update.
     10 To use this script first run it with the create_app_data option.
     11 
     12 ./update_verification.py create_app_data --old-apk <path> --app-data <path>
     13 
     14 The script will then install the old apk, prompt you to create some app data
     15 (bookmarks, etc.), and then save the app data in the path you gave it.
     16 
     17 Next, once you have some app data saved, run this script with the test_update
     18 option.
     19 
     20 ./update_verification.py test_update --old-apk <path> --new-apk <path>
     21 --app-data <path>
     22 
     23 This will install the old apk, load the saved app data, install the new apk,
     24 and ask the user to verify that all of the app data was preserved.
     25 """
     26 
     27 import argparse
     28 import logging
     29 import sys
     30 
     31 import devil_chromium
     32 
     33 from devil.android import apk_helper
     34 from devil.android import device_blacklist
     35 from devil.android import device_errors
     36 from devil.android import device_utils
     37 from devil.utils import run_tests_helper
     38 
     39 def CreateAppData(device, old_apk, app_data, package_name):
     40   device.Install(old_apk)
     41   raw_input('Set the application state. Once ready, press enter and '
     42             'select "Backup my data" on the device.')
     43   device.adb.Backup(app_data, packages=[package_name])
     44   logging.critical('Application data saved to %s', app_data)
     45 
     46 def TestUpdate(device, old_apk, new_apk, app_data, package_name):
     47   device.Install(old_apk)
     48   device.adb.Restore(app_data)
     49   # Restore command is not synchronous
     50   raw_input('Select "Restore my data" on the device. Then press enter to '
     51             'continue.')
     52   device_path = device.GetApplicationPaths(package_name)
     53   if not device_path:
     54     raise Exception('Expected package %s to already be installed. '
     55                     'Package name might have changed!' % package_name)
     56 
     57   logging.info('Verifying that %s can be overinstalled.', new_apk)
     58   device.adb.Install(new_apk, reinstall=True)
     59   logging.critical('Successfully updated to the new apk. Please verify that '
     60                    'the application data is preserved.')
     61 
     62 def main():
     63   parser = argparse.ArgumentParser(
     64       description="Script to do semi-automated upgrade testing.")
     65   parser.add_argument('-v', '--verbose', action='count',
     66                       help='Print verbose log information.')
     67   parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
     68   command_parsers = parser.add_subparsers(dest='command')
     69 
     70   subparser = command_parsers.add_parser('create_app_data')
     71   subparser.add_argument('--old-apk', required=True,
     72                          help='Path to apk to update from.')
     73   subparser.add_argument('--app-data', required=True,
     74                          help='Path to where the app data backup should be '
     75                            'saved to.')
     76   subparser.add_argument('--package-name',
     77                          help='Chrome apk package name.')
     78 
     79   subparser = command_parsers.add_parser('test_update')
     80   subparser.add_argument('--old-apk', required=True,
     81                          help='Path to apk to update from.')
     82   subparser.add_argument('--new-apk', required=True,
     83                          help='Path to apk to update to.')
     84   subparser.add_argument('--app-data', required=True,
     85                          help='Path to where the app data backup is saved.')
     86   subparser.add_argument('--package-name',
     87                          help='Chrome apk package name.')
     88 
     89   args = parser.parse_args()
     90   run_tests_helper.SetLogLevel(args.verbose)
     91 
     92   devil_chromium.Initialize()
     93 
     94   blacklist = (device_blacklist.Blacklist(args.blacklist_file)
     95                if args.blacklist_file
     96                else None)
     97 
     98   devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
     99   if not devices:
    100     raise device_errors.NoDevicesError()
    101   device = devices[0]
    102   logging.info('Using device %s for testing.', str(device))
    103 
    104   package_name = (args.package_name if args.package_name
    105                   else apk_helper.GetPackageName(args.old_apk))
    106   if args.command == 'create_app_data':
    107     CreateAppData(device, args.old_apk, args.app_data, package_name)
    108   elif args.command == 'test_update':
    109     TestUpdate(
    110         device, args.old_apk, args.new_apk, args.app_data, package_name)
    111   else:
    112     raise Exception('Unknown test command: %s' % args.command)
    113 
    114 if __name__ == '__main__':
    115   sys.exit(main())
    116