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