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 27299742Sdim# $HeadURL: http://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $ 28299742Sdim# $LastChangedRevision: 1718291 $ 29251881Speter 30251881Speterimport os, sys, subprocess 31251881Speterimport filecmp 32251881Speterimport shutil 33251881Speterimport traceback 34299742Sdimimport 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") 87299742Sdim print(" --swig=language : Run the swig perl/python/ruby tests instead of") 88299742Sdim 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") 104299742Sdim print(" -q, --quiet : Deprecated; this is the default.") 105299742Sdim 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 115299742Sdimimport gen_win_dependencies 116299742Sdimimport gen_base 117251881Speterversion_header = os.path.join('subversion', 'include', 'svn_version.h') 118251881Spetercp = configparser.ConfigParser() 119251881Spetercp.read('gen-make.opts') 120299742Sdimgen_obj = gen_win_dependencies.GenDependenciesBase('build.conf', version_header, 121299742Sdim 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', 128299742Sdim '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 137299742Sdimbase_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 154299742Sdimtest_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 177299742Sdim 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 214299742Sdim elif opt == '--swig': 215299742Sdim if val not in ['perl', 'python', 'ruby']: 216299742Sdim sys.stderr.write('Running \'%s\' swig tests not supported (yet).\n' 217299742Sdim % (val,)) 218299742Sdim 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': 229299742Sdim server_minor_version = int(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': 239299742Sdim 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 257299742Sdimif fs_type == 'bdb': 258299742Sdim all_tests = gen_obj.test_progs + gen_obj.bdb_test_progs \ 259299742Sdim + gen_obj.scripts + gen_obj.bdb_scripts 260299742Sdimelse: 261251881Speter all_tests = gen_obj.test_progs + gen_obj.scripts 262251881Speter 263299742Sdimclient_tests = [x for x in all_tests if x.startswith(CMDLINE_TEST_SCRIPT_PATH)] 264299742Sdim 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 296299742Sdimdef 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) 300299742Sdim 301299742Sdim if to_dir and not tgt: 302299742Sdim tgt = os.path.join(to_dir, os.path.basename(src)) 303299742Sdim elif not tgt or (tgt and to_dir): 304299742Sdim raise RuntimeError("Using 'tgt' *or* 'to_dir' is required" % (tgt,)) 305299742Sdim elif tgt and os.path.isdir(tgt): 306299742Sdim raise RuntimeError("'%s' is a directory. Use to_dir=" % (tgt,)) 307299742Sdim 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 320299742Sdim if cleanup: 321299742Sdim copied_execs.append(tgt) 322251881Speter 323251881Speterdef locate_libs(): 324251881Speter "Move DLLs to a known location and set env vars" 325251881Speter 326299742Sdim debug = (objdir == 'Debug') 327251881Speter 328299742Sdim for lib in gen_obj._libraries.values(): 329251881Speter 330299742Sdim if debug: 331299742Sdim name, dir = lib.debug_dll_name, lib.debug_dll_dir 332299742Sdim else: 333299742Sdim name, dir = lib.dll_name, lib.dll_dir 334251881Speter 335299742Sdim if name and dir: 336299742Sdim src = os.path.join(dir, name) 337299742Sdim if os.path.exists(src): 338299742Sdim copy_changed_file(src, to_dir=abs_builddir, cleanup=False) 339251881Speter 340299742Sdim for name in lib.extra_bin: 341299742Sdim src = os.path.join(dir, name) 342299742Sdim copy_changed_file(src, to_dir=abs_builddir) 343251881Speter 344251881Speter 345251881Speter # Copy the Subversion library DLLs 346299742Sdim for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): 347299742Sdim if isinstance(i, gen_base.TargetLib) and i.msvc_export: 348299742Sdim src = os.path.join(abs_objdir, i.filename) 349299742Sdim if os.path.isfile(src): 350299742Sdim copy_changed_file(src, to_dir=abs_builddir, 351299742Sdim 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 362299742Sdim copy_changed_file(mod_dav_svn_path, to_dir=abs_builddir, cleanup=False) 363299742Sdim copy_changed_file(mod_authz_svn_path, to_dir=abs_builddir, cleanup=False) 364299742Sdim copy_changed_file(mod_dontdothat_path, to_dir=abs_builddir, cleanup=False) 365251881Speter 366299742Sdim 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) 391299742Sdim 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 410299742Sdim self.proc = subprocess.Popen([self.path] + args[1:]) 411299742Sdim 412251881Speter def stop(self): 413299742Sdim if self.proc is not None: 414251881Speter try: 415251881Speter print('Stopping %s' % self.name) 416299742Sdim self.proc.poll(); 417299742Sdim if self.proc.returncode is None: 418299742Sdim self.proc.kill(); 419251881Speter return 420299742Sdim 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 443299742Sdim 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') 468289166Speter 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() 482289166Speter self._create_groups_file() 483251881Speter self._create_mime_types_file() 484251881Speter self._create_dontdothat_file() 485251881Speter 486299742Sdim # Obtain version. 487299742Sdim version_vals = gen_obj._libraries['httpd'].version.split('.') 488299742Sdim 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')) 523289166Speter fp.write(self._sys_module('authz_groupfile_module', 'mod_authz_groupfile.so')) 524289166Speter 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')) 547289166Speter 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']) 578289166Speter os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users, 579289166Speter 'JRANDOM', 'rayjandom']) 580289166Speter os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users, 581289166Speter 'JCONSTANT', 'rayjandom']) 582251881Speter 583289166Speter def _create_groups_file(self): 584289166Speter "Create groups for mod_authz_svn tests" 585289166Speter fp = open(self.httpd_groups, 'w') 586289166Speter fp.write('random: jrandom\n') 587289166Speter fp.write('constant: jconstant\n') 588289166Speter fp.close() 589289166Speter 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): 613299742Sdim 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 649289166Speter def _svn_authz_repo(self): 650289166Speter local_tmp = os.path.join(self.abs_builddir, 651289166Speter CMDLINE_TEST_SCRIPT_NATIVE_PATH, 652289166Speter 'svn-test-work', 'local_tmp') 653289166Speter return \ 654289166Speter '<Location /authz-test-work/anon>' + '\n' \ 655289166Speter ' DAV svn' + '\n' \ 656289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 657289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 658289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 659289166Speter ' SVNListParentPath On' + '\n' \ 660289166Speter ' <IfModule mod_authz_core.c>' + '\n' \ 661289166Speter ' Require all granted' + '\n' \ 662289166Speter ' </IfModule>' + '\n' \ 663289166Speter ' <IfModule !mod_authz_core.c>' + '\n' \ 664289166Speter ' Allow from all' + '\n' \ 665289166Speter ' </IfModule>' + '\n' \ 666289166Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 667289166Speter '</Location>' + '\n' \ 668289166Speter '<Location /authz-test-work/mixed>' + '\n' \ 669289166Speter ' DAV svn' + '\n' \ 670289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 671289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 672289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 673289166Speter ' SVNListParentPath On' + '\n' \ 674289166Speter ' AuthType Basic' + '\n' \ 675289166Speter ' AuthName "Subversion Repository"' + '\n' \ 676289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 677289166Speter ' Require valid-user' + '\n' \ 678289166Speter ' Satisfy Any' + '\n' \ 679289166Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 680289166Speter '</Location>' + '\n' \ 681289166Speter '<Location /authz-test-work/mixed-noauthwhenanon>' + '\n' \ 682289166Speter ' DAV svn' + '\n' \ 683289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 684289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 685289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 686289166Speter ' SVNListParentPath On' + '\n' \ 687289166Speter ' AuthType Basic' + '\n' \ 688289166Speter ' AuthName "Subversion Repository"' + '\n' \ 689289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 690289166Speter ' Require valid-user' + '\n' \ 691289166Speter ' AuthzSVNNoAuthWhenAnonymousAllowed On' + '\n' \ 692289166Speter ' SVNPathAuthz On' + '\n' \ 693289166Speter '</Location>' + '\n' \ 694289166Speter '<Location /authz-test-work/authn>' + '\n' \ 695289166Speter ' DAV svn' + '\n' \ 696289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 697289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 698289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 699289166Speter ' SVNListParentPath On' + '\n' \ 700289166Speter ' AuthType Basic' + '\n' \ 701289166Speter ' AuthName "Subversion Repository"' + '\n' \ 702289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 703289166Speter ' Require valid-user' + '\n' \ 704289166Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 705289166Speter '</Location>' + '\n' \ 706289166Speter '<Location /authz-test-work/authn-anonoff>' + '\n' \ 707289166Speter ' DAV svn' + '\n' \ 708289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 709289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 710289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 711289166Speter ' SVNListParentPath On' + '\n' \ 712289166Speter ' AuthType Basic' + '\n' \ 713289166Speter ' AuthName "Subversion Repository"' + '\n' \ 714289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 715289166Speter ' Require valid-user' + '\n' \ 716289166Speter ' AuthzSVNAnonymous Off' + '\n' \ 717289166Speter ' SVNPathAuthz On' + '\n' \ 718289166Speter '</Location>' + '\n' \ 719289166Speter '<Location /authz-test-work/authn-lcuser>' + '\n' \ 720289166Speter ' DAV svn' + '\n' \ 721289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 722289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 723289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 724289166Speter ' SVNListParentPath On' + '\n' \ 725289166Speter ' AuthType Basic' + '\n' \ 726289166Speter ' AuthName "Subversion Repository"' + '\n' \ 727289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 728289166Speter ' Require valid-user' + '\n' \ 729289166Speter ' AuthzForceUsernameCase Lower' + '\n' \ 730289166Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 731289166Speter '</Location>' + '\n' \ 732289166Speter '<Location /authz-test-work/authn-lcuser>' + '\n' \ 733289166Speter ' DAV svn' + '\n' \ 734289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 735289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 736289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 737289166Speter ' SVNListParentPath On' + '\n' \ 738289166Speter ' AuthType Basic' + '\n' \ 739289166Speter ' AuthName "Subversion Repository"' + '\n' \ 740289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 741289166Speter ' Require valid-user' + '\n' \ 742289166Speter ' AuthzForceUsernameCase Lower' + '\n' \ 743289166Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 744289166Speter '</Location>' + '\n' \ 745289166Speter '<Location /authz-test-work/authn-group>' + '\n' \ 746289166Speter ' DAV svn' + '\n' \ 747289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 748289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 749289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 750289166Speter ' SVNListParentPath On' + '\n' \ 751289166Speter ' AuthType Basic' + '\n' \ 752289166Speter ' AuthName "Subversion Repository"' + '\n' \ 753289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 754289166Speter ' AuthGroupFile ' + self._quote(self.httpd_groups) + '\n' \ 755289166Speter ' Require group random' + '\n' \ 756289166Speter ' AuthzSVNAuthoritative Off' + '\n' \ 757289166Speter ' SVNPathAuthz On' + '\n' \ 758289166Speter '</Location>' + '\n' \ 759289166Speter '<IfModule mod_authz_core.c>' + '\n' \ 760289166Speter '<Location /authz-test-work/sallrany>' + '\n' \ 761289166Speter ' DAV svn' + '\n' \ 762289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 763289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 764289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 765289166Speter ' SVNListParentPath On' + '\n' \ 766289166Speter ' AuthType Basic' + '\n' \ 767289166Speter ' AuthName "Subversion Repository"' + '\n' \ 768289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 769289166Speter ' AuthzSendForbiddenOnFailure On' + '\n' \ 770289166Speter ' Satisfy All' + '\n' \ 771289166Speter ' <RequireAny>' + '\n' \ 772289166Speter ' Require valid-user' + '\n' \ 773289166Speter ' Require expr req(\'ALLOW\') == \'1\'' + '\n' \ 774289166Speter ' </RequireAny>' + '\n' \ 775289166Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 776289166Speter '</Location>' + '\n' \ 777289166Speter '<Location /authz-test-work/sallrall>'+ '\n' \ 778289166Speter ' DAV svn' + '\n' \ 779289166Speter ' SVNParentPath ' + local_tmp + '\n' \ 780289166Speter ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \ 781289166Speter ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \ 782289166Speter ' SVNListParentPath On' + '\n' \ 783289166Speter ' AuthType Basic' + '\n' \ 784289166Speter ' AuthName "Subversion Repository"' + '\n' \ 785289166Speter ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \ 786289166Speter ' AuthzSendForbiddenOnFailure On' + '\n' \ 787289166Speter ' Satisfy All' + '\n' \ 788289166Speter ' <RequireAll>' + '\n' \ 789299742Sdim ' Require valid-user' + '\n' \ 790299742Sdim ' Require expr req(\'ALLOW\') == \'1\'' + '\n' \ 791299742Sdim '</RequireAll>' + '\n' \ 792289166Speter ' SVNPathAuthz ' + self.path_authz_option + '\n' \ 793289166Speter '</Location>' + '\n' \ 794289166Speter '</IfModule>' + '\n' \ 795289166Speter 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) 824299742Sdim self.proc = subprocess.Popen([self.path] + self.httpd_args[1:]) 825251881Speter 826251881Speter def _stop_daemon(self): 827251881Speter "Stop the HTTPD daemon" 828299742Sdim if self.proc is not None: 829251881Speter try: 830251881Speter print('Stopping %s' % self.name) 831299742Sdim self.proc.poll(); 832299742Sdim if self.proc.returncode is None: 833299742Sdim self.proc.kill(); 834251881Speter return 835299742Sdim except AttributeError: 836251881Speter pass 837251881Speter print('Httpd.stop_daemon not implemented') 838251881Speter 839251881Speter# Move the binaries to the test directory 840299742Sdimcreate_target_dir(abs_builddir) 841251881Speterlocate_libs() 842251881Speterif create_dirs: 843299742Sdim for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): 844299742Sdim if isinstance(i, gen_base.TargetExe): 845299742Sdim src = os.path.join(abs_objdir, i.filename) 846251881Speter 847299742Sdim if os.path.isfile(src): 848299742Sdim dst = os.path.join(abs_builddir, i.filename) 849299742Sdim create_target_dir(os.path.dirname(dst)) 850299742Sdim copy_changed_file(src, dst) 851299742Sdim 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 908299742Sdimif 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 917289166Speter if run_httpd: 918299742Sdim httpd_version = gen_obj._libraries['httpd'].version 919289166Speter else: 920289166Speter httpd_version = None 921299742Sdim 922299742Sdim opts, args = run_tests.create_parser().parse_args([]) 923299742Sdim opts.url = base_url 924299742Sdim opts.fs_type = fs_type 925299742Sdim opts.http_library = 'serf' 926299742Sdim opts.server_minor_version = server_minor_version 927299742Sdim opts.cleanup = cleanup 928299742Sdim opts.enable_sasl = enable_sasl 929299742Sdim opts.parallel = parallel 930299742Sdim opts.config_file = config_file 931299742Sdim opts.fsfs_sharding = fsfs_sharding 932299742Sdim opts.fsfs_packing = fsfs_packing 933299742Sdim opts.list_tests = list_tests 934299742Sdim opts.svn_bin = svn_bin 935299742Sdim opts.mode_filter = mode_filter 936299742Sdim opts.milestone_filter = milestone_filter 937299742Sdim opts.httpd_version = httpd_version 938299742Sdim opts.set_log_level = log_level 939299742Sdim opts.ssl_cert = ssl_cert 940251881Speter th = run_tests.TestHarness(abs_srcdir, abs_builddir, 941299742Sdim 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) 951299742Sdimelif test_javahl: 952251881Speter failed = False 953251881Speter 954299742Sdim java_exe = None 955251881Speter 956299742Sdim for path in os.environ["PATH"].split(os.pathsep): 957299742Sdim if os.path.isfile(os.path.join(path, 'java.exe')): 958299742Sdim java_exe = os.path.join(path, 'java.exe') 959299742Sdim break 960299742Sdim 961299742Sdim if not java_exe and 'java_sdk' in gen_obj._libraries: 962299742Sdim jdk = gen_obj._libraries['java_sdk'] 963299742Sdim 964299742Sdim if os.path.isfile(os.path.join(jdk.lib_dir, '../bin/java.exe')): 965299742Sdim java_exe = os.path.join(jdk.lib_dir, '../bin/java.exe') 966299742Sdim 967299742Sdim if not java_exe: 968299742Sdim print('Java not found. Skipping Java tests') 969299742Sdim else: 970299742Sdim args = (os.path.abspath(java_exe),) 971299742Sdim if (objdir == 'Debug'): 972299742Sdim args = args + ('-Xcheck:jni',) 973299742Sdim 974299742Sdim args = args + ( 975299742Sdim '-Dtest.rootdir=' + os.path.join(abs_builddir, 'javahl'), 976299742Sdim '-Dtest.srcdir=' + os.path.join(abs_srcdir, 977299742Sdim 'subversion/bindings/javahl'), 978299742Sdim '-Dtest.rooturl=', 979299742Sdim '-Dtest.fstype=' + fs_type , 980299742Sdim '-Dtest.tests=', 981299742Sdim 982299742Sdim '-Djava.library.path=' 983299742Sdim + os.path.join(abs_objdir, 984299742Sdim 'subversion/bindings/javahl/native'), 985299742Sdim '-classpath', 986299742Sdim os.path.join(abs_srcdir, 'subversion/bindings/javahl/classes') +';' + 987299742Sdim gen_obj.junit_path 988299742Sdim ) 989299742Sdim 990299742Sdim sys.stderr.flush() 991299742Sdim print('Running org.apache.subversion tests:') 992299742Sdim sys.stdout.flush() 993299742Sdim 994299742Sdim r = subprocess.call(args + tuple(['org.apache.subversion.javahl.RunTests'])) 995299742Sdim sys.stdout.flush() 996299742Sdim sys.stderr.flush() 997299742Sdim if (r != 0): 998299742Sdim print('[Test runner reported failure]') 999299742Sdim failed = True 1000299742Sdim 1001299742Sdim print('Running org.tigris.subversion tests:') 1002299742Sdim sys.stdout.flush() 1003299742Sdim r = subprocess.call(args + tuple(['org.tigris.subversion.javahl.RunTests'])) 1004299742Sdim sys.stdout.flush() 1005299742Sdim sys.stderr.flush() 1006299742Sdim if (r != 0): 1007299742Sdim print('[Test runner reported failure]') 1008299742Sdim failed = True 1009299742Sdimelif test_swig == 'perl': 1010299742Sdim failed = False 1011299742Sdim swig_dir = os.path.join(abs_builddir, 'swig') 1012299742Sdim swig_pl_dir = os.path.join(swig_dir, 'p5lib') 1013299742Sdim swig_pl_svn = os.path.join(swig_pl_dir, 'SVN') 1014299742Sdim swig_pl_auto_svn = os.path.join(swig_pl_dir, 'auto', 'SVN') 1015299742Sdim 1016299742Sdim create_target_dir(swig_pl_svn) 1017299742Sdim 1018299742Sdim for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): 1019299742Sdim if isinstance(i, gen_base.TargetSWIG) and i.lang == 'perl': 1020299742Sdim mod_dir = os.path.join(swig_pl_auto_svn, '_' + i.name[5:].capitalize()) 1021299742Sdim create_target_dir(mod_dir) 1022299742Sdim copy_changed_file(os.path.join(abs_objdir, i.filename), to_dir=mod_dir) 1023299742Sdim 1024299742Sdim elif isinstance(i, gen_base.TargetSWIGLib) and i.lang == 'perl': 1025299742Sdim copy_changed_file(os.path.join(abs_objdir, i.filename), 1026299742Sdim to_dir=abs_builddir) 1027299742Sdim 1028299742Sdim pm_src = os.path.join(abs_srcdir, 'subversion', 'bindings', 'swig', 'perl', 1029299742Sdim 'native') 1030299742Sdim 1031299742Sdim tests = [] 1032299742Sdim 1033299742Sdim for root, dirs, files in os.walk(pm_src): 1034299742Sdim for name in files: 1035299742Sdim if name.endswith('.pm'): 1036299742Sdim fn = os.path.join(root, name) 1037299742Sdim copy_changed_file(fn, to_dir=swig_pl_svn) 1038299742Sdim elif name.endswith('.t'): 1039299742Sdim tests.append(os.path.relpath(os.path.join(root, name), pm_src)) 1040299742Sdim 1041299742Sdim perl5lib = swig_pl_dir 1042299742Sdim if 'PERL5LIB' in os.environ: 1043299742Sdim perl5lib += os.pathsep + os.environ['PERL5LIB'] 1044299742Sdim 1045299742Sdim perl_exe = 'perl.exe' 1046299742Sdim 1047299742Sdim print('-- Running Swig Perl tests --') 1048251881Speter sys.stdout.flush() 1049299742Sdim old_cwd = os.getcwd() 1050299742Sdim try: 1051299742Sdim os.chdir(pm_src) 1052251881Speter 1053299742Sdim os.environ['PERL5LIB'] = perl5lib 1054299742Sdim os.environ["SVN_DBG_NO_ABORT_ON_ERROR_LEAK"] = 'YES' 1055299742Sdim 1056299742Sdim r = subprocess.call([ 1057299742Sdim perl_exe, 1058299742Sdim '-MExtUtils::Command::MM', 1059299742Sdim '-e', 'test_harness()' 1060299742Sdim ] + tests) 1061299742Sdim finally: 1062299742Sdim os.chdir(old_cwd) 1063299742Sdim 1064251881Speter if (r != 0): 1065251881Speter print('[Test runner reported failure]') 1066251881Speter failed = True 1067299742Sdimelif test_swig == 'python': 1068299742Sdim failed = False 1069299742Sdim swig_dir = os.path.join(abs_builddir, 'swig') 1070299742Sdim swig_py_dir = os.path.join(swig_dir, 'pylib') 1071299742Sdim swig_py_libsvn = os.path.join(swig_py_dir, 'libsvn') 1072299742Sdim swig_py_svn = os.path.join(swig_py_dir, 'svn') 1073251881Speter 1074299742Sdim create_target_dir(swig_py_libsvn) 1075299742Sdim create_target_dir(swig_py_svn) 1076299742Sdim 1077299742Sdim for i in gen_obj.graph.get_all_sources(gen_base.DT_INSTALL): 1078299742Sdim if (isinstance(i, gen_base.TargetSWIG) 1079299742Sdim or isinstance(i, gen_base.TargetSWIGLib)) and i.lang == 'python': 1080299742Sdim 1081299742Sdim src = os.path.join(abs_objdir, i.filename) 1082299742Sdim copy_changed_file(src, to_dir=swig_py_libsvn) 1083299742Sdim 1084299742Sdim py_src = os.path.join(abs_srcdir, 'subversion', 'bindings', 'swig', 'python') 1085299742Sdim 1086299742Sdim for py_file in os.listdir(py_src): 1087299742Sdim if py_file.endswith('.py'): 1088299742Sdim copy_changed_file(os.path.join(py_src, py_file), 1089299742Sdim to_dir=swig_py_libsvn) 1090299742Sdim 1091299742Sdim py_src_svn = os.path.join(py_src, 'svn') 1092299742Sdim for py_file in os.listdir(py_src_svn): 1093299742Sdim if py_file.endswith('.py'): 1094299742Sdim copy_changed_file(os.path.join(py_src_svn, py_file), 1095299742Sdim to_dir=swig_py_svn) 1096299742Sdim 1097299742Sdim print('-- Running Swig Python tests --') 1098251881Speter sys.stdout.flush() 1099251881Speter 1100299742Sdim pythonpath = swig_py_dir 1101299742Sdim if 'PYTHONPATH' in os.environ: 1102299742Sdim pythonpath += os.pathsep + os.environ['PYTHONPATH'] 1103299742Sdim 1104299742Sdim python_exe = 'python.exe' 1105299742Sdim old_cwd = os.getcwd() 1106299742Sdim try: 1107299742Sdim os.environ['PYTHONPATH'] = pythonpath 1108299742Sdim 1109299742Sdim r = subprocess.call([ 1110299742Sdim python_exe, 1111299742Sdim os.path.join(py_src, 'tests', 'run_all.py') 1112299742Sdim ]) 1113299742Sdim finally: 1114299742Sdim os.chdir(old_cwd) 1115299742Sdim 1116299742Sdim if (r != 0): 1117299742Sdim print('[Test runner reported failure]') 1118299742Sdim failed = True 1119299742Sdim 1120299742Sdimelif test_swig == 'ruby': 1121299742Sdim failed = False 1122299742Sdim 1123299742Sdim if 'ruby' not in gen_obj._libraries: 1124299742Sdim print('Ruby not found. Skipping Ruby tests') 1125299742Sdim else: 1126299742Sdim ruby_lib = gen_obj._libraries['ruby'] 1127299742Sdim 1128299742Sdim ruby_exe = 'ruby.exe' 1129299742Sdim ruby_subdir = os.path.join('subversion', 'bindings', 'swig', 'ruby') 1130299742Sdim ruby_args = [ 1131299742Sdim '-I', os.path.join(abs_srcdir, ruby_subdir), 1132299742Sdim os.path.join(abs_srcdir, ruby_subdir, 'test', 'run-test.rb'), 1133299742Sdim '--verbose' 1134299742Sdim ] 1135299742Sdim 1136299742Sdim print('-- Running Swig Ruby tests --') 1137299742Sdim sys.stdout.flush() 1138299742Sdim old_cwd = os.getcwd() 1139299742Sdim try: 1140299742Sdim os.chdir(ruby_subdir) 1141299742Sdim 1142299742Sdim os.environ["BUILD_TYPE"] = objdir 1143299742Sdim os.environ["SVN_DBG_NO_ABORT_ON_ERROR_LEAK"] = 'YES' 1144299742Sdim r = subprocess.call([ruby_exe] + ruby_args) 1145299742Sdim finally: 1146299742Sdim os.chdir(old_cwd) 1147299742Sdim 1148299742Sdim sys.stdout.flush() 1149299742Sdim sys.stderr.flush() 1150299742Sdim if (r != 0): 1151299742Sdim print('[Test runner reported failure]') 1152299742Sdim failed = True 1153299742Sdim 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