Index: chrome/browser/sync/test/live_sync/sync_integration_test.py |
diff --git a/chrome/browser/sync/test/live_sync/sync_integration_test.py b/chrome/browser/sync/test/live_sync/sync_integration_test.py |
deleted file mode 100644 |
index 17ed8769a23996fff6536d894e5bf5f7851652cf..0000000000000000000000000000000000000000 |
--- a/chrome/browser/sync/test/live_sync/sync_integration_test.py |
+++ /dev/null |
@@ -1,404 +0,0 @@ |
-#!/usr/bin/python2.4 |
-# |
-# Copyright 2009 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
- |
-"""A tool to run a chrome sync integration test, used by the buildbot slaves. |
- |
- When this is run, the current directory (cwd) should be the outer build |
- directory (e.g., chrome-release/build/). |
- |
- For a list of command-line options, call this script with '--help'. |
-""" |
- |
-__author__ = 'tejasshah@chromium.org' |
- |
- |
-import logging |
-import optparse |
-import os |
-import re |
-import subprocess |
-import sys |
-import tempfile |
-import time |
-import urllib2 |
- |
- |
-USAGE = '%s [options] [test args]' % os.path.basename(sys.argv[0]) |
-HTTP_SERVER_URL = None |
-HTTP_SERVER_PORT = None |
- |
- |
-class PathNotFound(Exception): pass |
- |
- |
-def ListSyncTests(test_exe_path): |
- """Returns list of the enabled live sync tests. |
- |
- Args: |
- test_exe_path: Absolute path to test exe file. |
- |
- Returns: |
- List of the tests that should be run. |
- """ |
- command = [test_exe_path] |
- command.append('--gtest_list_tests') |
- proc = subprocess.Popen( |
- command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1) |
- proc.wait() |
- sys.stdout.flush() |
- test_list = [] |
- for line in proc.stdout.readlines(): |
- if not line.strip(): |
- continue |
- elif line.count("."): # A new test collection |
- test_collection = line.split(".")[0].strip(); |
- else: # An individual test to run |
- test_name = line.strip() |
- test_list.append("%s.%s" % (test_collection, test_name)) |
- logging.info('List of tests to run: %s' % (test_list)) |
- return test_list |
- |
- |
-def GetUrl(command, port): |
- """Prepares the URL with appropriate command to send it to http server. |
- |
- Args: |
- command: Command for HTTP server |
- port: Port number as a parameter to the command |
- |
- Returns: |
- Formulated URL with the command and parameter. |
- """ |
- command_url = ( |
- '%s:%s/%s?port=%s' |
- % (HTTP_SERVER_URL, HTTP_SERVER_PORT, command, port)) |
- return command_url |
- |
- |
-def StartSyncServer(port=None): |
- """Starts a chrome sync server. |
- |
- Args: |
- port: Port number on which sync server to start |
- (Default value none, in this case it uses random port). |
- |
- Returns: |
- If success then port number on which sync server started, else None. |
- """ |
- sync_port = None |
- if port: |
- start_sync_server_url = GetUrl('startsyncserver', port) |
- else: |
- start_sync_server_url = ( |
- '%s:%s/%s' % (HTTP_SERVER_URL, HTTP_SERVER_PORT, 'startsyncserver')) |
- req = urllib2.Request(start_sync_server_url) |
- try: |
- response = urllib2.urlopen(req) |
- except urllib2.HTTPError, e: |
- logging.error( |
- 'Could not start sync server, something went wrong.' |
- 'Request URL: %s , Error Code: %s'% (start_sync_server_url, e.code)) |
- return sync_port |
- except urllib2.URLError, e: |
- logging.error( |
- 'Failed to reach HTTP server.Request URL: %s , Error: %s' |
- % (start_sync_server_url, e.reason)) |
- return sync_port |
- else: |
- # Let's read response and parse the sync server port number. |
- output = response.readlines() |
- # Regex to ensure that sync server started and extract the port number. |
- regex = re.compile( |
- ".*not.*running.*on.*port\s*:\s*(\d+).*started.*new.*sync.*server", |
- re.IGNORECASE|re.MULTILINE|re.DOTALL) |
- r = regex.search(output[0]) |
- if r: |
- sync_port = r.groups()[0] |
- if sync_port: |
- logging.info( |
- 'Started Sync Server Successfully on Port:%s. Request URL: %s , ' |
- 'Response: %s' % (sync_port, start_sync_server_url, output)) |
- response.fp._sock.recv = None |
- response.close() |
- return sync_port |
- |
- |
-def CheckIfSyncServerRunning(port): |
- """Check the healthz status of a chrome sync server. |
- |
- Args: |
- port: Port number on which sync server is running |
- |
- Returns: |
- True: If sync server running. |
- False: Otherwise. |
- """ |
- sync_server_healthz_url = ('%s:%s/healthz' % (HTTP_SERVER_URL, port)) |
- req = urllib2.Request(sync_server_healthz_url) |
- try: |
- response = urllib2.urlopen(req) |
- except urllib2.HTTPError, e: |
- logging.error( |
- 'It seems like Sync Server is not running, healthz check failed.' |
- 'Request URL: %s , Error Code: %s'% (sync_server_healthz_url, e.code)) |
- return False |
- except urllib2.URLError, e: |
- logging.error( |
- 'Failed to reach Sync server, healthz check failed.' |
- 'Request URL: %s , Error: %s'% (sync_server_healthz_url, e.reason)) |
- return False |
- else: |
- logging.info( |
- 'Sync Server healthz check Passed.Request URL: %s , Response: %s' |
- % (sync_server_healthz_url, response.readlines())) |
- response.fp._sock.recv = None |
- response.close() |
- return True |
- |
- |
-def StopSyncServer(port): |
- """Stops a chrome sync server. |
- |
- Args: |
- port: Port number on which sync server to Stop |
- |
- Returns: |
- Success/Failure as a bool value. |
- """ |
- stop_sync_server_url = GetUrl('stopsyncserver', port) |
- req = urllib2.Request(stop_sync_server_url) |
- logging.info("Stopping: %s" % stop_sync_server_url) |
- try: |
- response = urllib2.urlopen(req) |
- except urllib2.HTTPError, e: |
- logging.error( |
- 'Could not stop sync server, something went wrong.' |
- 'Request URL: %s , Error Code: %s'% (stop_sync_server_url, e.code)) |
- return False |
- except urllib2.URLError, e: |
- logging.error( |
- 'Failed to reach HTTP server.Request URL: %s , Error: %s' |
- % (stop_sync_server_url, e.reason)) |
- return False |
- else: |
- logging.info( |
- 'Stopped Sync Server Successfully.Request URL: %s , Response: %s' |
- % (stop_sync_server_url, response.readlines())) |
- response.fp._sock.recv = None |
- response.close() |
- return True |
- |
- |
-def ShowGtestLikeFailure(test_exe_path, test_name): |
- """Show a gtest-like error when the test can't be run for some reason. |
- |
- The scripts responsible for detecting test failures watch for this pattern. |
- |
- Args: |
- test_exe_path: Absolute path to the test exe file. |
- test_name: The name of the test that wasn't run. |
- """ |
- print '[ RUN ] %s.%s' % (os.path.basename(test_exe_path), test_name) |
- print '[ FAILED ] %s.%s' % (os.path.basename(test_exe_path), test_name) |
- |
- |
-def RunCommand(command): |
- """Runs the command list, printing its output and returning its exit status. |
- |
- Prints the given command (which should be a list of one or more strings), |
- then runs it and prints its stdout and stderr together to stdout, |
- line-buffered, converting line endings to CRLF (see note below). Waits for |
- the command to terminate and returns its status. |
- |
- Args: |
- command: Command to run. |
- |
- Returns: |
- Process exit code. |
- """ |
- print '\n' + subprocess.list2cmdline(command) + '\n', |
- proc = subprocess.Popen(command, stdout=subprocess.PIPE, |
- stderr=subprocess.STDOUT, bufsize=1) |
- last_flush_time = time.time() |
- while proc.poll() == None: |
- # Note that Windows Python converts \n to \r\n automatically whenever it |
- # encounters it written to a text file (including stdout). The only way |
- # around it is to write to a binary file, which isn't feasible for stdout. |
- # So we're stuck with \r\n here even though we explicitly write \n. (We |
- # could write \r instead, which doesn't get converted to \r\n, but that's |
- # probably more troublesome for people trying to read the files.) |
- line = proc.stdout.readline() |
- if line: |
- # The comma at the end tells python to not add \n, which is \r\n on |
- # Windows. |
- print line.rstrip() + '\n', |
- # Python on windows writes the buffer only when it reaches 4k. This is |
- # not fast enough. Flush each 10 seconds instead. |
- if time.time() - last_flush_time >= 10: |
- sys.stdout.flush() |
- last_flush_time = time.time() |
- sys.stdout.flush() |
- # Write the remaining buffer. |
- for line in proc.stdout.readlines(): |
- print line.rstrip() + '\n', |
- sys.stdout.flush() |
- return proc.returncode |
- |
- |
-def RunOneTest(test_exe_path, test_name, username, password): |
- """Run one live sync test after setting up a fresh server environment. |
- |
- Args: |
- test_exe_path: Absolute path to test exe file. |
- test_name: the name of the one test to run. |
- username: test account username. |
- password: test account password. |
- |
- Returns: |
- Zero for suceess. |
- Non-zero for failure. |
- """ |
- def LogTestNotRun(message): |
- ShowGtestLikeFailure(test_exe_path, test_name) |
- logging.info('\n\n%s did not run because %s' % (test_name, message)) |
- |
- try: |
- logging.info('\n\n*************************************') |
- logging.info('%s Start' % (test_name)) |
- sync_port = StartSyncServer() |
- if not sync_port: |
- LogTestNotRun('starting the sync server failed.') |
- return 1 |
- if not CheckIfSyncServerRunning(sync_port): |
- LogTestNotRun('sync server running check failed.') |
- return 1 |
- logging.info('Verified that sync server is running on port: %s', sync_port) |
- user_dir = GenericSetup(test_name) |
- logging.info('Created user data dir %s' % (user_dir)) |
- command = [ |
- test_exe_path, |
- '--gtest_filter='+ test_name, |
- '--user-data-dir=' + user_dir, |
- '--sync-user-for-test=' + username, |
- '--sync-password-for-test=' + password, |
- '--sync-url=' + HTTP_SERVER_URL + ':' + sync_port] |
- logging.info( |
- '%s will run with command: %s' |
- % (test_name, subprocess.list2cmdline(command))) |
- result = RunCommand(command) |
- StopSyncServer(sync_port) |
- return result |
- finally: |
- logging.info('%s End' % (test_name)) |
- |
- |
-def GenericSetup(test_name): |
- """Generic setup for running one test. |
- |
- Args: |
- test_name: The name of a test that is about to be run. |
- |
- Returns: |
- user_dir: Absolute path to user data dir created for the test. |
- """ |
- user_dir = tempfile.mkdtemp(prefix=test_name + '.') |
- return user_dir |
- |
- |
-def main_win(options, args): |
- """Main Function for win32 platform which drives the test here. |
- |
- Using the target build configuration, run the executable given in the |
- first non-option argument, passing any following arguments to that |
- executable. |
- |
- Args: |
- options: Option parameters. |
- args: Test arguments. |
- |
- Returns: |
- Result: Zero for success/ Non-zero for failure. |
- """ |
- final_result = 0 |
- test_exe = 'sync_integration_tests.exe' |
- build_dir = os.path.abspath(options.build_dir) |
- test_exe_path = os.path.join(build_dir, options.target, test_exe) |
- if not os.path.exists(test_exe_path): |
- raise PathNotFound('Unable to find %s' % test_exe_path) |
- test_list = ListSyncTests(test_exe_path) |
- for test_name in test_list: |
- result = RunOneTest( |
- test_exe_path, test_name, options.sync_test_username, |
- options.sync_test_password) |
- # If any single test fails then final result should be failure |
- if result != 0: |
- final_result = result |
- return final_result |
- |
-if '__main__' == __name__: |
- # Initialize logging. |
- log_level = logging.INFO |
- logging.basicConfig( |
- level=log_level, format='%(asctime)s %(filename)s:%(lineno)-3d' |
- ' %(levelname)s %(message)s', datefmt='%y%m%d %H:%M:%S') |
- |
- option_parser = optparse.OptionParser(usage=USAGE) |
- |
- # Since the trailing program to run may have has command-line args of its |
- # own, we need to stop parsing when we reach the first positional argument. |
- option_parser.disable_interspersed_args() |
- |
- option_parser.add_option( |
- '', '--target', default='Release', help='Build target (Debug or Release)' |
- ' Default value Release.') |
- option_parser.add_option( |
- '', '--build-dir', help='Path to main build directory' |
- '(the parent of the Release or Debug directory).') |
- option_parser.add_option( |
- '', '--http-server-url', help='Path to http server that can be used to' |
- ' start/stop sync server e.g. http://http_server_url_without_port') |
- option_parser.add_option( |
- '', '--http-server-port', help='Port on which http server is running' |
- ' e.g. 1010') |
- option_parser.add_option( |
- '', '--sync-test-username', help='Test username e.g. foo@gmail.com') |
- option_parser.add_option( |
- '', '--sync-test-password', help='Password for the test account') |
- options, args = option_parser.parse_args() |
- if not options.sync_test_password: |
- # Check along side this script under src/ first, and then check in |
- # the user profile dir. |
- password_file_path = os.path.join( |
- os.path.dirname(__file__),'sync_password') |
- if (not os.path.exists(password_file_path)): |
- password_file_path = os.path.join( |
- os.environ['USERPROFILE'], 'sync_password') |
- |
- if os.path.exists(password_file_path): |
- fs = open(password_file_path, 'r') |
- lines = fs.readlines() |
- if len(lines)==1: |
- options.sync_test_password = lines[0].strip() |
- else: |
- sys.stderr.write('sync_password file is not in required format.\n') |
- sys.exit(1) |
- else: |
- sys.stderr.write( |
- 'Missing required parameter- sync_test_password, please fix it.\n') |
- sys.exit(1) |
- if (not options.build_dir or not options.http_server_url or |
- not options.http_server_port or not options.sync_test_username): |
- sys.stderr.write('Missing required parameter, please fix it.\n') |
- option_parser.print_help() |
- sys.exit(1) |
- if sys.platform == 'win32': |
- HTTP_SERVER_URL = options.http_server_url |
- HTTP_SERVER_PORT = options.http_server_port |
- sys.exit(main_win(options, args)) |
- else: |
- sys.stderr.write('Unknown sys.platform value %s\n' % repr(sys.platform)) |
- sys.exit(1) |