##// END OF EJS Templates
interfaces: convert `repository.irevisiondelta` from zope `Attribute` attrs...
interfaces: convert `repository.irevisiondelta` from zope `Attribute` attrs This is the same transformation as b455dfddfed0 did for dirstate.

File last commit:

r52996:97840154 default
r53366:2aada52e default
Show More
test-filecache.py
282 lines | 6.8 KiB | text/x-python | PythonLexer
/ tests / test-filecache.py
Robert Stanca
py3: use absolute_import in test-filecache.py
r28741 import os
Augie Fackler
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 import stat
Robert Stanca
py3: use absolute_import in test-filecache.py
r28741 import subprocess
import sys
Idan Kamara
scmutil: introduce filecache...
r14928
Augie Fackler
formatting: blacken the codebase...
r43346 if subprocess.call(
Mathias De Mare
test-filecache: use sys.executable to call python...
r46438 [sys.executable, '%s/hghave' % os.environ['TESTDIR'], 'cacheable']
Augie Fackler
formatting: blacken the codebase...
r43346 ):
Idan Kamara
scmutil: introduce filecache...
r14928 sys.exit(80)
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 print_ = print
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 def print(*args, **kwargs):
"""print() wrapper that flushes stdout buffers to avoid py3 buffer issues
We could also just write directly to sys.stdout.buffer the way the
ui object will, but this was easier for porting the test.
"""
print_(*args, **kwargs)
sys.stdout.flush()
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
test-filecache: sort import lines
r28802 from mercurial import (
extensions,
hg,
Pierre-Yves David
filecache: explicitly test 'repofilecache'...
r31284 localrepo,
Pulkit Goyal
py3: use range instead of xrange on py3 in tests/test-filecache.py...
r36300 pycompat,
Yuya Nishihara
test-filecache: alias ui as uimod
r28803 ui as uimod,
Yuya Nishihara
test-filecache: sort import lines
r28802 util,
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 vfs as vfsmod,
Yuya Nishihara
test-filecache: sort import lines
r28802 )
Idan Kamara
scmutil: introduce filecache...
r14928
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class fakerepo:
Idan Kamara
scmutil: introduce filecache...
r14928 def __init__(self):
self._filecache = {}
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class fakevfs:
Pierre-Yves David
filecache: explicitly test 'repofilecache'...
r31284 def join(self, p):
return p
vfs = fakevfs()
def unfiltered(self):
return self
Idan Kamara
scmutil: introduce filecache...
r14928
def sjoin(self, p):
return p
filecache: use binary path in the test...
r52994 @localrepo.repofilecache(b'x', b'y')
Idan Kamara
scmutil: introduce filecache...
r14928 def cached(self):
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print('creating')
Siddharth Agarwal
test-filecache.py: make setbeforeget test clearer...
r20040 return 'string from function'
Idan Kamara
scmutil: introduce filecache...
r14928
def invalidate(self):
for k in self._filecache:
try:
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 delattr(self, pycompat.sysstr(k))
Idan Kamara
scmutil: introduce filecache...
r14928 except AttributeError:
pass
Augie Fackler
formatting: blacken the codebase...
r43346
Idan Kamara
scmutil: introduce filecache...
r14928 def basic(repo):
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* neither file exists")
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 # calls function
Idan Kamara
scmutil: introduce filecache...
r14928 repo.cached
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* neither file still exists")
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 # uses cache
Idan Kamara
scmutil: introduce filecache...
r14928 repo.cached
# create empty file
filecache: use bytes wherever possible in the tests...
r52996 f = open('x', 'wb')
Idan Kamara
scmutil: introduce filecache...
r14928 f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* empty file x created")
Idan Kamara
scmutil: introduce filecache...
r14928 # should recreate the object
repo.cached
filecache: use bytes wherever possible in the tests...
r52996 f = open('x', 'wb')
f.write(b'a')
Idan Kamara
scmutil: introduce filecache...
r14928 f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file x changed size")
Idan Kamara
scmutil: introduce filecache...
r14928 # should recreate the object
repo.cached
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* nothing changed with either file")
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 # stats file again, reuses object
Idan Kamara
scmutil: introduce filecache...
r14928 repo.cached
# atomic replace file, size doesn't change
# hopefully st_mtime doesn't change as well so this doesn't use the cache
# because of inode change
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 f = vfsmod.vfs(b'.')(b'x', b'w', atomictemp=True)
f.write(b'b')
Greg Ward
atomictempfile: make close() consistent with other file-like objects....
r15057 f.close()
Idan Kamara
scmutil: introduce filecache...
r14928
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file x changed inode")
Idan Kamara
scmutil: introduce filecache...
r14928 repo.cached
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 # create empty file y
filecache: use bytes wherever possible in the tests...
r52996 f = open('y', 'wb')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* empty file y created")
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 # should recreate the object
repo.cached
filecache: use bytes wherever possible in the tests...
r52996 f = open('y', 'wb')
f.write(b'A')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file y changed size")
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 # should recreate the object
repo.cached
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 f = vfsmod.vfs(b'.')(b'y', b'w', atomictemp=True)
f.write(b'B')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file y changed inode")
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 repo.cached
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 f = vfsmod.vfs(b'.')(b'x', b'w', atomictemp=True)
f.write(b'c')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.close()
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 f = vfsmod.vfs(b'.')(b'y', b'w', atomictemp=True)
f.write(b'C')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* both files changed inode")
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 repo.cached
Augie Fackler
formatting: blacken the codebase...
r43346
Idan Kamara
scmutil: introduce filecache...
r14928 def fakeuncacheable():
def wrapcacheable(orig, *args, **kwargs):
return False
def wrapinit(orig, *args, **kwargs):
pass
originit = extensions.wrapfunction(util.cachestat, '__init__', wrapinit)
Augie Fackler
formatting: blacken the codebase...
r43346 origcacheable = extensions.wrapfunction(
util.cachestat, 'cacheable', wrapcacheable
)
Idan Kamara
scmutil: introduce filecache...
r14928
filecache: use bytes wherever possible in the tests...
r52996 for fn in [b'x', b'y']:
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 try:
os.remove(fn)
except OSError:
pass
Idan Kamara
scmutil: introduce filecache...
r14928
basic(fakerepo())
util.cachestat.cacheable = origcacheable
util.cachestat.__init__ = originit
Augie Fackler
formatting: blacken the codebase...
r43346
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 def test_filecache_synced():
timeless@mozdev.org
spelling: behaviour -> behavior
r26098 # test old behavior that caused filecached properties to go out of sync
test: explicitly "add" file before some commit in test-filecache.py...
r50883 os.system('hg init && echo a >> a && hg add a && hg ci -qm.')
Yuya Nishihara
ui: factor out ui.load() to create a ui without loading configs (API)...
r30559 repo = hg.repository(uimod.ui.load())
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 # first rollback clears the filecache, but changelog to stays in __dict__
repo.rollback()
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 repo.commit(b'.')
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 # second rollback comes along and touches the changelog externally
# (file is moved)
repo.rollback()
# but since changelog isn't under the filecache control anymore, we don't
# see that it changed, and return the old changelog without reconstructing
# it
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 repo.commit(b'.')
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313
Augie Fackler
formatting: blacken the codebase...
r43346
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 def setbeforeget(repo):
filecache: use bytes wherever possible in the tests...
r52996 os.remove(b'x')
os.remove(b'y')
Yuya Nishihara
filecache: unimplement __set__() and __delete__() (API)...
r40454 repo.__class__.cached.set(repo, 'string set externally')
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* neither file exists")
print(repo.cached)
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 repo.invalidate()
filecache: use bytes wherever possible in the tests...
r52996 f = open('x', 'wb')
f.write(b'a')
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 f.close()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file x created")
print(repo.cached)
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316
Yuya Nishihara
filecache: unimplement __set__() and __delete__() (API)...
r40454 repo.__class__.cached.set(repo, 'string 2 set externally')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* string set externally again")
print(repo.cached)
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045
repo.invalidate()
filecache: use bytes wherever possible in the tests...
r52996 f = open('y', 'wb')
f.write(b'b')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.close()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file y created")
print(repo.cached)
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045
Augie Fackler
formatting: blacken the codebase...
r43346
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 def antiambiguity():
filename = 'ambigcheck'
# try some times, because reproduction of ambiguity depends on
# "filesystem time"
Manuel Jacob
py3: remove xrange() compatibility code...
r50180 for i in range(5):
filecache: use bytes wherever possible in the tests...
r52996 fp = open(filename, 'wb')
fp.write(b'FOO')
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 fp.close()
oldstat = os.stat(filename)
Augie Fackler
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 if oldstat[stat.ST_CTIME] != oldstat[stat.ST_MTIME]:
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 # subsequent changing never causes ambiguity
continue
repetition = 3
# repeat changing via checkambigatclosing, to examine whether
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # st_mtime is advanced multiple times as expected
Manuel Jacob
py3: remove xrange() compatibility code...
r50180 for i in range(repetition):
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 # explicit closing
filecache: use bytes wherever possible in the tests...
r52996 fp = vfsmod.checkambigatclosing(open(filename, 'ab'))
fp.write(b'FOO')
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 fp.close()
# implicit closing by "with" statement
filecache: use bytes wherever possible in the tests...
r52996 with vfsmod.checkambigatclosing(open(filename, 'ab')) as fp:
fp.write(b'BAR')
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995
newstat = os.stat(filename)
Augie Fackler
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 if oldstat[stat.ST_CTIME] != newstat[stat.ST_CTIME]:
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 # timestamp ambiguity was naturally avoided while repetition
continue
# st_mtime should be advanced "repetition * 2" times, because
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # all changes occurred at same time (in sec)
Augie Fackler
formatting: blacken the codebase...
r43346 expected = (oldstat[stat.ST_MTIME] + repetition * 2) & 0x7FFFFFFF
Augie Fackler
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 if newstat[stat.ST_MTIME] != expected:
Augie Fackler
formatting: blacken the codebase...
r43346 print(
"'newstat[stat.ST_MTIME] %s is not %s (as %s + %s * 2)"
% (
newstat[stat.ST_MTIME],
expected,
oldstat[stat.ST_MTIME],
repetition,
)
)
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995
# 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
Augie Fackler
formatting: blacken the codebase...
r43346
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print('basic:')
print()
Idan Kamara
scmutil: introduce filecache...
r14928 basic(fakerepo())
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print()
print('fakeuncacheable:')
print()
Idan Kamara
scmutil: introduce filecache...
r14928 fakeuncacheable()
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 test_filecache_synced()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print()
print('setbeforeget:')
print()
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 setbeforeget(fakerepo())
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 print()
print('antiambiguity:')
print()
antiambiguity()