pylightning: Add a small test for async rpcmethods

Signed-off-by: Christian Decker <decker.christian@gmail.com>
This commit is contained in:
Christian Decker 2019-01-22 23:23:34 +01:00 committed by Rusty Russell
parent cc4fbfca43
commit 571fb44d20
2 changed files with 55 additions and 0 deletions

30
tests/plugins/asynctest.py Executable file
View File

@ -0,0 +1,30 @@
#!/usr/bin/env python3
"""This plugin is used to check that async method calls are working correctly.
The plugin registers a method `callme` with an argument. All calls are
stashed away, and are only resolved on the fifth invocation. All calls
will then return the argument of the fifth call.
"""
from lightning import Plugin
plugin = Plugin()
@plugin.init()
def init(configuration, options, plugin):
plugin.requests = []
@plugin.method('asyncqueue', sync=False)
def async_queue(request, plugin):
plugin.requests.append(request)
@plugin.method('asyncflush')
def async_flush(res, plugin):
for r in plugin.requests:
r.set_result(res)
plugin.run()

View File

@ -5,6 +5,7 @@ from utils import only_one
import pytest
import subprocess
import time
def test_option_passthrough(node_factory):
@ -146,3 +147,27 @@ def test_plugin_connected_hook(node_factory):
peer = l1.rpc.listpeers(l3.info['id'])['peers']
assert(peer == [] or not peer[0]['connected'])
def test_async_rpcmethod(node_factory, executor):
"""This tests the async rpcmethods.
It works in conjunction with the `asynctest` plugin which stashes
requests and then resolves all of them on the fifth call.
"""
l1 = node_factory.get_node(options={'plugin': 'tests/plugins/asynctest.py'})
results = []
for i in range(10):
results.append(executor.submit(l1.rpc.asyncqueue))
time.sleep(3)
# None of these should have returned yet
assert len([r for r in results if r.done()]) == 0
# This last one triggers the release and all results should be 42,
# since the last number is returned for all
l1.rpc.asyncflush(42)
assert [r.result() for r in results] == [42] * len(results)