##// END OF EJS Templates
run-tests: refactor testtmp...
Gregory Szorc -
r21454:046587aa default
parent child Browse files
Show More
@@ -362,6 +362,7 b' class Test(object):'
362 self._duration = None
362 self._duration = None
363 self._result = None
363 self._result = None
364 self._skipped = None
364 self._skipped = None
365 self._testtmp = None
365
366
366 # If we're not in --debug mode and reference output file exists,
367 # If we're not in --debug mode and reference output file exists,
367 # check test output against it.
368 # check test output against it.
@@ -393,6 +394,10 b' class Test(object):'
393 self._result = None
394 self._result = None
394 self._skipped = None
395 self._skipped = None
395
396
397 self._testtmp = os.path.join(self._threadtmp,
398 os.path.basename(self._path))
399 os.mkdir(self._testtmp)
400
396 def run(self):
401 def run(self):
397 """Run this test instance.
402 """Run this test instance.
398
403
@@ -429,10 +434,8 b' class Test(object):'
429 if os.path.exists(self._errpath):
434 if os.path.exists(self._errpath):
430 os.remove(self._errpath)
435 os.remove(self._errpath)
431
436
432 testtmp = os.path.join(self._threadtmp, os.path.basename(self._path))
437 replacements, port = self._getreplacements()
433 os.mkdir(testtmp)
438 env = self._getenv(port)
434 replacements, port = self._getreplacements(testtmp)
435 env = self._getenv(testtmp, port)
436 self._daemonpids.append(env['DAEMON_PIDS'])
439 self._daemonpids.append(env['DAEMON_PIDS'])
437 self._createhgrc(env['HGRCPATH'])
440 self._createhgrc(env['HGRCPATH'])
438
441
@@ -440,7 +443,7 b' class Test(object):'
440
443
441 starttime = time.time()
444 starttime = time.time()
442 try:
445 try:
443 ret, out = self._run(testtmp, replacements, env)
446 ret, out = self._run(replacements, env)
444 self._duration = time.time() - starttime
447 self._duration = time.time() - starttime
445 self._finished = True
448 self._finished = True
446 self._ret = ret
449 self._ret = ret
@@ -455,9 +458,6 b' class Test(object):'
455
458
456 killdaemons(env['DAEMON_PIDS'])
459 killdaemons(env['DAEMON_PIDS'])
457
460
458 if not options.keep_tmpdir:
459 shutil.rmtree(testtmp)
460
461 def describe(ret):
461 def describe(ret):
462 if ret < 0:
462 if ret < 0:
463 return 'killed by signal: %d' % -ret
463 return 'killed by signal: %d' % -ret
@@ -529,6 +529,9 b' class Test(object):'
529
529
530 def tearDown(self):
530 def tearDown(self):
531 """Tasks to perform after run()."""
531 """Tasks to perform after run()."""
532 if not self._options.keep_tmpdir:
533 shutil.rmtree(self._testtmp)
534
532 vlog("# Ret was:", self._ret)
535 vlog("# Ret was:", self._ret)
533
536
534 # Don't print progress in unittest mode because that is handled
537 # Don't print progress in unittest mode because that is handled
@@ -541,11 +544,11 b' class Test(object):'
541
544
542 self._runner.times.append((self.name, self._duration))
545 self._runner.times.append((self.name, self._duration))
543
546
544 def _run(self, testtmp, replacements, env):
547 def _run(self, replacements, env):
545 # This should be implemented in child classes to run tests.
548 # This should be implemented in child classes to run tests.
546 return self._skip('unknown test type')
549 return self._skip('unknown test type')
547
550
548 def _getreplacements(self, testtmp):
551 def _getreplacements(self):
549 port = self._options.port + self._count * 3
552 port = self._options.port + self._count * 3
550 r = [
553 r = [
551 (r':%s\b' % port, ':$HGPORT'),
554 (r':%s\b' % port, ':$HGPORT'),
@@ -557,16 +560,16 b' class Test(object):'
557 r.append(
560 r.append(
558 (''.join(c.isalpha() and '[%s%s]' % (c.lower(), c.upper()) or
561 (''.join(c.isalpha() and '[%s%s]' % (c.lower(), c.upper()) or
559 c in '/\\' and r'[/\\]' or c.isdigit() and c or '\\' + c
562 c in '/\\' and r'[/\\]' or c.isdigit() and c or '\\' + c
560 for c in testtmp), '$TESTTMP'))
563 for c in self._testtmp), '$TESTTMP'))
561 else:
564 else:
562 r.append((re.escape(testtmp), '$TESTTMP'))
565 r.append((re.escape(self._testtmp), '$TESTTMP'))
563
566
564 return r, port
567 return r, port
565
568
566 def _getenv(self, testtmp, port):
569 def _getenv(self, port):
567 env = os.environ.copy()
570 env = os.environ.copy()
568 env['TESTTMP'] = testtmp
571 env['TESTTMP'] = self._testtmp
569 env['HOME'] = testtmp
572 env['HOME'] = self._testtmp
570 env["HGPORT"] = str(port)
573 env["HGPORT"] = str(port)
571 env["HGPORT1"] = str(port + 1)
574 env["HGPORT1"] = str(port + 1)
572 env["HGPORT2"] = str(port + 2)
575 env["HGPORT2"] = str(port + 2)
@@ -666,13 +669,13 b' class Test(object):'
666
669
667 class PythonTest(Test):
670 class PythonTest(Test):
668 """A Python-based test."""
671 """A Python-based test."""
669 def _run(self, testtmp, replacements, env):
672 def _run(self, replacements, env):
670 py3kswitch = self._options.py3k_warnings and ' -3' or ''
673 py3kswitch = self._options.py3k_warnings and ' -3' or ''
671 cmd = '%s%s "%s"' % (PYTHON, py3kswitch, self._path)
674 cmd = '%s%s "%s"' % (PYTHON, py3kswitch, self._path)
672 vlog("# Running", cmd)
675 vlog("# Running", cmd)
673 if os.name == 'nt':
676 if os.name == 'nt':
674 replacements.append((r'\r\n', '\n'))
677 replacements.append((r'\r\n', '\n'))
675 return run(cmd, testtmp, self._options, replacements, env,
678 return run(cmd, self._testtmp, self._options, replacements, env,
676 self._runner.abort)
679 self._runner.abort)
677
680
678 class TTest(Test):
681 class TTest(Test):
@@ -686,15 +689,15 b' class TTest(Test):'
686 ESCAPEMAP = dict((chr(i), r'\x%02x' % i) for i in range(256)).update(
689 ESCAPEMAP = dict((chr(i), r'\x%02x' % i) for i in range(256)).update(
687 {'\\': '\\\\', '\r': r'\r'})
690 {'\\': '\\\\', '\r': r'\r'})
688
691
689 def _run(self, testtmp, replacements, env):
692 def _run(self, replacements, env):
690 f = open(self._path)
693 f = open(self._path)
691 lines = f.readlines()
694 lines = f.readlines()
692 f.close()
695 f.close()
693
696
694 salt, script, after, expected = self._parsetest(lines, testtmp)
697 salt, script, after, expected = self._parsetest(lines)
695
698
696 # Write out the generated script.
699 # Write out the generated script.
697 fname = '%s.sh' % testtmp
700 fname = '%s.sh' % self._testtmp
698 f = open(fname, 'w')
701 f = open(fname, 'w')
699 for l in script:
702 for l in script:
700 f.write(l)
703 f.write(l)
@@ -703,8 +706,8 b' class TTest(Test):'
703 cmd = '%s "%s"' % (self._options.shell, fname)
706 cmd = '%s "%s"' % (self._options.shell, fname)
704 vlog("# Running", cmd)
707 vlog("# Running", cmd)
705
708
706 exitcode, output = run(cmd, testtmp, self._options, replacements, env,
709 exitcode, output = run(cmd, self._testtmp, self._options, replacements,
707 self._runner.abort)
710 env, self._runner.abort)
708 # Do not merge output if skipped. Return hghave message instead.
711 # Do not merge output if skipped. Return hghave message instead.
709 # Similarly, with --debug, output is None.
712 # Similarly, with --debug, output is None.
710 if exitcode == self.SKIPPED_STATUS or output is None:
713 if exitcode == self.SKIPPED_STATUS or output is None:
@@ -712,12 +715,12 b' class TTest(Test):'
712
715
713 return self._processoutput(exitcode, output, salt, after, expected)
716 return self._processoutput(exitcode, output, salt, after, expected)
714
717
715 def _hghave(self, reqs, testtmp):
718 def _hghave(self, reqs):
716 # TODO do something smarter when all other uses of hghave are gone.
719 # TODO do something smarter when all other uses of hghave are gone.
717 tdir = self._testdir.replace('\\', '/')
720 tdir = self._testdir.replace('\\', '/')
718 proc = Popen4('%s -c "%s/hghave %s"' %
721 proc = Popen4('%s -c "%s/hghave %s"' %
719 (self._options.shell, tdir, ' '.join(reqs)),
722 (self._options.shell, tdir, ' '.join(reqs)),
720 testtmp, 0)
723 self._testtmp, 0)
721 stdout, stderr = proc.communicate()
724 stdout, stderr = proc.communicate()
722 ret = proc.wait()
725 ret = proc.wait()
723 if wifexited(ret):
726 if wifexited(ret):
@@ -728,7 +731,7 b' class TTest(Test):'
728
731
729 return ret == 0
732 return ret == 0
730
733
731 def _parsetest(self, lines, testtmp):
734 def _parsetest(self, lines):
732 # We generate a shell script which outputs unique markers to line
735 # We generate a shell script which outputs unique markers to line
733 # up script results with our source. These markers include input
736 # up script results with our source. These markers include input
734 # line number and the last return code.
737 # line number and the last return code.
@@ -773,7 +776,7 b' class TTest(Test):'
773 after.setdefault(pos, []).append(' !!! invalid #if\n')
776 after.setdefault(pos, []).append(' !!! invalid #if\n')
774 if skipping is not None:
777 if skipping is not None:
775 after.setdefault(pos, []).append(' !!! nested #if\n')
778 after.setdefault(pos, []).append(' !!! nested #if\n')
776 skipping = not self._hghave(lsplit[1:], testtmp)
779 skipping = not self._hghave(lsplit[1:])
777 after.setdefault(pos, []).append(l)
780 after.setdefault(pos, []).append(l)
778 elif l.startswith('#else'):
781 elif l.startswith('#else'):
779 if skipping is None:
782 if skipping is None:
General Comments 0
You need to be logged in to leave comments. Login now