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