diff --git a/envisage/tests/bad_eggs/README.txt b/envisage/tests/bad_eggs/README.txt new file mode 100644 index 00000000..b467308e --- /dev/null +++ b/envisage/tests/bad_eggs/README.txt @@ -0,0 +1,2 @@ +This directory contains packages used by the test suite to create eggs +for testing purposes. diff --git a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.10.egg b/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.10.egg deleted file mode 100644 index b2a95706..00000000 Binary files a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.10.egg and /dev/null differ diff --git a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.5.egg b/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.5.egg deleted file mode 100644 index 01d0f5af..00000000 Binary files a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.5.egg and /dev/null differ diff --git a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.6.egg b/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.6.egg deleted file mode 100644 index 131bfdad..00000000 Binary files a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.6.egg and /dev/null differ diff --git a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.7.egg b/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.7.egg deleted file mode 100644 index 27ccc458..00000000 Binary files a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.7.egg and /dev/null differ diff --git a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.8.egg b/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.8.egg deleted file mode 100644 index e70d6746..00000000 Binary files a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.8.egg and /dev/null differ diff --git a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.9.egg b/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.9.egg deleted file mode 100644 index adcb2a01..00000000 Binary files a/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.9.egg and /dev/null differ diff --git a/envisage/tests/eggs/README.txt b/envisage/tests/eggs/README.txt index 108ce05c..b467308e 100644 --- a/envisage/tests/eggs/README.txt +++ b/envisage/tests/eggs/README.txt @@ -1,12 +1,2 @@ -This directory contains eggs used by the test suite, along with the packages -that were used to generate those eggs. - -To generate eggs for a new version of Python: - -- Change to the acme.bar directory -- Run "python setup.py bdist_egg" using the desired version of Python. This - will create a new egg under the "dist/" directory. -- Copy that egg to this directory. - -Now repeat for acme.baz and acme.foo, as well as acme.bad in the bad_eggs -directory adjacent to this one. +This directory contains packages used by the test suite to create eggs +for testing purposes. diff --git a/envisage/tests/eggs/acme.bar-0.1a1-py3.10.egg b/envisage/tests/eggs/acme.bar-0.1a1-py3.10.egg deleted file mode 100644 index 51ea8403..00000000 Binary files a/envisage/tests/eggs/acme.bar-0.1a1-py3.10.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.bar-0.1a1-py3.5.egg b/envisage/tests/eggs/acme.bar-0.1a1-py3.5.egg deleted file mode 100644 index 3d3f319c..00000000 Binary files a/envisage/tests/eggs/acme.bar-0.1a1-py3.5.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.bar-0.1a1-py3.6.egg b/envisage/tests/eggs/acme.bar-0.1a1-py3.6.egg deleted file mode 100644 index bb0e9265..00000000 Binary files a/envisage/tests/eggs/acme.bar-0.1a1-py3.6.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.bar-0.1a1-py3.7.egg b/envisage/tests/eggs/acme.bar-0.1a1-py3.7.egg deleted file mode 100644 index 2101d894..00000000 Binary files a/envisage/tests/eggs/acme.bar-0.1a1-py3.7.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.bar-0.1a1-py3.8.egg b/envisage/tests/eggs/acme.bar-0.1a1-py3.8.egg deleted file mode 100644 index 016f0cb5..00000000 Binary files a/envisage/tests/eggs/acme.bar-0.1a1-py3.8.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.bar-0.1a1-py3.9.egg b/envisage/tests/eggs/acme.bar-0.1a1-py3.9.egg deleted file mode 100644 index e9d997df..00000000 Binary files a/envisage/tests/eggs/acme.bar-0.1a1-py3.9.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.baz-0.1a1-py3.10.egg b/envisage/tests/eggs/acme.baz-0.1a1-py3.10.egg deleted file mode 100644 index 077d8cfa..00000000 Binary files a/envisage/tests/eggs/acme.baz-0.1a1-py3.10.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.baz-0.1a1-py3.5.egg b/envisage/tests/eggs/acme.baz-0.1a1-py3.5.egg deleted file mode 100644 index c435cbc5..00000000 Binary files a/envisage/tests/eggs/acme.baz-0.1a1-py3.5.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.baz-0.1a1-py3.6.egg b/envisage/tests/eggs/acme.baz-0.1a1-py3.6.egg deleted file mode 100644 index 96e9ed1a..00000000 Binary files a/envisage/tests/eggs/acme.baz-0.1a1-py3.6.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.baz-0.1a1-py3.7.egg b/envisage/tests/eggs/acme.baz-0.1a1-py3.7.egg deleted file mode 100644 index 6bc22c67..00000000 Binary files a/envisage/tests/eggs/acme.baz-0.1a1-py3.7.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.baz-0.1a1-py3.8.egg b/envisage/tests/eggs/acme.baz-0.1a1-py3.8.egg deleted file mode 100644 index eefcae79..00000000 Binary files a/envisage/tests/eggs/acme.baz-0.1a1-py3.8.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.baz-0.1a1-py3.9.egg b/envisage/tests/eggs/acme.baz-0.1a1-py3.9.egg deleted file mode 100644 index 676b14ce..00000000 Binary files a/envisage/tests/eggs/acme.baz-0.1a1-py3.9.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.foo-0.1a1-py3.10.egg b/envisage/tests/eggs/acme.foo-0.1a1-py3.10.egg deleted file mode 100644 index e354115d..00000000 Binary files a/envisage/tests/eggs/acme.foo-0.1a1-py3.10.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.foo-0.1a1-py3.5.egg b/envisage/tests/eggs/acme.foo-0.1a1-py3.5.egg deleted file mode 100644 index 780826be..00000000 Binary files a/envisage/tests/eggs/acme.foo-0.1a1-py3.5.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.foo-0.1a1-py3.6.egg b/envisage/tests/eggs/acme.foo-0.1a1-py3.6.egg deleted file mode 100644 index 8d27d97e..00000000 Binary files a/envisage/tests/eggs/acme.foo-0.1a1-py3.6.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.foo-0.1a1-py3.7.egg b/envisage/tests/eggs/acme.foo-0.1a1-py3.7.egg deleted file mode 100644 index a343d6d7..00000000 Binary files a/envisage/tests/eggs/acme.foo-0.1a1-py3.7.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.foo-0.1a1-py3.8.egg b/envisage/tests/eggs/acme.foo-0.1a1-py3.8.egg deleted file mode 100644 index 83b35d89..00000000 Binary files a/envisage/tests/eggs/acme.foo-0.1a1-py3.8.egg and /dev/null differ diff --git a/envisage/tests/eggs/acme.foo-0.1a1-py3.9.egg b/envisage/tests/eggs/acme.foo-0.1a1-py3.9.egg deleted file mode 100644 index 1c5bbd42..00000000 Binary files a/envisage/tests/eggs/acme.foo-0.1a1-py3.9.egg and /dev/null differ diff --git a/envisage/tests/test_egg_based.py b/envisage/tests/test_egg_based.py index 26e6bfd1..74f48ca5 100644 --- a/envisage/tests/test_egg_based.py +++ b/envisage/tests/test_egg_based.py @@ -10,20 +10,82 @@ """ Base class for Egg-based test cases. """ -from os.path import dirname, join +from os.path import join +import shutil +import subprocess +import sys +import tempfile import unittest import pkg_resources +def build_egg(egg_dir, dist_dir): + """Helper function to build an egg. + + Parameters + ---------- + egg_dir : str + Directory containing the Python package to be built. Should + contain a "setup.py" file that can be used with + "python setup.py bdist_egg" to build the package. + dist_dir : str + Directory to place the built egg in. The directory should + already exist. + """ + subprocess.run( + [ + "python", + "setup.py", + "bdist_egg", + "--dist-dir", + dist_dir, + ], + cwd=egg_dir, + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + class EggBasedTestCase(unittest.TestCase): """ Base class for Egg-based test cases. """ + @classmethod + def setUpClass(cls): + """ + Create eggs for testing purposes. + """ + cls.egg_dir = tempfile.mkdtemp() + eggs_root_dir = pkg_resources.resource_filename( + "envisage.tests", "eggs") + for egg_name in ["acme.bar", "acme.baz", "acme.foo"]: + build_egg( + egg_dir=join(eggs_root_dir, egg_name), + dist_dir=cls.egg_dir, + ) + + @classmethod + def tearDownClass(cls): + """ + Delete created eggs. + """ + shutil.rmtree(cls.egg_dir) + def setUp(self): """ Prepares the test fixture before each test method is called. """ - # The location of the 'eggs' directory. - self.egg_dir = join(dirname(__file__), "eggs") + # Some tests cause sys.path to be modified. Capture the original + # contents so that we can restore sys.path later. + self._original_sys_path_contents = sys.path[:] + + def tearDown(self): + """ Called immediately after each test method has been called. """ + + # Undo any sys.path modifications + sys.path[:] = self._original_sys_path_contents + + pkg_resources.working_set = pkg_resources.WorkingSet() def _add_egg(self, filename, working_set=None): """ Create and add a distribution from the specified '.egg'. """ @@ -32,7 +94,7 @@ def _add_egg(self, filename, working_set=None): working_set = pkg_resources.working_set # The eggs must be in our egg directory! - filename = join(dirname(__file__), "eggs", filename) + filename = join(self.egg_dir, filename) # Create a distribution for the egg. distributions = pkg_resources.find_distributions(filename) diff --git a/envisage/tests/test_egg_basket_plugin_manager.py b/envisage/tests/test_egg_basket_plugin_manager.py index eba62b10..60648074 100644 --- a/envisage/tests/test_egg_basket_plugin_manager.py +++ b/envisage/tests/test_egg_basket_plugin_manager.py @@ -10,15 +10,16 @@ """ Tests for the 'Egg Basket' plugin manager. """ import glob -from os.path import basename, dirname, join +from os.path import basename, join import shutil -import tempfile import sys +import tempfile import unittest import pkg_resources from envisage.egg_basket_plugin_manager import EggBasketPluginManager +from envisage.tests.test_egg_based import build_egg class EggBasketPluginManagerTestCase(unittest.TestCase): @@ -26,6 +27,38 @@ class EggBasketPluginManagerTestCase(unittest.TestCase): #### 'unittest.TestCase' protocol ######################################### + @classmethod + def setUpClass(cls): + """ + Create eggs for testing purposes. + """ + cls.eggs_dir = tempfile.mkdtemp() + cls.bad_eggs_dir = tempfile.mkdtemp() + + eggs_root_dir = pkg_resources.resource_filename( + "envisage.tests", "eggs") + for egg_name in ["acme.bar", "acme.baz", "acme.foo"]: + build_egg( + egg_dir=join(eggs_root_dir, egg_name), + dist_dir=cls.eggs_dir, + ) + + bad_eggs_root_dir = pkg_resources.resource_filename( + "envisage.tests", "bad_eggs") + for egg_name in ["acme.bad"]: + build_egg( + egg_dir=join(bad_eggs_root_dir, egg_name), + dist_dir=cls.bad_eggs_dir, + ) + + @classmethod + def tearDownClass(cls): + """ + Delete created eggs. + """ + shutil.rmtree(cls.bad_eggs_dir) + shutil.rmtree(cls.eggs_dir) + def setUp(self): """ Prepares the test fixture before each test method is called. """ @@ -33,10 +66,6 @@ def setUp(self): # contents so that we can restore sys.path later. self._original_sys_path_contents = sys.path[:] - # The location of the 'eggs' test data directory. - self.eggs_dir = join(dirname(__file__), "eggs") - self.bad_eggs_dir = join(dirname(__file__), "bad_eggs") - def tearDown(self): """ Called immediately after each test method has been called. """ diff --git a/setup.py b/setup.py index 10370e02..9ff7ad2c 100644 --- a/setup.py +++ b/setup.py @@ -330,8 +330,20 @@ def get_long_description(): "demo/*/*/*/*/*/*", ], "envisage.tests": [ - "bad_eggs/*.egg", - "eggs/*.egg", + "bad_eggs/README.txt", + "bad_eggs/acme.bad/setup.py", + "bad_eggs/acme.bad/acme/*.py", + "bad_eggs/acme.bad/acme/bad/*.py", + "eggs/README.txt", + "eggs/acme.bar/setup.py", + "eggs/acme.bar/acme/*.py", + "eggs/acme.bar/acme/bar/*.py", + "eggs/acme.baz/setup.py", + "eggs/acme.baz/acme/*.py", + "eggs/acme.baz/acme/baz/*.py", + "eggs/acme.foo/setup.py", + "eggs/acme.foo/acme/*.py", + "eggs/acme.foo/acme/foo/*.py", "plugins/pear/*.py", "plugins/banana/*.py", "plugins/orange/*.py",