tahoe-lafs/integration/test_tor.py

128 lines
4.3 KiB
Python
Raw Normal View History

2021-05-11 17:34:35 +00:00
"""
Ported to Python 3.
"""
import sys
2020-10-27 13:49:58 +00:00
from os.path import join
from os import environ
2020-06-23 00:16:19 +00:00
import pytest
2019-02-05 16:03:35 +00:00
import pytest_twisted
2021-05-11 15:56:21 +00:00
from . import util
from twisted.python.filepath import (
FilePath,
)
2022-05-13 17:29:08 +00:00
from allmydata.test.common import (
write_introducer,
)
from allmydata.client import read_config
# see "conftest.py" for the fixtures (e.g. "tor_network")
# XXX: Integration tests that involve Tor do not run reliably on
# Windows. They are skipped for now, in order to reduce CI noise.
#
# https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3347
2020-06-23 00:16:19 +00:00
if sys.platform.startswith('win'):
pytest.skip('Skipping Tor tests on Windows', allow_module_level=True)
2019-02-05 16:03:35 +00:00
@pytest_twisted.inlineCallbacks
def test_onion_service_storage(reactor, request, temp_dir, flog_gatherer, tor_network, tor_introducer_furl):
2022-05-13 17:29:08 +00:00
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)
2023-04-13 06:37:32 +00:00
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)
2022-05-13 17:29:08 +00:00
# ensure both nodes are connected to "a grid" by uploading
# something via carol, and retrieve it using dave.
gold_path = join(temp_dir, "gold")
with open(gold_path, "w") as f:
f.write(
"The object-capability model is a computer security model. A "
"capability describes a transferable right to perform one (or "
"more) operations on a given object."
)
# XXX could use treq or similar to POST these to their respective
# WUIs instead ...
proto = util._CollectOutputProtocol()
reactor.spawnProcess(
proto,
sys.executable,
(
sys.executable, '-b', '-m', 'allmydata.scripts.runner',
'-d', join(temp_dir, 'carol'),
'put', gold_path,
),
env=environ,
)
yield proto.done
cap = proto.output.getvalue().strip().split()[-1]
print("capability: {}".format(cap))
2021-05-11 15:56:21 +00:00
proto = util._CollectOutputProtocol(capture_stderr=False)
reactor.spawnProcess(
proto,
sys.executable,
(
sys.executable, '-b', '-m', 'allmydata.scripts.runner',
'-d', join(temp_dir, 'dave'),
'get', cap,
),
env=environ,
)
yield proto.done
dave_got = proto.output.getvalue().strip()
2021-05-11 15:56:21 +00:00
assert dave_got == open(gold_path, 'rb').read().strip()
2019-02-05 16:03:35 +00:00
@pytest_twisted.inlineCallbacks
def _create_anonymous_node(reactor, name, control_port, request, temp_dir, flog_gatherer, tor_network, introducer_furl):
node_dir = FilePath(temp_dir).child(name)
web_port = "tcp:{}:interface=localhost".format(control_port + 2000)
if True:
print(f"creating {node_dir.path} with introducer {introducer_furl}")
node_dir.makedirs()
proto = util._DumpOutputProtocol(None)
reactor.spawnProcess(
proto,
sys.executable,
(
sys.executable, '-b', '-m', 'allmydata.scripts.runner',
'create-node',
'--nickname', name,
'--webport', web_port,
'--introducer', introducer_furl,
'--hide-ip',
'--tor-control-port', 'tcp:localhost:{}'.format(control_port),
'--listen', 'tor',
'--shares-needed', '1',
'--shares-happy', '1',
'--shares-total', '2',
node_dir.path,
),
env=environ,
)
yield proto.done
# Which services should this client connect to?
write_introducer(node_dir, "default", introducer_furl)
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.external_port", "3457")
2023-04-04 14:58:22 +00:00
config.set_config("tor", "control.port", f"tcp:port={control_port}:host=127.0.0.1")
config.set_config("tor", "onion.private_key_file", "private/tor_onion.privkey")
print("running")
2022-05-13 17:29:08 +00:00
result = yield util._run_node(reactor, node_dir.path, request, None)
print("okay, launched")
2022-05-13 17:29:08 +00:00
return result