test-storage.py
168 lines
| 3.8 KiB
| text/x-python
|
PythonLexer
/ tests / test-storage.py
Gregory Szorc
|
r39808 | # This test verifies the conformance of various classes to various | ||
# storage interfaces. | ||||
from __future__ import absolute_import | ||||
import silenttestrunner | ||||
from mercurial import ( | ||||
Gregory Szorc
|
r40087 | error, | ||
Gregory Szorc
|
r39808 | filelog, | ||
Gregory Szorc
|
r40087 | revlog, | ||
Gregory Szorc
|
r39808 | transaction, | ||
ui as uimod, | ||||
vfs as vfsmod, | ||||
) | ||||
Augie Fackler
|
r43346 | from mercurial.testing import storage as storagetesting | ||
Gregory Szorc
|
r39808 | |||
Augie Fackler
|
r40399 | try: | ||
Augie Fackler
|
r43346 | from hgext import sqlitestore | ||
Augie Fackler
|
r40399 | except ImportError: | ||
sqlitestore = None | ||||
Gregory Szorc
|
r40362 | |||
try: | ||||
Yuya Nishihara
|
r40492 | import sqlite3 | ||
Augie Fackler
|
r43346 | |||
Yuya Nishihara
|
r40492 | if sqlite3.sqlite_version_info < (3, 8, 3): | ||
# WITH clause not supported | ||||
sqlitestore = None | ||||
except ImportError: | ||||
pass | ||||
try: | ||||
Gregory Szorc
|
r40362 | from mercurial import zstd | ||
Augie Fackler
|
r43346 | |||
Gregory Szorc
|
r40362 | zstd.__version__ | ||
except ImportError: | ||||
zstd = None | ||||
Gregory Szorc
|
r39808 | STATE = { | ||
'lastindex': 0, | ||||
'ui': uimod.ui(), | ||||
'vfs': vfsmod.vfs(b'.', realpath=True), | ||||
} | ||||
Augie Fackler
|
r43346 | |||
Gregory Szorc
|
r39808 | def makefilefn(self): | ||
"""Factory for filelog instances.""" | ||||
Gregory Szorc
|
r39989 | fl = filelog.filelog(STATE['vfs'], b'filelog-%d' % STATE['lastindex']) | ||
Gregory Szorc
|
r39808 | STATE['lastindex'] += 1 | ||
return fl | ||||
Augie Fackler
|
r43346 | |||
Gregory Szorc
|
r39808 | def maketransaction(self): | ||
Gregory Szorc
|
r40356 | vfsmap = {b'plain': STATE['vfs'], b'store': STATE['vfs']} | ||
Gregory Szorc
|
r39808 | |||
Augie Fackler
|
r43346 | return transaction.transaction( | ||
STATE['ui'].warn, STATE['vfs'], vfsmap, b'journal', b'undo' | ||||
) | ||||
Gregory Szorc
|
r39808 | |||
Augie Fackler
|
r43346 | def addrawrevision( | ||
self, | ||||
fl, | ||||
tr, | ||||
node, | ||||
p1, | ||||
p2, | ||||
linkrev, | ||||
rawtext=None, | ||||
delta=None, | ||||
censored=False, | ||||
ellipsis=False, | ||||
extstored=False, | ||||
): | ||||
Gregory Szorc
|
r40087 | 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: | ||||
Augie Fackler
|
r43346 | fl._revlog.addrawrevision( | ||
rawtext, tr, linkrev, p1, p2, node, flags, cachedelta=delta | ||||
) | ||||
Gregory Szorc
|
r40087 | 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() | ||||
Augie Fackler
|
r43346 | |||
Gregory Szorc
|
r39808 | # Assigning module-level attributes that inherit from unittest.TestCase | ||
# is all that is needed to register tests. | ||||
Augie Fackler
|
r43346 | filelogindextests = storagetesting.makeifileindextests( | ||
makefilefn, maketransaction, addrawrevision | ||||
) | ||||
filelogdatatests = storagetesting.makeifiledatatests( | ||||
makefilefn, maketransaction, addrawrevision | ||||
) | ||||
filelogmutationtests = storagetesting.makeifilemutationtests( | ||||
makefilefn, maketransaction, addrawrevision | ||||
) | ||||
Gregory Szorc
|
r39808 | |||
Gregory Szorc
|
r40362 | def makesqlitefile(self): | ||
path = STATE['vfs'].join(b'db-%d.db' % STATE['lastindex']) | ||||
STATE['lastindex'] += 1 | ||||
db = sqlitestore.makedb(path) | ||||
compression = b'zstd' if zstd else b'zlib' | ||||
return sqlitestore.sqlitefilestore(db, b'dummy-path', compression) | ||||
Augie Fackler
|
r43346 | |||
def addrawrevisionsqlite( | ||||
self, | ||||
fl, | ||||
tr, | ||||
node, | ||||
p1, | ||||
p2, | ||||
linkrev, | ||||
rawtext=None, | ||||
delta=None, | ||||
censored=False, | ||||
ellipsis=False, | ||||
extstored=False, | ||||
): | ||||
Gregory Szorc
|
r40362 | flags = 0 | ||
if censored: | ||||
flags |= sqlitestore.FLAG_CENSORED | ||||
if ellipsis | extstored: | ||||
Augie Fackler
|
r43346 | raise error.Abort( | ||
b'support for ellipsis and extstored flags not ' b'supported' | ||||
) | ||||
Gregory Szorc
|
r40362 | |||
if rawtext is not None: | ||||
fl._addrawrevision(node, rawtext, tr, linkrev, p1, p2, flags=flags) | ||||
elif delta is not None: | ||||
Augie Fackler
|
r43346 | fl._addrawrevision( | ||
node, rawtext, tr, linkrev, p1, p2, storedelta=delta, flags=flags | ||||
) | ||||
Gregory Szorc
|
r40362 | else: | ||
raise error.Abort(b'must supply rawtext or delta arguments') | ||||
Augie Fackler
|
r43346 | |||
Augie Fackler
|
r40399 | if sqlitestore is not None: | ||
sqlitefileindextests = storagetesting.makeifileindextests( | ||||
Augie Fackler
|
r43346 | makesqlitefile, maketransaction, addrawrevisionsqlite | ||
) | ||||
Augie Fackler
|
r40399 | sqlitefiledatatests = storagetesting.makeifiledatatests( | ||
Augie Fackler
|
r43346 | makesqlitefile, maketransaction, addrawrevisionsqlite | ||
) | ||||
Augie Fackler
|
r40399 | sqlitefilemutationtests = storagetesting.makeifilemutationtests( | ||
Augie Fackler
|
r43346 | makesqlitefile, maketransaction, addrawrevisionsqlite | ||
) | ||||
Gregory Szorc
|
r40362 | |||
Gregory Szorc
|
r39808 | if __name__ == '__main__': | ||
silenttestrunner.main(__name__) | ||||