From d86776560411acccca7a10328b47c5667578d645 Mon Sep 17 00:00:00 2001
From: Zooko <zooko@zooko.com>
Date: Sat, 12 May 2012 20:42:52 -0700
Subject: [PATCH] modify build_helpers files

Should close #1342. This makes the actual changes to the two test
files (separated from the 'rename' patch to avoid VC complications).
---
 ...n-you-already-have-sufficiently-new-one.py |   3 +-
 .../test-dont-use-too-old-dep.py              | 113 +++++++++++++-----
 2 files changed, 87 insertions(+), 29 deletions(-)

diff --git a/misc/build_helpers/test-dont-install-newer-dep-when-you-already-have-sufficiently-new-one.py b/misc/build_helpers/test-dont-install-newer-dep-when-you-already-have-sufficiently-new-one.py
index 64d84539..83e5de9e 100644
--- a/misc/build_helpers/test-dont-install-newer-dep-when-you-already-have-sufficiently-new-one.py
+++ b/misc/build_helpers/test-dont-install-newer-dep-when-you-already-have-sufficiently-new-one.py
@@ -12,7 +12,8 @@ def test():
     #
     #   python setup.py --fakedependency -v test -s buildtest.test_build_with_fake_dist
     #
-    # which imports fakedependency and passes if fakedependency.__version__ == '1.0.0'.
+    # which requires "fakedependency >= 1.0.0", imports fakedependency
+    # and passes if fakedependency.__version__ == '1.0.0'.
     #
     # The goal is to turn red if the build system tries to build the
     # source dist when it could have used the binary dist.
diff --git a/misc/build_helpers/test-dont-use-too-old-dep.py b/misc/build_helpers/test-dont-use-too-old-dep.py
index f3ecf880..4c5e394e 100644
--- a/misc/build_helpers/test-dont-use-too-old-dep.py
+++ b/misc/build_helpers/test-dont-use-too-old-dep.py
@@ -1,30 +1,87 @@
 #!/usr/bin/env python
 
-# We put a fake "pycryptopp-0.5.13" package on the PYTHONPATH so that
-# the build system thinks pycryptopp-0.5.13 is already installed. Then
-# we execute 'setup.py trial'. If the build system is too naive/greedy
-# about finding dependencies, it will latch onto the
-# "pycryptopp-0.5.13" and then will be unable to satisfy the
-# requirement (from _auto_deps.py) for pycryptopp >= 0.5.20 (or
-# pycryptopp >= 0.5.14, depending on machine architecture). This is
-# currently happening on trunk, see #1190. So with trunk, running
-# test-with-fake-pkg.py shows a failure, but with the ticket1190
-# branch, test-with-fake-pkg.py succeeds.
-
-import os, subprocess, sys
-
-fakepkgdir = 'misc/build_helpers/fakepkgs'
-fakepkgname = "pycryptopp"
-fakepkgversion = "0.5.13"
-testsuite = "allmydata.test.test_backupdb"
-
-pkgdirname = os.path.join(os.getcwd(), fakepkgdir, '%s-%s.egg' % (fakepkgname, fakepkgversion))
-
-try:
-    os.makedirs(pkgdirname)
-except OSError:
-    # probably already exists
-    pass
-
-os.environ['PYTHONPATH']=pkgdirname+os.pathsep+os.environ.get('PYTHONPATH','')
-sys.exit(subprocess.call([sys.executable, 'setup.py', 'trial', '-s', testsuite], env=os.environ))
+import StringIO, os, platform, shutil, subprocess, sys, tarfile, zipfile
+import pkg_resources
+
+def test():
+    # We put a "fakedependency-0.9.9.egg" package and a
+    # "fakedependency-1.0.0.tar.gz" into a directory, but the former is
+    # booby-trapped so it will raise an exception when you try to import it.
+    #
+    # Then we run
+    #
+    #   python setup.py --fakedependency -v test -s buildtest.test_build_with_fake_dist
+    #
+    # which requires "fakedependency >= 1.0.0", imports fakedependency
+    # and passes if fakedependency.__version__ == '1.0.0'.
+    #
+    # The goal is to turn red if the build system tries to use the
+    # source dist when it could have used the binary dist.
+    #
+    # Note that for this test to make sense, Tahoe-LAFS needs to be asking
+    # for a version of fakedependency which can be satisfied by 1.0.0.
+    # The --fakedependency option to setup.py arranges that.
+
+    fake_distdir = 'tahoe-deps'
+    fake_distname = "fakedependency"
+    fake_sdistversion = "1.0.0"
+    fake_bdistversion = "0.9.9"
+
+    bdist_init = "raise Exception('Aha I caught you trying to import me. I am a fakedependency 0.9.9 package and you should not be satisfied with something < 1.0.0.')"
+    sdist_setup = "import distutils.core\ndistutils.core.setup(name='fakedependency', version='1.0.0', packages=['fakedependency'])"
+    sdist_init = "__version__ = '%s'" % (fake_sdistversion,)
+
+    testsuite = "buildtest.test_build_with_fake_dist"
+
+    dist_dirname = os.path.join(os.getcwd(), fake_distdir)
+
+    try:
+        os.makedirs(dist_dirname)
+    except OSError:
+        # probably already exists
+        pass
+
+    bdist_egg_name = os.path.join(dist_dirname, '%s-%s-py%s.%s-%s.egg' % (fake_distname, fake_bdistversion, platform.python_version_tuple()[0], platform.python_version_tuple()[1], pkg_resources.get_supported_platform()))
+    try:
+        bdist_egg = zipfile.ZipFile(bdist_egg_name, 'w')
+        bdist_egg.writestr('fakedependency/__init__.py', bdist_init)
+        bdist_egg.close()
+
+        sdist_name = os.path.join(dist_dirname, '%s-%s.tar' % (fake_distname, fake_sdistversion))
+        sdist = tarfile.open(sdist_name, 'w:gz')
+        sdist.errorlevel = 2
+        tarinfo = tarfile.TarInfo('setup.py')
+        tarinfo.errorlevel = 2
+        tarinfo.size = len(sdist_setup)
+        sdist.addfile(tarinfo, StringIO.StringIO(sdist_setup))
+        tarinfo = tarfile.TarInfo('fakedependency/__init__.py')
+        tarinfo.errorlevel = 2
+        tarinfo.size = len(sdist_init)
+        sdist.addfile(tarinfo, StringIO.StringIO(sdist_init))
+        sdist.close()
+
+        sys.exit(subprocess.call([sys.executable, "setup.py", "--fakedependency", "-v", "test", "-s", testsuite],
+                                 env=os.environ))
+    finally:
+        os.remove(bdist_egg_name)
+        os.remove(sdist_name)
+        cleanup()
+
+def cleanup():
+    egg_info = os.path.join('src', 'allmydata_tahoe.egg-info')
+    bin_tahoe = os.path.join('bin', 'tahoe')
+    bin_tahoe_pyscript = os.path.join('bin', 'tahoe.pyscript')
+
+    if os.path.exists('build'):
+        shutil.rmtree('build')
+    if os.path.exists('support'):
+        shutil.rmtree('support')
+    if os.path.exists(egg_info):
+        shutil.rmtree(egg_info)
+    if os.path.exists(bin_tahoe):
+        os.remove(bin_tahoe)
+    if os.path.exists(bin_tahoe_pyscript):
+        os.remove(bin_tahoe_pyscript)
+
+if __name__ == '__main__':
+    test()
-- 
2.45.2