test-filecache.py
193 lines
| 4.3 KiB
| text/x-python
|
PythonLexer
/ tests / test-filecache.py
Robert Stanca
|
r28742 | from __future__ import absolute_import, print_function | ||
Robert Stanca
|
r28741 | import os | ||
import subprocess | ||||
import sys | ||||
Idan Kamara
|
r14928 | |||
Brodie Rao
|
r16683 | if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'], | ||
'cacheable']): | ||||
Idan Kamara
|
r14928 | sys.exit(80) | ||
Yuya Nishihara
|
r28802 | from mercurial import ( | ||
extensions, | ||||
hg, | ||||
scmutil, | ||||
Yuya Nishihara
|
r28803 | ui as uimod, | ||
Yuya Nishihara
|
r28802 | util, | ||
) | ||||
Idan Kamara
|
r14928 | |||
filecache = scmutil.filecache | ||||
class fakerepo(object): | ||||
def __init__(self): | ||||
self._filecache = {} | ||||
def join(self, p): | ||||
return p | ||||
def sjoin(self, p): | ||||
return p | ||||
Siddharth Agarwal
|
r20045 | @filecache('x', 'y') | ||
Idan Kamara
|
r14928 | def cached(self): | ||
Robert Stanca
|
r28742 | print('creating') | ||
Siddharth Agarwal
|
r20040 | return 'string from function' | ||
Idan Kamara
|
r14928 | |||
def invalidate(self): | ||||
for k in self._filecache: | ||||
try: | ||||
delattr(self, k) | ||||
except AttributeError: | ||||
pass | ||||
def basic(repo): | ||||
Robert Stanca
|
r28742 | print("* neither file exists") | ||
Siddharth Agarwal
|
r20041 | # calls function | ||
Idan Kamara
|
r14928 | repo.cached | ||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* neither file still exists") | ||
Siddharth Agarwal
|
r20041 | # uses cache | ||
Idan Kamara
|
r14928 | repo.cached | ||
# create empty file | ||||
f = open('x', 'w') | ||||
f.close() | ||||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* empty file x created") | ||
Idan Kamara
|
r14928 | # should recreate the object | ||
repo.cached | ||||
f = open('x', 'w') | ||||
f.write('a') | ||||
f.close() | ||||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* file x changed size") | ||
Idan Kamara
|
r14928 | # should recreate the object | ||
repo.cached | ||||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* nothing changed with either file") | ||
Siddharth Agarwal
|
r20041 | # stats file again, reuses object | ||
Idan Kamara
|
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 | ||||
f = scmutil.opener('.')('x', 'w', atomictemp=True) | ||||
f.write('b') | ||||
Greg Ward
|
r15057 | f.close() | ||
Idan Kamara
|
r14928 | |||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* file x changed inode") | ||
Idan Kamara
|
r14928 | repo.cached | ||
Siddharth Agarwal
|
r20045 | # create empty file y | ||
f = open('y', 'w') | ||||
f.close() | ||||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* empty file y created") | ||
Siddharth Agarwal
|
r20045 | # should recreate the object | ||
repo.cached | ||||
f = open('y', 'w') | ||||
f.write('A') | ||||
f.close() | ||||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* file y changed size") | ||
Siddharth Agarwal
|
r20045 | # should recreate the object | ||
repo.cached | ||||
f = scmutil.opener('.')('y', 'w', atomictemp=True) | ||||
f.write('B') | ||||
f.close() | ||||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* file y changed inode") | ||
Siddharth Agarwal
|
r20045 | repo.cached | ||
f = scmutil.opener('.')('x', 'w', atomictemp=True) | ||||
f.write('c') | ||||
f.close() | ||||
f = scmutil.opener('.')('y', 'w', atomictemp=True) | ||||
f.write('C') | ||||
f.close() | ||||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* both files changed inode") | ||
Siddharth Agarwal
|
r20045 | repo.cached | ||
Idan Kamara
|
r14928 | def fakeuncacheable(): | ||
def wrapcacheable(orig, *args, **kwargs): | ||||
return False | ||||
def wrapinit(orig, *args, **kwargs): | ||||
pass | ||||
originit = extensions.wrapfunction(util.cachestat, '__init__', wrapinit) | ||||
Matt Mackall
|
r14937 | origcacheable = extensions.wrapfunction(util.cachestat, 'cacheable', | ||
wrapcacheable) | ||||
Idan Kamara
|
r14928 | |||
Siddharth Agarwal
|
r20045 | for fn in ['x', 'y']: | ||
try: | ||||
os.remove(fn) | ||||
except OSError: | ||||
pass | ||||
Idan Kamara
|
r14928 | |||
basic(fakerepo()) | ||||
util.cachestat.cacheable = origcacheable | ||||
util.cachestat.__init__ = originit | ||||
Idan Kamara
|
r18313 | def test_filecache_synced(): | ||
timeless@mozdev.org
|
r26098 | # test old behavior that caused filecached properties to go out of sync | ||
Idan Kamara
|
r18313 | os.system('hg init && echo a >> a && hg ci -qAm.') | ||
Yuya Nishihara
|
r28803 | repo = hg.repository(uimod.ui()) | ||
Idan Kamara
|
r18313 | # first rollback clears the filecache, but changelog to stays in __dict__ | ||
repo.rollback() | ||||
repo.commit('.') | ||||
# 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 | ||||
repo.commit('.') | ||||
Idan Kamara
|
r18316 | def setbeforeget(repo): | ||
os.remove('x') | ||||
Siddharth Agarwal
|
r20045 | os.remove('y') | ||
Siddharth Agarwal
|
r20040 | repo.cached = 'string set externally' | ||
Idan Kamara
|
r18316 | repo.invalidate() | ||
Robert Stanca
|
r28742 | print("* neither file exists") | ||
print(repo.cached) | ||||
Idan Kamara
|
r18316 | repo.invalidate() | ||
f = open('x', 'w') | ||||
f.write('a') | ||||
f.close() | ||||
Robert Stanca
|
r28742 | print("* file x created") | ||
print(repo.cached) | ||||
Idan Kamara
|
r18316 | |||
Siddharth Agarwal
|
r20045 | repo.cached = 'string 2 set externally' | ||
repo.invalidate() | ||||
Robert Stanca
|
r28742 | print("* string set externally again") | ||
print(repo.cached) | ||||
Siddharth Agarwal
|
r20045 | |||
repo.invalidate() | ||||
f = open('y', 'w') | ||||
f.write('b') | ||||
f.close() | ||||
Robert Stanca
|
r28742 | print("* file y created") | ||
print(repo.cached) | ||||
Siddharth Agarwal
|
r20045 | |||
Robert Stanca
|
r28742 | print('basic:') | ||
print() | ||||
Idan Kamara
|
r14928 | basic(fakerepo()) | ||
Robert Stanca
|
r28742 | print() | ||
print('fakeuncacheable:') | ||||
print() | ||||
Idan Kamara
|
r14928 | fakeuncacheable() | ||
Idan Kamara
|
r18313 | test_filecache_synced() | ||
Robert Stanca
|
r28742 | print() | ||
print('setbeforeget:') | ||||
print() | ||||
Idan Kamara
|
r18316 | setbeforeget(fakerepo()) | ||