comparison tests/run-tests.py @ 19248:6a127fa5de23

run-tests: change return code of runone
author Matt Mackall <mpm@selenic.com>
date Fri, 24 May 2013 14:30:35 -0500
parents b43ed416bc2d
children de45df2688a9
comparison
equal deleted inserted replaced
19247:b43ed416bc2d 19248:6a127fa5de23
823 for s, r in replacements: 823 for s, r in replacements:
824 output = re.sub(s, r, output) 824 output = re.sub(s, r, output)
825 return ret, output.splitlines(True) 825 return ret, output.splitlines(True)
826 826
827 def runone(options, test): 827 def runone(options, test):
828 '''tristate output: 828 '''returns a result element: (code, test, msg)'''
829 None -> skipped 829
830 True -> passed 830 global iolock
831 False -> failed'''
832
833 global results, resultslock, iolock
834
835 def result(l, e):
836 resultslock.acquire()
837 results[l].append(e)
838 resultslock.release()
839 831
840 def skip(msg): 832 def skip(msg):
841 if not options.verbose: 833 if options.verbose:
842 result('s', (test, msg))
843 else:
844 iolock.acquire() 834 iolock.acquire()
845 print "\nSkipping %s: %s" % (testpath, msg) 835 print "\nSkipping %s: %s" % (testpath, msg)
846 iolock.release() 836 iolock.release()
847 return None 837 return 's', test, msg
848 838
849 def fail(msg, ret): 839 def fail(msg, ret):
850 if not options.nodiff: 840 if not options.nodiff:
851 iolock.acquire() 841 iolock.acquire()
852 print "\nERROR: %s %s" % (testpath, msg) 842 print "\nERROR: %s %s" % (testpath, msg)
860 if answer.lower() in "y yes".split(): 850 if answer.lower() in "y yes".split():
861 if test.endswith(".t"): 851 if test.endswith(".t"):
862 rename(testpath + ".err", testpath) 852 rename(testpath + ".err", testpath)
863 else: 853 else:
864 rename(testpath + ".err", testpath + ".out") 854 rename(testpath + ".err", testpath + ".out")
865 result('p', test) 855 return 'p', test, ''
866 return 856 return 'f', test, msg
867 result('f', (test, msg))
868 857
869 def success(): 858 def success():
870 result('p', test) 859 return 'p', test, ''
871 860
872 def ignore(msg): 861 def ignore(msg):
873 result('i', (test, msg)) 862 return 'i', test, msg
874 863
875 def describe(ret): 864 def describe(ret):
876 if ret < 0: 865 if ret < 0:
877 return 'killed by signal %d' % -ret 866 return 'killed by signal %d' % -ret
878 return 'returned error code %d' % ret 867 return 'returned error code %d' % ret
880 testpath = os.path.join(TESTDIR, test) 869 testpath = os.path.join(TESTDIR, test)
881 err = os.path.join(TESTDIR, test + ".err") 870 err = os.path.join(TESTDIR, test + ".err")
882 lctest = test.lower() 871 lctest = test.lower()
883 872
884 if not os.path.exists(testpath): 873 if not os.path.exists(testpath):
885 skip("doesn't exist") 874 return skip("doesn't exist")
886 return None
887 875
888 if not (options.whitelisted and test in options.whitelisted): 876 if not (options.whitelisted and test in options.whitelisted):
889 if options.blacklist and test in options.blacklist: 877 if options.blacklist and test in options.blacklist:
890 skip("blacklisted") 878 return skip("blacklisted")
891 return None
892 879
893 if options.retest and not os.path.exists(test + ".err"): 880 if options.retest and not os.path.exists(test + ".err"):
894 ignore("not retesting") 881 ignore("not retesting")
895 return None 882 return None
896 883
980 else: 967 else:
981 missing, failed = parsehghaveoutput(out) 968 missing, failed = parsehghaveoutput(out)
982 if not missing: 969 if not missing:
983 missing = ['irrelevant'] 970 missing = ['irrelevant']
984 if failed: 971 if failed:
985 fail("hghave failed checking for %s" % failed[-1], ret) 972 result = fail("hghave failed checking for %s" % failed[-1], ret)
986 skipped = False 973 skipped = False
987 else: 974 else:
988 skip(missing[-1]) 975 result = skip(missing[-1])
989 elif ret == 'timeout': 976 elif ret == 'timeout':
990 mark = 't' 977 mark = 't'
991 fail("timed out", ret) 978 result = fail("timed out", ret)
992 elif out != refout: 979 elif out != refout:
993 mark = '!' 980 mark = '!'
994 if not options.nodiff: 981 if not options.nodiff:
995 iolock.acquire() 982 iolock.acquire()
996 if options.view: 983 if options.view:
997 os.system("%s %s %s" % (options.view, ref, err)) 984 os.system("%s %s %s" % (options.view, ref, err))
998 else: 985 else:
999 showdiff(refout, out, ref, err) 986 showdiff(refout, out, ref, err)
1000 iolock.release() 987 iolock.release()
1001 if ret: 988 if ret:
1002 fail("output changed and " + describe(ret), ret) 989 result = fail("output changed and " + describe(ret), ret)
1003 else: 990 else:
1004 fail("output changed", ret) 991 result = fail("output changed", ret)
1005 ret = 1
1006 elif ret: 992 elif ret:
1007 mark = '!' 993 mark = '!'
1008 fail(describe(ret), ret) 994 result = fail(describe(ret), ret)
1009 else: 995 else:
1010 success() 996 result = success()
1011 997
1012 if not options.verbose: 998 if not options.verbose:
1013 iolock.acquire() 999 iolock.acquire()
1014 sys.stdout.write(mark) 1000 sys.stdout.write(mark)
1015 sys.stdout.flush() 1001 sys.stdout.flush()
1016 iolock.release() 1002 iolock.release()
1017 1003
1018 if not options.keep_tmpdir: 1004 if not options.keep_tmpdir:
1019 shutil.rmtree(testtmp, True) 1005 shutil.rmtree(testtmp, True)
1020 if skipped: 1006 return result
1021 return None
1022 return ret == 0
1023 1007
1024 _hgpath = None 1008 _hgpath = None
1025 1009
1026 def _gethgpath(): 1010 def _gethgpath():
1027 """Return the path to the mercurial package that is actually found by 1011 """Return the path to the mercurial package that is actually found by
1167 resultslock = threading.Lock() 1151 resultslock = threading.Lock()
1168 times = [] 1152 times = []
1169 iolock = threading.Lock() 1153 iolock = threading.Lock()
1170 1154
1171 def runqueue(options, tests): 1155 def runqueue(options, tests):
1156 global results, resultslock
1157
1172 for test in tests: 1158 for test in tests:
1173 ret = runone(options, test) 1159 code, test, msg = runone(options, test)
1174 if options.first and ret is not None and not ret: 1160 resultslock.acquire()
1161 results[code].append((test, msg))
1162 resultslock.release()
1163
1164 if options.first and code not in '.si':
1175 break 1165 break
1176 1166
1177 def runtests(options, tests): 1167 def runtests(options, tests):
1178 global DAEMON_PIDS, HGRCPATH 1168 global DAEMON_PIDS, HGRCPATH
1179 DAEMON_PIDS = os.environ["DAEMON_PIDS"] = os.path.join(HGTMP, 'daemon.pids') 1169 DAEMON_PIDS = os.environ["DAEMON_PIDS"] = os.path.join(HGTMP, 'daemon.pids')