Mercurial > hg
view tests/test-demandimport.py @ 36534:5faeabb07cf5
debugcommands: support for triggering push protocol
The mechanism for pushing to a remote is a bit more complicated
than other commands. On SSH, we wait for a positive reply from
the server before we start sending the bundle payload.
This commit adds a mechanism to the "command" action in
`hg debugwireproto` to trigger the "push protocol" and to
specify a file whose contents should be submitted as the command
payload.
With this new feature, we implement a handful of tests for the
"unbundle" command. We try to cover various server failures and
hook/output scenarios so protocol behavior is as comprehensively
tested as possible. Even with so much test output, we only cover
bundle1 with Python hooks. There's still a lot of test coverage
that needs to be implemented. But this is certainly a good start.
Because there are so many new tests, we split these tests into their
own test file.
In order to make output deterministic, we need to disable the
doublepipe primitive. We add an option to `hg debugwireproto`
to do that. Because something in the bowels of the peer does a
read of stderr, we still capture read I/O from stderr. So there
is test coverage of what the server emits.
The tests around I/O capture some wonkiness. For example,
interleaved ui.write() and ui.write_err() calls are emitted in
order. However, (presumably due to buffering), print() to
sys.stdout and sys.stderr aren't in order.
We currently only test bundle1 because bundle2 is substantially
harder to test because it is more complicated (the server responds
with a stream containing a bundle2 instead of a frame).
Differential Revision: https://phab.mercurial-scm.org/D2471
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 26 Feb 2018 18:01:13 -0800 |
parents | c2c5f9f6fa21 |
children | 1d0610fdd63b |
line wrap: on
line source
from __future__ import absolute_import, print_function from mercurial import demandimport demandimport.enable() import os import subprocess import sys # Only run if demandimport is allowed if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'], 'demandimport']): sys.exit(80) if os.name != 'nt': try: import distutils.msvc9compiler print('distutils.msvc9compiler needs to be an immediate ' 'importerror on non-windows platforms') distutils.msvc9compiler except ImportError: pass import re rsub = re.sub def f(obj): l = repr(obj) l = rsub("0x[0-9a-fA-F]+", "0x?", l) l = rsub("from '.*'", "from '?'", l) l = rsub("'<[a-z]*>'", "'<whatever>'", l) return l demandimport.disable() os.environ['HGDEMANDIMPORT'] = 'disable' # this enable call should not actually enable demandimport! demandimport.enable() from mercurial import node print("node =", f(node)) # now enable it for real del os.environ['HGDEMANDIMPORT'] demandimport.enable() # Test access to special attributes through demandmod proxy from mercurial import error as errorproxy print("errorproxy =", f(errorproxy)) print("errorproxy.__doc__ = %r" % (' '.join(errorproxy.__doc__.split()[:3]) + ' ...')) print("errorproxy.__name__ = %r" % errorproxy.__name__) # __name__ must be accessible via __dict__ so the relative imports can be # resolved print("errorproxy.__dict__['__name__'] = %r" % errorproxy.__dict__['__name__']) print("errorproxy =", f(errorproxy)) import os print("os =", f(os)) print("os.system =", f(os.system)) print("os =", f(os)) from mercurial import util print("util =", f(util)) print("util.system =", f(util.system)) print("util =", f(util)) print("util.system =", f(util.system)) from mercurial import hgweb print("hgweb =", f(hgweb)) print("hgweb_mod =", f(hgweb.hgweb_mod)) print("hgweb =", f(hgweb)) import re as fred print("fred =", f(fred)) import re as remod print("remod =", f(remod)) import sys as re print("re =", f(re)) print("fred =", f(fred)) print("fred.sub =", f(fred.sub)) print("fred =", f(fred)) remod.escape # use remod print("remod =", f(remod)) print("re =", f(re)) print("re.stderr =", f(re.stderr)) print("re =", f(re)) import contextlib print("contextlib =", f(contextlib)) try: from contextlib import unknownattr print('no demandmod should be created for attribute of non-package ' 'module:\ncontextlib.unknownattr =', f(unknownattr)) except ImportError as inst: print('contextlib.unknownattr = ImportError: %s' % rsub(r"'", '', str(inst))) # Unlike the import statement, __import__() function should not raise # ImportError even if fromlist has an unknown item # (see Python/import.c:import_module_level() and ensure_fromlist()) contextlibimp = __import__('contextlib', globals(), locals(), ['unknownattr']) print("__import__('contextlib', ..., ['unknownattr']) =", f(contextlibimp)) print("hasattr(contextlibimp, 'unknownattr') =", util.safehasattr(contextlibimp, 'unknownattr'))