Mercurial > hgsubversion
view tests/test_pull_fallback.py @ 1501:6e3f48d8002f
tests: fix ipv6 support in test_push_command.py
This test runs the `svnserve` binary, which appears to resolve the hostname
passed as an argument using gethostbyname(3), which can only return an IPv4
address. When run on a system that is configured to only have an IPv6 address,
Mercurial will correctly resolve the hostname to an IPv6 address, but the SVN
server will be listening on an incorrect IPv4 address, causing the test to
fail. The workaround is to resolve the hostname using getaddrinfo(3) in the
test harness and pass the resulting address to svnserve.
author | Arun Kulshreshtha <kulshrax@fb.com> |
---|---|
date | Mon, 10 Apr 2017 16:58:28 -0700 |
parents | 4f1461428334 |
children |
line wrap: on
line source
import test_util import re import mercurial from mercurial import commands from hgsubversion import stupid from hgsubversion import svnwrap from hgsubversion import wrappers class TestPullFallback(test_util.TestBase): def setUp(self): super(TestPullFallback, self).setUp() def _loadupdate(self, fixture_name, *args, **kwargs): kwargs = kwargs.copy() kwargs.update(noupdate=False) repo, repo_path = self.load_and_fetch(fixture_name, *args, **kwargs) return repo, repo_path def test_stupid_fallback_to_stupid_fullrevs(self): return to_patch = { 'mercurial.patch.patchbackend': _patchbackend_raise, 'stupid.diff_branchrev': stupid.diff_branchrev, 'stupid.fetch_branchrev': stupid.fetch_branchrev, } expected_calls = { 'mercurial.patch.patchbackend': 1, 'stupid.diff_branchrev': 1, 'stupid.fetch_branchrev': 1, } self.stupid = True repo, repo_path = self._loadupdate('single_rev.svndump') self.stupid = False # Passing stupid=True doesn't seem to be working - force it repo.ui.setconfig('hgsubversion', 'stupid', "true") state = repo[None].parents() calls, replaced = _monkey_patch(to_patch) try: self.add_svn_rev(repo_path, {'trunk/alpha': 'Changed'}) commands.pull(self.repo.ui, repo, update=True) self.failIfEqual(state, repo[None].parents()) self.assertTrue('tip' in repo[None].tags()) self.assertEqual(expected_calls, calls) finally: _monkey_unpatch(replaced) def _monkey_patch(to_patch, start=None): if start is None: import sys start = sys.modules[__name__] calls = {} replaced = {} for path, replacement in to_patch.iteritems(): obj = start owner, attr = path.rsplit('.', 1) for a in owner.split('.', -1): obj = getattr(obj, a) replaced[path] = getattr(obj, attr) calls[path] = 0 def outer(path=path, calls=calls, replacement=replacement): def wrapper(*p, **kw): calls[path] += 1 return replacement(*p, **kw) return wrapper setattr(obj, attr, outer()) return calls, replaced def _monkey_unpatch(to_patch, start=None): if start is None: import sys start = sys.modules[__name__] replaced = {} for path, replacement in to_patch.iteritems(): obj = start owner, attr = path.rsplit('.', 1) for a in owner.split('.', -1): obj = getattr(obj, a) replaced[path] = getattr(obj, attr) setattr(obj, attr, replacement) return replaced def _patchbackend_raise(*p, **kw): raise mercurial.patch.PatchError("patch failed")