mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2024-12-30 01:38:55 +00:00
Add a test that triggers client-side HTTP storage client to use Tor.
This commit is contained in:
parent
83d8efbb62
commit
a1e00ffc3f
@ -19,6 +19,7 @@ from allmydata.test.common import (
|
|||||||
write_introducer,
|
write_introducer,
|
||||||
)
|
)
|
||||||
from allmydata.client import read_config
|
from allmydata.client import read_config
|
||||||
|
from allmydata.util.deferredutil import async_to_deferred
|
||||||
|
|
||||||
# see "conftest.py" for the fixtures (e.g. "tor_network")
|
# see "conftest.py" for the fixtures (e.g. "tor_network")
|
||||||
|
|
||||||
@ -31,13 +32,26 @@ if sys.platform.startswith('win'):
|
|||||||
|
|
||||||
@pytest_twisted.inlineCallbacks
|
@pytest_twisted.inlineCallbacks
|
||||||
def test_onion_service_storage(reactor, request, temp_dir, flog_gatherer, tor_network, tor_introducer_furl):
|
def test_onion_service_storage(reactor, request, temp_dir, flog_gatherer, tor_network, tor_introducer_furl):
|
||||||
|
"""
|
||||||
|
Two nodes and an introducer all configured to use Tahoe.
|
||||||
|
|
||||||
|
The two nodes can talk to the introducer and each other: we upload to one
|
||||||
|
node, read from the other.
|
||||||
|
"""
|
||||||
carol = yield _create_anonymous_node(reactor, 'carol', 8008, request, temp_dir, flog_gatherer, tor_network, tor_introducer_furl)
|
carol = yield _create_anonymous_node(reactor, 'carol', 8008, request, temp_dir, flog_gatherer, tor_network, tor_introducer_furl)
|
||||||
dave = yield _create_anonymous_node(reactor, 'dave', 8009, request, temp_dir, flog_gatherer, tor_network, tor_introducer_furl)
|
dave = yield _create_anonymous_node(reactor, 'dave', 8009, request, temp_dir, flog_gatherer, tor_network, tor_introducer_furl)
|
||||||
yield util.await_client_ready(carol, minimum_number_of_servers=2, timeout=600)
|
yield util.await_client_ready(carol, minimum_number_of_servers=2, timeout=600)
|
||||||
yield util.await_client_ready(dave, minimum_number_of_servers=2, timeout=600)
|
yield util.await_client_ready(dave, minimum_number_of_servers=2, timeout=600)
|
||||||
|
yield upload_to_one_download_from_the_other(reactor, temp_dir, carol, dave)
|
||||||
|
|
||||||
|
|
||||||
|
@async_to_deferred
|
||||||
|
async def upload_to_one_download_from_the_other(reactor, temp_dir, upload_to: util.TahoeProcess, download_from: util.TahoeProcess):
|
||||||
|
"""
|
||||||
|
Ensure both nodes are connected to "a grid" by uploading something via one
|
||||||
|
node, and retrieve it using the other.
|
||||||
|
"""
|
||||||
|
|
||||||
# ensure both nodes are connected to "a grid" by uploading
|
|
||||||
# something via carol, and retrieve it using dave.
|
|
||||||
gold_path = join(temp_dir, "gold")
|
gold_path = join(temp_dir, "gold")
|
||||||
with open(gold_path, "w") as f:
|
with open(gold_path, "w") as f:
|
||||||
f.write(
|
f.write(
|
||||||
@ -54,12 +68,12 @@ def test_onion_service_storage(reactor, request, temp_dir, flog_gatherer, tor_ne
|
|||||||
sys.executable,
|
sys.executable,
|
||||||
(
|
(
|
||||||
sys.executable, '-b', '-m', 'allmydata.scripts.runner',
|
sys.executable, '-b', '-m', 'allmydata.scripts.runner',
|
||||||
'-d', join(temp_dir, 'carol'),
|
'-d', upload_to.node_dir,
|
||||||
'put', gold_path,
|
'put', gold_path,
|
||||||
),
|
),
|
||||||
env=environ,
|
env=environ,
|
||||||
)
|
)
|
||||||
yield proto.done
|
await proto.done
|
||||||
cap = proto.output.getvalue().strip().split()[-1]
|
cap = proto.output.getvalue().strip().split()[-1]
|
||||||
print("capability: {}".format(cap))
|
print("capability: {}".format(cap))
|
||||||
|
|
||||||
@ -69,19 +83,18 @@ def test_onion_service_storage(reactor, request, temp_dir, flog_gatherer, tor_ne
|
|||||||
sys.executable,
|
sys.executable,
|
||||||
(
|
(
|
||||||
sys.executable, '-b', '-m', 'allmydata.scripts.runner',
|
sys.executable, '-b', '-m', 'allmydata.scripts.runner',
|
||||||
'-d', join(temp_dir, 'dave'),
|
'-d', download_from.node_dir,
|
||||||
'get', cap,
|
'get', cap,
|
||||||
),
|
),
|
||||||
env=environ,
|
env=environ,
|
||||||
)
|
)
|
||||||
yield proto.done
|
await proto.done
|
||||||
|
download_got = proto.output.getvalue().strip()
|
||||||
dave_got = proto.output.getvalue().strip()
|
assert download_got == open(gold_path, 'rb').read().strip()
|
||||||
assert dave_got == open(gold_path, 'rb').read().strip()
|
|
||||||
|
|
||||||
|
|
||||||
@pytest_twisted.inlineCallbacks
|
@pytest_twisted.inlineCallbacks
|
||||||
def _create_anonymous_node(reactor, name, control_port, request, temp_dir, flog_gatherer, tor_network, introducer_furl):
|
def _create_anonymous_node(reactor, name, control_port, request, temp_dir, flog_gatherer, tor_network, introducer_furl) -> util.TahoeProcess:
|
||||||
node_dir = FilePath(temp_dir).child(name)
|
node_dir = FilePath(temp_dir).child(name)
|
||||||
web_port = "tcp:{}:interface=localhost".format(control_port + 2000)
|
web_port = "tcp:{}:interface=localhost".format(control_port + 2000)
|
||||||
|
|
||||||
@ -113,9 +126,9 @@ def _create_anonymous_node(reactor, name, control_port, request, temp_dir, flog_
|
|||||||
|
|
||||||
# Which services should this client connect to?
|
# Which services should this client connect to?
|
||||||
write_introducer(node_dir, "default", introducer_furl)
|
write_introducer(node_dir, "default", introducer_furl)
|
||||||
|
util.basic_node_configuration(request, flog_gatherer, node_dir.path)
|
||||||
|
|
||||||
config = read_config(node_dir.path, "tub.port")
|
config = read_config(node_dir.path, "tub.port")
|
||||||
config.set_config("node", "log_gatherer.furl", flog_gatherer)
|
|
||||||
config.set_config("tor", "onion", "true")
|
config.set_config("tor", "onion", "true")
|
||||||
config.set_config("tor", "onion.external_port", "3457")
|
config.set_config("tor", "onion.external_port", "3457")
|
||||||
config.set_config("tor", "control.port", f"tcp:port={control_port}:host=127.0.0.1")
|
config.set_config("tor", "control.port", f"tcp:port={control_port}:host=127.0.0.1")
|
||||||
@ -125,3 +138,19 @@ def _create_anonymous_node(reactor, name, control_port, request, temp_dir, flog_
|
|||||||
result = yield util._run_node(reactor, node_dir.path, request, None)
|
result = yield util._run_node(reactor, node_dir.path, request, None)
|
||||||
print("okay, launched")
|
print("okay, launched")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
@pytest_twisted.inlineCallbacks
|
||||||
|
def test_anonymous_client(reactor, alice, request, temp_dir, flog_gatherer, tor_network, introducer_furl):
|
||||||
|
"""
|
||||||
|
A normal node (alice) and a normal introducer are configured, and one node
|
||||||
|
(carol) which is configured to be anonymous by talking via Tor.
|
||||||
|
|
||||||
|
Carol should be able to communicate with alice.
|
||||||
|
|
||||||
|
TODO how to ensure that carol is actually using Tor?
|
||||||
|
"""
|
||||||
|
carol = yield _create_anonymous_node(reactor, 'carol', 8008, request, temp_dir, flog_gatherer, tor_network, introducer_furl)
|
||||||
|
yield util.await_client_ready(carol, minimum_number_of_servers=2, timeout=600)
|
||||||
|
|
||||||
|
yield upload_to_one_download_from_the_other(reactor, temp_dir, alice, carol)
|
||||||
|
@ -311,6 +311,36 @@ def _run_node(reactor, node_dir, request, magic_text, finalize=True):
|
|||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
def basic_node_configuration(request, flog_gatherer, node_dir: str):
|
||||||
|
"""
|
||||||
|
Setup common configuration options for a node, given a ``pytest`` request
|
||||||
|
fixture.
|
||||||
|
"""
|
||||||
|
config_path = join(node_dir, 'tahoe.cfg')
|
||||||
|
config = get_config(config_path)
|
||||||
|
set_config(
|
||||||
|
config,
|
||||||
|
u'node',
|
||||||
|
u'log_gatherer.furl',
|
||||||
|
flog_gatherer,
|
||||||
|
)
|
||||||
|
force_foolscap = request.config.getoption("force_foolscap")
|
||||||
|
assert force_foolscap in (True, False)
|
||||||
|
set_config(
|
||||||
|
config,
|
||||||
|
'storage',
|
||||||
|
'force_foolscap',
|
||||||
|
str(force_foolscap),
|
||||||
|
)
|
||||||
|
set_config(
|
||||||
|
config,
|
||||||
|
'client',
|
||||||
|
'force_foolscap',
|
||||||
|
str(force_foolscap),
|
||||||
|
)
|
||||||
|
write_config(FilePath(config_path), config)
|
||||||
|
|
||||||
|
|
||||||
def _create_node(reactor, request, temp_dir, introducer_furl, flog_gatherer, name, web_port,
|
def _create_node(reactor, request, temp_dir, introducer_furl, flog_gatherer, name, web_port,
|
||||||
storage=True,
|
storage=True,
|
||||||
magic_text=None,
|
magic_text=None,
|
||||||
@ -351,29 +381,7 @@ def _create_node(reactor, request, temp_dir, introducer_furl, flog_gatherer, nam
|
|||||||
created_d = done_proto.done
|
created_d = done_proto.done
|
||||||
|
|
||||||
def created(_):
|
def created(_):
|
||||||
config_path = join(node_dir, 'tahoe.cfg')
|
basic_node_configuration(request, flog_gatherer, node_dir)
|
||||||
config = get_config(config_path)
|
|
||||||
set_config(
|
|
||||||
config,
|
|
||||||
u'node',
|
|
||||||
u'log_gatherer.furl',
|
|
||||||
flog_gatherer,
|
|
||||||
)
|
|
||||||
force_foolscap = request.config.getoption("force_foolscap")
|
|
||||||
assert force_foolscap in (True, False)
|
|
||||||
set_config(
|
|
||||||
config,
|
|
||||||
'storage',
|
|
||||||
'force_foolscap',
|
|
||||||
str(force_foolscap),
|
|
||||||
)
|
|
||||||
set_config(
|
|
||||||
config,
|
|
||||||
'client',
|
|
||||||
'force_foolscap',
|
|
||||||
str(force_foolscap),
|
|
||||||
)
|
|
||||||
write_config(FilePath(config_path), config)
|
|
||||||
created_d.addCallback(created)
|
created_d.addCallback(created)
|
||||||
|
|
||||||
d = Deferred()
|
d = Deferred()
|
||||||
|
Loading…
Reference in New Issue
Block a user