xref: /aosp_15_r20/external/cronet/testing/chromoting/browser_tests_launcher.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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