Mercurial > public > mercurial-scm > hg
diff tests/test-storage.py @ 40051:cdf61ab1f54c
testing: add file storage integration for bad hashes and censoring
In order to implement these tests, we need a backdoor to write data
into storage backends while bypassing normal checks. We invent a
callable to do that.
As part of writing the tests, I found a bug with censorrevision()
pretty quickly! After calling censorrevision(), attempting to
access revision data for an affected node raises a cryptic error
related to malformed compression. This appears to be due to the
revlog not adjusting delta chains as part of censoring.
I also found a bug with regards to hash verification and revision
fulltext caching. Essentially, we cache the fulltext before hash
verification. If we look up the fulltext after a failed hash
verification, we don't get a hash verification exception. Furthermore,
the behavior of revision(raw=True) can be inconsistent depending on
the order of operations.
I'll be fixing both these bugs in subsequent commits.
Differential Revision: https://phab.mercurial-scm.org/D4865
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 03 Oct 2018 10:56:48 -0700 |
parents | a3a9b93bff80 |
children | 324b4b10351e |
line wrap: on
line diff
--- a/tests/test-storage.py Wed Oct 03 10:03:41 2018 -0700 +++ b/tests/test-storage.py Wed Oct 03 10:56:48 2018 -0700 @@ -5,7 +5,9 @@ import silenttestrunner from mercurial import ( + error, filelog, + revlog, transaction, ui as uimod, vfs as vfsmod, @@ -33,14 +35,39 @@ return transaction.transaction(STATE['ui'].warn, STATE['vfs'], vfsmap, b'journal', b'undo') +def addrawrevision(self, fl, tr, node, p1, p2, linkrev, rawtext=None, + delta=None, censored=False, ellipsis=False, extstored=False): + flags = 0 + + if censored: + flags |= revlog.REVIDX_ISCENSORED + if ellipsis: + flags |= revlog.REVIDX_ELLIPSIS + if extstored: + flags |= revlog.REVIDX_EXTSTORED + + if rawtext is not None: + fl._revlog.addrawrevision(rawtext, tr, linkrev, p1, p2, node, flags) + elif delta is not None: + raise error.Abort('support for storing raw deltas not yet supported') + else: + raise error.Abort('must supply rawtext or delta arguments') + + # We may insert bad data. Clear caches to prevent e.g. cache hits to + # bypass hash verification. + fl._revlog.clearcaches() + # Assigning module-level attributes that inherit from unittest.TestCase # is all that is needed to register tests. filelogindextests = storagetesting.makeifileindextests(makefilefn, - maketransaction) + maketransaction, + addrawrevision) filelogdatatests = storagetesting.makeifiledatatests(makefilefn, - maketransaction) + maketransaction, + addrawrevision) filelogmutationtests = storagetesting.makeifilemutationtests(makefilefn, - maketransaction) + maketransaction, + addrawrevision) if __name__ == '__main__': silenttestrunner.main(__name__)