Finishes basic test

This commit is contained in:
Sergi Delgado Segura
2020-05-04 19:40:54 +02:00
parent d3cbfc7ac4
commit 01a18b3fd7

View File

@@ -16,6 +16,7 @@ tower_port = "1234"
tower_sk = PrivateKey() tower_sk = PrivateKey()
tower_id = Cryptographer.get_compressed_pk(tower_sk.public_key) tower_id = Cryptographer.get_compressed_pk(tower_sk.public_key)
nodes = None, None
mocked_return = None mocked_return = None
@@ -61,6 +62,15 @@ def add_appointment_service_unavailable():
return response, rcode return response, rcode
@pytest.fixture(scope="session", autouse=True)
def towers_dict():
os.environ["TOWERS_DATA_DIR"] = "/tmp/watchtower"
yield
shutil.rmtree(os.environ["TOWERS_DATA_DIR"])
@pytest.fixture(scope="session", autouse=True) @pytest.fixture(scope="session", autouse=True)
def prng_seed(): def prng_seed():
random.seed(0) random.seed(0)
@@ -72,7 +82,7 @@ def get_random_value_hex(nbytes):
return prv_hex.zfill(2 * nbytes) return prv_hex.zfill(2 * nbytes)
@pytest.fixture(scope="session") @pytest.fixture(scope="session", autouse=True)
def tower_mock(): def tower_mock():
app = Flask(__name__) app = Flask(__name__)
@@ -96,7 +106,6 @@ def tower_mock():
@app.route("/add_appointment", methods=["POST"]) @app.route("/add_appointment", methods=["POST"])
def add_appointment(): def add_appointment():
if mocked_return == "success": if mocked_return == "success":
appointment = Appointment.from_dict(request.get_json().get("appointment")) appointment = Appointment.from_dict(request.get_json().get("appointment"))
user_id = Cryptographer.get_compressed_pk( user_id = Cryptographer.get_compressed_pk(
@@ -120,7 +129,14 @@ def tower_mock():
logging.getLogger("werkzeug").setLevel(logging.ERROR) logging.getLogger("werkzeug").setLevel(logging.ERROR)
os.environ["WERKZEUG_RUN_MAIN"] = "true" os.environ["WERKZEUG_RUN_MAIN"] = "true"
yield app Thread(target=app.run, kwargs={"host": tower_netaddr, "port": tower_port}, daemon=True).start()
# nodes_factory is set as a function fixture, so need to work around it to reuse it
@pytest.fixture(autouse=True)
def init_nodes(node_factory):
global nodes
nodes = node_factory.line_graph(2, opts=[{"may_fail": True, "allow_broken_log": True}, {"plugin": plugin_path}])
def test_helpme_starts(node_factory): def test_helpme_starts(node_factory):
@@ -135,13 +151,9 @@ def test_helpme_starts(node_factory):
l1.start() l1.start()
def test_watchtower(node_factory, tower_mock): def test_watchtower():
global mocked_return global mocked_return
l1, l2 = nodes
l1, l2 = node_factory.line_graph(2, opts=[{"may_fail": True, "allow_broken_log": True}, {"plugin": plugin_path}])
# Start the tower mock in a different process
Thread(target=tower_mock.run, kwargs={"host": tower_netaddr, "port": tower_port}, daemon=True).start()
# Register a new tower # Register a new tower
l2.rpc.registertower("{}@{}:{}".format(tower_id, tower_netaddr, tower_port)) l2.rpc.registertower("{}@{}:{}".format(tower_id, tower_netaddr, tower_port))
@@ -155,18 +167,17 @@ def test_watchtower(node_factory, tower_mock):
# Force a new commitment # Force a new commitment
mocked_return = "success" mocked_return = "success"
l1.rpc.pay(l2.rpc.invoice(25000000, "lbl1", "desc1")["bolt11"]) l1.rpc.pay(l2.rpc.invoice(25000000, "lbl1", "desc")["bolt11"])
# Check that the tower got it (list is not empty anymore) # Check that the tower got it (list is not empty anymore)
# FIXME: it would be great to check the ids, need to run as dev tho and its currently failing to compile # FIXME: it would be great to check the ids, need to run as dev tho and its currently failing to compile
appointments = l2.rpc.gettowerinfo(tower_id).get("appointments") appointments = l2.rpc.gettowerinfo(tower_id).get("appointments")
assert appointments assert appointments
# Disconnect the tower and see how appointments get backed up
assert not l2.rpc.gettowerinfo(tower_id).get("pending_appointments") assert not l2.rpc.gettowerinfo(tower_id).get("pending_appointments")
# Disconnect the tower and see how appointments get backed up
mocked_return = "service_unavailable" mocked_return = "service_unavailable"
l1.rpc.pay(l2.rpc.invoice(25000000, "lbl2", "desc1")["bolt11"]) l1.rpc.pay(l2.rpc.invoice(25000000, "lbl2", "desc")["bolt11"])
pending_appointments = [ pending_appointments = [
data.get("appointment").get("locator") for data in l2.rpc.gettowerinfo(tower_id).get("pending_appointments") data.get("appointment").get("locator") for data in l2.rpc.gettowerinfo(tower_id).get("pending_appointments")
] ]
@@ -174,11 +185,10 @@ def test_watchtower(node_factory, tower_mock):
# The fail has triggered the retry strategy. By "turning it back on" we should get the pending appointments trough # The fail has triggered the retry strategy. By "turning it back on" we should get the pending appointments trough
mocked_return = "success" mocked_return = "success"
sleep(1)
assert not l2.rpc.gettowerinfo(tower_id).get("pending_appointments") # Give it some time to switch
while l2.rpc.gettowerinfo(tower_id).get("pending_appointments"):
sleep(0.5)
# The previously pending appointment are now part of the sent appointments
assert set(pending_appointments).issubset(l2.rpc.gettowerinfo(tower_id).get("appointments").keys()) assert set(pending_appointments).issubset(l2.rpc.gettowerinfo(tower_id).get("appointments").keys())
# TODO: reduce max retries and force retry with retrytower
# TODO: Check rejections