12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#!/usr/bin/env python 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved. 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file. 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""Runs the WebDriver Java acceptance tests. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)This script is called from chrome/test/chromedriver/run_all_tests.py and reports 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)results using the buildbot annotation scheme. 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)For ChromeDriver documentation, refer to http://code.google.com/p/chromedriver. 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import optparse 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import shutil 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import sys 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import xml.dom.minidom as minidom 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch_THIS_DIR = os.path.abspath(os.path.dirname(__file__)) 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochsys.path.insert(1, os.path.join(_THIS_DIR, os.pardir)) 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import chrome_paths 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import test_environment 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import util 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)if util.IsLinux(): 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sys.path.insert(0, os.path.join(chrome_paths.GetSrc(), 'build', 'android')) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) from pylib import constants 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestResult(object): 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """A result for an attempted single test case.""" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def __init__(self, name, time, failure): 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Initializes a test result. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Args: 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name: the full name of the test. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time: the amount of time the test ran, in seconds. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failure: the test error or failure message, or None if the test passed. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._name = name 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._time = time 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) self._failure = failure 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def GetName(self): 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Returns the test name.""" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self._name 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def GetTime(self): 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Returns the time it took to run the test.""" 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self._time 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def IsPass(self): 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Returns whether the test passed.""" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self._failure is None 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def GetFailureMessage(self): 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Returns the test failure message, or None if the test passed.""" 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return self._failure 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def _Run(java_tests_src_dir, test_filter, 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chromedriver_path, chrome_path, log_path, android_package_key, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verbose, debug): 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Run the WebDriver Java tests and return the test results. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Args: 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) java_tests_src_dir: the java test source code directory. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_filter: the filter to use when choosing tests to run. Format is same 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) as Google C++ Test format. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromedriver_path: path to ChromeDriver exe. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome_path: path to Chrome exe. 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) log_path: path to server log. 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) android_package_key: name of Chrome's Android package. 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verbose: whether the output should be verbose. 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) debug: whether the tests should wait until attached by a debugger. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns: 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A list of |TestResult|s. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_dir = util.MakeTempDir() 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keystore_path = ('java', 'client', 'test', 'keystore') 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) required_dirs = [keystore_path[:-1], 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ('javascript',), 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ('third_party', 'closure', 'goog'), 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ('third_party', 'js')] 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for required_dir in required_dirs: 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os.makedirs(os.path.join(test_dir, *required_dir)) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_jar = 'test-standalone.jar' 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class_path = test_jar 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shutil.copyfile(os.path.join(java_tests_src_dir, 'keystore'), 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os.path.join(test_dir, *keystore_path)) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) util.Unzip(os.path.join(java_tests_src_dir, 'common.zip'), test_dir) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shutil.copyfile(os.path.join(java_tests_src_dir, test_jar), 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os.path.join(test_dir, test_jar)) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sys_props = ['selenium.browser=chrome', 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'webdriver.chrome.driver=' + os.path.abspath(chromedriver_path)] 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if chrome_path: 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sys_props += ['webdriver.chrome.binary=' + os.path.abspath(chrome_path)] 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if log_path: 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) sys_props += ['webdriver.chrome.logfile=' + log_path] 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if android_package_key: 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) android_package = constants.PACKAGE_INFO[android_package_key].package 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sys_props += ['webdriver.chrome.android_package=' + android_package] 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if android_package_key == 'chromedriver_webview_shell': 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) android_activity = constants.PACKAGE_INFO[android_package_key].activity 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) android_process = '%s:main' % android_package 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sys_props += ['webdriver.chrome.android_activity=' + android_activity] 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sys_props += ['webdriver.chrome.android_process=' + android_process] 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if test_filter: 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Test jar actually takes a regex. Convert from glob. 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_filter = test_filter.replace('*', '.*') 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sys_props += ['filter=' + test_filter] 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jvm_args = [] 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if debug: 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) transport = 'dt_socket' 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if util.IsWindows(): 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) transport = 'dt_shmem' 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) jvm_args += ['-agentlib:jdwp=transport=%s,server=y,suspend=y,' 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 'address=33081' % transport] 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Unpack the sources into the test directory and add to the class path 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # for ease of debugging, particularly with jdb. 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) util.Unzip(os.path.join(java_tests_src_dir, 'test-nodeps-srcs.jar'), 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_dir) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class_path += ':' + test_dir 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _RunAntTest( 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_dir, 'org.openqa.selenium.chrome.ChromeDriverTests', 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class_path, sys_props, jvm_args, verbose) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def _RunAntTest(test_dir, test_class, class_path, sys_props, jvm_args, verbose): 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Runs a single Ant JUnit test suite and returns the |TestResult|s. 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Args: 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_dir: the directory to run the tests in. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_class: the name of the JUnit test suite class to run. 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class_path: the Java class path used when running the tests, colon delimited 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sys_props: Java system properties to set when running the tests. 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) jvm_args: Java VM command line args to use. 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verbose: whether the output should be verbose. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Returns: 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A list of |TestResult|s. 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """ 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _CreateBuildConfig(test_name, results_file, class_path, junit_props, 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sys_props, jvm_args): 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _SystemPropToXml(prop): 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key, value = prop.split('=') 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return '<sysproperty key="%s" value="%s"/>' % (key, value) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def _JvmArgToXml(arg): 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return '<jvmarg value="%s"/>' % arg 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return '\n'.join([ 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '<project>', 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' <target name="test">', 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' <junit %s>' % ' '.join(junit_props), 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' <formatter type="xml"/>', 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' <classpath>', 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ' <pathelement path="%s"/>' % class_path, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' </classpath>', 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' ' + '\n '.join(map(_SystemPropToXml, sys_props)), 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ' ' + '\n '.join(map(_JvmArgToXml, jvm_args)), 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' <test name="%s" outfile="%s"/>' % (test_name, results_file), 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' </junit>', 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' </target>', 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '</project>']) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) def _ProcessResults(results_path): 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) doc = minidom.parse(results_path) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tests = [] 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for test in doc.getElementsByTagName('testcase'): 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name = test.getAttribute('classname') + '.' + test.getAttribute('name') 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time = test.getAttribute('time') 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failure = None 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_nodes = test.getElementsByTagName('error') 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failure_nodes = test.getElementsByTagName('failure') 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if error_nodes: 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failure = error_nodes[0].childNodes[0].nodeValue 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elif failure_nodes: 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failure = failure_nodes[0].childNodes[0].nodeValue 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tests += [TestResult(name, time, failure)] 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tests 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) junit_props = ['printsummary="yes"', 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'fork="yes"', 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'haltonfailure="no"', 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'haltonerror="no"'] 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if verbose: 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) junit_props += ['showoutput="yes"'] 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ant_file = open(os.path.join(test_dir, 'build.xml'), 'w') 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ant_file.write(_CreateBuildConfig( 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_class, 'results', class_path, junit_props, sys_props, jvm_args)) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ant_file.close() 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if util.IsWindows(): 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ant_name = 'ant.bat' 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else: 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ant_name = 'ant' 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) code = util.RunCommand([ant_name, 'test'], cwd=test_dir) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if code != 0: 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print 'FAILED to run java tests of %s through ant' % test_class 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return _ProcessResults(os.path.join(test_dir, 'results.xml')) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def PrintTestResults(results): 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) """Prints the given results in a format recognized by the buildbot.""" 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failures = [] 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) failure_names = [] 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for result in results: 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if not result.IsPass(): 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) failures += [result] 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) failure_names += ['.'.join(result.GetName().split('.')[-2:])] 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print 'Ran %s tests' % len(results) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print 'Failed %s:' % len(failures) 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) util.AddBuildStepText('failed %s/%s' % (len(failures), len(results))) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for result in failures: 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '=' * 80 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print '=' * 10, result.GetName(), '(%ss)' % result.GetTime() 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print result.GetFailureMessage() 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if len(failures) < 10: 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) util.AddBuildStepText('.'.join(result.GetName().split('.')[-2:])) 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) print 'Rerun failing tests with filter:', ':'.join(failure_names) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return len(failures) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def main(): 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser = optparse.OptionParser() 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.add_option( 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) '', '--verbose', action='store_true', default=False, 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) help='Whether output should be verbose') 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.add_option( 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) '', '--debug', action='store_true', default=False, 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) help='Whether to wait to be attached by a debugger') 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.add_option( 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '', '--chromedriver', type='string', default=None, 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help='Path to a build of the chromedriver library(REQUIRED!)') 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.add_option( 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '', '--chrome', type='string', default=None, 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help='Path to a build of the chrome binary') 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.add_option( 2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) '', '--log-path', 2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) help='Output verbose server logs to this file') 2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) parser.add_option( 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) '', '--chrome-version', default='HEAD', 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) help='Version of chrome. Default is \'HEAD\'') 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.add_option( 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) '', '--android-package', help='Android package key') 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.add_option( 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '', '--filter', type='string', default=None, 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) help='Filter for specifying what tests to run, "*" will run all. E.g., ' 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) '*testShouldReturnTitleOfPageIfSet') 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.add_option( 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) '', '--also-run-disabled-tests', action='store_true', default=False, 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) help='Include disabled tests while running the tests') 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parser.add_option( 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) '', '--isolate-tests', action='store_true', default=False, 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) help='Relaunch the jar test harness after each test') 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) options, _ = parser.parse_args() 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.chromedriver = util.GetAbsolutePathOfUserPath(options.chromedriver) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if options.chromedriver is None or not os.path.exists(options.chromedriver): 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parser.error('chromedriver is required or the given path is invalid.' + 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 'Please run "%s --help" for help' % __file__) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if options.android_package: 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if options.android_package not in constants.PACKAGE_INFO: 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) parser.error('Invalid --android-package') 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if options.chrome_version != 'HEAD': 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.error('Android does not support the --chrome-version argument.') 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) environment = test_environment.AndroidTestEnvironment( 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) options.android_package) 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else: 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) environment = test_environment.DesktopTestEnvironment( 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) options.chrome_version) 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) try: 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) environment.GlobalSetUp() 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Run passed tests when filter is not provided. 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if options.isolate_tests: 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) test_filters = environment.GetPassedJavaTests() 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else: 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if options.filter: 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) test_filter = options.filter 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else: 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) test_filter = '*' 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if not options.also_run_disabled_tests: 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if '-' in test_filter: 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) test_filter += ':' 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else: 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) test_filter += '-' 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) test_filter += ':'.join(environment.GetDisabledJavaTestMatchers()) 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) test_filters = [test_filter] 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) java_tests_src_dir = os.path.join(chrome_paths.GetSrc(), 'chrome', 'test', 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'chromedriver', 'third_party', 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'java_tests') 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (not os.path.exists(java_tests_src_dir) or 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) not os.listdir(java_tests_src_dir)): 307ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch java_tests_url = ('http://src.chromium.org/svn/trunk/deps/third_party' 308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch '/webdriver') 309ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch print ('"%s" is empty or it doesn\'t exist. ' % java_tests_src_dir + 310ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'Need to map <chrome-svn>/trunk/deps/third_party/webdriver to ' 311ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'chrome/test/chromedriver/third_party/java_tests in .gclient.\n' 312ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'Alternatively, do:\n' 313ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ' $ cd chrome/test/chromedriver/third_party\n' 314ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ' $ svn co %s java_tests' % java_tests_url) 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 1 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) results = [] 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for filter in test_filters: 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) results += _Run( 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) java_tests_src_dir=java_tests_src_dir, 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_filter=filter, 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromedriver_path=options.chromedriver, 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome_path=util.GetAbsolutePathOfUserPath(options.chrome), 3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) log_path=options.log_path, 325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) android_package_key=options.android_package, 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verbose=options.verbose, 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) debug=options.debug) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PrintTestResults(results) 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) finally: 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) environment.GlobalTearDown() 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if __name__ == '__main__': 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sys.exit(main()) 335