##// END OF EJS Templates
interfaces: introduce an interface for dirstate implementations...
interfaces: introduce an interface for dirstate implementations As usual with adding interface definitions, this describes the way things are, not the way we'd like things to be. There are some clear problems in the interface right now (eg ._map leaks in a few places), but I have plans to clean those up. There are also many missing docstrings, but again, we'll make a second pass to clean that up. Differential Revision: https://phab.mercurial-scm.org/D6836

File last commit:

r43197:d459cd8e default
r43197:d459cd8e default
Show More
test-check-interfaces.py
239 lines | 7.7 KiB | text/x-python | PythonLexer
/ tests / test-check-interfaces.py
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 # Test that certain objects conform to well-defined interfaces.
from __future__ import absolute_import, print_function
Gregory Szorc
interfaceutil: module to stub out zope.interface...
r37828 from mercurial import encoding
encoding.environ[b'HGREALINTERFACES'] = b'1'
Gregory Szorc
repository: define interface for local repositories...
r37198 import os
Martin von Zweigbergk
tests: mark test-check-interfaces.py as requiring a repo...
r37832 import subprocess
import sys
# Only run if tests are run in a repo
if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'],
'test-repo']):
sys.exit(80)
Gregory Szorc
repository: define interface for local repositories...
r37198
Pulkit Goyal
interfaces: create a new folder for interfaces and move repository.py in it...
r43078 from mercurial.interfaces import (
Augie Fackler
interfaces: introduce an interface for dirstate implementations...
r43197 dirstate as intdirstate,
Pulkit Goyal
interfaces: create a new folder for interfaces and move repository.py in it...
r43078 repository,
)
Gregory Szorc
repository: define interface for local repositories...
r37198 from mercurial.thirdparty.zope import (
interface as zi,
)
from mercurial.thirdparty.zope.interface import (
verify as ziverify,
)
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 from mercurial import (
Gregory Szorc
tests: add interface checks for bundle, statichttp, and union peers...
r34308 bundlerepo,
Augie Fackler
interfaces: introduce an interface for dirstate implementations...
r43197 dirstate,
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 filelog,
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 httppeer,
localrepo,
Gregory Szorc
repository: define manifest interfaces...
r38549 manifest,
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 pycompat,
Gregory Szorc
repository: establish API for emitting revision deltas...
r39267 revlog,
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 sshpeer,
Gregory Szorc
tests: add interface checks for bundle, statichttp, and union peers...
r34308 statichttprepo,
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 ui as uimod,
Gregory Szorc
tests: add interface checks for bundle, statichttp, and union peers...
r34308 unionrepo,
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 vfs as vfsmod,
Gregory Szorc
wireproto: port protocol handler to zope.interface...
r37312 wireprotoserver,
wireprototypes,
Gregory Szorc
wireproto: implement command executor interface for version 1 peers...
r37648 wireprotov1peer,
Gregory Szorc
wireproto: extract HTTP version 2 code to own module...
r37563 wireprotov2server,
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 )
Augie Fackler
tests: add simplestorerepo to test-check-interfaces.py...
r41194 testdir = os.path.dirname(__file__)
rootdir = pycompat.fsencode(os.path.normpath(os.path.join(testdir, '..')))
sys.path[0:0] = [testdir]
import simplestorerepo
del sys.path[0]
Gregory Szorc
repository: define interface for local repositories...
r37198
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 def checkzobject(o, allowextra=False):
Gregory Szorc
repository: define interface for local repositories...
r37198 """Verify an object with a zope interface."""
ifaces = zi.providedBy(o)
if not ifaces:
print('%r does not provide any zope interfaces' % o)
return
# Run zope.interface's built-in verification routine. This verifies that
# everything that is supposed to be present is present.
for iface in ifaces:
ziverify.verifyObject(iface, o)
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 if allowextra:
return
Gregory Szorc
repository: define interface for local repositories...
r37198 # Now verify that the object provides no extra public attributes that
# aren't declared as part of interfaces.
allowed = set()
for iface in ifaces:
allowed |= set(iface.names(all=True))
public = {a for a in dir(o) if not a.startswith('_')}
for attr in sorted(public - allowed):
print('public attribute not declared in interfaces: %s.%s' % (
o.__class__.__name__, attr))
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 # Facilitates testing localpeer.
class dummyrepo(object):
def __init__(self):
self.ui = uimod.ui()
def filtered(self, name):
pass
def _restrictcapabilities(self, caps):
pass
Gregory Szorc
httppeer: refactor how httppeer is created (API)...
r37024 class dummyopener(object):
handlers = []
Gregory Szorc
httppeer: perform capabilities request in makepeer()...
r37570 # Facilitates testing sshpeer without requiring a server.
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 class badpeer(httppeer.httppeer):
def __init__(self):
Gregory Szorc
httppeer: perform capabilities request in makepeer()...
r37570 super(badpeer, self).__init__(None, None, None, dummyopener(), None,
None)
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 self.badattribute = True
def badmethod(self):
pass
Gregory Szorc
sshpeer: defer pipe buffering and stderr sidechannel binding...
r36388 class dummypipe(object):
def close(self):
pass
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 def main():
ui = uimod.ui()
Gregory Szorc
repository: define interface for local repositories...
r37198 # Needed so we can open a local repo with obsstore without a warning.
Gregory Szorc
py3: use b'' in test-check-interfaces.py...
r40189 ui.setconfig(b'experimental', b'evolution.createmarkers', True)
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336 checkzobject(badpeer())
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653 ziverify.verifyClass(repository.ipeerbase, httppeer.httppeer)
Gregory Szorc
httppeer: perform capabilities request in makepeer()...
r37570 checkzobject(httppeer.httppeer(None, None, None, dummyopener(), None, None))
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336
Gregory Szorc
httppeer: expose API descriptor on httpv2peer...
r40207 ziverify.verifyClass(repository.ipeerv2, httppeer.httpv2peer)
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 checkzobject(httppeer.httpv2peer(None, b'', b'', None, None, None))
Gregory Szorc
httppeer: implement ipeerconnection...
r37627
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336 ziverify.verifyClass(repository.ipeerbase,
localrepo.localpeer)
checkzobject(localrepo.localpeer(dummyrepo()))
Gregory Szorc
wireproto: implement command executor interface for version 1 peers...
r37648 ziverify.verifyClass(repository.ipeercommandexecutor,
localrepo.localcommandexecutor)
checkzobject(localrepo.localcommandexecutor(None))
ziverify.verifyClass(repository.ipeercommandexecutor,
wireprotov1peer.peerexecutor)
checkzobject(wireprotov1peer.peerexecutor(None))
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653 ziverify.verifyClass(repository.ipeerbase, sshpeer.sshv1peer)
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 checkzobject(sshpeer.sshv1peer(ui, b'ssh://localhost/foo', b'', dummypipe(),
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336 dummypipe(), None, None))
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653 ziverify.verifyClass(repository.ipeerbase, sshpeer.sshv2peer)
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 checkzobject(sshpeer.sshv2peer(ui, b'ssh://localhost/foo', b'', dummypipe(),
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336 dummypipe(), None, None))
ziverify.verifyClass(repository.ipeerbase, bundlerepo.bundlepeer)
checkzobject(bundlerepo.bundlepeer(dummyrepo()))
ziverify.verifyClass(repository.ipeerbase, statichttprepo.statichttppeer)
checkzobject(statichttprepo.statichttppeer(dummyrepo()))
ziverify.verifyClass(repository.ipeerbase, unionrepo.unionpeer)
checkzobject(unionrepo.unionpeer(dummyrepo()))
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806
Gregory Szorc
localrepo: iteratively derive local repository type...
r39800 ziverify.verifyClass(repository.ilocalrepositorymain,
Gregory Szorc
repository: define interface for local repositories...
r37198 localrepo.localrepository)
Gregory Szorc
localrepo: iteratively derive local repository type...
r39800 ziverify.verifyClass(repository.ilocalrepositoryfilestorage,
localrepo.revlogfilestorage)
Gregory Szorc
localrepo: create new function for instantiating a local repo object...
r39723 repo = localrepo.makelocalrepository(ui, rootdir)
Gregory Szorc
repository: define interface for local repositories...
r37198 checkzobject(repo)
Gregory Szorc
wireproto: port protocol handler to zope.interface...
r37312 ziverify.verifyClass(wireprototypes.baseprotocolhandler,
wireprotoserver.sshv1protocolhandler)
ziverify.verifyClass(wireprototypes.baseprotocolhandler,
wireprotoserver.sshv2protocolhandler)
ziverify.verifyClass(wireprototypes.baseprotocolhandler,
wireprotoserver.httpv1protocolhandler)
ziverify.verifyClass(wireprototypes.baseprotocolhandler,
Gregory Szorc
wireproto: extract HTTP version 2 code to own module...
r37563 wireprotov2server.httpv2protocolhandler)
Gregory Szorc
wireproto: port protocol handler to zope.interface...
r37312
sshv1 = wireprotoserver.sshv1protocolhandler(None, None, None)
checkzobject(sshv1)
sshv2 = wireprotoserver.sshv2protocolhandler(None, None, None)
checkzobject(sshv2)
httpv1 = wireprotoserver.httpv1protocolhandler(None, None, None)
checkzobject(httpv1)
Gregory Szorc
wireproto: extract HTTP version 2 code to own module...
r37563 httpv2 = wireprotov2server.httpv2protocolhandler(None, None)
Gregory Szorc
wireproto: port protocol handler to zope.interface...
r37312 checkzobject(httpv2)
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 ziverify.verifyClass(repository.ifilestorage, filelog.filelog)
Gregory Szorc
repository: define manifest interfaces...
r38549 ziverify.verifyClass(repository.imanifestdict, manifest.manifestdict)
ziverify.verifyClass(repository.imanifestrevisionstored,
manifest.manifestctx)
ziverify.verifyClass(repository.imanifestrevisionwritable,
manifest.memmanifestctx)
ziverify.verifyClass(repository.imanifestrevisionstored,
manifest.treemanifestctx)
ziverify.verifyClass(repository.imanifestrevisionwritable,
manifest.memtreemanifestctx)
ziverify.verifyClass(repository.imanifestlog, manifest.manifestlog)
Gregory Szorc
manifest: proxy to revlog instance instead of inheriting...
r39350 ziverify.verifyClass(repository.imanifeststorage, manifest.manifestrevlog)
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459
Augie Fackler
tests: add simplestorerepo to test-check-interfaces.py...
r41194 ziverify.verifyClass(repository.irevisiondelta,
simplestorerepo.simplestorerevisiondelta)
ziverify.verifyClass(repository.ifilestorage, simplestorerepo.filestorage)
ziverify.verifyClass(repository.iverifyproblem,
simplestorerepo.simplefilestoreproblem)
Augie Fackler
interfaces: introduce an interface for dirstate implementations...
r43197 ziverify.verifyClass(intdirstate.idirstate, dirstate.dirstate)
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 vfs = vfsmod.vfs(b'.')
fl = filelog.filelog(vfs, b'dummy.i')
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 checkzobject(fl, allowextra=True)
Gregory Szorc
repository: define manifest interfaces...
r38549 # Conforms to imanifestlog.
Martin von Zweigbergk
manifest: accept narrowmatch into constructor instead of getting from repo...
r41067 ml = manifest.manifestlog(vfs, repo, manifest.manifestrevlog(repo.svfs),
repo.narrowmatch())
Gregory Szorc
repository: define manifest interfaces...
r38549 checkzobject(ml)
checkzobject(repo.manifestlog)
# Conforms to imanifestrevision.
mctx = ml[repo[0].manifestnode()]
checkzobject(mctx)
# Conforms to imanifestrevisionwritable.
checkzobject(mctx.new())
checkzobject(mctx.copy())
# Conforms to imanifestdict.
checkzobject(mctx.read())
Gregory Szorc
manifest: proxy to revlog instance instead of inheriting...
r39350 mrl = manifest.manifestrevlog(vfs)
checkzobject(mrl)
Gregory Szorc
repository: formalize interfaces for revision deltas and requests...
r39266 ziverify.verifyClass(repository.irevisiondelta,
Gregory Szorc
repository: establish API for emitting revision deltas...
r39267 revlog.revlogrevisiondelta)
Gregory Szorc
repository: formalize interfaces for revision deltas and requests...
r39266
Gregory Szorc
repository: establish API for emitting revision deltas...
r39267 rd = revlog.revlogrevisiondelta(
Gregory Szorc
repository: formalize interfaces for revision deltas and requests...
r39266 node=b'',
p1node=b'',
p2node=b'',
basenode=b'',
linknode=b'',
flags=b'',
baserevisionsize=None,
revision=b'',
delta=None)
checkzobject(rd)
Gregory Szorc
verify: start to abstract file verification...
r39878 ziverify.verifyClass(repository.iverifyproblem,
revlog.revlogproblem)
checkzobject(revlog.revlogproblem())
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 main()