From 4a06c25178f3261bce956ee5f6b1d69c25e81438 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Thu, 27 Oct 2022 13:19:07 -0300 Subject: [PATCH] chore: add some docs and specs; treat some possible errors --- .../src/emqx_rule_engine_jwt_sup.erl | 24 ++++++++++++++++--- .../emqx_rule_engine_jwt_worker_SUITE.erl | 4 ++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_jwt_sup.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_jwt_sup.erl index bdf38378c..72ead42ab 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_jwt_sup.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_jwt_sup.erl @@ -25,6 +25,8 @@ -export([init/1]). +-type worker_id() :: term(). + start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). @@ -37,14 +39,30 @@ init([]) -> ChildSpecs = [], {ok, {SupFlags, ChildSpecs}}. +%% @doc Starts a new JWT worker. The worker will send the caller a +%% message when it creates and stores its first JWT, or if it fails to +%% do so, using a generated reference. +-spec start_worker(worker_id(), map()) -> + {ok, {reference(), supervisor:child()}} + | {error, already_present} + | {error, {already_started, supervisor:child()}}. start_worker(Id, Config) -> Ref = erlang:alias([reply]), ChildSpec = jwt_worker_child_spec(Id, Config, Ref), - {ok, Pid} = supervisor:start_child(?MODULE, ChildSpec), - {Ref, Pid}. + case supervisor:start_child(?MODULE, ChildSpec) of + {ok, Pid} -> + {ok, {Ref, Pid}}; + Error -> + Error + end. +%% @doc Stops a given JWT worker by its id. +-spec stop_worker(worker_id()) -> ok. stop_worker(Id) -> - supervisor:terminate_child(?MODULE, Id). + case supervisor:terminate_child(?MODULE, Id) of + ok -> ok; + {error, not_found} -> ok + end. jwt_worker_child_spec(Id, Config, Ref) -> #{ id => Id diff --git a/apps/emqx_rule_engine/test/emqx_rule_engine_jwt_worker_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_engine_jwt_worker_SUITE.erl index 8cc350b52..85d2409ef 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_engine_jwt_worker_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_engine_jwt_worker_SUITE.erl @@ -225,12 +225,12 @@ t_lookup_badarg(_Config) -> t_start_supervised_worker(_Config) -> {ok, _} = emqx_rule_engine_jwt_sup:start_link(), Config = #{resource_id := ResourceId} = generate_config(), - {Ref, Pid} = emqx_rule_engine_jwt_sup:start_worker(ResourceId, Config), + {ok, {Ref, Pid}} = emqx_rule_engine_jwt_sup:start_worker(ResourceId, Config), receive {Ref, token_created} -> ok after - 1_000 -> + 5_000 -> ct:fail("timeout") end, MRef = monitor(process, Pid),