[Python-checkins] distutils2: refactored test command tests and added another functional test

tarek.ziade python-checkins at python.org
Sun Sep 19 10:20:21 CEST 2010


tarek.ziade pushed 9e054e62e8d6 to distutils2:

http://hg.python.org/distutils2/rev/9e054e62e8d6
changeset:   600:9e054e62e8d6
user:        Konrad Delong <konryd at gmail.com>
date:        Tue Jul 27 14:53:37 2010 +0200
summary:     refactored test command tests and added another functional test
files:       src/distutils2/_backport/__init__.py, src/distutils2/command/test.py, src/distutils2/tests/dists/extensions_test/myowntestmodule.py, src/distutils2/tests/dists/extensions_test/setup.cfg, src/distutils2/tests/dists/extensions_test/setup.py, src/distutils2/tests/dists/extensions_test/spammodule.c, src/distutils2/tests/dists/simple_test/myowntestmodule.py, src/distutils2/tests/dists/simple_test/setup.cfg, src/distutils2/tests/dists/simple_test/setup.py, src/distutils2/tests/test_test.py

diff --git a/src/distutils2/_backport/__init__.py b/src/distutils2/_backport/__init__.py
--- a/src/distutils2/_backport/__init__.py
+++ b/src/distutils2/_backport/__init__.py
@@ -1,2 +1,8 @@
 """Things that will land in the Python 3.3 std lib but which we must drag along
 with us for now to support 2.x."""
+
+def any(seq):
+    for elem in seq:
+        if elem:
+            return elem
+    return False
diff --git a/src/distutils2/command/test.py b/src/distutils2/command/test.py
--- a/src/distutils2/command/test.py
+++ b/src/distutils2/command/test.py
@@ -14,17 +14,16 @@
         self.test_suite = None
     
     def finalize_options(self):
-        pass
-
-    def distpath(self):
-        self.run_command('build')
-        build_cmd = self.get_finalized_command("build")
-        return os.path.join(build_cmd.build_base, "lib")
+        self.build_lib = self.get_finalized_command("build").build_lib
 
     def run(self):
-        orig_path = sys.path[:]
+        prev_cwd = os.getcwd()
         try:
-            sys.path.insert(0, self.distpath())
+            if self.distribution.has_ext_modules():
+                build = self.get_reinitialized_command('build')
+                build.inplace = 1
+                self.run_command('build')
+                os.chdir(self.build_lib)
             unittest.main(module=self.test_suite, argv=sys.argv[:1])
         finally:
-            sys.path[:] = orig_path
+            os.chdir(prev_cwd)
diff --git a/src/distutils2/tests/dists/extensions_test/myowntestmodule.py b/src/distutils2/tests/dists/extensions_test/myowntestmodule.py
new file mode 100644
--- /dev/null
+++ b/src/distutils2/tests/dists/extensions_test/myowntestmodule.py
@@ -0,0 +1,4 @@
+import unittest
+class SomeTest(unittest.TestCase):
+    def test_blah(self):
+        self.fail("horribly")
diff --git a/src/distutils2/tests/dists/extensions_test/setup.cfg b/src/distutils2/tests/dists/extensions_test/setup.cfg
new file mode 100644
--- /dev/null
+++ b/src/distutils2/tests/dists/extensions_test/setup.cfg
@@ -0,0 +1,2 @@
+[test]
+test-suite = myowntestmodule
diff --git a/src/distutils2/tests/dists/extensions_test/setup.py b/src/distutils2/tests/dists/extensions_test/setup.py
new file mode 100644
--- /dev/null
+++ b/src/distutils2/tests/dists/extensions_test/setup.py
@@ -0,0 +1,6 @@
+from distutils2.core import setup, Extension
+setup(name='somedist',
+      version='0.1',
+      py_modules=['myowntestmodule', 'somemod'],
+      ext_modules=[Extension('spam', ['spammodule.c'])],
+)
diff --git a/src/distutils2/tests/dists/extensions_test/spammodule.c b/src/distutils2/tests/dists/extensions_test/spammodule.c
new file mode 100644
--- /dev/null
+++ b/src/distutils2/tests/dists/extensions_test/spammodule.c
@@ -0,0 +1,11 @@
+#include <Python.h>
+
+static PyMethodDef SpamMethods[] = {
+    {NULL, NULL, 0, NULL}        /* Sentinel */
+};
+
+PyMODINIT_FUNC
+initspam(void)
+{
+    (void) Py_InitModule("spam", SpamMethods);
+}
diff --git a/src/distutils2/tests/dists/simple_test/myowntestmodule.py b/src/distutils2/tests/dists/simple_test/myowntestmodule.py
new file mode 100644
--- /dev/null
+++ b/src/distutils2/tests/dists/simple_test/myowntestmodule.py
@@ -0,0 +1,4 @@
+import unittest
+class SomeTest(unittest.TestCase):
+    def test_blah(self):
+        self.fail("horribly")
diff --git a/src/distutils2/tests/dists/simple_test/setup.cfg b/src/distutils2/tests/dists/simple_test/setup.cfg
new file mode 100644
--- /dev/null
+++ b/src/distutils2/tests/dists/simple_test/setup.cfg
@@ -0,0 +1,2 @@
+[test]
+test-suite = myowntestmodule
diff --git a/src/distutils2/tests/dists/simple_test/setup.py b/src/distutils2/tests/dists/simple_test/setup.py
new file mode 100644
--- /dev/null
+++ b/src/distutils2/tests/dists/simple_test/setup.py
@@ -0,0 +1,5 @@
+from distutils2.core import setup
+setup(name='somedist',
+      version='0.1',
+      py_modules=['myowntestmodule', 'somemod'],
+)
diff --git a/src/distutils2/tests/test_test.py b/src/distutils2/tests/test_test.py
--- a/src/distutils2/tests/test_test.py
+++ b/src/distutils2/tests/test_test.py
@@ -1,4 +1,4 @@
-import os, sys
+import os, sys, shutil, re
 from copy import copy
 from os.path import join
 from StringIO import StringIO
@@ -6,33 +6,17 @@
 from distutils2.command.test import test
 import subprocess
 
-TEST_BODY = '''\
-import unittest
-class SomeTest(unittest.TestCase):
-    def test_blah(self):
-        self.fail("horribly")
-testSuite = unittest.makeSuite(SomeTest)
-'''
+try:
+    any
+except NameError:
+    from distutils2._backport import any
 
-SETUP_PY = '''\
-from distutils2.core import setup
-setup(name='somedist',
-      version='0.1',
-      py_modules=['myowntestmodule', 'somemod'],
-)
-'''
-
-SETUP_CFG = '''\
-[test]
-test-suite = myowntestmodule
-'''
-
-EXPECTED_OUTPUT = '''\
-FAIL: test_blah (myowntestmodule.SomeTest)
+EXPECTED_OUTPUT_RE = '''\
+FAIL: test_blah \\(myowntestmodule.SomeTest\\)
 ----------------------------------------------------------------------
-Traceback (most recent call last):
-  File "build/lib/myowntestmodule.py", line 4, in test_blah
-    self.fail("horribly")
+Traceback \\(most recent call last\\):
+  File ".+/myowntestmodule.py", line \\d+, in test_blah
+    self.fail\\("horribly"\\)
 AssertionError: horribly
 '''
 
@@ -40,10 +24,7 @@
 
     def setUp(self):
         super(TestTest, self).setUp()
-        self.pkg_dir = self.prepare_dist()
-        self.cwd = os.getcwd()
-        os.chdir(self.pkg_dir)
-        self.orig_environ = copy(os.environ)
+
         distutils2path = join(__file__, '..', '..', '..')
         distutils2path = os.path.abspath(distutils2path)
         self.old_pythonpath = os.environ.get('PYTHONPATH', '')
@@ -51,38 +32,54 @@
 
     def tearDown(self):
         super(TestTest, self).tearDown()
-        os.chdir(self.cwd)
         os.environ['PYTHONPATH'] = self.old_pythonpath
 
-    def prepare_dist(self):
-        # prepare distribution
-        pkg_dir = self.mkdtemp()
-        self.write_file(join(pkg_dir, "setup.py"), SETUP_PY)
-        self.write_file(join(pkg_dir, "setup.cfg"), SETUP_CFG)
-        self.write_file(join(pkg_dir, "somemod.py"), "")
-        self.write_file(join(pkg_dir, "myowntestmodule.py"), TEST_BODY)
-        return pkg_dir
-
-    def test_runs_simple_tests(self):
-        command = [sys.executable, "setup.py", "test"]
-        test_proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
-        _, errors = test_proc.communicate()
-
-        # ensure right output
-        self.assert_multiline_substring(EXPECTED_OUTPUT, errors)
-
-    def assert_multiline_substring(self, a, b):
+    def assert_re_match(self, pattern, string):
         def quote(s):
-            lines = ['##  ' + line for line in s.split('\n')]
+            lines = ['## ' + line for line in s.split('\n')]
             sep = ["#" * 60]
             return [''] + sep + lines + sep
-        msg = quote(a) + ['not found in:'] + quote(b)
+        msg = quote(pattern) + ["didn't match"] + quote(string)
         msg = "\n".join(msg)
-        if a not in b:
+        if not re.search(pattern, string):
             self.fail(msg)
 
-    def _test_setup_py_accepts_options(self):
+    def run_with_dist_cwd(self, pkg_dir):
+        cwd = os.getcwd()
+        command = [sys.executable, "setup.py", "test"]
+        try:
+            os.chdir(pkg_dir)
+            test_proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
+            _, errors = test_proc.communicate()
+            return errors
+        finally:
+            os.chdir(cwd)
+
+    def prepare_dist(self, dist_name):
+        pkg_dir = join(os.path.dirname(__file__), "dists", dist_name)
+        temp_pkg_dir = join(self.mkdtemp(), dist_name)
+        shutil.copytree(pkg_dir, temp_pkg_dir)
+        return temp_pkg_dir
+        
+    def test_runs_simple_tests(self):
+        self.pkg_dir = self.prepare_dist('simple_test')
+        output = self.run_with_dist_cwd(self.pkg_dir)
+        self.assert_re_match(EXPECTED_OUTPUT_RE, output)
+        self.assertFalse(os.path.exists(join(self.pkg_dir, 'build')))
+
+    def test_builds_extensions(self):
+        self.pkg_dir = self.prepare_dist("extensions_test")
+        output = self.run_with_dist_cwd(self.pkg_dir)
+        self.assert_re_match(EXPECTED_OUTPUT_RE, output)
+        self.assertTrue(os.path.exists(join(self.pkg_dir, 'build')))
+        self.assertTrue(any(x.startswith('lib') for x in os.listdir(join(self.pkg_dir, 'build'))))
+
+    def _test_custom_test_loader(self):
         pass
 
-    def _test_options_preparation(self):
+    def _test_downloads_test_requires(self):
         pass
+
+def test_suite():
+    suite = [unittest.makeSuite(TestTest)]
+    return unittest.TestSuite(suite)

--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list