misc/build_helpers/run_trial.py: check that the root from which the module we are testing was loaded is the current directory. This version of the patch folds in later fixes to the logic for caculating the directories to compare, and improvements to error messages. addresses #1137

This commit is contained in:
david-sarah 2010-08-01 21:55:35 -07:00
parent 88b6c57a1c
commit 3af6f19cb0
2 changed files with 93 additions and 5 deletions

View File

@ -1 +1,55 @@
from twisted.scripts.trial import run; run()
#!/usr/bin/env python
import os, sys, re
modulename = None
for i in xrange(1, len(sys.argv)):
if not sys.argv[i].startswith('-'):
modulename = sys.argv[i]
break
if modulename is None:
raise AssertionError("no test module specified")
__import__(modulename)
srcfile = sys.modules[modulename].__file__
srcdir = os.path.dirname(os.path.realpath(srcfile))
for i in modulename.split('.'):
srcdir = os.path.dirname(srcdir)
if os.path.normcase(srcdir).endswith('.egg'):
srcdir = os.path.dirname(srcdir)
elif os.path.normcase(os.path.basename(srcdir)) == 'site-packages':
srcdir = os.path.dirname(srcdir)
if re.search(r'python.+\..+', os.path.normcase(os.path.basename(srcdir))):
srcdir = os.path.dirname(srcdir)
if os.path.normcase(os.path.basename(srcdir)) == 'lib':
srcdir = os.path.dirname(srcdir)
srcdir = os.path.normcase(os.path.normpath(srcdir))
cwd = os.path.normcase(os.path.normpath(os.getcwd()))
same = (srcdir == cwd)
if not same:
try:
same = os.path.samefile(srcdir, cwd)
except AttributeError, e:
e # hush pyflakes
if not same:
msg = ("We seem to be testing the code at %r\n"
"(according to the source filename %r),\n"
"but expected to be testing the code at %r.\n"
% (srcdir, srcfile, cwd))
if (not isinstance(cwd, unicode) and
cwd.decode(sys.getfilesystemencoding(), 'replace') != os.path.normcase(os.path.normpath(os.getcwdu()))):
msg += ("However, this may be a false alarm because the current directory path\n"
"is not representable in the filesystem encoding. This script needs to be\n"
"run from the source directory to be tested, at a non-Unicode path.")
else:
msg += "This script needs to be run from the source directory to be tested."
raise AssertionError(msg)
from twisted.scripts.trial import run
run()

View File

@ -13,7 +13,11 @@ from allmydata.scripts import runner
from allmydata.test import common_util
import allmydata
bintahoe = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(allmydata.__file__))), 'bin', 'tahoe')
srcfile = allmydata.__file__
srcdir = os.path.dirname(os.path.dirname(os.path.realpath(srcfile)))
rootdir = os.path.dirname(srcdir)
bintahoe = os.path.join(rootdir, 'bin', 'tahoe')
if sys.platform == "win32":
bintahoe += ".pyscript"
@ -33,6 +37,33 @@ class SkipMixin:
class BinTahoe(common_util.SignalMixin, unittest.TestCase, SkipMixin):
def test_the_right_code(self):
cwd = os.getcwd()
root_from_cwd = os.path.normcase(os.path.normpath(os.path.join(cwd, "..")))
root_from_test = os.path.normcase(os.path.normpath(rootdir))
same = (root_from_cwd == root_from_test)
if not same:
try:
same = os.path.samefile(root_from_cwd, root_from_test)
except AttributeError, e:
e # hush pyflakes
if not same:
msg = ("We seem to be testing the code at %r,\n"
"(according to the source filename %r),\n"
"but expected to be testing the code at %r.\n"
% (root_from_test, srcfile, root_from_cwd))
if (not isinstance(cwd, unicode) and
cwd.decode(get_filesystem_encoding(), 'replace') != os.path.normcase(os.path.normpath(os.getcwdu()))):
msg += ("However, this may be a false alarm because the current directory path\n"
"is not representable in the filesystem encoding. Please run the tests\n"
"from the root of the Tahoe-LAFS distribution at a non-Unicode path.")
raise unittest.SkipTest(msg)
else:
msg += "Please run the tests from the root of the Tahoe-LAFS distribution."
self.fail(msg)
def test_path(self):
self.skip_if_cannot_run_bintahoe()
d = utils.getProcessOutputAndValue(bintahoe, args=["--version-and-path"], env=os.environ)
@ -41,10 +72,13 @@ class BinTahoe(common_util.SignalMixin, unittest.TestCase, SkipMixin):
self.failUnlessEqual(rc_or_sig, 0, str(res))
# Fail unless the package is *this* version *and* was loaded from *this* source directory.
ad = os.path.dirname(os.path.dirname(os.path.realpath(allmydata.__file__)))
required_ver_and_path = "%s: %s (%s)" % (allmydata.__appname__, allmydata.__version__, ad)
required_ver_and_path = "%s: %s (%s)" % (allmydata.__appname__, allmydata.__version__, srcdir)
self.failUnless(out.startswith(required_ver_and_path),
str((out, err, rc_or_sig, required_ver_and_path)))
self.failIfEqual(allmydata.__version__, "unknown",
"We don't know our version, because this distribution didn't come "
"with a _version.py and 'setup.py darcsver' hasn't been run.")
d.addCallback(_cb)
return d
@ -61,7 +95,7 @@ class BinTahoe(common_util.SignalMixin, unittest.TestCase, SkipMixin):
d = utils.getProcessOutputAndValue(bintahoe, args=[tricky_arg], env=os.environ)
def _cb(res):
out, err, rc_or_sig = res
self.failUnlessEqual(rc_or_sig, 1, str((out, err, rc_or_sig)))
self.failUnlessEqual(rc_or_sig, 1, str(res))
self.failUnlessIn("Unknown command: "+tricky_out, out)
d.addCallback(_cb)
return d