diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/files/tests.py | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/tests/files/tests.py b/tests/files/tests.py index 1a383090f9..5e165a998f 100644 --- a/tests/files/tests.py +++ b/tests/files/tests.py @@ -1,3 +1,4 @@ +import errno import gzip import os import struct @@ -340,6 +341,30 @@ class FileMoveSafeTests(unittest.TestCase): os.close(handle_a) os.close(handle_b) + def test_file_move_copystat_cifs(self): + """ + file_move_safe() ignores a copystat() EPERM PermissionError. This + happens when the destination filesystem is CIFS, for example. + """ + copystat_EACCES_error = PermissionError(errno.EACCES, 'msg') + copystat_EPERM_error = PermissionError(errno.EPERM, 'msg') + handle_a, self.file_a = tempfile.mkstemp() + handle_b, self.file_b = tempfile.mkstemp() + try: + # This exception is required to reach the copystat() call in + # file_safe_move(). + with mock.patch('django.core.files.move.os.rename', side_effect=OSError()): + # An error besides EPERM isn't ignored. + with mock.patch('django.core.files.move.copystat', side_effect=copystat_EACCES_error): + with self.assertRaises(PermissionError): + file_move_safe(self.file_a, self.file_b, allow_overwrite=True) + # EPERM is ignored. + with mock.patch('django.core.files.move.copystat', side_effect=copystat_EPERM_error): + self.assertIsNone(file_move_safe(self.file_a, self.file_b, allow_overwrite=True)) + finally: + os.close(handle_a) + os.close(handle_b) + class SpooledTempTests(unittest.TestCase): def test_in_memory_spooled_temp(self): |
