--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-filecache.py Sat Jul 09 19:06:59 2011 +0300
@@ -0,0 +1,95 @@
+import sys, os, subprocess
+
+try:
+ subprocess.check_call(['%s/hghave' % os.environ['TESTDIR'], 'cacheable'])
+except subprocess.CalledProcessError:
+ sys.exit(80)
+
+from mercurial import util, scmutil, extensions
+
+filecache = scmutil.filecache
+
+class fakerepo(object):
+ def __init__(self):
+ self._filecache = {}
+
+ def join(self, p):
+ return p
+
+ def sjoin(self, p):
+ return p
+
+ @filecache('x')
+ def cached(self):
+ print 'creating'
+
+ def invalidate(self):
+ for k in self._filecache:
+ try:
+ delattr(self, k)
+ except AttributeError:
+ pass
+
+def basic(repo):
+ # file doesn't exist, calls function
+ repo.cached
+
+ repo.invalidate()
+ # file still doesn't exist, uses cache
+ repo.cached
+
+ # create empty file
+ f = open('x', 'w')
+ f.close()
+ repo.invalidate()
+ # should recreate the object
+ repo.cached
+
+ f = open('x', 'w')
+ f.write('a')
+ f.close()
+ repo.invalidate()
+ # should recreate the object
+ repo.cached
+
+ repo.invalidate()
+ # stats file again, nothing changed, reuses object
+ 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')
+ f.rename()
+
+ repo.invalidate()
+ repo.cached
+
+def fakeuncacheable():
+ def wrapcacheable(orig, *args, **kwargs):
+ return False
+
+ def wrapinit(orig, *args, **kwargs):
+ pass
+
+ originit = extensions.wrapfunction(util.cachestat, '__init__', wrapinit)
+ origcacheable = extensions.wrapfunction(util.cachestat, 'cacheable', wrapcacheable)
+
+ try:
+ os.remove('x')
+ except:
+ pass
+
+ basic(fakerepo())
+
+ util.cachestat.cacheable = origcacheable
+ util.cachestat.__init__ = originit
+
+print 'basic:'
+print
+basic(fakerepo())
+print
+print 'fakeuncacheable:'
+print
+fakeuncacheable()