Resolve links to their target in os.utime to fix #49
diff --git a/fake_filesystem.py b/fake_filesystem.py
index e45e639..5d1a49a 100644
--- a/fake_filesystem.py
+++ b/fake_filesystem.py
@@ -1743,7 +1743,7 @@
number of elements in the tuple is not equal to 2.
"""
try:
- file_object = self.filesystem.GetObject(path)
+ file_object = self.filesystem.ResolveObject(path)
except IOError as io_error:
if io_error.errno == errno.ENOENT:
raise OSError(errno.ENOENT,
@@ -1758,7 +1758,7 @@
raise TypeError('utime() arg 2 must be a tuple (atime, mtime)')
for t in times:
if not isinstance(t, (int, float)):
- raise TypeError('an integer is required')
+ raise TypeError('atime and mtime must be numbers')
file_object.st_atime = times[0]
file_object.st_mtime = times[1]
diff --git a/fake_filesystem_test.py b/fake_filesystem_test.py
index 54aa256..0dfdeae 100644
--- a/fake_filesystem_test.py
+++ b/fake_filesystem_test.py
@@ -1379,7 +1379,7 @@
self._CreateTestDirectory(path)
# actual tests
self.assertRaisesWithRegexpMatch(
- TypeError, 'an integer is required',
+ TypeError, 'atime and mtime must be numbers',
self.os.utime, path, (1, 'str'))
def testChownExistingFile(self):
@@ -2785,6 +2785,22 @@
self.__WriteToFile('/a/b/c/d/e')
self.assertTrue(self.filesystem.Exists(final_target))
+ def testUtimeLink(self):
+ '''os.utime() and os.stat() via symbolic link (issue #49)'''
+ self.filesystem.CreateDirectory('/foo/baz')
+ self.__WriteToFile('/foo/baz/bip')
+ link_name = '/foo/bar'
+ self.filesystem.CreateLink(link_name, '/foo/baz/bip')
+
+ self.os.utime(link_name, (1, 2))
+ st = self.os.stat(link_name)
+ self.assertEqual(1, st.st_atime)
+ self.assertEqual(2, st.st_mtime)
+ self.os.utime(link_name, (3, 4))
+ st = self.os.stat(link_name)
+ self.assertEqual(3, st.st_atime)
+ self.assertEqual(4, st.st_mtime)
+
def testTooManyLinks(self):
self.filesystem.CreateLink('/a/loop', 'loop')
self.assertFalse(self.filesystem.Exists('/a/loop'))