Use boring old dependency injection to replace mocks in this test

This commit is contained in:
Jean-Paul Calderone 2020-12-16 11:50:35 -05:00
parent 3d564f97d5
commit 3d82ca0d25
2 changed files with 43 additions and 28 deletions

View File

@ -190,16 +190,28 @@ class Connections(unittest.TestCase):
self.assertEqual(default_connection_handlers["i2p"], "i2p") self.assertEqual(default_connection_handlers["i2p"], "i2p")
def test_tor_unimportable(self): def test_tor_unimportable(self):
with mock.patch("allmydata.util.tor_provider._import_tor", """
return_value=None): If the configuration calls for substituting Tor for TCP and
``foolscap.connections.tor`` is not importable then
``create_connection_handlers`` raises ``ValueError`` with a message
explaining this makes Tor unusable.
"""
self.config = config_from_string( self.config = config_from_string(
"fake.port", "fake.port",
"no-basedir", "no-basedir",
BASECONFIG + "[connections]\ntcp = tor\n", BASECONFIG + "[connections]\ntcp = tor\n",
) )
tor_provider = create_tor_provider(
reactor,
self.config,
import_tor=lambda: None,
)
with self.assertRaises(ValueError) as ctx: with self.assertRaises(ValueError) as ctx:
tor_provider = create_tor_provider(reactor, self.config) default_connection_handlers, _ = create_connection_handlers(
default_connection_handlers, _ = create_connection_handlers(self.config, mock.Mock(), tor_provider) self.config,
i2p_provider=ConstantAddresses(handler=object()),
tor_provider=tor_provider,
)
self.assertEqual( self.assertEqual(
str(ctx.exception), str(ctx.exception),
"'tahoe.cfg [connections] tcp='" "'tahoe.cfg [connections] tcp='"

View File

@ -17,23 +17,7 @@ from ..interfaces import (
IAddressFamily, IAddressFamily,
) )
def create(reactor, config):
"""
Create a new _Provider service (this is an IService so must be
hooked up to a parent or otherwise started).
If foolscap.connections.tor or txtorcon are not installed, then
Provider.get_tor_handler() will return None. If tahoe.cfg wants
to start an onion service too, then this `create()` method will
throw a nice error (and startService will throw an ugly error).
"""
provider = _Provider(config, reactor)
provider.check_onion_config()
return provider
def _import_tor(): def _import_tor():
# this exists to be overridden by unit tests
try: try:
from foolscap.connections import tor from foolscap.connections import tor
return tor return tor
@ -47,6 +31,25 @@ def _import_txtorcon():
except ImportError: # pragma: no cover except ImportError: # pragma: no cover
return None return None
def create(reactor, config, import_tor=None, import_txtorcon=None):
"""
Create a new _Provider service (this is an IService so must be
hooked up to a parent or otherwise started).
If foolscap.connections.tor or txtorcon are not installed, then
Provider.get_tor_handler() will return None. If tahoe.cfg wants
to start an onion service too, then this `create()` method will
throw a nice error (and startService will throw an ugly error).
"""
if import_tor is None:
import_tor = _import_tor
if import_txtorcon is None:
import_txtorcon = _import_txtorcon
provider = _Provider(config, reactor, import_tor(), import_txtorcon())
provider.check_onion_config()
return provider
def data_directory(private_dir): def data_directory(private_dir):
return os.path.join(private_dir, "tor-statedir") return os.path.join(private_dir, "tor-statedir")
@ -217,14 +220,14 @@ def create_config(reactor, cli_config):
@implementer(IAddressFamily) @implementer(IAddressFamily)
class _Provider(service.MultiService): class _Provider(service.MultiService):
def __init__(self, config, reactor): def __init__(self, config, reactor, tor, txtorcon):
service.MultiService.__init__(self) service.MultiService.__init__(self)
self._config = config self._config = config
self._tor_launched = None self._tor_launched = None
self._onion_ehs = None self._onion_ehs = None
self._onion_tor_control_proto = None self._onion_tor_control_proto = None
self._tor = _import_tor() self._tor = tor
self._txtorcon = _import_txtorcon() self._txtorcon = txtorcon
self._reactor = reactor self._reactor = reactor
def _get_tor_config(self, *args, **kwargs): def _get_tor_config(self, *args, **kwargs):