]> granicus.if.org Git - python/commitdiff
#22315: Add test to capture the failure.
authorJason R. Coombs <jaraco@jaraco.com>
Sun, 31 Aug 2014 19:02:42 +0000 (15:02 -0400)
committerJason R. Coombs <jaraco@jaraco.com>
Sun, 31 Aug 2014 19:02:42 +0000 (15:02 -0400)
Lib/distutils/tests/test_dir_util.py

index 6181ec6ef104d8f8a3570856e132a1430492bb10..eb83497fc6c143cc606756151568f4ca05746f8a 100644 (file)
@@ -3,7 +3,9 @@ import unittest
 import os
 import stat
 import sys
+import contextlib
 
+from distutils import dir_util, errors
 from distutils.dir_util import (mkpath, remove_tree, create_tree, copy_tree,
                                 ensure_relative)
 
@@ -11,6 +13,20 @@ from distutils import log
 from distutils.tests import support
 from test.support import run_unittest
 
+
+@contextlib.context_manager
+def patch_obj(obj, attr, replacement):
+    """
+    A poor man's mock.patch.object
+    """
+    orig = getattr(obj, attr)
+    try:
+        setattr(obj, attr, replacement)
+        yield
+    finally:
+        setattr(obj, attr, orig)
+
+
 class DirUtilTestCase(support.TempdirManager, unittest.TestCase):
 
     def _log(self, msg, *args):
@@ -119,6 +135,19 @@ class DirUtilTestCase(support.TempdirManager, unittest.TestCase):
             self.assertEqual(ensure_relative('c:\\home\\foo'), 'c:home\\foo')
             self.assertEqual(ensure_relative('home\\foo'), 'home\\foo')
 
+    def test_copy_tree_exception_in_listdir(self):
+        """
+        An exception in listdir should raise a DistutilsFileError
+        """
+        def new_listdir(path):
+            raise OSError()
+        # simulate a transient network error or other failure invoking listdir
+        with patch_obj(os, 'listdir', new_listdir):
+            args = 'src', None
+            exc = errors.DistutilsFileError
+            self.assertRaises(exc, dir_util.copy_tree, *args)
+
+
 def test_suite():
     return unittest.makeSuite(DirUtilTestCase)