Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 """Utility script to launch browser-tests on the Chromoting bot.""" | 6 """Utility script to launch browser-tests on the Chromoting bot.""" |
| 7 import argparse | 7 import argparse |
| 8 import glob | 8 import glob |
| 9 import hashlib | 9 import hashlib |
| 10 import os | 10 import os |
| 11 from os.path import expanduser | 11 from os.path import expanduser |
| 12 import shutil | 12 import shutil |
| 13 import socket | 13 import socket |
| 14 import subprocess | 14 import subprocess |
| 15 | 15 |
| 16 import psutil | 16 import psutil |
| 17 | 17 |
| 18 BROWSER_TEST_ID = 'browser_tests' | 18 BROWSER_TEST_ID = 'browser_tests' |
| 19 PROD_DIR_ID = '#PROD_DIR#' | 19 PROD_DIR_ID = '#PROD_DIR#' |
| 20 HOST_HASH_VALUE = hashlib.md5(socket.gethostname()).hexdigest() | 20 HOST_HASH_VALUE = hashlib.md5(socket.gethostname()).hexdigest() |
| 21 SUCCESS_INDICATOR = 'SUCCESS: all tests passed.' | 21 SUCCESS_INDICATOR = 'SUCCESS: all tests passed.' |
| 22 NATIVE_MESSAGING_DIR = 'NativeMessagingHosts' | 22 NATIVE_MESSAGING_DIR = 'NativeMessagingHosts' |
| 23 CRD_ID = 'chrome-remote-desktop' # Used in a few file/folder names | 23 CRD_ID = 'chrome-remote-desktop' # Used in a few file/folder names |
| 24 CHROMOTING_HOST_PATH = '/opt/google/chrome-remote-desktop/chrome-remote-desktop' | 24 CHROMOTING_HOST_PATH = '/opt/google/chrome-remote-desktop/chrome-remote-desktop' |
| 25 TEST_FAILURE = False | 25 TEST_FAILURE = False |
| 26 FAILING_TESTS = '' | 26 FAILING_TESTS = '' |
| 27 HOST_READY_INDICATOR = 'Host ready to receive connections.' | 27 HOST_READY_INDICATOR = 'Host ready to receive connections.' |
| 28 BROWSER_NOT_STARTED_ERROR = ( | |
| 29 'Still waiting for the following processes to finish') | |
| 30 TIME_OUT_INDICATOR = '(TIMED OUT)' | |
| 28 | 31 |
| 29 | 32 |
| 30 def LaunchBTCommand(command): | 33 def LaunchBTCommand(args, command): |
| 34 """Launches the specified browser-test command. | |
| 35 | |
| 36 If the execution failed because a browser-instance was not launched, retry | |
| 37 once. | |
| 38 Args: | |
| 39 args: Command line args, used for test-case startup tasks. | |
| 40 command: Browser-test command line. | |
| 41 """ | |
| 31 global TEST_FAILURE, FAILING_TESTS | 42 global TEST_FAILURE, FAILING_TESTS |
| 32 results = RunCommandInSubProcess(command) | 43 results = RunCommandInSubProcess(command) |
| 33 | 44 |
|
joedow
2015/06/09 23:59:32
I think you should move the TestCaseSetup() call f
anandc
2015/06/10 01:02:12
Done.
| |
| 45 # Sometimes, during execution of browser-tests, a browser instance is | |
| 46 # not started and the test times out. See http://crbug/480025. | |
| 47 # To work around it, check if this execution failed owing to that | |
| 48 # problem and retry. | |
| 49 # There are 2 things to look for in the results: | |
| 50 # A line saying "Still waiting for the following processes to finish", | |
| 51 # and, because sometimes that line gets logged even if the test | |
| 52 # eventually passes, we'll also look for "(TIMED OUT)", before retrying. | |
|
joedow
2015/06/09 23:59:32
Just curious, is there an error code we can key of
anandc
2015/06/10 01:02:12
There doesn't seem to be a special error code for
| |
| 53 if BROWSER_NOT_STARTED_ERROR in results and TIME_OUT_INDICATOR in results: | |
| 54 # Retry test execution once. | |
| 55 TestCaseSetup(args) | |
| 56 results = RunCommandInSubProcess(command) | |
| 57 | |
| 34 # Check that the test passed. | 58 # Check that the test passed. |
| 35 if SUCCESS_INDICATOR not in results: | 59 if SUCCESS_INDICATOR not in results: |
| 36 TEST_FAILURE = True | 60 TEST_FAILURE = True |
| 37 # Add this command-line to list of tests that failed. | 61 # Add this command-line to list of tests that failed. |
| 38 FAILING_TESTS += command | 62 FAILING_TESTS += command |
| 39 | 63 |
| 40 | 64 |
| 41 def RunCommandInSubProcess(command): | 65 def RunCommandInSubProcess(command): |
| 42 """Creates a subprocess with command-line that is passed in. | 66 """Creates a subprocess with command-line that is passed in. |
| 43 | 67 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 166 | 190 |
| 167 def PrintRunningProcesses(): | 191 def PrintRunningProcesses(): |
| 168 processes = psutil.get_process_list() | 192 processes = psutil.get_process_list() |
| 169 processes = sorted(processes, key=lambda process: process.name) | 193 processes = sorted(processes, key=lambda process: process.name) |
| 170 | 194 |
| 171 print 'List of running processes:\n' | 195 print 'List of running processes:\n' |
| 172 for process in processes: | 196 for process in processes: |
| 173 print process.name | 197 print process.name |
| 174 | 198 |
| 175 | 199 |
| 200 def TestCaseSetup(args): | |
| 201 # Stop+start me2me host process. | |
| 202 if not RestartMe2MeHost(): | |
| 203 # Host restart failed. Don't run any more tests. | |
| 204 raise Exception('Host restart failed.') | |
| 205 | |
| 206 # Reset the user profile directory to start each test with a clean slate. | |
| 207 SetupUserProfileDir(args.me2me_manifest_file, args.it2me_manifest_file, | |
| 208 args.user_profile_dir) | |
| 209 | |
| 210 | |
| 176 def main(args): | 211 def main(args): |
| 177 | 212 |
| 178 InitialiseTestMachineForLinux(args.cfg_file) | 213 InitialiseTestMachineForLinux(args.cfg_file) |
| 179 | 214 |
| 180 with open(args.commands_file) as f: | 215 with open(args.commands_file) as f: |
| 181 for line in f: | 216 for line in f: |
| 182 # Reset the user profile directory to start each test with a clean slate. | 217 TestCaseSetup(args) |
| 183 SetupUserProfileDir(args.me2me_manifest_file, args.it2me_manifest_file, | |
| 184 args.user_profile_dir) | |
| 185 | |
| 186 # Replace the PROD_DIR value in the command-line with | 218 # Replace the PROD_DIR value in the command-line with |
| 187 # the passed in value. | 219 # the passed in value. |
| 188 line = line.replace(PROD_DIR_ID, args.prod_dir) | 220 line = line.replace(PROD_DIR_ID, args.prod_dir) |
| 189 # Launch specified command line for test. | 221 # Launch specified command line for test. |
| 190 LaunchBTCommand(line) | 222 LaunchBTCommand(args, line) |
| 191 # After each test, stop+start me2me host process. | |
| 192 if not RestartMe2MeHost(): | |
| 193 # Host restart failed. Don't run any more tests. | |
| 194 raise Exception('Host restart failed.') | |
| 195 | |
| 196 # Print list of currently running processes. | |
| 197 PrintRunningProcesses() | |
| 198 | 223 |
| 199 # All tests completed. Include host-logs in the test results. | 224 # All tests completed. Include host-logs in the test results. |
| 200 host_log_contents = '' | 225 host_log_contents = '' |
| 201 # There should be only 1 log file, as we delete logs on test completion. | 226 # There should be only 1 log file, as we delete logs on test completion. |
| 202 # Loop through matching files, just in case there are more. | 227 # Loop through matching files, just in case there are more. |
| 203 for log_file in glob.glob('/tmp/chrome_remote_desktop_*'): | 228 for log_file in glob.glob('/tmp/chrome_remote_desktop_*'): |
| 204 with open(log_file, 'r') as log: | 229 with open(log_file, 'r') as log: |
| 205 host_log_contents += '\nHOST LOG %s\n CONTENTS:\n%s' % ( | 230 host_log_contents += '\nHOST LOG %s\n CONTENTS:\n%s' % ( |
| 206 log_file, log.read()) | 231 log_file, log.read()) |
| 207 print host_log_contents | 232 print host_log_contents |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 228 help='path to it2me host manifest file.') | 253 help='path to it2me host manifest file.') |
| 229 parser.add_argument( | 254 parser.add_argument( |
| 230 '-u', '--user_profile_dir', | 255 '-u', '--user_profile_dir', |
| 231 help='path to user-profile-dir, used by connect-to-host tests.') | 256 help='path to user-profile-dir, used by connect-to-host tests.') |
| 232 command_line_args = parser.parse_args() | 257 command_line_args = parser.parse_args() |
| 233 try: | 258 try: |
| 234 main(command_line_args) | 259 main(command_line_args) |
| 235 finally: | 260 finally: |
| 236 # Stop host and cleanup user-profile-dir. | 261 # Stop host and cleanup user-profile-dir. |
| 237 TestMachineCleanup(command_line_args.user_profile_dir) | 262 TestMachineCleanup(command_line_args.user_profile_dir) |
| OLD | NEW |