| 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 = './remoting/host/linux/linux_me2me_host.py' |
| 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 = ( | 28 BROWSER_NOT_STARTED_ERROR = ( |
| 29 'Still waiting for the following processes to finish') | 29 'Still waiting for the following processes to finish') |
| 30 TIME_OUT_INDICATOR = '(TIMED OUT)' | 30 TIME_OUT_INDICATOR = '(TIMED OUT)' |
| 31 MAX_RETRIES = 1 | 31 MAX_RETRIES = 1 |
| 32 # On a Swarming bot where these tests are executed, a temp folder is created |
| 33 # under which the files specified in an .isolate are copied. This temp folder |
| 34 # has a random name, which we'll store here for use later. |
| 35 # Note that the test-execution always starts from the testing/chromoting folder |
| 36 # under the temp folder. |
| 37 ISOLATE_TEMP_FOLDER = os.path.abspath(os.path.join(os.getcwd(), '../..')) |
| 32 | 38 |
| 33 | 39 |
| 34 def LaunchBTCommand(args, command): | 40 def LaunchBTCommand(args, command): |
| 35 """Launches the specified browser-test command. | 41 """Launches the specified browser-test command. |
| 36 | 42 |
| 37 If the execution failed because a browser-instance was not launched, retry | 43 If the execution failed because a browser-instance was not launched, retry |
| 38 once. | 44 once. |
| 39 Args: | 45 Args: |
| 40 args: Command line args, used for test-case startup tasks. | 46 args: Command line args, used for test-case startup tasks. |
| 41 command: Browser-test command line. | 47 command: Browser-test command line. |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 def RestartMe2MeHost(): | 155 def RestartMe2MeHost(): |
| 150 """Stops and starts the Me2Me host on the test machine. | 156 """Stops and starts the Me2Me host on the test machine. |
| 151 | 157 |
| 152 Waits to confirm that host is ready to receive connections before returning. | 158 Waits to confirm that host is ready to receive connections before returning. |
| 153 | 159 |
| 154 Returns: | 160 Returns: |
| 155 True: if HOST_READY_INDICATOR is found in stdout, indicating host is ready. | 161 True: if HOST_READY_INDICATOR is found in stdout, indicating host is ready. |
| 156 False: if HOST_READY_INDICATOR not found in stdout. | 162 False: if HOST_READY_INDICATOR not found in stdout. |
| 157 """ | 163 """ |
| 158 | 164 |
| 165 # To start the host, we want to be in the temp-folder for this test execution. |
| 166 # Store the current folder to return back to it later. |
| 167 previous_directory = os.getcwd() |
| 168 os.chdir(ISOLATE_TEMP_FOLDER) |
| 169 |
| 159 # Stop chromoting host. | 170 # Stop chromoting host. |
| 160 RunCommandInSubProcess(CHROMOTING_HOST_PATH + ' --stop') | 171 RunCommandInSubProcess(CHROMOTING_HOST_PATH + ' --stop') |
| 161 # Start chromoting host. | 172 # Start chromoting host. |
| 162 results = RunCommandInSubProcess(CHROMOTING_HOST_PATH + ' --start') | 173 results = RunCommandInSubProcess(CHROMOTING_HOST_PATH + ' --start') |
| 174 |
| 175 os.chdir(previous_directory) |
| 163 # Confirm that the start process completed, and we got: | 176 # Confirm that the start process completed, and we got: |
| 164 # "Host ready to receive connections." in the log. | 177 # "Host ready to receive connections." in the log. |
| 165 if HOST_READY_INDICATOR not in results: | 178 if HOST_READY_INDICATOR not in results: |
| 166 return False | 179 return False |
| 167 return True | 180 return True |
| 168 | 181 |
| 169 | 182 |
| 170 def SetupUserProfileDir(me2me_manifest_file, it2me_manifest_file, | 183 def SetupUserProfileDir(me2me_manifest_file, it2me_manifest_file, |
| 171 user_profile_dir): | 184 user_profile_dir): |
| 172 """Sets up the Google Chrome user profile directory. | 185 """Sets up the Google Chrome user profile directory. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 with open(args.commands_file) as f: | 238 with open(args.commands_file) as f: |
| 226 for line in f: | 239 for line in f: |
| 227 # Replace the PROD_DIR value in the command-line with | 240 # Replace the PROD_DIR value in the command-line with |
| 228 # the passed in value. | 241 # the passed in value. |
| 229 line = line.replace(PROD_DIR_ID, args.prod_dir) | 242 line = line.replace(PROD_DIR_ID, args.prod_dir) |
| 230 # Launch specified command line for test. | 243 # Launch specified command line for test. |
| 231 LaunchBTCommand(args, line) | 244 LaunchBTCommand(args, line) |
| 232 | 245 |
| 233 # All tests completed. Include host-logs in the test results. | 246 # All tests completed. Include host-logs in the test results. |
| 234 host_log_contents = '' | 247 host_log_contents = '' |
| 235 # There should be only 1 log file, as we delete logs on test completion. | |
| 236 # Loop through matching files, just in case there are more. | |
| 237 for log_file in glob.glob('/tmp/chrome_remote_desktop_*'): | 248 for log_file in glob.glob('/tmp/chrome_remote_desktop_*'): |
| 238 with open(log_file, 'r') as log: | 249 with open(log_file, 'r') as log: |
| 239 host_log_contents += '\nHOST LOG %s\n CONTENTS:\n%s' % ( | 250 host_log_contents += '\nHOST LOG %s\n CONTENTS:\n%s' % ( |
| 240 log_file, log.read()) | 251 log_file, log.read()) |
| 241 print host_log_contents | 252 print host_log_contents |
| 242 | 253 |
| 243 # Was there any test failure? | |
| 244 if TEST_FAILURE: | 254 if TEST_FAILURE: |
| 245 print '++++++++++AT LEAST 1 TEST FAILED++++++++++' | 255 print '++++++++++AT LEAST 1 TEST FAILED++++++++++' |
| 246 print FAILING_TESTS.rstrip('\n') | 256 print FAILING_TESTS.rstrip('\n') |
| 247 print '++++++++++++++++++++++++++++++++++++++++++' | 257 print '++++++++++++++++++++++++++++++++++++++++++' |
| 248 raise Exception('At least one test failed.') | 258 raise Exception('At least one test failed.') |
| 249 | 259 |
| 250 if __name__ == '__main__': | 260 if __name__ == '__main__': |
| 251 | 261 |
| 252 parser = argparse.ArgumentParser() | 262 parser = argparse.ArgumentParser() |
| 253 parser.add_argument('-f', '--commands_file', | 263 parser.add_argument('-f', '--commands_file', |
| 254 help='path to file listing commands to be launched.') | 264 help='path to file listing commands to be launched.') |
| 255 parser.add_argument('-p', '--prod_dir', | 265 parser.add_argument('-p', '--prod_dir', |
| 256 help='path to folder having product and test binaries.') | 266 help='path to folder having product and test binaries.') |
| 257 parser.add_argument('-c', '--cfg_file', | 267 parser.add_argument('-c', '--cfg_file', |
| 258 help='path to test host config file.') | 268 help='path to test host config file.') |
| 259 parser.add_argument('--me2me_manifest_file', | 269 parser.add_argument('--me2me_manifest_file', |
| 260 help='path to me2me host manifest file.') | 270 help='path to me2me host manifest file.') |
| 261 parser.add_argument('--it2me_manifest_file', | 271 parser.add_argument('--it2me_manifest_file', |
| 262 help='path to it2me host manifest file.') | 272 help='path to it2me host manifest file.') |
| 263 parser.add_argument( | 273 parser.add_argument( |
| 264 '-u', '--user_profile_dir', | 274 '-u', '--user_profile_dir', |
| 265 help='path to user-profile-dir, used by connect-to-host tests.') | 275 help='path to user-profile-dir, used by connect-to-host tests.') |
| 266 command_line_args = parser.parse_args() | 276 command_line_args = parser.parse_args() |
| 267 try: | 277 try: |
| 268 main(command_line_args) | 278 main(command_line_args) |
| 269 finally: | 279 finally: |
| 270 # Stop host and cleanup user-profile-dir. | 280 # Stop host and cleanup user-profile-dir. |
| 271 TestMachineCleanup(command_line_args.user_profile_dir) | 281 TestMachineCleanup(command_line_args.user_profile_dir) |
| OLD | NEW |