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