Merged revisions 80946 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r80946 | michael.foord | 2010-05-08 01:39:38 +0200 (Sat, 08 May 2010) | 1 line

  Issue 8547 - detecting and reporting that modules have been imported from the wrong location under test discovery.
........
diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py
index a45dffa..76c4e11 100644
--- a/Lib/unittest/loader.py
+++ b/Lib/unittest/loader.py
@@ -178,7 +178,10 @@
 
         if not top_level_dir in sys.path:
             # all test modules must be importable from the top level directory
-            sys.path.append(top_level_dir)
+            # should we *unconditionally* put the start directory in first
+            # in sys.path to minimise likelihood of conflicts between installed
+            # modules and development versions?
+            sys.path.insert(0, top_level_dir)
         self._top_level_dir = top_level_dir
 
         is_not_importable = False
@@ -251,6 +254,16 @@
                     except:
                         yield _make_failed_import_test(name, self.suiteClass)
                     else:
+                        mod_file = os.path.abspath(getattr(module, '__file__', full_path))
+                        realpath = os.path.splitext(mod_file)[0]
+                        fullpath_noext = os.path.splitext(full_path)[0]
+                        if realpath.lower() != fullpath_noext.lower():
+                            module_dir = os.path.dirname(realpath)
+                            mod_name = os.path.splitext(os.path.basename(full_path))[0]
+                            expected_dir = os.path.dirname(full_path)
+                            msg = ("%r module incorrectly imported from %r. Expected %r. "
+                                   "Is this module globally installed?")
+                            raise ImportError(msg % (mod_name, module_dir, expected_dir))
                         yield self.loadTestsFromModule(module)
             elif os.path.isdir(full_path):
                 if not os.path.isfile(os.path.join(full_path, '__init__.py')):