1*6777b538SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard Worker"""Utility script to launch browser-tests on the Chromoting bot.""" 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Workerfrom __future__ import print_function 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Workerimport argparse 11*6777b538SAndroid Build Coastguard Workerimport time 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import CleanupUserProfileDir 14*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import GetJidFromHostLog 15*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import GetJidListFromTestResults 16*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import InitialiseTestMachineForLinux 17*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import MAX_RETRIES 18*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import PrintHostLogContents 19*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import PROD_DIR_ID 20*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import RunCommandInSubProcess 21*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import TestCaseSetup 22*6777b538SAndroid Build Coastguard Workerfrom chromoting_test_utilities import TestMachineCleanup 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard WorkerSUCCESS_INDICATOR = 'SUCCESS: all tests passed.' 25*6777b538SAndroid Build Coastguard WorkerTEST_FAILURE = False 26*6777b538SAndroid Build Coastguard WorkerFAILING_TESTS = '' 27*6777b538SAndroid Build Coastguard WorkerBROWSER_NOT_STARTED_ERROR = ( 28*6777b538SAndroid Build Coastguard Worker 'Still waiting for the following processes to finish') 29*6777b538SAndroid Build Coastguard WorkerTIME_OUT_INDICATOR = '(TIMED OUT)' 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Workerdef LaunchBTCommand(args, command): 33*6777b538SAndroid Build Coastguard Worker """Launches the specified browser-test command. 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker Retry if the execution failed because a browser-instance was not launched or 36*6777b538SAndroid Build Coastguard Worker because the JID used did not match the host-JID. 37*6777b538SAndroid Build Coastguard Worker Args: 38*6777b538SAndroid Build Coastguard Worker args: Command line args, used for test-case startup tasks. 39*6777b538SAndroid Build Coastguard Worker command: Browser-test command line. 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker Returns: 42*6777b538SAndroid Build Coastguard Worker host_log_file_names: Array of host logs created for this command, including 43*6777b538SAndroid Build Coastguard Worker retries. 44*6777b538SAndroid Build Coastguard Worker """ 45*6777b538SAndroid Build Coastguard Worker global TEST_FAILURE, FAILING_TESTS 46*6777b538SAndroid Build Coastguard Worker host_log_file_names = [] 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker retries = 0 49*6777b538SAndroid Build Coastguard Worker host_jid_mismatch = False 50*6777b538SAndroid Build Coastguard Worker host_jid = None 51*6777b538SAndroid Build Coastguard Worker while retries <= MAX_RETRIES: 52*6777b538SAndroid Build Coastguard Worker # TestCaseSetup restarts the me2me host, and sets up user-profile dir. 53*6777b538SAndroid Build Coastguard Worker # It returns the file-name of the me2me host log. 54*6777b538SAndroid Build Coastguard Worker # If we are attempting to run this test because of a JID-mismatch, don't 55*6777b538SAndroid Build Coastguard Worker # restart host. 56*6777b538SAndroid Build Coastguard Worker if host_jid_mismatch: 57*6777b538SAndroid Build Coastguard Worker # Cleanup user-profile directory, but don't restart host. 58*6777b538SAndroid Build Coastguard Worker CleanupUserProfileDir(args) 59*6777b538SAndroid Build Coastguard Worker else: 60*6777b538SAndroid Build Coastguard Worker host_log_file_names.append(TestCaseSetup(args)) 61*6777b538SAndroid Build Coastguard Worker # Parse the me2me host log to obtain the JID that the host registered. 62*6777b538SAndroid Build Coastguard Worker host_jid = GetJidFromHostLog(host_log_file_names[retries]) 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker results = RunCommandInSubProcess(command) 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker # Get the JID used by this test to connect a remote-host, if any. 67*6777b538SAndroid Build Coastguard Worker jids_used = GetJidListFromTestResults(results) 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker # Check for JID mismatch before checking for test success, so that we may 70*6777b538SAndroid Build Coastguard Worker # record instances where a test passed despite a JID mismatch. 71*6777b538SAndroid Build Coastguard Worker if jids_used and host_jid.rstrip() not in jids_used: 72*6777b538SAndroid Build Coastguard Worker host_jid_mismatch = True 73*6777b538SAndroid Build Coastguard Worker print('Host JID mismatch. JID in host log = %s.' % host_jid.rstrip()) 74*6777b538SAndroid Build Coastguard Worker print('Host JIDs used by test:') 75*6777b538SAndroid Build Coastguard Worker for jid in jids_used: 76*6777b538SAndroid Build Coastguard Worker print(jid) 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker if host_jid_mismatch: 79*6777b538SAndroid Build Coastguard Worker # The JID for the remote-host did not match the JID that was used for this 80*6777b538SAndroid Build Coastguard Worker # execution of the test. This happens because of a replication delay in 81*6777b538SAndroid Build Coastguard Worker # updating all instances of the Chromoting Directory Server. To 82*6777b538SAndroid Build Coastguard Worker # work-around this, sleep for 30s, which, based off a recent (08/2015) 83*6777b538SAndroid Build Coastguard Worker # query for average replication delay for Chromoting, should be sufficient 84*6777b538SAndroid Build Coastguard Worker # for the current JID value to have fully propagated. 85*6777b538SAndroid Build Coastguard Worker retries += 1 86*6777b538SAndroid Build Coastguard Worker time.sleep(30) 87*6777b538SAndroid Build Coastguard Worker continue 88*6777b538SAndroid Build Coastguard Worker if jids_used: 89*6777b538SAndroid Build Coastguard Worker print('JID used by test matched me2me host JID: %s' % host_jid) 90*6777b538SAndroid Build Coastguard Worker else: 91*6777b538SAndroid Build Coastguard Worker # There wasn't a mismatch and no JIDs were returned. If no JIDs were 92*6777b538SAndroid Build Coastguard Worker # returned, that means the test didn't use any JIDs, so there is nothing 93*6777b538SAndroid Build Coastguard Worker # further for us to do. 94*6777b538SAndroid Build Coastguard Worker pass 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker if SUCCESS_INDICATOR in results: 97*6777b538SAndroid Build Coastguard Worker break 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker # Sometimes, during execution of browser-tests, a browser instance is 100*6777b538SAndroid Build Coastguard Worker # not started and the test times out. See http://crbug/480025. 101*6777b538SAndroid Build Coastguard Worker # To work around it, check if this execution failed owing to that 102*6777b538SAndroid Build Coastguard Worker # problem and retry. 103*6777b538SAndroid Build Coastguard Worker # There are 2 things to look for in the results: 104*6777b538SAndroid Build Coastguard Worker # A line saying "Still waiting for the following processes to finish", 105*6777b538SAndroid Build Coastguard Worker # and, because sometimes that line gets logged even if the test 106*6777b538SAndroid Build Coastguard Worker # eventually passes, we'll also look for "(TIMED OUT)", before retrying. 107*6777b538SAndroid Build Coastguard Worker if BROWSER_NOT_STARTED_ERROR in results and TIME_OUT_INDICATOR in results: 108*6777b538SAndroid Build Coastguard Worker print('Browser-instance not started (http://crbug/480025). Retrying.') 109*6777b538SAndroid Build Coastguard Worker else: 110*6777b538SAndroid Build Coastguard Worker print('Test failed for unknown reason. Retrying.') 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker retries += 1 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker # Check that the test passed. 115*6777b538SAndroid Build Coastguard Worker if SUCCESS_INDICATOR not in results: 116*6777b538SAndroid Build Coastguard Worker TEST_FAILURE = True 117*6777b538SAndroid Build Coastguard Worker # Add this command-line to list of tests that failed. 118*6777b538SAndroid Build Coastguard Worker FAILING_TESTS += command 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker return host_log_file_names 121*6777b538SAndroid Build Coastguard Worker 122*6777b538SAndroid Build Coastguard Worker 123*6777b538SAndroid Build Coastguard Workerdef main(args): 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker InitialiseTestMachineForLinux(args.cfg_file) 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker host_log_files = [] 128*6777b538SAndroid Build Coastguard Worker with open(args.commands_file) as f: 129*6777b538SAndroid Build Coastguard Worker for line in f: 130*6777b538SAndroid Build Coastguard Worker # Replace the PROD_DIR value in the command-line with 131*6777b538SAndroid Build Coastguard Worker # the passed in value. 132*6777b538SAndroid Build Coastguard Worker line = line.replace(PROD_DIR_ID, args.prod_dir) 133*6777b538SAndroid Build Coastguard Worker # Launch specified command line for test. 134*6777b538SAndroid Build Coastguard Worker host_log_files.extend(LaunchBTCommand(args, line)) 135*6777b538SAndroid Build Coastguard Worker 136*6777b538SAndroid Build Coastguard Worker # All tests completed. Include host-logs in the test results. 137*6777b538SAndroid Build Coastguard Worker PrintHostLogContents(host_log_files) 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker return host_log_files 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 144*6777b538SAndroid Build Coastguard Worker parser.add_argument('-f', '--commands_file', 145*6777b538SAndroid Build Coastguard Worker help='path to file listing commands to be launched.') 146*6777b538SAndroid Build Coastguard Worker parser.add_argument('-p', '--prod_dir', 147*6777b538SAndroid Build Coastguard Worker help='path to folder having product and test binaries.') 148*6777b538SAndroid Build Coastguard Worker parser.add_argument('-c', '--cfg_file', 149*6777b538SAndroid Build Coastguard Worker help='path to test host config file.') 150*6777b538SAndroid Build Coastguard Worker parser.add_argument('--me2me_manifest_file', 151*6777b538SAndroid Build Coastguard Worker help='path to me2me host manifest file.') 152*6777b538SAndroid Build Coastguard Worker parser.add_argument('--it2me_manifest_file', 153*6777b538SAndroid Build Coastguard Worker help='path to it2me host manifest file.') 154*6777b538SAndroid Build Coastguard Worker parser.add_argument( 155*6777b538SAndroid Build Coastguard Worker '-u', '--user_profile_dir', 156*6777b538SAndroid Build Coastguard Worker help='path to user-profile-dir, used by connect-to-host tests.') 157*6777b538SAndroid Build Coastguard Worker command_line_args = parser.parse_args() 158*6777b538SAndroid Build Coastguard Worker host_logs = '' 159*6777b538SAndroid Build Coastguard Worker try: 160*6777b538SAndroid Build Coastguard Worker host_logs = main(command_line_args) 161*6777b538SAndroid Build Coastguard Worker if TEST_FAILURE: 162*6777b538SAndroid Build Coastguard Worker print('++++++++++AT LEAST 1 TEST FAILED++++++++++') 163*6777b538SAndroid Build Coastguard Worker print(FAILING_TESTS.rstrip('\n')) 164*6777b538SAndroid Build Coastguard Worker print('++++++++++++++++++++++++++++++++++++++++++') 165*6777b538SAndroid Build Coastguard Worker raise Exception('At least one test failed.') 166*6777b538SAndroid Build Coastguard Worker finally: 167*6777b538SAndroid Build Coastguard Worker # Stop host and cleanup user-profile-dir. 168*6777b538SAndroid Build Coastguard Worker TestMachineCleanup(command_line_args.user_profile_dir, host_logs) 169