##// END OF EJS Templates
localrepo: use context manager for lock and transaction in commitctx()...
localrepo: use context manager for lock and transaction in commitctx() Differential Revision: https://phab.mercurial-scm.org/D5624

File last commit:

r41152:0fea1337 default
r41400:0132221c default
Show More
test-fastannotate-revmap.py
200 lines | 5.0 KiB | text/x-python | PythonLexer
/ tests / test-fastannotate-revmap.py
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 from __future__ import absolute_import, print_function
import os
import tempfile
Pulkit Goyal
py3: alias xrange to range in tests/test-fastannotate-revmap.py...
r39444 from mercurial import (
pycompat,
util,
)
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 from hgext.fastannotate import error, revmap
Pulkit Goyal
py3: alias xrange to range in tests/test-fastannotate-revmap.py...
r39444 if pycompat.ispy3:
xrange = range
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 def genhsh(i):
Pulkit Goyal
py3: use pycompat.bytechr() instead of chr() in test-fastannotate-revmap.py...
r40982 return pycompat.bytechr(i) + b'\0' * 19
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243
def gettemppath():
fd, path = tempfile.mkstemp()
Matt Harbison
test-fastannotate: close fd before unlinking to keep Windows happy
r39286 os.close(fd)
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 os.unlink(path)
return path
def ensure(condition):
if not condition:
raise RuntimeError('Unexpected')
def testbasicreadwrite():
path = gettemppath()
rm = revmap.revmap(path)
ensure(rm.maxrev == 0)
for i in xrange(5):
ensure(rm.rev2hsh(i) is None)
ensure(rm.hsh2rev(b'\0' * 20) is None)
Augie Fackler
tests: add lots of b prefix goo to test-fastannotate-revmap.py...
r41152 paths = [
b'', b'a', None, b'b', b'b', b'c', b'c', None, b'a', b'b', b'a', b'a']
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 for i in xrange(1, 5):
ensure(rm.append(genhsh(i), sidebranch=(i & 1), path=paths[i]) == i)
ensure(rm.maxrev == 4)
for i in xrange(1, 5):
ensure(rm.hsh2rev(genhsh(i)) == i)
ensure(rm.rev2hsh(i) == genhsh(i))
# re-load and verify
rm.flush()
rm = revmap.revmap(path)
ensure(rm.maxrev == 4)
for i in xrange(1, 5):
ensure(rm.hsh2rev(genhsh(i)) == i)
ensure(rm.rev2hsh(i) == genhsh(i))
ensure(bool(rm.rev2flag(i) & revmap.sidebranchflag) == bool(i & 1))
# append without calling save() explicitly
for i in xrange(5, 12):
ensure(rm.append(genhsh(i), sidebranch=(i & 1), path=paths[i],
flush=True) == i)
# re-load and verify
rm = revmap.revmap(path)
ensure(rm.maxrev == 11)
for i in xrange(1, 12):
ensure(rm.hsh2rev(genhsh(i)) == i)
ensure(rm.rev2hsh(i) == genhsh(i))
ensure(rm.rev2path(i) == paths[i] or paths[i - 1])
ensure(bool(rm.rev2flag(i) & revmap.sidebranchflag) == bool(i & 1))
os.unlink(path)
# missing keys
ensure(rm.rev2hsh(12) is None)
ensure(rm.rev2hsh(0) is None)
ensure(rm.rev2hsh(-1) is None)
ensure(rm.rev2flag(12) is None)
ensure(rm.rev2path(12) is None)
ensure(rm.hsh2rev(b'\1' * 20) is None)
# illformed hash (not 20 bytes)
try:
rm.append(b'\0')
ensure(False)
except Exception:
pass
def testcorruptformat():
path = gettemppath()
# incorrect header
Augie Fackler
tests: add lots of b prefix goo to test-fastannotate-revmap.py...
r41152 with open(path, 'wb') as f:
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 f.write(b'NOT A VALID HEADER')
try:
revmap.revmap(path)
ensure(False)
except error.CorruptedFileError:
pass
# rewrite the file
os.unlink(path)
rm = revmap.revmap(path)
rm.append(genhsh(0), flush=True)
rm = revmap.revmap(path)
ensure(rm.maxrev == 1)
# corrupt the file by appending a byte
size = os.stat(path).st_size
Augie Fackler
tests: add lots of b prefix goo to test-fastannotate-revmap.py...
r41152 with open(path, 'ab') as f:
f.write(b'\xff')
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 try:
revmap.revmap(path)
ensure(False)
except error.CorruptedFileError:
pass
# corrupt the file by removing the last byte
ensure(size > 0)
Augie Fackler
tests: add lots of b prefix goo to test-fastannotate-revmap.py...
r41152 with open(path, 'wb') as f:
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 f.truncate(size - 1)
try:
revmap.revmap(path)
ensure(False)
except error.CorruptedFileError:
pass
os.unlink(path)
def testcopyfrom():
path = gettemppath()
rm = revmap.revmap(path)
for i in xrange(1, 10):
Augie Fackler
tests: add lots of b prefix goo to test-fastannotate-revmap.py...
r41152 ensure(rm.append(genhsh(i),
sidebranch=(i & 1), path=(b'%d' % (i // 3))) == i)
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 rm.flush()
# copy rm to rm2
rm2 = revmap.revmap()
rm2.copyfrom(rm)
path2 = gettemppath()
rm2.path = path2
rm2.flush()
# two files should be the same
ensure(len(set(util.readfile(p) for p in [path, path2])) == 1)
os.unlink(path)
os.unlink(path2)
class fakefctx(object):
def __init__(self, node, path=None):
self._node = node
self._path = path
def node(self):
return self._node
def path(self):
return self._path
def testcontains():
path = gettemppath()
rm = revmap.revmap(path)
for i in xrange(1, 5):
ensure(rm.append(genhsh(i), sidebranch=(i & 1)) == i)
for i in xrange(1, 5):
ensure(((genhsh(i), None) in rm) == ((i & 1) == 0))
ensure((fakefctx(genhsh(i)) in rm) == ((i & 1) == 0))
for i in xrange(5, 10):
ensure(fakefctx(genhsh(i)) not in rm)
ensure((genhsh(i), None) not in rm)
# "contains" checks paths
rm = revmap.revmap()
for i in xrange(1, 5):
Augie Fackler
tests: add lots of b prefix goo to test-fastannotate-revmap.py...
r41152 ensure(rm.append(genhsh(i), path=(b'%d' % (i // 2))) == i)
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 for i in xrange(1, 5):
Augie Fackler
tests: add lots of b prefix goo to test-fastannotate-revmap.py...
r41152 ensure(fakefctx(genhsh(i), path=(b'%d' % (i // 2))) in rm)
ensure(fakefctx(genhsh(i), path=b'a') not in rm)
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243
def testlastnode():
path = gettemppath()
ensure(revmap.getlastnode(path) is None)
rm = revmap.revmap(path)
ensure(revmap.getlastnode(path) is None)
for i in xrange(1, 10):
hsh = genhsh(i)
Augie Fackler
tests: add lots of b prefix goo to test-fastannotate-revmap.py...
r41152 rm.append(hsh, path=(b'%d' % (i // 2)), flush=True)
Augie Fackler
fastannotate: initial import from Facebook's hg-experimental...
r39243 ensure(revmap.getlastnode(path) == hsh)
rm2 = revmap.revmap(path)
ensure(rm2.rev2hsh(rm2.maxrev) == hsh)
testbasicreadwrite()
testcorruptformat()
testcopyfrom()
testcontains()
testlastnode()