xref: /aosp_15_r20/external/autotest/client/bin/telemetry_check.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/python3
2*9c5db199SXin Li#
3*9c5db199SXin Li# Copyright 2016 The Chromium OS Authors. All rights reserved.
4*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
5*9c5db199SXin Li# found in the LICENSE file.
6*9c5db199SXin Li'''Confidence tests for Chrome on ChromeOS.
7*9c5db199SXin Li
8*9c5db199SXin LiThis script runs a number of confidence tests to ensure that Chrome browser on
9*9c5db199SXin LiChromeOS is functional.
10*9c5db199SXin Li'''
11*9c5db199SXin Li
12*9c5db199SXin Lifrom __future__ import absolute_import
13*9c5db199SXin Lifrom __future__ import division
14*9c5db199SXin Lifrom __future__ import print_function
15*9c5db199SXin Li
16*9c5db199SXin Liimport argparse
17*9c5db199SXin Liimport datetime
18*9c5db199SXin Liimport logging
19*9c5db199SXin Liimport sys
20*9c5db199SXin Li
21*9c5db199SXin Li# This sets up import paths for autotest.
22*9c5db199SXin Liimport common
23*9c5db199SXin Lifrom autotest_lib.client.bin import utils
24*9c5db199SXin Lifrom autotest_lib.client.common_lib.cros import arc, arc_common, chrome
25*9c5db199SXin Lifrom autotest_lib.client.common_lib.error import TestFail
26*9c5db199SXin Lifrom autotest_lib.client.cros import cryptohome
27*9c5db199SXin Lifrom six.moves import range
28*9c5db199SXin Li
29*9c5db199SXin Li
30*9c5db199SXin Liclass TelemetryCheck(object):
31*9c5db199SXin Li    """Class for running confidence tests to verify telemetry."""
32*9c5db199SXin Li
33*9c5db199SXin Li    def __init__(self,
34*9c5db199SXin Li                 count=1,
35*9c5db199SXin Li                 run_cryptohome=True,
36*9c5db199SXin Li                 run_incognito=True,
37*9c5db199SXin Li                 run_screenlock=True):
38*9c5db199SXin Li        self.count = count
39*9c5db199SXin Li        self.run_cryptohome = run_cryptohome
40*9c5db199SXin Li        self.run_incognito = run_incognito
41*9c5db199SXin Li        self.run_screenlock = run_screenlock
42*9c5db199SXin Li
43*9c5db199SXin Li    def Run(self):
44*9c5db199SXin Li        """Run tests."""
45*9c5db199SXin Li        start = datetime.datetime.now()
46*9c5db199SXin Li
47*9c5db199SXin Li        for i in range(self.count):
48*9c5db199SXin Li            if self.count > 1:
49*9c5db199SXin Li                logging.info('Starting iteration %d.', i)
50*9c5db199SXin Li            if self.run_cryptohome:
51*9c5db199SXin Li                self.RunCryptohomeTest()
52*9c5db199SXin Li            if self.run_incognito:
53*9c5db199SXin Li                self.RunIncognitoTest()
54*9c5db199SXin Li            if self.run_screenlock:
55*9c5db199SXin Li                self.RunScreenlockTest()
56*9c5db199SXin Li
57*9c5db199SXin Li        elapsed = datetime.datetime.now() - start
58*9c5db199SXin Li        logging.info('Tests succeeded in %s seconds.', elapsed.seconds)
59*9c5db199SXin Li
60*9c5db199SXin Li    def RunCryptohomeTest(self):
61*9c5db199SXin Li        """Test Cryptohome."""
62*9c5db199SXin Li        logging.info('RunCryptohomeTest: Starting chrome and logging in.')
63*9c5db199SXin Li        # Only run ARC tests for P.
64*9c5db199SXin Li        run_arc_tests = (utils.is_arc_available()
65*9c5db199SXin Li                         and arc.get_android_sdk_version() <= 28)
66*9c5db199SXin Li        arc_mode = arc_common.ARC_MODE_ENABLED if run_arc_tests else None
67*9c5db199SXin Li        with chrome.Chrome(arc_mode=arc_mode, num_tries=1) as cr:
68*9c5db199SXin Li            # Check that the cryptohome is mounted.
69*9c5db199SXin Li            # is_vault_mounted throws an exception if it fails.
70*9c5db199SXin Li            logging.info('Checking mounted cryptohome.')
71*9c5db199SXin Li            cryptohome.is_vault_mounted(user=cr.username, allow_fail=False)
72*9c5db199SXin Li            # Navigate to about:blank.
73*9c5db199SXin Li            tab = cr.browser.tabs[0]
74*9c5db199SXin Li            tab.Navigate('about:blank')
75*9c5db199SXin Li
76*9c5db199SXin Li            # Evaluate some javascript.
77*9c5db199SXin Li            logging.info('Evaluating JavaScript.')
78*9c5db199SXin Li            if tab.EvaluateJavaScript('2+2') != 4:
79*9c5db199SXin Li                raise TestFail('EvaluateJavaScript failed')
80*9c5db199SXin Li
81*9c5db199SXin Li            # ARC test.
82*9c5db199SXin Li            if run_arc_tests:
83*9c5db199SXin Li                arc.wait_for_adb_ready()
84*9c5db199SXin Li                logging.info('Android booted successfully.')
85*9c5db199SXin Li                arc.wait_for_android_process('org.chromium.arc.intent_helper')
86*9c5db199SXin Li                if not arc.is_package_installed('android'):
87*9c5db199SXin Li                    raise TestFail(
88*9c5db199SXin Li                            '"android" system package was not listed by '
89*9c5db199SXin Li                            'Package Manager.')
90*9c5db199SXin Li
91*9c5db199SXin Li        if run_arc_tests:
92*9c5db199SXin Li            utils.poll_for_condition(lambda: not arc.
93*9c5db199SXin Li                                     is_android_container_alive(),
94*9c5db199SXin Li                                     timeout=15,
95*9c5db199SXin Li                                     desc='Android container still running '
96*9c5db199SXin Li                                     'after Chrome shutdown.')
97*9c5db199SXin Li
98*9c5db199SXin Li    def RunIncognitoTest(self):
99*9c5db199SXin Li        """Test Incognito mode."""
100*9c5db199SXin Li        logging.info('RunIncognitoTest')
101*9c5db199SXin Li        with chrome.Chrome(logged_in=False):
102*9c5db199SXin Li            if not cryptohome.is_guest_vault_mounted():
103*9c5db199SXin Li                raise TestFail('Expected to find a guest vault mounted.')
104*9c5db199SXin Li        if cryptohome.is_guest_vault_mounted(allow_fail=True):
105*9c5db199SXin Li            raise TestFail('Expected to NOT find a guest vault mounted.')
106*9c5db199SXin Li
107*9c5db199SXin Li    def RunScreenlockTest(self):
108*9c5db199SXin Li        """Run a test that locks the screen."""
109*9c5db199SXin Li        logging.info('RunScreenlockTest')
110*9c5db199SXin Li        with chrome.Chrome(autotest_ext=True) as cr:
111*9c5db199SXin Li            cr.autotest_ext.ExecuteJavaScript(
112*9c5db199SXin Li                    'chrome.autotestPrivate.lockScreen();')
113*9c5db199SXin Li            utils.poll_for_condition(lambda: cr.login_status['isScreenLocked'],
114*9c5db199SXin Li                                     timeout=15,
115*9c5db199SXin Li                                     exception=TestFail('Screen not locked'))
116*9c5db199SXin Li
117*9c5db199SXin Li    @staticmethod
118*9c5db199SXin Li    def ParseArgs(argv):
119*9c5db199SXin Li        """Parse command line.
120*9c5db199SXin Li
121*9c5db199SXin Li    Args:
122*9c5db199SXin Li      argv: List of command line arguments.
123*9c5db199SXin Li
124*9c5db199SXin Li    Returns:
125*9c5db199SXin Li      List of parsed opts.
126*9c5db199SXin Li    """
127*9c5db199SXin Li        parser = argparse.ArgumentParser(description=__doc__)
128*9c5db199SXin Li        parser.add_argument('--count',
129*9c5db199SXin Li                            type=int,
130*9c5db199SXin Li                            default=1,
131*9c5db199SXin Li                            help='Number of iterations of the test to run.')
132*9c5db199SXin Li        parser.add_argument('--run-all',
133*9c5db199SXin Li                            default=False,
134*9c5db199SXin Li                            action='store_true',
135*9c5db199SXin Li                            help='Run all tests.')
136*9c5db199SXin Li        parser.add_argument('--run-cryptohome',
137*9c5db199SXin Li                            default=False,
138*9c5db199SXin Li                            action='store_true',
139*9c5db199SXin Li                            help='Run Cryptohome test.')
140*9c5db199SXin Li        parser.add_argument('--run-incognito',
141*9c5db199SXin Li                            default=False,
142*9c5db199SXin Li                            action='store_true',
143*9c5db199SXin Li                            help='Run Incognito test.')
144*9c5db199SXin Li        parser.add_argument('--run-screenlock',
145*9c5db199SXin Li                            default=False,
146*9c5db199SXin Li                            action='store_true',
147*9c5db199SXin Li                            help='Run Screenlock test.')
148*9c5db199SXin Li        return parser.parse_args(argv)
149*9c5db199SXin Li
150*9c5db199SXin Li
151*9c5db199SXin Lidef main(argv):
152*9c5db199SXin Li    '''The main function.'''
153*9c5db199SXin Li    opts = TelemetryCheck.ParseArgs(argv)
154*9c5db199SXin Li
155*9c5db199SXin Li    # Run all tests if none are specified.
156*9c5db199SXin Li    if opts.run_all or not (opts.run_cryptohome or opts.run_incognito
157*9c5db199SXin Li                            or opts.run_screenlock):
158*9c5db199SXin Li        opts.run_cryptohome = opts.run_screenlock = True
159*9c5db199SXin Li        opts.run_incognito = False  # crbug.com/970065
160*9c5db199SXin Li
161*9c5db199SXin Li    TelemetryCheck(opts.count, opts.run_cryptohome, opts.run_incognito,
162*9c5db199SXin Li                   opts.run_screenlock).Run()
163*9c5db199SXin Li
164*9c5db199SXin Li
165*9c5db199SXin Liif __name__ == '__main__':
166*9c5db199SXin Li    sys.exit(main(sys.argv[1:]))
167