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( |
|
|
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, |
|
|
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 |
|
|
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, |
|
|
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, |
|
|
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, |
|
|
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 |
|
|
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, |
|
|
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 |
|
|
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 |
|
|
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:] |
|
|
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