def testcheckambig(self): def atomicwrite(checkambig): f = atomictempfile(self._filename, checkambig=checkambig) f.writeutf8("FOO") f.close() # try some times, because reproduction of ambiguity depends on # "filesystem time" for i in xrange(5): atomicwrite(False) oldstat = util.stat(self._filename) if oldstat.st_ctime != oldstat.st_mtime: # subsequent changing never causes ambiguity continue repetition = 3 # repeat atomic write with checkambig=True, to examine # whether st_mtime is advanced multiple times as expected for j in xrange(repetition): atomicwrite(True) newstat = util.stat(self._filename) if oldstat.st_ctime != newstat.st_ctime: # timestamp ambiguity was naturally avoided while repetition continue # st_mtime should be advanced "repetition" times, because # all atomicwrite() occurred at same time (in sec) self.assertTrue( newstat.st_mtime == ((oldstat.st_mtime + repetition) & 0x7FFFFFFF)) # no more examination is needed, if assumption above is true break else: # This platform seems too slow to examine anti-ambiguity # of file timestamp (or test happened to be executed at # bad timing). Exit silently in this case, because running # on other faster platforms can detect problems pass
def antiambiguity(): filename = "ambigcheck" # try some times, because reproduction of ambiguity depends on # "filesystem time" for i in xrange(5): fp = open(filename, "w") fp.write("FOO") fp.close() oldstat = util.stat(filename) if oldstat.st_ctime != oldstat.st_mtime: # subsequent changing never causes ambiguity continue repetition = 3 # repeat changing via checkambigatclosing, to examine whether # st_mtime is advanced multiple times as expected for i in xrange(repetition): # explicit closing fp = vfsmod.checkambigatclosing(open(filename, "a")) fp.write("FOO") fp.close() # implicit closing by "with" statement with vfsmod.checkambigatclosing(open(filename, "a")) as fp: fp.write("BAR") newstat = os.stat(filename) if oldstat.st_ctime != newstat.st_ctime: # timestamp ambiguity was naturally avoided while repetition continue # st_mtime should be advanced "repetition * 2" times, because # all changes occurred at same time (in sec) expected = (oldstat.st_mtime + repetition * 2) & 0x7FFFFFFF if newstat.st_mtime != expected: print( "'newstat.st_mtime %s is not %s (as %s + %s * 2)" % (newstat.st_mtime, expected, oldstat.st_mtime, repetition) ) # no more examination is needed regardless of result break else: # This platform seems too slow to examine anti-ambiguity # of file timestamp (or test happened to be executed at # bad timing). Exit silently in this case, because running # on other faster platforms can detect problems pass