Browse Source

pylightning: Migrate the test plugin to use the new wrapper

Should be a lot easier to see what happens :-)

Signed-off-by: Christian Decker <decker.christian@gmail.com>
plugin-7
Christian Decker 6 years ago
parent
commit
643480cfd8
  1. 115
      contrib/plugins/helloworld.py
  2. 1
      contrib/pylightning/lightning/plugin.py
  3. 8
      tests/test_plugin.py

115
contrib/plugins/helloworld.py

@ -1,111 +1,28 @@
#!/usr/bin/env python3
"""Simple plugin to show how to build new plugins for c-lightning
from lightning import Plugin
It demonstrates how a plugin communicates with c-lightning, how it
registers command line arguments that should be passed through and how
it can register JSON-RPC commands. We communicate with the main daemon
through STDIN and STDOUT, reading and writing JSON-RPC requests.
"""
import json
import sys
plugin = Plugin(autopatch=True)
greeting = "World"
@plugin.method("hello")
def hello(name, plugin):
"""This is the documentation string for the hello-function.
It gets reported as the description when registering the function
as a method with `lightningd`.
def json_hello(request, name):
greeting = "Hello {}".format(name)
return greeting
def json_fail(request):
raise ValueError("This will fail")
def json_getmanifest(request):
global greeting
return {
"options": [
{"name": "greeting",
"type": "string",
"default": greeting,
"description": "What name should I call you?"},
],
"rpcmethods": [
{
"name": "hello",
"description": "Returns a personalized greeting for {name}",
},
{
"name": "fail",
"description": "Always returns a failure for testing",
},
]
}
def plugin_log(message, level="info"):
payload = {
"jsonrpc": "2.0",
"method": "log",
"params": {
"level": level,
"message": message,
}
}
json.dump(payload, fp=sys.stdout)
sys.stdout.write('\n\n')
sys.stdout.flush()
def json_init(request, options, configuration):
"""The main daemon is telling us the relevant cli options
"""
global greeting
greeting = request['params']['options']['greeting']
plugin_log("Plugin helloworld.py initialized with greeting \"{}\"".format(greeting), "debug")
return "ok"
methods = {
'hello': json_hello,
'fail': json_fail,
'getmanifest': json_getmanifest,
'init': json_init,
}
greeting = plugin.get_option('greeting')
s = '{} {}'.format(greeting, name)
plugin.log(s)
return s
partial = ""
for l in sys.stdin:
try:
partial += l
request = json.loads(partial)
except Exception:
continue
@plugin.method("init")
def init(options, configuration, plugin):
plugin.log("Plugin helloworld.py initialized")
result = None
method = methods[request['method']]
params = request['params']
try:
if isinstance(params, dict):
result = method(request, **params)
else:
result = method(request, *params)
result = {
"jsonrpc": "2.0",
"result": result,
"id": request['id']
}
except Exception:
result = {
"jsonrpc": "2.0",
"error": "Error while processing {}".format(request['method']),
"id": request['id']
}
json.dump(result, fp=sys.stdout)
sys.stdout.write('\n')
sys.stdout.flush()
partial = ""
plugin.add_option('greeting', 'Hello', 'The greeting I should use.')
plugin.run()

1
contrib/pylightning/lightning/plugin.py

@ -180,7 +180,6 @@ class Plugin(object):
def _getmanifest(self):
methods = []
for name, func in self.methods.items():
# Skip the builtin ones, they don't get reported
if name in ['getmanifest', 'init']:

8
tests/test_plugin.py

@ -28,7 +28,7 @@ def test_option_passthrough(node_factory):
# Now try to see if it gets accepted, would fail to start if the
# option didn't exist
n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Mars'})
n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'})
n.stop()
@ -40,7 +40,7 @@ def test_rpc_passthrough(node_factory):
"""
plugin_path = 'contrib/plugins/helloworld.py'
n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Mars'})
n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'})
# Make sure that the 'hello' command that the helloworld.py plugin
# has registered is available.
@ -52,8 +52,8 @@ def test_rpc_passthrough(node_factory):
assert n.daemon.is_in_log('Plugin helloworld.py initialized')
# Now try to call it and see what it returns:
greet = n.rpc.hello(name='Sun')
assert(greet == "Hello Sun")
greet = n.rpc.hello(name='World')
assert(greet == "Ciao World")
with pytest.raises(RpcError):
n.rpc.fail()

Loading…
Cancel
Save