Instead of abusing the process transport, introduce a new object
This commit is contained in:
parent
731c58754f
commit
e7c387a7fc
|
@ -30,7 +30,7 @@ from util import (
|
||||||
_ProcessExitedProtocol,
|
_ProcessExitedProtocol,
|
||||||
_create_node,
|
_create_node,
|
||||||
_run_node,
|
_run_node,
|
||||||
_cleanup_twistd_process,
|
_cleanup_tahoe_process,
|
||||||
_tahoe_runner_optional_coverage,
|
_tahoe_runner_optional_coverage,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ def flog_gatherer(reactor, temp_dir, flog_binary, request):
|
||||||
pytest_twisted.blockon(twistd_protocol.magic_seen)
|
pytest_twisted.blockon(twistd_protocol.magic_seen)
|
||||||
|
|
||||||
def cleanup():
|
def cleanup():
|
||||||
_cleanup_twistd_process(twistd_process, twistd_protocol.exited)
|
_cleanup_tahoe_process(twistd_process, twistd_protocol.exited)
|
||||||
|
|
||||||
flog_file = mktemp('.flog_dump')
|
flog_file = mktemp('.flog_dump')
|
||||||
flog_protocol = _DumpOutputProtocol(open(flog_file, 'w'))
|
flog_protocol = _DumpOutputProtocol(open(flog_file, 'w'))
|
||||||
|
@ -209,7 +209,7 @@ log_gatherer.furl = {log_furl}
|
||||||
intro_dir,
|
intro_dir,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
request.addfinalizer(partial(_cleanup_twistd_process, process, protocol.exited))
|
request.addfinalizer(partial(_cleanup_tahoe_process, process, protocol.exited))
|
||||||
|
|
||||||
pytest_twisted.blockon(protocol.magic_seen)
|
pytest_twisted.blockon(protocol.magic_seen)
|
||||||
return process
|
return process
|
||||||
|
@ -279,8 +279,8 @@ log_gatherer.furl = {log_furl}
|
||||||
|
|
||||||
def cleanup():
|
def cleanup():
|
||||||
try:
|
try:
|
||||||
process.signalProcess('TERM')
|
process.transport.signalProcess('TERM')
|
||||||
pytest_twisted.blockon(protocol.exited)
|
pytest_twisted.blockon(process.transport.exited)
|
||||||
except ProcessExitedAlready:
|
except ProcessExitedAlready:
|
||||||
pass
|
pass
|
||||||
request.addfinalizer(cleanup)
|
request.addfinalizer(cleanup)
|
||||||
|
@ -402,8 +402,8 @@ def alice_invite(reactor, alice, temp_dir, request):
|
||||||
# before magic-folder works, we have to stop and restart (this is
|
# before magic-folder works, we have to stop and restart (this is
|
||||||
# crappy for the tests -- can we fix it in magic-folder?)
|
# crappy for the tests -- can we fix it in magic-folder?)
|
||||||
try:
|
try:
|
||||||
alice.signalProcess('TERM')
|
alice.transport.signalProcess('TERM')
|
||||||
pytest_twisted.blockon(alice.exited)
|
pytest_twisted.blockon(alice.transport.exited)
|
||||||
except ProcessExitedAlready:
|
except ProcessExitedAlready:
|
||||||
pass
|
pass
|
||||||
with start_action(action_type=u"integration:alice:magic_folder:magic-text"):
|
with start_action(action_type=u"integration:alice:magic_folder:magic-text"):
|
||||||
|
@ -439,8 +439,8 @@ def magic_folder(reactor, alice_invite, alice, bob, temp_dir, request):
|
||||||
# crappy for the tests -- can we fix it in magic-folder?)
|
# crappy for the tests -- can we fix it in magic-folder?)
|
||||||
try:
|
try:
|
||||||
print("Sending TERM to Bob")
|
print("Sending TERM to Bob")
|
||||||
bob.signalProcess('TERM')
|
bob.transport.signalProcess('TERM')
|
||||||
pytest_twisted.blockon(bob.exited)
|
pytest_twisted.blockon(bob.transport.exited)
|
||||||
except ProcessExitedAlready:
|
except ProcessExitedAlready:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -336,10 +336,10 @@ def test_edmond_uploads_then_restarts(reactor, request, temp_dir, introducer_fur
|
||||||
assert created, "Didn't create a magic-folder"
|
assert created, "Didn't create a magic-folder"
|
||||||
|
|
||||||
# to actually-start the magic-folder we have to re-start
|
# to actually-start the magic-folder we have to re-start
|
||||||
edmond.signalProcess('TERM')
|
edmond.transport.signalProcess('TERM')
|
||||||
yield edmond._protocol.exited
|
yield edmond.transport.exited
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
edmond = yield util._run_node(reactor, edmond._node_dir, request, 'Completed initial Magic Folder scan successfully')
|
edmond = yield util._run_node(reactor, edmond.node_dir, request, 'Completed initial Magic Folder scan successfully')
|
||||||
|
|
||||||
# add a thing to the magic-folder
|
# add a thing to the magic-folder
|
||||||
with open(join(magic_folder, "its_a_file"), "w") as f:
|
with open(join(magic_folder, "its_a_file"), "w") as f:
|
||||||
|
@ -383,10 +383,10 @@ def test_edmond_uploads_then_restarts(reactor, request, temp_dir, introducer_fur
|
||||||
# re-starting edmond right now would "normally" trigger the 2880 bug
|
# re-starting edmond right now would "normally" trigger the 2880 bug
|
||||||
|
|
||||||
# kill edmond
|
# kill edmond
|
||||||
edmond.signalProcess('TERM')
|
edmond.transport.signalProcess('TERM')
|
||||||
yield edmond._protocol.exited
|
yield edmond.transport.exited
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
edmond = yield util._run_node(reactor, edmond._node_dir, request, 'Completed initial Magic Folder scan successfully')
|
edmond = yield util._run_node(reactor, edmond.node_dir, request, 'Completed initial Magic Folder scan successfully')
|
||||||
|
|
||||||
# XXX how can we say for sure if we've waited long enough? look at
|
# XXX how can we say for sure if we've waited long enough? look at
|
||||||
# tail of logs for magic-folder ... somethingsomething?
|
# tail of logs for magic-folder ... somethingsomething?
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
import shutil
|
|
||||||
from os import mkdir, unlink, utime
|
|
||||||
from os.path import join, exists, getmtime
|
|
||||||
|
|
||||||
import util
|
|
||||||
|
|
||||||
import pytest_twisted
|
|
||||||
|
|
||||||
|
|
||||||
def test_index(alice):
|
|
||||||
"""
|
|
||||||
we can download the index file
|
|
||||||
"""
|
|
||||||
util.web_get(alice._node_dir, "")
|
|
||||||
|
|
||||||
|
|
||||||
def test_upload_download(alice):
|
|
||||||
"""
|
|
||||||
upload a file, then download it via readcap
|
|
||||||
"""
|
|
||||||
|
|
||||||
# XXX FIXME why?
|
|
||||||
print("waiting for ready..")
|
|
||||||
time.sleep(10)
|
|
||||||
|
|
||||||
FILE_CONTENTS = "some contents"
|
|
||||||
|
|
||||||
readcap = util.web_post(
|
|
||||||
alice._node_dir,
|
|
||||||
"uri",
|
|
||||||
data={
|
|
||||||
"t": "upload",
|
|
||||||
"format": "mdmf",
|
|
||||||
},
|
|
||||||
files={
|
|
||||||
"file": FILE_CONTENTS,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
readcap = readcap.strip()
|
|
||||||
print("readcap '{}'".format(readcap))
|
|
||||||
|
|
||||||
data = util.web_get(
|
|
||||||
alice._node_dir, "uri",
|
|
||||||
params={
|
|
||||||
"uri": readcap,
|
|
||||||
"filename": "boom",
|
|
||||||
}
|
|
||||||
)
|
|
||||||
assert data == FILE_CONTENTS
|
|
||||||
|
|
||||||
|
|
||||||
def test_put(alice):
|
|
||||||
"""
|
|
||||||
use PUT to create a file
|
|
||||||
"""
|
|
||||||
|
|
||||||
import time; time.sleep(10) # XXX wat
|
|
||||||
FILE_CONTENTS = "added via PUT"
|
|
||||||
|
|
||||||
import requests
|
|
||||||
resp = requests.put(
|
|
||||||
util.node_url(alice._node_dir, "uri"),
|
|
||||||
files={
|
|
||||||
"file": FILE_CONTENTS,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
print(resp)
|
|
||||||
print(resp.status_code)
|
|
||||||
print(resp.text)
|
|
||||||
print("\n\n\n\n\n\n\n")
|
|
||||||
assert resp.text.strip().startswith("URI:CHK:")
|
|
||||||
assert resp.text.strip().endswith(":2:4:153")
|
|
|
@ -108,19 +108,19 @@ class _MagicTextProtocol(ProcessProtocol):
|
||||||
sys.stdout.write(data)
|
sys.stdout.write(data)
|
||||||
|
|
||||||
|
|
||||||
def _cleanup_twistd_process(twistd_process, exited):
|
def _cleanup_tahoe_process(tahoe_transport, exited):
|
||||||
"""
|
"""
|
||||||
Terminate the given process with a kill signal (SIGKILL on POSIX,
|
Terminate the given process with a kill signal (SIGKILL on POSIX,
|
||||||
TerminateProcess on Windows).
|
TerminateProcess on Windows).
|
||||||
|
|
||||||
:param twistd_process: The `IProcessTransport` representing the process.
|
:param tahoe_transport: The `IProcessTransport` representing the process.
|
||||||
:param exited: A `Deferred` which fires when the process has exited.
|
:param exited: A `Deferred` which fires when the process has exited.
|
||||||
|
|
||||||
:return: After the process has exited.
|
:return: After the process has exited.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
print("signaling {} with TERM".format(twistd_process.pid))
|
print("signaling {} with TERM".format(tahoe_transport.pid))
|
||||||
twistd_process.signalProcess('TERM')
|
tahoe_transport.signalProcess('TERM')
|
||||||
print("signaled, blocking on exit")
|
print("signaled, blocking on exit")
|
||||||
pytest_twisted.blockon(exited)
|
pytest_twisted.blockon(exited)
|
||||||
print("exited, goodbye")
|
print("exited, goodbye")
|
||||||
|
@ -146,7 +146,30 @@ def _tahoe_runner_optional_coverage(proto, reactor, request, other_args):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TahoeProcess(object):
|
||||||
|
"""
|
||||||
|
A running Tahoe process, with associated information.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, process_transport, node_dir):
|
||||||
|
self._process_transport = process_transport # IProcessTransport instance
|
||||||
|
self._node_dir = node_dir # path
|
||||||
|
|
||||||
|
@property
|
||||||
|
def transport(self):
|
||||||
|
return self._process_transport
|
||||||
|
|
||||||
|
@property
|
||||||
|
def node_dir(self):
|
||||||
|
return self._node_dir
|
||||||
|
|
||||||
|
|
||||||
def _run_node(reactor, node_dir, request, magic_text):
|
def _run_node(reactor, node_dir, request, magic_text):
|
||||||
|
"""
|
||||||
|
Run a tahoe process from its node_dir.
|
||||||
|
|
||||||
|
:returns: a TahoeProcess for this node
|
||||||
|
"""
|
||||||
if magic_text is None:
|
if magic_text is None:
|
||||||
magic_text = "client running"
|
magic_text = "client running"
|
||||||
protocol = _MagicTextProtocol(magic_text)
|
protocol = _MagicTextProtocol(magic_text)
|
||||||
|
@ -155,7 +178,7 @@ def _run_node(reactor, node_dir, request, magic_text):
|
||||||
# but on linux it means daemonize. "tahoe run" is consistent
|
# but on linux it means daemonize. "tahoe run" is consistent
|
||||||
# between platforms.
|
# between platforms.
|
||||||
|
|
||||||
process = _tahoe_runner_optional_coverage(
|
transport = _tahoe_runner_optional_coverage(
|
||||||
protocol,
|
protocol,
|
||||||
reactor,
|
reactor,
|
||||||
request,
|
request,
|
||||||
|
@ -165,17 +188,18 @@ def _run_node(reactor, node_dir, request, magic_text):
|
||||||
node_dir,
|
node_dir,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
process.exited = protocol.exited
|
transport.exited = protocol.exited
|
||||||
|
|
||||||
request.addfinalizer(partial(_cleanup_twistd_process, process, protocol.exited))
|
request.addfinalizer(partial(_cleanup_tahoe_process, transport, protocol.exited))
|
||||||
|
|
||||||
# we return the 'process' ITransport instance
|
# XXX abusing the Deferred; should use .when_magic_seen() pattern
|
||||||
# XXX abusing the Deferred; should use .when_magic_seen() or something?
|
|
||||||
|
|
||||||
def got_proto(proto):
|
def got_proto(proto):
|
||||||
process._protocol = proto
|
transport._protocol = proto
|
||||||
process._node_dir = node_dir
|
return TahoeProcess(
|
||||||
return process
|
transport,
|
||||||
|
node_dir,
|
||||||
|
)
|
||||||
protocol.magic_seen.addCallback(got_proto)
|
protocol.magic_seen.addCallback(got_proto)
|
||||||
return protocol.magic_seen
|
return protocol.magic_seen
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue