class TestPreserveTimes(PicardTestCase): def setUp(self): super().setUp() self.tmp_directory = self.mktmpdir() filepath = os.path.join(self.tmp_directory, 'a.mp3') self.file = File(filepath) def _create_testfile(self): # create a dummy file with open(self.file.filename, 'w') as f: f.write('xxx') f.flush() os.fsync(f.fileno()) def _modify_testfile(self): # dummy file modification, append data to it with open(self.file.filename, 'a') as f: f.write('yyy') f.flush() os.fsync(f.fileno()) def _read_testfile(self): with open(self.file.filename, 'r') as f: return f.read() def test_preserve_times(self): self._create_testfile() # test if times are preserved (before_atime_ns, before_mtime_ns) = self.file._preserve_times(self.file.filename, self._modify_testfile) # HERE an external access to the file is possible, modifying its access time # read times again and compare with original st = os.stat(self.file.filename) (after_atime_ns, after_mtime_ns) = (st.st_atime_ns, st.st_mtime_ns) # on macOS 10.14 and later os.utime only sets the times with second # precision see https://tickets.metabrainz.org/browse/PICARD-1516. # This also seems to depend on the Python build being used. if IS_MACOS: before_atime_ns //= 1000 before_mtime_ns //= 1000 after_atime_ns //= 1000 after_mtime_ns //= 1000 # modification times should be equal self.assertEqual(before_mtime_ns, after_mtime_ns) # access times may not be equal # time difference should be positive and reasonably low (if no access in between, it should be 0) delta = after_atime_ns - before_atime_ns tolerance = 10**7 # 0.01 seconds self.assertTrue(0 <= delta < tolerance, "0 <= %s < %s" % (delta, tolerance)) # ensure written data can be read back # keep it at the end, we don't want to access file before time checks self.assertEqual(self._read_testfile(), 'xxxyyy') def test_preserve_times_nofile(self): with self.assertRaises(self.file.PreserveTimesStatError): self.file._preserve_times(self.file.filename, self._modify_testfile) with self.assertRaises(FileNotFoundError): self._read_testfile() def test_preserve_times_nofile_utime(self): self._create_testfile() def save(): os.remove(self.file.filename) with self.assertRaises(self.file.PreserveTimesUtimeError): self.file._preserve_times(self.file.filename, save)
class TestPreserveTimes(PicardTestCase): def setUp(self): super().setUp() self.tmp_directory = mkdtemp() filepath = os.path.join(self.tmp_directory, 'a.mp3') self.file = File(filepath) def tearDown(self): shutil.rmtree(self.tmp_directory) def _create_testfile(self): # create a dummy file with open(self.file.filename, 'w') as f: f.write('xxx') f.flush() os.fsync(f.fileno()) def _modify_testfile(self): # dummy file modification, append data to it with open(self.file.filename, 'a') as f: f.write('yyy') f.flush() os.fsync(f.fileno()) def _read_testfile(self): with open(self.file.filename, 'r') as f: return f.read() def test_preserve_times(self): self._create_testfile() # test if times are preserved (before_atime_ns, before_mtime_ns) = self.file._preserve_times(self.file.filename, self._modify_testfile) # HERE an external access to the file is possible, modifying its access time # read times again and compare with original st = os.stat(self.file.filename) (after_atimes_ns, after_mtimes_ns) = (st.st_atime_ns, st.st_mtime_ns) # modification times should be equal self.assertEqual(before_mtime_ns, after_mtimes_ns) # access times may not be equal # time difference should be positive and reasonably low (if no access in between, it should be 0) delta = after_atimes_ns - before_atime_ns tolerance = 10**7 # 0.01 seconds self.assertTrue(0 <= delta < tolerance) # ensure written data can be read back # keep it at the end, we don't want to access file before time checks self.assertEqual(self._read_testfile(), 'xxxyyy') def test_preserve_times_nofile(self): with self.assertRaises(self.file.PreserveTimesStatError): self.file._preserve_times(self.file.filename, self._modify_testfile) with self.assertRaises(FileNotFoundError): self._read_testfile() def test_preserve_times_nofile_utime(self): self._create_testfile() def save(): os.remove(self.file.filename) with self.assertRaises(self.file.PreserveTimesUtimeError): result = self.file._preserve_times(self.file.filename, save)