##// END OF EJS Templates
test: enable sparse-revlog for test-clonebundles.t...
test: enable sparse-revlog for test-clonebundles.t We are about to enable sparse-revlog globally. To help with reviewing the tests change, we isolate them in individual changesets. Differential Revision: https://phab.mercurial-scm.org/D5316

File last commit:

r40454:7caf632e default
r40925:abac9d18 default
Show More
test-filecache.py
269 lines | 6.8 KiB | text/x-python | PythonLexer
/ tests / test-filecache.py
Robert Stanca
py3: use print_function in test-filecache.py
r28742 from __future__ import absolute_import, print_function
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
Brodie Rao
cleanup: eradicate long lines
r16683 if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'],
'cacheable']):
Idan Kamara
scmutil: introduce filecache...
r14928 sys.exit(80)
Augie Fackler
tests: port test-filecache.py to Python 3...
r37917 print_ = print
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()
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
Pulkit Goyal
py3: use range instead of xrange on py3 in tests/test-filecache.py...
r36300 if pycompat.ispy3:
xrange = range
Idan Kamara
scmutil: introduce filecache...
r14928 class fakerepo(object):
def __init__(self):
self._filecache = {}
Pierre-Yves David
filecache: explicitly test 'repofilecache'...
r31284 class fakevfs(object):
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
Pierre-Yves David
filecache: explicitly test 'repofilecache'...
r31284 @localrepo.repofilecache('x', '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
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
f = open('x', 'w')
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
f = open('x', 'w')
f.write('a')
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
f = open('y', 'w')
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
f = open('y', 'w')
f.write('A')
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
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)
Matt Mackall
filecache: fix check-code complaint
r14937 origcacheable = extensions.wrapfunction(util.cachestat, 'cacheable',
wrapcacheable)
Idan Kamara
scmutil: introduce filecache...
r14928
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 for fn in ['x', 'y']:
try:
os.remove(fn)
except OSError:
pass
Idan Kamara
scmutil: introduce filecache...
r14928
basic(fakerepo())
util.cachestat.cacheable = origcacheable
util.cachestat.__init__ = originit
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
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 os.system('hg init && echo a >> a && hg ci -qAm.')
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
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 def setbeforeget(repo):
os.remove('x')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 os.remove('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()
f = open('x', 'w')
f.write('a')
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()
f = open('y', 'w')
f.write('b')
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
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"
for i in xrange(5):
fp = open(filename, 'w')
fp.write('FOO')
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
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 for i in xrange(repetition):
# explicit closing
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 fp = vfsmod.checkambigatclosing(open(filename, 'a'))
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 fp.write('FOO')
fp.close()
# implicit closing by "with" statement
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 with vfsmod.checkambigatclosing(open(filename, 'a')) as fp:
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 fp.write('BAR')
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
cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime...
r36799 expected = (oldstat[stat.ST_MTIME] + repetition * 2) & 0x7fffffff
if newstat[stat.ST_MTIME] != expected:
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
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()