xref: /aosp_15_r20/external/cronet/build/android/update_verification.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1#!/usr/bin/env vpython3
2#
3# Copyright 2013 The Chromium Authors
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
9This script will help verify that app data is preserved during an update.
10To 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
14The 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
17Next, once you have some app data saved, run this script with the test_update
18option.
19
20./update_verification.py test_update --old-apk <path> --new-apk <path>
21--app-data <path>
22
23This will install the old apk, load the saved app data, install the new apk,
24and ask the user to verify that all of the app data was preserved.
25"""
26
27import argparse
28import logging
29import sys
30
31import devil_chromium
32
33from devil.android import apk_helper
34from devil.android import device_denylist
35from devil.android import device_errors
36from devil.android import device_utils
37from devil.utils import run_tests_helper
38
39
40def CreateAppData(device, old_apk, app_data, package_name):
41  device.Install(old_apk)
42  input('Set the application state. Once ready, press enter and '
43        'select "Backup my data" on the device.')
44  device.adb.Backup(app_data, packages=[package_name])
45  logging.critical('Application data saved to %s', app_data)
46
47def TestUpdate(device, old_apk, new_apk, app_data, package_name):
48  device.Install(old_apk)
49  device.adb.Restore(app_data)
50  # Restore command is not synchronous
51  input('Select "Restore my data" on the device. Then press enter to '
52        'continue.')
53  if not device.IsApplicationInstalled(package_name):
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
62def 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('--denylist-file', help='Device denylist 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  denylist = (device_denylist.Denylist(args.denylist_file)
95              if args.denylist_file else None)
96
97  devices = device_utils.DeviceUtils.HealthyDevices(denylist)
98  if not devices:
99    raise device_errors.NoDevicesError()
100  device = devices[0]
101  logging.info('Using device %s for testing.', str(device))
102
103  package_name = (args.package_name if args.package_name
104                  else apk_helper.GetPackageName(args.old_apk))
105  if args.command == 'create_app_data':
106    CreateAppData(device, args.old_apk, args.app_data, package_name)
107  elif args.command == 'test_update':
108    TestUpdate(
109        device, args.old_apk, args.new_apk, args.app_data, package_name)
110  else:
111    raise Exception('Unknown test command: %s' % args.command)
112
113if __name__ == '__main__':
114  sys.exit(main())
115