272 help="loop tests repeatedly") |
272 help="loop tests repeatedly") |
273 parser.add_option("--runs-per-test", type="int", dest="runs_per_test", |
273 parser.add_option("--runs-per-test", type="int", dest="runs_per_test", |
274 help="run each test N times (default=1)", default=1) |
274 help="run each test N times (default=1)", default=1) |
275 parser.add_option("-n", "--nodiff", action="store_true", |
275 parser.add_option("-n", "--nodiff", action="store_true", |
276 help="skip showing test changes") |
276 help="skip showing test changes") |
|
277 parser.add_option("--outputdir", type="string", |
|
278 help="directory to write error logs to (default=test directory)") |
277 parser.add_option("-p", "--port", type="int", |
279 parser.add_option("-p", "--port", type="int", |
278 help="port on which servers should listen" |
280 help="port on which servers should listen" |
279 " (default: $%s or %d)" % defaults['port']) |
281 " (default: $%s or %d)" % defaults['port']) |
280 parser.add_option("--compiler", type="string", |
282 parser.add_option("--compiler", type="string", |
281 help="compiler to build with") |
283 help="compiler to build with") |
562 """ |
564 """ |
563 |
565 |
564 # Status code reserved for skipped tests (used by hghave). |
566 # Status code reserved for skipped tests (used by hghave). |
565 SKIPPED_STATUS = 80 |
567 SKIPPED_STATUS = 80 |
566 |
568 |
567 def __init__(self, path, tmpdir, keeptmpdir=False, |
569 def __init__(self, path, outputdir, tmpdir, keeptmpdir=False, |
568 debug=False, |
570 debug=False, |
569 timeout=defaults['timeout'], |
571 timeout=defaults['timeout'], |
570 startport=defaults['port'], extraconfigopts=None, |
572 startport=defaults['port'], extraconfigopts=None, |
571 py3kwarnings=False, shell=None, hgcommand=None, |
573 py3kwarnings=False, shell=None, hgcommand=None, |
572 slowtimeout=defaults['slowtimeout'], usechg=False, |
574 slowtimeout=defaults['slowtimeout'], usechg=False, |
603 """ |
605 """ |
604 self.path = path |
606 self.path = path |
605 self.bname = os.path.basename(path) |
607 self.bname = os.path.basename(path) |
606 self.name = _strpath(self.bname) |
608 self.name = _strpath(self.bname) |
607 self._testdir = os.path.dirname(path) |
609 self._testdir = os.path.dirname(path) |
|
610 self._outputdir = outputdir |
608 self._tmpname = os.path.basename(path) |
611 self._tmpname = os.path.basename(path) |
609 self.errpath = os.path.join(self._testdir, b'%s.err' % self.bname) |
612 self.errpath = os.path.join(self._outputdir, b'%s.err' % self.bname) |
610 |
613 |
611 self._threadtmp = tmpdir |
614 self._threadtmp = tmpdir |
612 self._keeptmpdir = keeptmpdir |
615 self._keeptmpdir = keeptmpdir |
613 self._debug = debug |
616 self._debug = debug |
614 self._timeout = timeout |
617 self._timeout = timeout |
2210 return perf[f] |
2214 return perf[f] |
2211 testdescs.sort(key=sortkey) |
2215 testdescs.sort(key=sortkey) |
2212 |
2216 |
2213 self._testdir = osenvironb[b'TESTDIR'] = getattr( |
2217 self._testdir = osenvironb[b'TESTDIR'] = getattr( |
2214 os, 'getcwdb', os.getcwd)() |
2218 os, 'getcwdb', os.getcwd)() |
|
2219 if self.options.outputdir: |
|
2220 self._outputdir = canonpath(_bytespath(self.options.outputdir)) |
|
2221 else: |
|
2222 self._outputdir = self._testdir |
2215 |
2223 |
2216 if 'PYTHONHASHSEED' not in os.environ: |
2224 if 'PYTHONHASHSEED' not in os.environ: |
2217 # use a random python hash seed all the time |
2225 # use a random python hash seed all the time |
2218 # we do the randomness ourself to know what seed is used |
2226 # we do the randomness ourself to know what seed is used |
2219 os.environ['PYTHONHASHSEED'] = str(random.getrandbits(32)) |
2227 os.environ['PYTHONHASHSEED'] = str(random.getrandbits(32)) |
2334 vlog("# Using TESTDIR", self._testdir) |
2342 vlog("# Using TESTDIR", self._testdir) |
2335 vlog("# Using RUNTESTDIR", osenvironb[b'RUNTESTDIR']) |
2343 vlog("# Using RUNTESTDIR", osenvironb[b'RUNTESTDIR']) |
2336 vlog("# Using HGTMP", self._hgtmp) |
2344 vlog("# Using HGTMP", self._hgtmp) |
2337 vlog("# Using PATH", os.environ["PATH"]) |
2345 vlog("# Using PATH", os.environ["PATH"]) |
2338 vlog("# Using", IMPL_PATH, osenvironb[IMPL_PATH]) |
2346 vlog("# Using", IMPL_PATH, osenvironb[IMPL_PATH]) |
|
2347 vlog("# Writing to directory", self._outputdir) |
2339 |
2348 |
2340 try: |
2349 try: |
2341 return self._runtests(testdescs) or 0 |
2350 return self._runtests(testdescs) or 0 |
2342 finally: |
2351 finally: |
2343 time.sleep(.1) |
2352 time.sleep(.1) |
2489 tmpdir = os.path.join(self._hgtmp, b'child%d' % count) |
2498 tmpdir = os.path.join(self._hgtmp, b'child%d' % count) |
2490 |
2499 |
2491 # extra keyword parameters. 'case' is used by .t tests |
2500 # extra keyword parameters. 'case' is used by .t tests |
2492 kwds = dict((k, testdesc[k]) for k in ['case'] if k in testdesc) |
2501 kwds = dict((k, testdesc[k]) for k in ['case'] if k in testdesc) |
2493 |
2502 |
2494 t = testcls(refpath, tmpdir, |
2503 t = testcls(refpath, self._outputdir, tmpdir, |
2495 keeptmpdir=self.options.keep_tmpdir, |
2504 keeptmpdir=self.options.keep_tmpdir, |
2496 debug=self.options.debug, |
2505 debug=self.options.debug, |
2497 timeout=self.options.timeout, |
2506 timeout=self.options.timeout, |
2498 startport=self._getport(count), |
2507 startport=self._getport(count), |
2499 extraconfigopts=self.options.extra_config_opt, |
2508 extraconfigopts=self.options.extra_config_opt, |