win-tests.py revision 289180
1251881Speter# 2251881Speter# 3251881Speter# Licensed to the Apache Software Foundation (ASF) under one 4251881Speter# or more contributor license agreements. See the NOTICE file 5251881Speter# distributed with this work for additional information 6251881Speter# regarding copyright ownership. The ASF licenses this file 7251881Speter# to you under the Apache License, Version 2.0 (the 8251881Speter# "License"); you may not use this file except in compliance 9251881Speter# with the License. You may obtain a copy of the License at 10251881Speter# 11251881Speter# http://www.apache.org/licenses/LICENSE-2.0 12251881Speter# 13251881Speter# Unless required by applicable law or agreed to in writing, 14251881Speter# software distributed under the License is distributed on an 15251881Speter# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16251881Speter# KIND, either express or implied. See the License for the 17251881Speter# specific language governing permissions and limitations 18251881Speter# under the License. 19251881Speter# 20251881Speter# 21251881Speter""" 22251881SpeterDriver for running the tests on Windows. 23251881Speter 24251881SpeterFor a list of options, run this script with the --help option. 25251881Speter""" 26251881Speter 27289180Speter# $HeadURL: http://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $ 28289180Speter# $LastChangedRevision: 1703828 $ 29251881Speter 30251881Speterimport os, sys, subprocess 31251881Speterimport filecmp 32251881Speterimport shutil 33251881Speterimport traceback 34289180Speterimport logging 35251881Spetertry: 36251881Speter # Python >=3.0 37251881Speter import configparser 38251881Speterexcept ImportError: 39251881Speter # Python <3.0 40251881Speter import ConfigParser as configparser 41251881Speterimport string 42251881Speterimport random 43251881Speter 44251881Speterimport getopt 45251881Spetertry: 46251881Speter my_getopt = getopt.gnu_getopt 47251881Speterexcept AttributeError: 48251881Speter my_getopt = getopt.getopt 49251881Speter 50251881Speterdef _usage_exit(): 51251881Speter "print usage, exit the script" 52251881Speter 53251881Speter print("Driver for running the tests on Windows.") 54251881Speter print("Usage: python win-tests.py [option] [test-path]") 55251881Speter print("") 56251881Speter print("Valid options:") 57251881Speter print(" -r, --release : test the Release configuration") 58251881Speter print(" -d, --debug : test the Debug configuration (default)") 59251881Speter print(" --bin=PATH : use the svn binaries installed in PATH") 60251881Speter print(" -u URL, --url=URL : run ra_dav or ra_svn tests against URL;") 61251881Speter print(" will start svnserve for ra_svn tests") 62251881Speter print(" -v, --verbose : talk more") 63251881Speter print(" -f, --fs-type=type : filesystem type to use (fsfs is default)") 64251881Speter print(" -c, --cleanup : cleanup after running a test") 65251881Speter print(" -t, --test=TEST : Run the TEST test (all is default); use") 66251881Speter print(" TEST#n to run a particular test number,") 67251881Speter print(" multiples also accepted e.g. '2,4-7'") 68251881Speter print(" --log-level=LEVEL : Set log level to LEVEL (E.g. DEBUG)") 69251881Speter print(" --log-to-stdout : Write log results to stdout") 70251881Speter 71251881Speter print(" --svnserve-args=list : comma-separated list of arguments for") 72251881Speter print(" svnserve") 73251881Speter print(" default is '-d,-r,<test-path-root>'") 74251881Speter print(" --asp.net-hack : use '_svn' instead of '.svn' for the admin") 75251881Speter print(" dir name") 76251881Speter print(" --httpd-dir : location where Apache HTTPD is installed") 77251881Speter print(" --httpd-port : port for Apache HTTPD; random port number") 78251881Speter print(" will be used, if not specified") 79251881Speter print(" --httpd-daemon : Run Apache httpd as daemon") 80251881Speter print(" --httpd-service : Run Apache httpd as Windows service (default)") 81251881Speter print(" --httpd-no-log : Disable httpd logging") 82251881Speter print(" --http-short-circuit : Use SVNPathAuthz short_circuit on HTTP server") 83251881Speter print(" --disable-http-v2 : Do not advertise support for HTTPv2 on server") 84251881Speter print(" --disable-bulk-updates : Disable bulk updates on HTTP server") 85251881Speter print(" --ssl-cert : Path to SSL server certificate to trust.") 86251881Speter print(" --javahl : Run the javahl tests instead of the normal tests") 87289180Speter print(" --swig=language : Run the swig perl/python/ruby tests instead of") 88289180Speter print(" the normal tests") 89251881Speter print(" --list : print test doc strings only") 90251881Speter print(" --milestone-filter=RE : RE is a regular expression pattern that (when") 91251881Speter print(" used with --list) limits the tests listed to") 92251881Speter print(" those with an associated issue in the tracker") 93251881Speter print(" which has a target milestone that matches RE.") 94251881Speter print(" --mode-filter=TYPE : limit tests to expected TYPE = XFAIL, SKIP, PASS,") 95251881Speter print(" or 'ALL' (default)") 96251881Speter print(" --enable-sasl : enable Cyrus SASL authentication for") 97251881Speter print(" svnserve") 98251881Speter print(" -p, --parallel : run multiple tests in parallel") 99251881Speter print(" --server-minor-version : the minor version of the server being") 100251881Speter print(" tested") 101251881Speter print(" --config-file : Configuration file for tests") 102251881Speter print(" --fsfs-sharding : Specify shard size (for fsfs)") 103251881Speter print(" --fsfs-packing : Run 'svnadmin pack' automatically") 104289180Speter print(" -q, --quiet : Deprecated; this is the default.") 105289180Speter print(" Use --set-log-level instead.") 106251881Speter 107251881Speter sys.exit(0) 108251881Speter 109251881SpeterCMDLINE_TEST_SCRIPT_PATH = 'subversion/tests/cmdline/' 110251881SpeterCMDLINE_TEST_SCRIPT_NATIVE_PATH = CMDLINE_TEST_SCRIPT_PATH.replace('/', os.sep) 111251881Speter 112251881Spetersys.path.insert(0, os.path.join('build', 'generator')) 113251881Spetersys.path.insert(1, 'build') 114251881Speter 115289180Speterimport gen_win_dependencies 116289180Speterimport gen_base 117251881Speterversion_header = os.path.join('subversion', 'include', 'svn_version.h') 118251881Spetercp = configparser.ConfigParser() 119251881Spetercp.read('gen-make.opts') 120289180Spetergen_obj = gen_win_dependencies.GenDependenciesBase('build.conf', version_header, 121289180Speter cp.items('options')) 122251881Speteropts, args = my_getopt(sys.argv[1:], 'hrdvqct:pu:f:', 123251881Speter ['release', 'debug', 'verbose', 'quiet', 'cleanup', 124251881Speter 'test=', 'url=', 'svnserve-args=', 'fs-type=', 'asp.net-hack', 125251881Speter 'httpd-dir=', 'httpd-port=', 'httpd-daemon', 126251881Speter 'httpd-server', 'http-short-circuit', 'httpd-no-log', 127251881Speter 'disable-http-v2', 'disable-bulk-updates', 'help', 128289180Speter 'fsfs-packing', 'fsfs-sharding=', 'javahl', 'swig=', 129251881Speter 'list', 'enable-sasl', 'bin=', 'parallel', 130251881Speter 'config-file=', 'server-minor-version=', 'log-level=', 131251881Speter 'log-to-stdout', 'mode-filter=', 'milestone-filter=', 132251881Speter 'ssl-cert=']) 133251881Speterif len(args) > 1: 134251881Speter print('Warning: non-option arguments after the first one will be ignored') 135251881Speter 136251881Speter# Interpret the options and set parameters 137289180Speterbase_url, fs_type, verbose, cleanup = None, None, None, None 138251881Speterrepo_loc = 'local repository.' 139251881Speterobjdir = 'Debug' 140251881Speterlog = 'tests.log' 141251881Speterfaillog = 'fails.log' 142251881Speterrun_svnserve = None 143251881Spetersvnserve_args = None 144251881Speterrun_httpd = None 145251881Speterhttpd_port = None 146251881Speterhttpd_service = None 147251881Speterhttpd_no_log = None 148251881Speterhttp_short_circuit = False 149251881Speteradvertise_httpv2 = True 150251881Speterhttp_bulk_updates = True 151251881Speterlist_tests = None 152251881Spetermilestone_filter = None 153251881Spetertest_javahl = None 154289180Spetertest_swig = None 155251881Speterenable_sasl = None 156251881Spetersvn_bin = None 157251881Speterparallel = None 158251881Speterfsfs_sharding = None 159251881Speterfsfs_packing = None 160251881Speterserver_minor_version = None 161251881Speterconfig_file = None 162251881Speterlog_to_stdout = None 163251881Spetermode_filter=None 164251881Spetertests_to_run = [] 165251881Speterlog_level = None 166251881Speterssl_cert = None 167251881Speter 168251881Speterfor opt, val in opts: 169251881Speter if opt in ('-h', '--help'): 170251881Speter _usage_exit() 171251881Speter elif opt in ('-u', '--url'): 172251881Speter base_url = val 173251881Speter elif opt in ('-f', '--fs-type'): 174251881Speter fs_type = val 175251881Speter elif opt in ('-v', '--verbose'): 176251881Speter verbose = 1 177289180Speter log_level = logging.DEBUG 178251881Speter elif opt in ('-c', '--cleanup'): 179251881Speter cleanup = 1 180251881Speter elif opt in ('-t', '--test'): 181251881Speter tests_to_run.append(val) 182251881Speter elif opt in ['-r', '--release']: 183251881Speter objdir = 'Release' 184251881Speter elif opt in ['-d', '--debug']: 185251881Speter objdir = 'Debug' 186251881Speter elif opt == '--svnserve-args': 187251881Speter svnserve_args = val.split(',') 188251881Speter run_svnserve = 1 189251881Speter elif opt == '--asp.net-hack': 190251881Speter os.environ['SVN_ASP_DOT_NET_HACK'] = opt 191251881Speter elif opt == '--httpd-dir': 192251881Speter abs_httpd_dir = os.path.abspath(val) 193251881Speter run_httpd = 1 194251881Speter elif opt == '--httpd-port': 195251881Speter httpd_port = int(val) 196251881Speter elif opt == '--httpd-daemon': 197251881Speter httpd_service = 0 198251881Speter elif opt == '--httpd-service': 199251881Speter httpd_service = 1 200251881Speter elif opt == '--httpd-no-log': 201251881Speter httpd_no_log = 1 202251881Speter elif opt == '--http-short-circuit': 203251881Speter http_short_circuit = True 204251881Speter elif opt == '--disable-http-v2': 205251881Speter advertise_httpv2 = False 206251881Speter elif opt == '--disable-bulk-updates': 207251881Speter http_bulk_updates = False 208251881Speter elif opt == '--fsfs-sharding': 209251881Speter fsfs_sharding = int(val) 210251881Speter elif opt == '--fsfs-packing': 211251881Speter fsfs_packing = 1 212251881Speter elif opt == '--javahl': 213251881Speter test_javahl = 1 214289180Speter elif opt == '--swig': 215289180Speter if val not in ['perl', 'python', 'ruby']: 216289180Speter sys.stderr.write('Running \'%s\' swig tests not supported (yet).\n' 217289180Speter % (val,)) 218289180Speter test_swig = val 219251881Speter elif opt == '--list': 220251881Speter list_tests = 1 221251881Speter elif opt == '--milestone-filter': 222251881Speter milestone_filter = val 223251881Speter elif opt == '--mode-filter': 224251881Speter mode_filter = val 225251881Speter elif opt == '--enable-sasl': 226251881Speter enable_sasl = 1 227251881Speter base_url = "svn://localhost/" 228251881Speter elif opt == '--server-minor-version': 229251881Speter server_minor_version = val 230251881Speter elif opt == '--bin': 231251881Speter svn_bin = val 232251881Speter elif opt in ('-p', '--parallel'): 233251881Speter parallel = 1 234251881Speter elif opt in ('--config-file'): 235251881Speter config_file = val 236251881Speter elif opt == '--log-to-stdout': 237251881Speter log_to_stdout = 1 238251881Speter elif opt == '--log-level': 239289180Speter log_level = getattr(logging, val, None) or int(val) 240251881Speter elif opt == '--ssl-cert': 241251881Speter ssl_cert = val 242251881Speter 243251881Speter# Calculate the source and test directory names 244251881Speterabs_srcdir = os.path.abspath("") 245251881Speterabs_objdir = os.path.join(abs_srcdir, objdir) 246251881Speterif len(args) == 0: 247251881Speter abs_builddir = abs_objdir 248251881Speter create_dirs = 0 249251881Speterelse: 250251881Speter abs_builddir = os.path.abspath(args[0]) 251251881Speter create_dirs = 1 252251881Speter 253251881Speter# Default to fsfs explicitly 254251881Speterif not fs_type: 255251881Speter fs_type = 'fsfs' 256251881Speter 257289180Speterif fs_type == 'bdb': 258289180Speter all_tests = gen_obj.test_progs + gen_obj.bdb_test_progs \ 259289180Speter + gen_obj.scripts + gen_obj.bdb_scripts 260289180Speterelse: 261251881Speter all_tests = gen_obj.test_progs + gen_obj.scripts 262251881Speter 263289180Speterclient_tests = [x for x in all_tests if x.startswith(CMDLINE_TEST_SCRIPT_PATH)] 264289180Speter 265251881Speterif run_httpd: 266251881Speter if not httpd_port: 267251881Speter httpd_port = random.randrange(1024, 30000) 268251881Speter if not base_url: 269251881Speter base_url = 'http://localhost:' + str(httpd_port) 270251881Speter 271251881Speterif base_url: 272251881Speter repo_loc = 'remote repository ' + base_url + '.' 273251881Speter if base_url[:4] == 'http': 274251881Speter log = 'dav-tests.log' 275251881Speter faillog = 'dav-fails.log' 276251881Speter elif base_url[:3] == 'svn': 277251881Speter log = 'svn-tests.log' 278251881Speter faillog = 'svn-fails.log' 279251881Speter run_svnserve = 1 280251881Speter else: 281251881Speter # Don't know this scheme, but who're we to judge whether it's 282251881Speter # correct or not? 283251881Speter log = 'url-tests.log' 284251881Speter faillog = 'url-fails.log' 285251881Speter 286251881Speter# Have to move the executables where the tests expect them to be 287251881Spetercopied_execs = [] # Store copied exec files to avoid the final dir scan 288251881Speter 289251881Speterdef create_target_dir(dirname): 290251881Speter tgt_dir = os.path.join(abs_builddir, dirname) 291251881Speter if not os.path.exists(tgt_dir): 292251881Speter if verbose: 293251881Speter print("mkdir: %s" % tgt_dir) 294251881Speter os.makedirs(tgt_dir) 295251881Speter 296289180Speterdef copy_changed_file(src, tgt=None, to_dir=None, cleanup=True): 297251881Speter if not os.path.isfile(src): 298251881Speter print('Could not find ' + src) 299251881Speter sys.exit(1) 300289180Speter 301289180Speter if to_dir and not tgt: 302289180Speter tgt = os.path.join(to_dir, os.path.basename(src)) 303289180Speter elif not tgt or (tgt and to_dir): 304289180Speter raise RuntimeError("Using 'tgt' *or* 'to_dir' is required" % (tgt,)) 305289180Speter elif tgt and os.path.isdir(tgt): 306289180Speter raise RuntimeError("'%s' is a directory. Use to_dir=" % (tgt,)) 307289180Speter 308251881Speter if os.path.exists(tgt): 309251881Speter assert os.path.isfile(tgt) 310251881Speter if filecmp.cmp(src, tgt): 311251881Speter if verbose: 312251881Speter print("same: %s" % src) 313251881Speter print(" and: %s" % tgt) 314251881Speter return 0 315251881Speter if verbose: 316251881Speter print("copy: %s" % src) 317251881Speter print(" to: %s" % tgt) 318251881Speter shutil.copy(src, tgt) 319251881Speter 320289180Speter if cleanup: 321289180Speter copied_execs.append(tgt) 322251881Speter 323251881Speterdef locate_libs(): 324251881Speter "Move DLLs to a known location and set env vars" 325251881Speter 326289180Speter debug = (objdir == 'Debug') 327251881Speter 328289180Speter for lib in gen_obj._libraries.values(): 329251881Speter 330289180Speter if debug: 331289180Speter name, dir = lib.debug_dll_name, lib.debug_dll_dir 332289180Speter else: 333289180Speter name, dir = lib.dll_name, lib.dll_dir 334251881Speter 335289180Speter if name and dir: 336289180Speter src = os.path.join(dir, name) 337289180Speter if os.path.exists(src): 338289180Speter copy_changed_file(src, to_dir=abs_builddir, cleanup=False) 339251881Speter 340289180Speter for name in lib.extra_bin: 341289180Speter src = os.path.join(dir, name) 342289180Speter copy_changed_file(src, to_dir=abs_builddir) 343251881Speter 344251881Speter 345251881Speter # Copy the Subversion library DLLs 346289180Speter for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): 347289180Speter if isinstance(i, gen_base.TargetLib) and i.msvc_export: 348289180Speter src = os.path.join(abs_objdir, i.filename) 349289180Speter if os.path.isfile(src): 350289180Speter copy_changed_file(src, to_dir=abs_builddir, 351289180Speter cleanup=False) 352251881Speter 353251881Speter # Copy the Apache modules 354251881Speter if run_httpd and cp.has_option('options', '--with-httpd'): 355251881Speter mod_dav_svn_path = os.path.join(abs_objdir, 'subversion', 356251881Speter 'mod_dav_svn', 'mod_dav_svn.so') 357251881Speter mod_authz_svn_path = os.path.join(abs_objdir, 'subversion', 358251881Speter 'mod_authz_svn', 'mod_authz_svn.so') 359251881Speter mod_dontdothat_path = os.path.join(abs_objdir, 'tools', 'server-side', 360251881Speter 'mod_dontdothat', 'mod_dontdothat.so') 361251881Speter 362289180Speter copy_changed_file(mod_dav_svn_path, to_dir=abs_builddir, cleanup=False) 363289180Speter copy_changed_file(mod_authz_svn_path, to_dir=abs_builddir, cleanup=False) 364289180Speter copy_changed_file(mod_dontdothat_path, to_dir=abs_builddir, cleanup=False) 365251881Speter 366289180Speter os.environ['PATH'] = abs_builddir + os.pathsep + os.environ['PATH'] 367251881Speter 368251881Speterdef fix_case(path): 369251881Speter path = os.path.normpath(path) 370251881Speter parts = path.split(os.path.sep) 371251881Speter drive = parts[0].upper() 372251881Speter parts = parts[1:] 373251881Speter path = drive + os.path.sep 374251881Speter for part in parts: 375251881Speter dirs = os.listdir(path) 376251881Speter for dir in dirs: 377251881Speter if dir.lower() == part.lower(): 378251881Speter path = os.path.join(path, dir) 379251881Speter break 380251881Speter return path 381251881Speter 382251881Speterclass Svnserve: 383251881Speter "Run svnserve for ra_svn tests" 384251881Speter def __init__(self, svnserve_args, objdir, abs_objdir, abs_builddir): 385251881Speter self.args = svnserve_args 386251881Speter self.name = 'svnserve.exe' 387251881Speter self.kind = objdir 388251881Speter self.path = os.path.join(abs_objdir, 389251881Speter 'subversion', 'svnserve', self.name) 390251881Speter self.root = os.path.join(abs_builddir, CMDLINE_TEST_SCRIPT_NATIVE_PATH) 391289180Speter self.proc = None 392251881Speter 393251881Speter def __del__(self): 394251881Speter "Stop svnserve when the object is deleted" 395251881Speter self.stop() 396251881Speter 397251881Speter def _quote(self, arg): 398251881Speter if ' ' in arg: 399251881Speter return '"' + arg + '"' 400251881Speter else: 401251881Speter return arg 402251881Speter 403251881Speter def start(self): 404251881Speter if not self.args: 405251881Speter args = [self.name, '-d', '-r', self.root] 406251881Speter else: 407251881Speter args = [self.name] + self.args 408251881Speter print('Starting %s %s' % (self.kind, self.name)) 409251881Speter 410289180Speter self.proc = subprocess.Popen([self.path] + args[1:]) 411289180Speter 412251881Speter def stop(self): 413289180Speter if self.proc is not None: 414251881Speter try: 415251881Speter print('Stopping %s' % self.name) 416289180Speter self.proc.poll(); 417289180Speter if self.proc.returncode is None: 418289180Speter self.proc.kill(); 419251881Speter return 420289180Speter except AttributeError: 421251881Speter pass 422251881Speter print('Svnserve.stop not implemented') 423251881Speter 424251881Speterclass Httpd: 425251881Speter "Run httpd for DAV tests" 426251881Speter def __init__(self, abs_httpd_dir, abs_objdir, abs_builddir, httpd_port, 427251881Speter service, no_log, httpv2, short_circuit, bulk_updates): 428251881Speter self.name = 'apache.exe' 429251881Speter self.httpd_port = httpd_port 430251881Speter self.httpd_dir = abs_httpd_dir 431251881Speter 432251881Speter if httpv2: 433251881Speter self.httpv2_option = 'on' 434251881Speter else: 435251881Speter self.httpv2_option = 'off' 436251881Speter 437251881Speter if bulk_updates: 438251881Speter self.bulkupdates_option = 'on' 439251881Speter else: 440251881Speter self.bulkupdates_option = 'off' 441251881Speter 442251881Speter self.service = service 443289180Speter self.proc = None 444251881Speter self.path = os.path.join(self.httpd_dir, 'bin', self.name) 445251881Speter 446251881Speter if short_circuit: 447251881Speter self.path_authz_option = 'short_circuit' 448251881Speter else: 449251881Speter self.path_authz_option = 'on' 450251881Speter 451251881Speter if not os.path.exists(self.path): 452251881Speter self.name = 'httpd.exe' 453251881Speter self.path = os.path.join(self.httpd_dir, 'bin', self.name) 454251881Speter if not os.path.exists(self.path): 455251881Speter raise RuntimeError("Could not find a valid httpd binary!") 456251881Speter 457251881Speter self.root_dir = os.path.join(CMDLINE_TEST_SCRIPT_NATIVE_PATH, 'httpd') 458251881Speter self.root = os.path.join(abs_builddir, self.root_dir) 459251881Speter self.authz_file = os.path.join(abs_builddir, 460251881Speter CMDLINE_TEST_SCRIPT_NATIVE_PATH, 461251881Speter 'svn-test-work', 'authz') 462251881Speter self.dontdothat_file = os.path.join(abs_builddir, 463251881Speter CMDLINE_TEST_SCRIPT_NATIVE_PATH, 464251881Speter 'svn-test-work', 'dontdothat') 465251881Speter self.httpd_config = os.path.join(self.root, 'httpd.conf') 466251881Speter self.httpd_users = os.path.join(self.root, 'users') 467251881Speter self.httpd_mime_types = os.path.join(self.root, 'mime.types') 468286506Speter self.httpd_groups = os.path.join(self.root, 'groups') 469251881Speter self.abs_builddir = abs_builddir 470251881Speter self.abs_objdir = abs_objdir 471251881Speter self.service_name = 'svn-test-httpd-' + str(httpd_port) 472251881Speter 473251881Speter if self.service: 474251881Speter self.httpd_args = [self.name, '-n', self._quote(self.service_name), 475251881Speter '-f', self._quote(self.httpd_config)] 476251881Speter else: 477251881Speter self.httpd_args = [self.name, '-f', self._quote(self.httpd_config)] 478251881Speter 479251881Speter create_target_dir(self.root_dir) 480251881Speter 481251881Speter self._create_users_file() 482286506Speter self._create_groups_file() 483251881Speter self._create_mime_types_file() 484251881Speter self._create_dontdothat_file() 485251881Speter 486289180Speter # Obtain version. 487289180Speter version_vals = gen_obj._libraries['httpd'].version.split('.') 488289180Speter self.httpd_ver = float('%s.%s' % (version_vals[0], version_vals[1])) 489251881Speter 490251881Speter # Create httpd config file 491251881Speter fp = open(self.httpd_config, 'w') 492251881Speter 493251881Speter # Limit the number of threads (default = 64) 494251881Speter fp.write('<IfModule mpm_winnt.c>\n') 495251881Speter fp.write('ThreadsPerChild 16\n') 496251881Speter fp.write('</IfModule>\n') 497251881Speter 498251881Speter # Global Environment 499251881Speter fp.write('ServerRoot ' + self._quote(self.root) + '\n') 500251881Speter fp.write('DocumentRoot ' + self._quote(self.root) + '\n') 501251881Speter fp.write('ServerName localhost\n') 502251881Speter fp.write('PidFile pid\n') 503251881Speter fp.write('ErrorLog log\n') 504251881Speter fp.write('Listen ' + str(self.httpd_port) + '\n') 505251881Speter 506251881Speter if not no_log: 507251881Speter fp.write('LogFormat "%h %l %u %t \\"%r\\" %>s %b" common\n') 508251881Speter fp.write('Customlog log common\n') 509251881Speter fp.write('LogLevel Debug\n') 510251881Speter else: 511251881Speter fp.write('LogLevel Crit\n') 512251881Speter 513251881Speter # Write LoadModule for minimal system module 514251881Speter fp.write(self._sys_module('dav_module', 'mod_dav.so')) 515251881Speter if self.httpd_ver >= 2.3: 516251881Speter fp.write(self._sys_module('access_compat_module', 'mod_access_compat.so')) 517251881Speter fp.write(self._sys_module('authz_core_module', 'mod_authz_core.so')) 518251881Speter fp.write(self._sys_module('authz_user_module', 'mod_authz_user.so')) 519251881Speter fp.write(self._sys_module('authn_core_module', 'mod_authn_core.so')) 520251881Speter if self.httpd_ver >= 2.2: 521251881Speter fp.write(self._sys_module('auth_basic_module', 'mod_auth_basic.so')) 522251881Speter fp.write(self._sys_module('authn_file_module', 'mod_authn_file.so')) 523286506Speter fp.write(self._sys_module('authz_groupfile_module', 'mod_authz_groupfile.so')) 524286506Speter fp.write(self._sys_module('authz_host_module', 'mod_authz_host.so')) 525251881Speter else: 526251881Speter fp.write(self._sys_module('auth_module', 'mod_auth.so')) 527251881Speter fp.write(self._sys_module('alias_module', 'mod_alias.so')) 528251881Speter fp.write(self._sys_module('mime_module', 'mod_mime.so')) 529251881Speter fp.write(self._sys_module('log_config_module', 'mod_log_config.so')) 530251881Speter 531251881Speter # Write LoadModule for Subversion modules 532251881Speter fp.write(self._svn_module('dav_svn_module', 'mod_dav_svn.so')) 533251881Speter fp.write(self._svn_module('authz_svn_module', 'mod_authz_svn.so')) 534251881Speter 535251881Speter # And for mod_dontdothat 536251881Speter fp.write(self._svn_module('dontdothat_module', 'mod_dontdothat.so')) 537251881Speter 538251881Speter # Don't handle .htaccess, symlinks, etc. 539251881Speter fp.write('<Directory />\n') 540251881Speter fp.write('AllowOverride None\n') 541251881Speter fp.write('Options None\n') 542251881Speter fp.write('</Directory>\n\n') 543251881Speter 544251881Speter # Define two locations for repositories 545251881Speter fp.write(self._svn_repo('repositories')) 546251881Speter fp.write(self._svn_repo('local_tmp')) 547286506Speter fp.write(self._svn_authz_repo()) 548251881Speter 549251881Speter # And two redirects for the redirect tests 550251881Speter fp.write('RedirectMatch permanent ^/svn-test-work/repositories/' 551251881Speter 'REDIRECT-PERM-(.*)$ /svn-test-work/repositories/$1\n') 552251881Speter fp.write('RedirectMatch ^/svn-test-work/repositories/' 553251881Speter 'REDIRECT-TEMP-(.*)$ /svn-test-work/repositories/$1\n') 554251881Speter 555251881Speter fp.write('TypesConfig ' + self._quote(self.httpd_mime_types) + '\n') 556251881Speter fp.write('HostNameLookups Off\n') 557251881Speter 558251881Speter fp.close() 559251881Speter 560251881Speter def __del__(self): 561251881Speter "Stop httpd when the object is deleted" 562251881Speter self.stop() 563251881Speter 564251881Speter def _quote(self, arg): 565251881Speter if ' ' in arg: 566251881Speter return '"' + arg + '"' 567251881Speter else: 568251881Speter return arg 569251881Speter 570251881Speter def _create_users_file(self): 571251881Speter "Create users file" 572251881Speter htpasswd = os.path.join(self.httpd_dir, 'bin', 'htpasswd.exe') 573251881Speter # Create the cheapest to compare password form for our testsuite 574251881Speter os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bcp', self.httpd_users, 575251881Speter 'jrandom', 'rayjandom']) 576251881Speter os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users, 577251881Speter 'jconstant', 'rayjandom']) 578286506Speter os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users, 579286506Speter 'JRANDOM', 'rayjandom']) 580286506Speter os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users, 581286506Speter 'JCONSTANT', 'rayjandom']) 582251881Speter 583286506Speter def _create_groups_file(self): 584286506Speter "Create groups for mod_authz_svn tests" 585286506Speter fp = open(self.httpd_groups, 'w') 586286506Speter fp.write('random: jrandom\n') 587286506Speter fp.write('constant: jconstant\n') 588286506Speter fp.close() 589286506Speter 590251881Speter def _create_mime_types_file(self): 591251881Speter "Create empty mime.types file" 592251881Speter fp = open(self.httpd_mime_types, 'w') 593251881Speter fp.close() 594251881Speter 595251881Speter def _create_dontdothat_file(self): 596251881Speter "Create empty mime.types file" 597253734Speter # If the tests have not previously been run or were cleaned 598253734Speter # up, then 'svn-test-work' does not exist yet. 599253734Speter parent_dir = os.path.dirname(self.dontdothat_file) 600253734Speter if not os.path.exists(parent_dir): 601253734Speter os.makedirs(parent_dir) 602253734Speter 603251881Speter fp = open(self.dontdothat_file, 'w') 604251881Speter fp.write('[recursive-actions]\n') 605251881Speter fp.write('/ = deny\n') 606251881Speter fp.close() 607251881Speter 608251881Speter def _sys_module(self, name, path): 609251881Speter full_path = os.path.join(self.httpd_dir, 'modules', path) 610251881Speter return 'LoadModule ' + name + " " + self._quote(full_path) + '\n' 611251881Speter 612251881Speter def _svn_module(self, name, path): 613289180Speter full_path = os.path.join(self.abs_builddir, path) 614251881Speter return 'LoadModule ' + name + ' ' + self._quote(full_path) + '\n' 615251881Speter 616251881Speter def _svn_repo(self, name): 617251881Speter path = os.path.join(self.abs_builddir, 618251881Speter CMDLINE_TEST_SCRIPT_NATIVE_PATH, 619251881Speter 'svn-test-work', name) 620251881Speter location = '/svn-test-work/' + name 621251881Speter ddt_location = '/ddt-test-work/' + name 622251881Speter return \ 623251881Speter '<Location ' + location + '>\n' \ 624251881Speter ' DAV svn\n' \ 625251881Speter ' SVNParentPath ' + self._quote(path) + '\n' \ 626251881Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 627251881Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 628251881Speter ' SVNAllowBulkUpdates ' + self.bulkupdates_option + '\n' \ 629251881Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 630251881Speter ' AuthType Basic\n' \ 631251881Speter ' AuthName "Subversion Repository"\n' \ 632251881Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 633251881Speter ' Require valid-user\n' \ 634251881Speter '</Location>\n' \ 635251881Speter '<Location ' + ddt_location + '>\n' \ 636251881Speter ' DAV svn\n' \ 637251881Speter ' SVNParentPath ' + self._quote(path) + '\n' \ 638251881Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 639251881Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 640251881Speter ' SVNAllowBulkUpdates ' + self.bulkupdates_option + '\n' \ 641251881Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 642251881Speter ' AuthType Basic\n' \ 643251881Speter ' AuthName "Subversion Repository"\n' \ 644251881Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 645251881Speter ' Require valid-user\n' \ 646251881Speter ' DontDoThatConfigFile ' + self._quote(self.dontdothat_file) + '\n' \ 647251881Speter '</Location>\n' 648251881Speter 649286506Speter def _svn_authz_repo(self): 650286506Speter local_tmp = os.path.join(self.abs_builddir, 651286506Speter CMDLINE_TEST_SCRIPT_NATIVE_PATH, 652286506Speter 'svn-test-work', 'local_tmp') 653286506Speter return \ 654286506Speter '<Location /authz-test-work/anon>' + '\n' \ 655286506Speter ' DAV svn' + '\n' \ 656286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 657286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 658286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 659286506Speter ' SVNListParentPath On' + '\n' \ 660286506Speter ' <IfModule mod_authz_core.c>' + '\n' \ 661286506Speter ' Require all granted' + '\n' \ 662286506Speter ' </IfModule>' + '\n' \ 663286506Speter ' <IfModule !mod_authz_core.c>' + '\n' \ 664286506Speter ' Allow from all' + '\n' \ 665286506Speter ' </IfModule>' + '\n' \ 666286506Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 667286506Speter '</Location>' + '\n' \ 668286506Speter '<Location /authz-test-work/mixed>' + '\n' \ 669286506Speter ' DAV svn' + '\n' \ 670286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 671286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 672286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 673286506Speter ' SVNListParentPath On' + '\n' \ 674286506Speter ' AuthType Basic' + '\n' \ 675286506Speter ' AuthName "Subversion Repository"' + '\n' \ 676286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 677286506Speter ' Require valid-user' + '\n' \ 678286506Speter ' Satisfy Any' + '\n' \ 679286506Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 680286506Speter '</Location>' + '\n' \ 681286506Speter '<Location /authz-test-work/mixed-noauthwhenanon>' + '\n' \ 682286506Speter ' DAV svn' + '\n' \ 683286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 684286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 685286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 686286506Speter ' SVNListParentPath On' + '\n' \ 687286506Speter ' AuthType Basic' + '\n' \ 688286506Speter ' AuthName "Subversion Repository"' + '\n' \ 689286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 690286506Speter ' Require valid-user' + '\n' \ 691286506Speter ' AuthzSVNNoAuthWhenAnonymousAllowed On' + '\n' \ 692286506Speter ' SVNPathAuthz On' + '\n' \ 693286506Speter '</Location>' + '\n' \ 694286506Speter '<Location /authz-test-work/authn>' + '\n' \ 695286506Speter ' DAV svn' + '\n' \ 696286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 697286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 698286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 699286506Speter ' SVNListParentPath On' + '\n' \ 700286506Speter ' AuthType Basic' + '\n' \ 701286506Speter ' AuthName "Subversion Repository"' + '\n' \ 702286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 703286506Speter ' Require valid-user' + '\n' \ 704286506Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 705286506Speter '</Location>' + '\n' \ 706286506Speter '<Location /authz-test-work/authn-anonoff>' + '\n' \ 707286506Speter ' DAV svn' + '\n' \ 708286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 709286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 710286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 711286506Speter ' SVNListParentPath On' + '\n' \ 712286506Speter ' AuthType Basic' + '\n' \ 713286506Speter ' AuthName "Subversion Repository"' + '\n' \ 714286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 715286506Speter ' Require valid-user' + '\n' \ 716286506Speter ' AuthzSVNAnonymous Off' + '\n' \ 717286506Speter ' SVNPathAuthz On' + '\n' \ 718286506Speter '</Location>' + '\n' \ 719286506Speter '<Location /authz-test-work/authn-lcuser>' + '\n' \ 720286506Speter ' DAV svn' + '\n' \ 721286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 722286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 723286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 724286506Speter ' SVNListParentPath On' + '\n' \ 725286506Speter ' AuthType Basic' + '\n' \ 726286506Speter ' AuthName "Subversion Repository"' + '\n' \ 727286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 728286506Speter ' Require valid-user' + '\n' \ 729286506Speter ' AuthzForceUsernameCase Lower' + '\n' \ 730286506Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 731286506Speter '</Location>' + '\n' \ 732286506Speter '<Location /authz-test-work/authn-lcuser>' + '\n' \ 733286506Speter ' DAV svn' + '\n' \ 734286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 735286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 736286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 737286506Speter ' SVNListParentPath On' + '\n' \ 738286506Speter ' AuthType Basic' + '\n' \ 739286506Speter ' AuthName "Subversion Repository"' + '\n' \ 740286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 741286506Speter ' Require valid-user' + '\n' \ 742286506Speter ' AuthzForceUsernameCase Lower' + '\n' \ 743286506Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 744286506Speter '</Location>' + '\n' \ 745286506Speter '<Location /authz-test-work/authn-group>' + '\n' \ 746286506Speter ' DAV svn' + '\n' \ 747286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 748286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 749286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 750286506Speter ' SVNListParentPath On' + '\n' \ 751286506Speter ' AuthType Basic' + '\n' \ 752286506Speter ' AuthName "Subversion Repository"' + '\n' \ 753286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 754286506Speter ' AuthGroupFile ' + self._quote(self.httpd_groups) + '\n' \ 755286506Speter ' Require group random' + '\n' \ 756286506Speter ' AuthzSVNAuthoritative Off' + '\n' \ 757286506Speter ' SVNPathAuthz On' + '\n' \ 758286506Speter '</Location>' + '\n' \ 759286506Speter '<IfModule mod_authz_core.c>' + '\n' \ 760286506Speter '<Location /authz-test-work/sallrany>' + '\n' \ 761286506Speter ' DAV svn' + '\n' \ 762286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 763286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 764286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 765286506Speter ' SVNListParentPath On' + '\n' \ 766286506Speter ' AuthType Basic' + '\n' \ 767286506Speter ' AuthName "Subversion Repository"' + '\n' \ 768286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 769286506Speter ' AuthzSendForbiddenOnFailure On' + '\n' \ 770286506Speter ' Satisfy All' + '\n' \ 771286506Speter ' <RequireAny>' + '\n' \ 772286506Speter ' Require valid-user' + '\n' \ 773286506Speter ' Require expr req(\'ALLOW\') == \'1\'' + '\n' \ 774286506Speter ' </RequireAny>' + '\n' \ 775286506Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 776286506Speter '</Location>' + '\n' \ 777286506Speter '<Location /authz-test-work/sallrall>'+ '\n' \ 778286506Speter ' DAV svn' + '\n' \ 779286506Speter ' SVNParentPath ' + local_tmp + '\n' \ 780286506Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 781286506Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 782286506Speter ' SVNListParentPath On' + '\n' \ 783286506Speter ' AuthType Basic' + '\n' \ 784286506Speter ' AuthName "Subversion Repository"' + '\n' \ 785286506Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 786286506Speter ' AuthzSendForbiddenOnFailure On' + '\n' \ 787286506Speter ' Satisfy All' + '\n' \ 788286506Speter ' <RequireAll>' + '\n' \ 789289180Speter ' Require valid-user' + '\n' \ 790289180Speter ' Require expr req(\'ALLOW\') == \'1\'' + '\n' \ 791289180Speter '</RequireAll>' + '\n' \ 792286506Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 793286506Speter '</Location>' + '\n' \ 794286506Speter '</IfModule>' + '\n' \ 795286506Speter 796251881Speter def start(self): 797251881Speter if self.service: 798251881Speter self._start_service() 799251881Speter else: 800251881Speter self._start_daemon() 801251881Speter 802251881Speter def stop(self): 803251881Speter if self.service: 804251881Speter self._stop_service() 805251881Speter else: 806251881Speter self._stop_daemon() 807251881Speter 808251881Speter def _start_service(self): 809251881Speter "Install and start HTTPD service" 810251881Speter print('Installing service %s' % self.service_name) 811251881Speter os.spawnv(os.P_WAIT, self.path, self.httpd_args + ['-k', 'install']) 812251881Speter print('Starting service %s' % self.service_name) 813251881Speter os.spawnv(os.P_WAIT, self.path, self.httpd_args + ['-k', 'start']) 814251881Speter 815251881Speter def _stop_service(self): 816251881Speter "Stop and uninstall HTTPD service" 817251881Speter os.spawnv(os.P_WAIT, self.path, self.httpd_args + ['-k', 'stop']) 818251881Speter os.spawnv(os.P_WAIT, self.path, self.httpd_args + ['-k', 'uninstall']) 819251881Speter 820251881Speter def _start_daemon(self): 821251881Speter "Start HTTPD as daemon" 822251881Speter print('Starting httpd as daemon') 823251881Speter print(self.httpd_args) 824289180Speter self.proc = subprocess.Popen([self.path] + self.httpd_args[1:]) 825251881Speter 826251881Speter def _stop_daemon(self): 827251881Speter "Stop the HTTPD daemon" 828289180Speter if self.proc is not None: 829251881Speter try: 830251881Speter print('Stopping %s' % self.name) 831289180Speter self.proc.poll(); 832289180Speter if self.proc.returncode is None: 833289180Speter self.proc.kill(); 834251881Speter return 835289180Speter except AttributeError: 836251881Speter pass 837251881Speter print('Httpd.stop_daemon not implemented') 838251881Speter 839251881Speter# Move the binaries to the test directory 840289180Spetercreate_target_dir(abs_builddir) 841251881Speterlocate_libs() 842251881Speterif create_dirs: 843289180Speter for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): 844289180Speter if isinstance(i, gen_base.TargetExe): 845289180Speter src = os.path.join(abs_objdir, i.filename) 846251881Speter 847289180Speter if os.path.isfile(src): 848289180Speter dst = os.path.join(abs_builddir, i.filename) 849289180Speter create_target_dir(os.path.dirname(dst)) 850289180Speter copy_changed_file(src, dst) 851289180Speter 852251881Speter# Create the base directory for Python tests 853251881Spetercreate_target_dir(CMDLINE_TEST_SCRIPT_NATIVE_PATH) 854251881Speter 855251881Speter# Ensure the tests directory is correctly cased 856251881Speterabs_builddir = fix_case(abs_builddir) 857251881Speter 858251881Speterdaemon = None 859251881Speter# Run the tests 860251881Speter 861251881Speter# No need to start any servers if we are only listing the tests. 862251881Speterif not list_tests: 863251881Speter if run_svnserve: 864251881Speter daemon = Svnserve(svnserve_args, objdir, abs_objdir, abs_builddir) 865251881Speter 866251881Speter if run_httpd: 867251881Speter daemon = Httpd(abs_httpd_dir, abs_objdir, abs_builddir, httpd_port, 868251881Speter httpd_service, httpd_no_log, 869251881Speter advertise_httpv2, http_short_circuit, 870251881Speter http_bulk_updates) 871251881Speter 872251881Speter # Start service daemon, if any 873251881Speter if daemon: 874251881Speter daemon.start() 875251881Speter 876251881Speter# Find the full path and filename of any test that is specified just by 877251881Speter# its base name. 878251881Speterif len(tests_to_run) != 0: 879251881Speter tests = [] 880251881Speter for t in tests_to_run: 881251881Speter tns = None 882251881Speter if '#' in t: 883251881Speter t, tns = t.split('#') 884251881Speter 885251881Speter test = [x for x in all_tests if x.split('/')[-1] == t] 886251881Speter if not test and not (t.endswith('-test.exe') or t.endswith('_tests.py')): 887251881Speter # The lengths of '-test.exe' and of '_tests.py' are both 9. 888251881Speter test = [x for x in all_tests if x.split('/')[-1][:-9] == t] 889251881Speter 890251881Speter if not test: 891251881Speter print("Skipping test '%s', test not found." % t) 892251881Speter elif tns: 893251881Speter tests.append('%s#%s' % (test[0], tns)) 894251881Speter else: 895251881Speter tests.extend(test) 896251881Speter 897251881Speter tests_to_run = tests 898251881Speterelse: 899251881Speter tests_to_run = all_tests 900251881Speter 901251881Speter 902251881Speterif list_tests: 903251881Speter print('Listing %s configuration on %s' % (objdir, repo_loc)) 904251881Speterelse: 905251881Speter print('Testing %s configuration on %s' % (objdir, repo_loc)) 906251881Spetersys.path.insert(0, os.path.join(abs_srcdir, 'build')) 907251881Speter 908289180Speterif not test_javahl and not test_swig: 909251881Speter import run_tests 910251881Speter if log_to_stdout: 911251881Speter log_file = None 912251881Speter fail_log_file = None 913251881Speter else: 914251881Speter log_file = os.path.join(abs_builddir, log) 915251881Speter fail_log_file = os.path.join(abs_builddir, faillog) 916251881Speter 917286506Speter if run_httpd: 918289180Speter httpd_version = gen_obj._libraries['httpd'].version 919286506Speter else: 920286506Speter httpd_version = None 921289180Speter 922289180Speter opts, args = run_tests.create_parser().parse_args([]) 923289180Speter opts.url = base_url 924289180Speter opts.fs_type = fs_type 925289180Speter opts.http_library = 'serf' 926289180Speter opts.server_minor_version = server_minor_version 927289180Speter opts.cleanup = cleanup 928289180Speter opts.enable_sasl = enable_sasl 929289180Speter opts.parallel = parallel 930289180Speter opts.config_file = config_file 931289180Speter opts.fsfs_sharding = fsfs_sharding 932289180Speter opts.fsfs_packing = fsfs_packing 933289180Speter opts.list_tests = list_tests 934289180Speter opts.svn_bin = svn_bin 935289180Speter opts.mode_filter = mode_filter 936289180Speter opts.milestone_filter = milestone_filter 937289180Speter opts.httpd_version = httpd_version 938289180Speter opts.set_log_level = log_level 939289180Speter opts.ssl_cert = ssl_cert 940251881Speter th = run_tests.TestHarness(abs_srcdir, abs_builddir, 941289180Speter log_file, fail_log_file, opts) 942251881Speter old_cwd = os.getcwd() 943251881Speter try: 944251881Speter os.chdir(abs_builddir) 945251881Speter failed = th.run(tests_to_run) 946251881Speter except: 947251881Speter os.chdir(old_cwd) 948251881Speter raise 949251881Speter else: 950251881Speter os.chdir(old_cwd) 951289180Speterelif test_javahl: 952251881Speter failed = False 953251881Speter 954289180Speter java_exe = None 955251881Speter 956289180Speter for path in os.environ["PATH"].split(os.pathsep): 957289180Speter if os.path.isfile(os.path.join(path, 'java.exe')): 958289180Speter java_exe = os.path.join(path, 'java.exe') 959289180Speter break 960289180Speter 961289180Speter if not java_exe and 'java_sdk' in gen_obj._libraries: 962289180Speter jdk = gen_obj._libraries['java_sdk'] 963289180Speter 964289180Speter if os.path.isfile(os.path.join(jdk.lib_dir, '../bin/java.exe')): 965289180Speter java_exe = os.path.join(jdk.lib_dir, '../bin/java.exe') 966289180Speter 967289180Speter if not java_exe: 968289180Speter print('Java not found. Skipping Java tests') 969289180Speter else: 970289180Speter args = (os.path.abspath(java_exe),) 971289180Speter if (objdir == 'Debug'): 972289180Speter args = args + ('-Xcheck:jni',) 973289180Speter 974289180Speter args = args + ( 975289180Speter '-Dtest.rootdir=' + os.path.join(abs_builddir, 'javahl'), 976289180Speter '-Dtest.srcdir=' + os.path.join(abs_srcdir, 977289180Speter 'subversion/bindings/javahl'), 978289180Speter '-Dtest.rooturl=', 979289180Speter '-Dtest.fstype=' + fs_type , 980289180Speter '-Dtest.tests=', 981289180Speter 982289180Speter '-Djava.library.path=' 983289180Speter + os.path.join(abs_objdir, 984289180Speter 'subversion/bindings/javahl/native'), 985289180Speter '-classpath', 986289180Speter os.path.join(abs_srcdir, 'subversion/bindings/javahl/classes') +';' + 987289180Speter gen_obj.junit_path 988289180Speter ) 989289180Speter 990289180Speter sys.stderr.flush() 991289180Speter print('Running org.apache.subversion tests:') 992289180Speter sys.stdout.flush() 993289180Speter 994289180Speter r = subprocess.call(args + tuple(['org.apache.subversion.javahl.RunTests'])) 995289180Speter sys.stdout.flush() 996289180Speter sys.stderr.flush() 997289180Speter if (r != 0): 998289180Speter print('[Test runner reported failure]') 999289180Speter failed = True 1000289180Speter 1001289180Speter print('Running org.tigris.subversion tests:') 1002289180Speter sys.stdout.flush() 1003289180Speter r = subprocess.call(args + tuple(['org.tigris.subversion.javahl.RunTests'])) 1004289180Speter sys.stdout.flush() 1005289180Speter sys.stderr.flush() 1006289180Speter if (r != 0): 1007289180Speter print('[Test runner reported failure]') 1008289180Speter failed = True 1009289180Speterelif test_swig == 'perl': 1010289180Speter failed = False 1011289180Speter swig_dir = os.path.join(abs_builddir, 'swig') 1012289180Speter swig_pl_dir = os.path.join(swig_dir, 'p5lib') 1013289180Speter swig_pl_svn = os.path.join(swig_pl_dir, 'SVN') 1014289180Speter swig_pl_auto_svn = os.path.join(swig_pl_dir, 'auto', 'SVN') 1015289180Speter 1016289180Speter create_target_dir(swig_pl_svn) 1017289180Speter 1018289180Speter for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): 1019289180Speter if isinstance(i, gen_base.TargetSWIG) and i.lang == 'perl': 1020289180Speter mod_dir = os.path.join(swig_pl_auto_svn, '_' + i.name[5:].capitalize()) 1021289180Speter create_target_dir(mod_dir) 1022289180Speter copy_changed_file(os.path.join(abs_objdir, i.filename), to_dir=mod_dir) 1023289180Speter 1024289180Speter elif isinstance(i, gen_base.TargetSWIGLib) and i.lang == 'perl': 1025289180Speter copy_changed_file(os.path.join(abs_objdir, i.filename), 1026289180Speter to_dir=abs_builddir) 1027289180Speter 1028289180Speter pm_src = os.path.join(abs_srcdir, 'subversion', 'bindings', 'swig', 'perl', 1029289180Speter 'native') 1030289180Speter 1031289180Speter tests = [] 1032289180Speter 1033289180Speter for root, dirs, files in os.walk(pm_src): 1034289180Speter for name in files: 1035289180Speter if name.endswith('.pm'): 1036289180Speter fn = os.path.join(root, name) 1037289180Speter copy_changed_file(fn, to_dir=swig_pl_svn) 1038289180Speter elif name.endswith('.t'): 1039289180Speter tests.append(os.path.relpath(os.path.join(root, name), pm_src)) 1040289180Speter 1041289180Speter perl5lib = swig_pl_dir 1042289180Speter if 'PERL5LIB' in os.environ: 1043289180Speter perl5lib += os.pathsep + os.environ['PERL5LIB'] 1044289180Speter 1045289180Speter perl_exe = 'perl.exe' 1046289180Speter 1047289180Speter print('-- Running Swig Perl tests --') 1048251881Speter sys.stdout.flush() 1049289180Speter old_cwd = os.getcwd() 1050289180Speter try: 1051289180Speter os.chdir(pm_src) 1052251881Speter 1053289180Speter os.environ['PERL5LIB'] = perl5lib 1054289180Speter os.environ["SVN_DBG_NO_ABORT_ON_ERROR_LEAK"] = 'YES' 1055289180Speter 1056289180Speter r = subprocess.call([ 1057289180Speter perl_exe, 1058289180Speter '-MExtUtils::Command::MM', 1059289180Speter '-e', 'test_harness()' 1060289180Speter ] + tests) 1061289180Speter finally: 1062289180Speter os.chdir(old_cwd) 1063289180Speter 1064251881Speter if (r != 0): 1065251881Speter print('[Test runner reported failure]') 1066251881Speter failed = True 1067289180Speterelif test_swig == 'python': 1068289180Speter failed = False 1069289180Speter swig_dir = os.path.join(abs_builddir, 'swig') 1070289180Speter swig_py_dir = os.path.join(swig_dir, 'pylib') 1071289180Speter swig_py_libsvn = os.path.join(swig_py_dir, 'libsvn') 1072289180Speter swig_py_svn = os.path.join(swig_py_dir, 'svn') 1073251881Speter 1074289180Speter create_target_dir(swig_py_libsvn) 1075289180Speter create_target_dir(swig_py_svn) 1076289180Speter 1077289180Speter for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): 1078289180Speter if (isinstance(i, gen_base.TargetSWIG) 1079289180Speter or isinstance(i, gen_base.TargetSWIGLib)) and i.lang == 'python': 1080289180Speter 1081289180Speter src = os.path.join(abs_objdir, i.filename) 1082289180Speter copy_changed_file(src, to_dir=swig_py_libsvn) 1083289180Speter 1084289180Speter py_src = os.path.join(abs_srcdir, 'subversion', 'bindings', 'swig', 'python') 1085289180Speter 1086289180Speter for py_file in os.listdir(py_src): 1087289180Speter if py_file.endswith('.py'): 1088289180Speter copy_changed_file(os.path.join(py_src, py_file), 1089289180Speter to_dir=swig_py_libsvn) 1090289180Speter 1091289180Speter py_src_svn = os.path.join(py_src, 'svn') 1092289180Speter for py_file in os.listdir(py_src_svn): 1093289180Speter if py_file.endswith('.py'): 1094289180Speter copy_changed_file(os.path.join(py_src_svn, py_file), 1095289180Speter to_dir=swig_py_svn) 1096289180Speter 1097289180Speter print('-- Running Swig Python tests --') 1098251881Speter sys.stdout.flush() 1099251881Speter 1100289180Speter pythonpath = swig_py_dir 1101289180Speter if 'PYTHONPATH' in os.environ: 1102289180Speter pythonpath += os.pathsep + os.environ['PYTHONPATH'] 1103289180Speter 1104289180Speter python_exe = 'python.exe' 1105289180Speter old_cwd = os.getcwd() 1106289180Speter try: 1107289180Speter os.environ['PYTHONPATH'] = pythonpath 1108289180Speter 1109289180Speter r = subprocess.call([ 1110289180Speter python_exe, 1111289180Speter os.path.join(py_src, 'tests', 'run_all.py') 1112289180Speter ]) 1113289180Speter finally: 1114289180Speter os.chdir(old_cwd) 1115289180Speter 1116289180Speter if (r != 0): 1117289180Speter print('[Test runner reported failure]') 1118289180Speter failed = True 1119289180Speter 1120289180Speterelif test_swig == 'ruby': 1121289180Speter failed = False 1122289180Speter 1123289180Speter if 'ruby' not in gen_obj._libraries: 1124289180Speter print('Ruby not found. Skipping Ruby tests') 1125289180Speter else: 1126289180Speter ruby_lib = gen_obj._libraries['ruby'] 1127289180Speter 1128289180Speter ruby_exe = 'ruby.exe' 1129289180Speter ruby_subdir = os.path.join('subversion', 'bindings', 'swig', 'ruby') 1130289180Speter ruby_args = [ 1131289180Speter '-I', os.path.join(abs_srcdir, ruby_subdir), 1132289180Speter os.path.join(abs_srcdir, ruby_subdir, 'test', 'run-test.rb'), 1133289180Speter '--verbose' 1134289180Speter ] 1135289180Speter 1136289180Speter print('-- Running Swig Ruby tests --') 1137289180Speter sys.stdout.flush() 1138289180Speter old_cwd = os.getcwd() 1139289180Speter try: 1140289180Speter os.chdir(ruby_subdir) 1141289180Speter 1142289180Speter os.environ["BUILD_TYPE"] = objdir 1143289180Speter os.environ["SVN_DBG_NO_ABORT_ON_ERROR_LEAK"] = 'YES' 1144289180Speter r = subprocess.call([ruby_exe] + ruby_args) 1145289180Speter finally: 1146289180Speter os.chdir(old_cwd) 1147289180Speter 1148289180Speter sys.stdout.flush() 1149289180Speter sys.stderr.flush() 1150289180Speter if (r != 0): 1151289180Speter print('[Test runner reported failure]') 1152289180Speter failed = True 1153289180Speter 1154251881Speter# Stop service daemon, if any 1155251881Speterif daemon: 1156251881Speter del daemon 1157251881Speter 1158251881Speter# Remove the execs again 1159251881Speterfor tgt in copied_execs: 1160251881Speter try: 1161251881Speter if os.path.isfile(tgt): 1162251881Speter if verbose: 1163251881Speter print("kill: %s" % tgt) 1164251881Speter os.unlink(tgt) 1165251881Speter except: 1166251881Speter traceback.print_exc(file=sys.stdout) 1167251881Speter pass 1168251881Speter 1169251881Speter 1170251881Speterif failed: 1171251881Speter sys.exit(1) 1172