blob: 57e3674865bbad905d7e7eb56ed437ea485ff010 [file] [log] [blame]
# Automatic Python regression test.
#
# Some essential parts of the Python interpreter are tested by the module
# 'testall'. (Despite its name, it doesn't test everything -- that would
# be a truly Herculean task!) When a test fails, 'testall' raises an
# exception. When all tests succeed, it produces quite a lot of output.
#
# For a normal regression test, this output is never looked at unless
# something goes wrong. Thus, it would be wise to suppress the output
# normally. This module does that, but it doesn't just throw the output
# from 'testall' away -- it compares it with the output from a previous
# run. If a difference is noticed it raises an exception; if all is well,
# it prints nothing except 'All tests OK.' at the very end.
#
# The output from a previous run is supposed to be in a file 'testall.out'
# somewhere on the search path for modules (sys.path, initialized from
# $PYTHONPATH plus some default places).
#
# Of course, if the normal output of the tests is changed because the
# tests have been changed (rather than a test producing the wrong output),
# 'autotest' will fail as well. In this case, run 'testall' manually
# and direct its output to 'testall.out'.
#
# The comparison uses (and demonstrates!) a rather new Python feature:
# program output that normally goes to stdout (by 'print' statements
# or by writing directly to sys.stdout) can be redirected to an
# arbitrary class instance as long as it has a 'write' method.
import os
import sys
# Function to find a file somewhere on sys.path
def findfile(filename):
for dirname in sys.path:
fullname = os.path.join(dirname, filename)
if os.path.exists(fullname):
return fullname
return filename # Will cause exception later
# Exception raised when the test failed (not the same as in test_support)
TestFailed = 'autotest.TestFailed'
# Class substituted for sys.stdout, to compare it with the given file
class Compare:
def init(self, filename):
self.fp = open(filename, 'r')
return self
def write(self, data):
expected = self.fp.read(len(data))
if data <> expected:
raise TestFailed, \
'Writing: '+`data`+', expected: '+`expected`
def close(self):
self.fp.close()
# The main program
def main():
import sys
filename = findfile('testall.out')
real_stdout = sys.stdout
try:
sys.stdout = Compare().init(filename)
import testall
finally:
sys.stdout = real_stdout
print 'All tests OK.'
main()