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.
7 """Runs semi-automated update testing on a non-rooted device.
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.
12 ./update_verification.py create_app_data --old-apk <path> --app-data <path>
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.
17 Next, once you have some app data saved, run this script with the test_update
20 ./update_verification.py test_update --old-apk <path> --new-apk <path>
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.
33 from pylib
import constants
34 from pylib
.device
import device_errors
35 from pylib
.device
import device_utils
36 from pylib
.utils
import apk_helper
37 from pylib
.utils
import run_tests_helper
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
)
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 '
52 device_path
= device
.GetApplicationPaths(package_name
)
54 raise Exception('Expected package %s to already be installed. '
55 'Package name might have changed!' % package_name
)
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.')
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 command_parsers
= parser
.add_subparsers(dest
='command')
69 subparser
= command_parsers
.add_parser('create_app_data')
70 subparser
.add_argument('--old-apk', required
=True,
71 help='Path to apk to update from.')
72 subparser
.add_argument('--app-data', required
=True,
73 help='Path to where the app data backup should be '
75 subparser
.add_argument('--package-name',
76 help='Chrome apk package name.')
78 subparser
= command_parsers
.add_parser('test_update')
79 subparser
.add_argument('--old-apk', required
=True,
80 help='Path to apk to update from.')
81 subparser
.add_argument('--new-apk', required
=True,
82 help='Path to apk to update to.')
83 subparser
.add_argument('--app-data', required
=True,
84 help='Path to where the app data backup is saved.')
85 subparser
.add_argument('--package-name',
86 help='Chrome apk package name.')
88 args
= parser
.parse_args()
89 run_tests_helper
.SetLogLevel(args
.verbose
)
91 devices
= device_utils
.DeviceUtils
.HealthyDevices()
93 raise device_errors
.NoDevicesError()
95 logging
.info('Using device %s for testing.' % str(device
))
97 package_name
= (args
.package_name
if args
.package_name
98 else apk_helper
.GetPackageName(args
.old_apk
))
99 if args
.command
== 'create_app_data':
100 CreateAppData(device
, args
.old_apk
, args
.app_data
, package_name
)
101 elif args
.command
== 'test_update':
103 device
, args
.old_apk
, args
.new_apk
, args
.app_data
, package_name
)
105 raise Exception('Unknown test command: %s' % args
.command
)
107 if __name__
== '__main__':