summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Avdey <eiri@eiri.ca>2019-08-15 10:07:07 -0300
committerEric Avdey <eiri@eiri.ca>2019-08-15 10:08:27 -0300
commit1db0294eb1093066773760b75a200d99aa453be8 (patch)
tree46d1b89f2aa71e0e45e93ddc69180dc9f3218142
parent36fd9dab64814475221e72022bd9227cfbd034d2 (diff)
downloadcouchdb-epi-support-map-childspec.tar.gz
Support map childspecs in couch_epi supervisor's children replacementepi-support-map-childspec
-rw-r--r--src/couch_epi/src/couch_epi_sup.erl5
-rw-r--r--src/couch_epi/test/eunit/couch_epi_basic_test.erl34
2 files changed, 27 insertions, 12 deletions
diff --git a/src/couch_epi/src/couch_epi_sup.erl b/src/couch_epi/src/couch_epi_sup.erl
index 218db5445..477cbe79e 100644
--- a/src/couch_epi/src/couch_epi_sup.erl
+++ b/src/couch_epi/src/couch_epi_sup.erl
@@ -136,4 +136,7 @@ modules(#couch_epi_spec{kind = data_subscriptions, behaviour = Module}) ->
merge([], Children) ->
Children;
merge([{Id, _, _, _, _, _} = Spec | Rest], Children) ->
- merge(Rest, lists:keystore(Id, 1, Children, Spec)).
+ merge(Rest, lists:keystore(Id, 1, Children, Spec));
+merge([#{id := Id} = Spec | Rest], Children) ->
+ Replace = fun(#{id := I}) when I == Id -> Spec; (E) -> E end,
+ merge(Rest, lists:map(Replace, Children)).
diff --git a/src/couch_epi/test/eunit/couch_epi_basic_test.erl b/src/couch_epi/test/eunit/couch_epi_basic_test.erl
index 587d1564e..5ba6c9f87 100644
--- a/src/couch_epi/test/eunit/couch_epi_basic_test.erl
+++ b/src/couch_epi/test/eunit/couch_epi_basic_test.erl
@@ -67,7 +67,9 @@ processes() ->
[
{?MODULE, [?CHILD(extra_process, worker)]},
{?MODULE, [{to_replace, {new, start_link, [bar]},
- permanent, 5000, worker, [bar]}]}
+ permanent, 5000, worker, [bar]}]},
+ {?MODULE, [#{id => to_replace_map,
+ start => {new, start_link, [bar]}, modules => [bar]}]}
].
@@ -95,9 +97,10 @@ parse_child_id(Id) ->
-include_lib("eunit/include/eunit.hrl").
basic_test() ->
- Expected = lists:sort([
+ Expected = [
{extra_process, [], [extra_process]},
{to_replace, [bar], [bar]},
+ {to_replace_map, [bar], [bar]},
{{my_service, providers},
[couch_epi_functions_gen_my_service],
[couch_epi_codechange_monitor, couch_epi_functions_gen_my_service,
@@ -114,18 +117,23 @@ basic_test() ->
[couch_epi_data_gen_test_app_descriptions],
lists:sort([couch_epi_codechange_monitor,
couch_epi_data_gen_test_app_descriptions, ?MODULE])}
- ]),
+ ],
- ToReplace = {to_replace,
- {old, start_link, [foo]}, permanent, 5000, worker, [foo]},
- Children = lists:sort(couch_epi_sup:plugin_childspecs(
- ?MODULE, [?MODULE], [ToReplace])),
- Results = [
- {parse_child_id(Id), Args, lists:sort(Modules)}
- || {Id, {_M, _F, Args}, _, _, _, Modules} <- Children
+ ToReplace = [
+ {to_replace, {old, start_link, [foo]}, permanent, 5000, worker, [foo]},
+ #{id => to_replace_map, start => {old, start_link, [foo]}}
],
+ Children = lists:sort(couch_epi_sup:plugin_childspecs(
+ ?MODULE, [?MODULE], ToReplace)),
+
+ Results = lists:map(fun
+ ({Id, {_M, _F, Args}, _, _, _, Modules}) ->
+ {parse_child_id(Id), Args, lists:sort(Modules)};
+ (#{id := Id, start := {_M, _F, Args}, modules := Modules}) ->
+ {parse_child_id(Id), Args, lists:sort(Modules)}
+ end, Children),
- Tests = lists:zip(Expected, Results),
+ Tests = lists:zip(lists:sort(Expected), lists:sort(Results)),
[?assertEqual(Expect, Result) || {Expect, Result} <- Tests],
ExpectedChild = {to_replace, {new, start_link, [bar]},
@@ -134,4 +142,8 @@ basic_test() ->
ExpectedChild,
lists:keyfind(to_replace, 1, Children)),
+ ExpectedMapChildSpec = #{id => to_replace_map,
+ start => {new, start_link, [bar]}, modules => [bar]},
+ [MapChildSpec] = [E || #{id := to_replace_map} = E <- Children],
+ ?assertEqual(ExpectedMapChildSpec, MapChildSpec),
ok.