mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-24 01:24:26 +01:00
libplugin: make init return a string.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Changelog-Added: libplugin: init can return a non-NULL string to disable the plugin.
This commit is contained in:
committed by
Christian Decker
parent
529ae0d766
commit
27c006f7aa
@@ -5,7 +5,7 @@
|
||||
|
||||
|
||||
const char *name_option;
|
||||
|
||||
static bool self_disable = false;
|
||||
|
||||
static struct command_result *json_helloworld(struct command *cmd,
|
||||
const char *buf,
|
||||
@@ -86,10 +86,15 @@ static struct command_result *json_testrpc(struct command *cmd,
|
||||
return send_outreq(cmd->plugin, req);
|
||||
}
|
||||
|
||||
static void init(struct plugin *p,
|
||||
const char *buf UNUSED, const jsmntok_t *config UNUSED)
|
||||
static const char *init(struct plugin *p,
|
||||
const char *buf UNUSED,
|
||||
const jsmntok_t *config UNUSED)
|
||||
{
|
||||
plugin_log(p, LOG_DBG, "test_libplugin initialised!");
|
||||
|
||||
if (self_disable)
|
||||
return "Disabled via selfdisable option";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const struct plugin_command commands[] = { {
|
||||
@@ -149,5 +154,9 @@ int main(int argc, char *argv[])
|
||||
"string",
|
||||
"Who to say hello to.",
|
||||
charp_option, &name_option),
|
||||
plugin_option("selfdisable",
|
||||
"flag",
|
||||
"Whether to disable.",
|
||||
flag_option, &self_disable),
|
||||
NULL);
|
||||
}
|
||||
|
||||
@@ -2326,19 +2326,26 @@ def test_pyln_request_notify(node_factory):
|
||||
def test_self_disable(node_factory):
|
||||
"""Test that plugin can disable itself without penalty.
|
||||
"""
|
||||
plugin_path = os.path.join(
|
||||
os.path.dirname(__file__), 'plugins/test_selfdisable'
|
||||
# This disables in response to getmanifest.
|
||||
p1 = os.path.join(
|
||||
os.path.dirname(__file__), 'plugins/test_selfdisable_after_getmanifest'
|
||||
)
|
||||
l1 = node_factory.get_node(options={'important-plugin': plugin_path})
|
||||
# This disables in response to init.
|
||||
p2 = os.path.join(os.getcwd(), "tests/plugins/test_libplugin")
|
||||
l1 = node_factory.get_node(options={'important-plugin': [p1, p2], 'selfdisable': None})
|
||||
|
||||
# Could happen before it gets set up.
|
||||
l1.daemon.logsearch_start = 0
|
||||
l1.daemon.wait_for_log('test_selfdisable: disabled itself: "Self-disable test after getmanifest"')
|
||||
l1.daemon.wait_for_logs(['test_selfdisable_after_getmanifest: disabled itself: "Self-disable test after getmanifest"',
|
||||
'test_libplugin: disabled itself at init: Disabled via selfdisable option'])
|
||||
|
||||
assert plugin_path not in [p['name'] for p in l1.rpc.plugin_list()['plugins']]
|
||||
assert p1 not in [p['name'] for p in l1.rpc.plugin_list()['plugins']]
|
||||
assert p2 not in [p['name'] for p in l1.rpc.plugin_list()['plugins']]
|
||||
|
||||
# Also works with dynamic load attempts
|
||||
with pytest.raises(RpcError, match="Self-disable test after getmanifest"):
|
||||
l1.rpc.plugin_start(plugin_path)
|
||||
l1.rpc.plugin_start(p1)
|
||||
|
||||
# Now test the disable-in-init-response.
|
||||
# Also works with dynamic load attempts
|
||||
with pytest.raises(RpcError, match="Disabled via selfdisable option"):
|
||||
l1.rpc.plugin_start(p2, selfdisable=True)
|
||||
|
||||
Reference in New Issue
Block a user