Skip to content

Commit 9632038

Browse files
Merge pull request #4345 from esl/start-cover-on-mim1-v7
Start cover on mim1 - second version
2 parents 9fb5603 + 8cf7c10 commit 9632038

File tree

5 files changed

+113
-103
lines changed

5 files changed

+113
-103
lines changed

big_tests/run_common_test.erl

Lines changed: 108 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -359,21 +359,22 @@ analyze_coverage(_, _) ->
359359

360360
prepare(Props) ->
361361
Nodes = get_mongoose_nodes(Props),
362-
maybe_compile_cover(Nodes).
362+
maybe_compile_cover(Nodes),
363+
block_nodes(Props).
363364

364365
maybe_compile_cover([]) ->
365366
io:format("cover: skip cover compilation~n", []),
366367
ok;
367-
maybe_compile_cover(Nodes) ->
368+
maybe_compile_cover([CoverNode|_] = Nodes) ->
368369
io:format("cover: compiling modules for nodes ~p~n", [Nodes]),
369370
import_code_paths(hd(Nodes)),
370371

371-
cover:start(Nodes),
372+
cover_start(CoverNode, Nodes),
372373
Dir = call(hd(Nodes), code, lib_dir, [mongooseim, ebin]),
373374

374375
%% Time is in microseconds
375376
{Time, Compiled} = timer:tc(fun() ->
376-
Results = cover:compile_beam_directory(Dir),
377+
Results = cover_compile_dir(CoverNode, Dir),
377378
Ok = [X || X = {ok, _} <- Results],
378379
NotOk = Results -- Ok,
379380
#{ok => length(Ok), failed => NotOk}
@@ -385,26 +386,26 @@ maybe_compile_cover(Nodes) ->
385386
ok.
386387

387388
analyze(Props, CoverOpts) ->
389+
unblock_nodes(Props),
388390
io:format("Coverage analyzing~n"),
389391
Nodes = get_mongoose_nodes(Props),
390392
analyze(Props, CoverOpts, Nodes).
391393

392394
analyze(_Props, _CoverOpts, []) ->
393395
ok;
394-
analyze(_Props, CoverOpts, Nodes) ->
395-
deduplicate_cover_server_console_prints(),
396+
analyze(_Props, CoverOpts, [CoverNode|_] = Nodes) ->
396397
%% Import small tests cover
397398
Files = filelib:wildcard(repo_dir() ++ "/_build/**/cover/*.coverdata"),
398399
io:format("Files: ~p", [Files]),
399400
report_time("Import cover data into run_common_test node", fun() ->
400-
[cover:import(File) || File <- Files]
401+
[cover_import(CoverNode, File) || File <- Files]
401402
end),
402403
report_time("Export merged cover data", fun() ->
403-
cover:export("/tmp/mongoose_combined.coverdata")
404+
cover_export(CoverNode, "/tmp/mongoose_combined.coverdata")
404405
end),
405406
case os:getenv("GITHUB_RUN_ID") of
406407
false ->
407-
make_html(modules_to_analyze(CoverOpts));
408+
make_html(CoverNode, modules_to_analyze(CoverNode, CoverOpts));
408409
_ ->
409410
ok
410411
end,
@@ -414,11 +415,11 @@ analyze(_Props, CoverOpts, Nodes) ->
414415
ok;
415416
_ ->
416417
report_time("Stopping cover on MongooseIM nodes", fun() ->
417-
cover:stop([node()|Nodes])
418+
cover_stop(CoverNode, Nodes)
418419
end)
419420
end.
420421

421-
make_html(Modules) ->
422+
make_html(CoverNode, Modules) ->
422423
{ok, Root} = file:get_cwd(),
423424
SortScript = Root ++ "/priv/sorttable.js",
424425
os:cmd("cp " ++ SortScript ++ " " ++ ?CT_REPORT),
@@ -437,11 +438,11 @@ make_html(Modules) ->
437438
FileName = lists:flatten(io_lib:format("~s.COVER.html",[Module])),
438439

439440
%% We assume that import_code_paths/1 was called earlier
440-
case cover:analyse(Module, module) of
441+
case cover_analyse(CoverNode, Module) of
441442
{ok, {Module, {C, NC}}} ->
442443
file:write(File, row(atom_to_list(Module), C, NC, percent(C,NC),"coverage/"++FileName)),
443444
FilePathC = filename:join([CoverageDir, FileName]),
444-
catch cover:analyse_to_file(Module, FilePathC, [html]),
445+
cover_analyse_to_html_file(CoverNode, Module, FilePathC),
445446
{CAcc + C, NCAcc + NC};
446447
Reason ->
447448
error_logger:error_msg("issue=cover_analyse_failed module=~p reason=~p",
@@ -503,9 +504,9 @@ module_list(undefined) ->
503504
module_list(ModuleList) ->
504505
[ list_to_atom(L) || L <- string:tokens(ModuleList, ", ") ].
505506

506-
modules_to_analyze(true) ->
507-
lists:usort(cover:imported_modules() ++ cover:modules());
508-
modules_to_analyze(ModuleList) when is_list(ModuleList) ->
507+
modules_to_analyze(CoverNode, true) ->
508+
lists:usort(cover_all_modules(CoverNode));
509+
modules_to_analyze(_CoverNode, ModuleList) when is_list(ModuleList) ->
509510
ModuleList.
510511

511512
add({X1, X2, X3, X4},
@@ -581,6 +582,9 @@ host_param(Name, {_, Params}) ->
581582
{Name, Param} = lists:keyfind(Name, 1, Params),
582583
Param.
583584

585+
host_param(Name, {_, Params}, Default) ->
586+
proplists:get_value(Name, Params, Default).
587+
584588
report_time(Description, Fun) ->
585589
report_progress("~nExecuting ~ts~n", [Description]),
586590
Start = os:timestamp(),
@@ -630,16 +634,6 @@ handle_file_error(_FileName, Other) ->
630634

631635
%% ------------------------------------------------------------------
632636

633-
%% cover_server process is using io:format too much.
634-
%% This code removes duplicate io:formats.
635-
%%
636-
%% Example of a message we want to write only once:
637-
%% "Analysis includes data from imported files" from cover.erl in Erlang/R19
638-
deduplicate_cover_server_console_prints() ->
639-
%% Set a new group leader for cover_server
640-
CoverPid = whereis(cover_server),
641-
dedup_proxy_group_leader:start_proxy_group_leader_for(CoverPid).
642-
643637
ct_run_dirs() ->
644638
filelib:wildcard("ct_report/ct_run*").
645639

@@ -721,3 +715,91 @@ assert_preset_present(Preset, PresetConfs) ->
721715
error_logger:error_msg("Preset not found ~p~n", [Preset]),
722716
error({preset_not_found, Preset})
723717
end.
718+
719+
assert_list(X) when is_list(X) -> X.
720+
721+
%% We use mim1 as a main node.
722+
%% Only the main node supports meck
723+
%% (other nodes should not use meck for the cover compiled modules).
724+
cover_start(CoverNode, Nodes) ->
725+
{ok, _} = cover_call(CoverNode, start, [Nodes]),
726+
CoverNode = cover_call(CoverNode, get_main_node, []),
727+
ok.
728+
729+
cover_stop(CoverNode, Nodes) ->
730+
cover_call(CoverNode, stop, [Nodes]).
731+
732+
cover_all_modules(CoverNode) ->
733+
List1 = assert_list(cover_call(CoverNode, imported_modules, [])),
734+
List2 = assert_list(cover_call(CoverNode, modules, [])),
735+
List1 ++ List2.
736+
737+
cover_analyse_to_html_file(CoverNode, Module, FilePathC) ->
738+
catch cover_call(CoverNode, analyse_to_file, [Module, FilePathC, [html]]).
739+
740+
cover_analyse(CoverNode, Module) ->
741+
cover_call(CoverNode, analyse, [Module, module]).
742+
743+
cover_export(CoverNode, ToFile) ->
744+
cover_call(CoverNode, export, [ToFile]).
745+
746+
cover_import(CoverNode, FromFile) ->
747+
cover_call(CoverNode, import, [FromFile]).
748+
749+
cover_compile_dir(CoverNode, Dir) ->
750+
cover_call(CoverNode, compile_beam_directory, [Dir]).
751+
752+
cover_call(CoverNode, Fun, Args) ->
753+
rpc:call(CoverNode, cover, Fun, Args).
754+
755+
block_nodes(Props) ->
756+
[block_node(Node, BlockNode, Props) || {Node, BlockNode} <- block_nodes_specs(Props)],
757+
ok.
758+
759+
unblock_nodes(Props) ->
760+
[unblock_node(Node, BlockNode, Props) || {Node, BlockNode} <- block_nodes_specs(Props)],
761+
ok.
762+
763+
%% Reads `blocks_hosts' parameter for the host from `test.config'.
764+
%% Returns a list of blocks to do like `[{mim, fed}]'.
765+
block_nodes_specs(Props) ->
766+
EnabledHosts = [ H || H <- get_all_hosts(Props), is_test_host_enabled(host_name(H)) ],
767+
[{host_name(H), BlockName}
768+
|| H <- EnabledHosts, BlockName <- host_param(blocks_hosts, H, []),
769+
is_test_host_enabled(BlockName)].
770+
771+
host_name_to_node(Name, Props) ->
772+
Hosts = get_all_hosts(Props),
773+
Host = proplists:get_value(Name, Hosts, []),
774+
case proplists:get_value(node, Host) of
775+
undefined ->
776+
error({host_name_to_node_failed, Name, Props});
777+
Node ->
778+
Node
779+
end.
780+
781+
%% Do not allow node Name to talk to node BlockName
782+
block_node(Name, BlockName, Props) ->
783+
Node = host_name_to_node(Name, Props),
784+
BlockNode = host_name_to_node(BlockName, Props),
785+
rpc_call(Node, erlang, set_cookie, [BlockNode, make_bad_cookie(Name, BlockNode)]),
786+
rpc_call(Node, erlang, disconnect_node, [BlockNode]),
787+
Cond = fun() -> lists:member(BlockNode, rpc_call(Node, erlang, nodes, [])) end,
788+
mongoose_helper:wait_until(Cond, false).
789+
790+
unblock_node(Name, BlockName, Props) ->
791+
Node = host_name_to_node(Name, Props),
792+
BlockNode = host_name_to_node(BlockName, Props),
793+
DefCookie = rpc_call(Node, erlang, get_cookie, []),
794+
rpc_call(Node, erlang, set_cookie, [BlockNode, DefCookie]).
795+
796+
make_bad_cookie(Name, BlockName) ->
797+
list_to_atom(atom_to_list(Name) ++ "_blocks_" ++ atom_to_list(BlockName)).
798+
799+
rpc_call(Node, M, F, Args) ->
800+
case rpc:call(Node, M, F, Args) of
801+
{badrpc, Reason} ->
802+
error({rpc_call_failed, Reason, Node, {M, F, Args}});
803+
Res ->
804+
Res
805+
end.

big_tests/src/dedup_proxy_group_leader.erl

Lines changed: 0 additions & 73 deletions
This file was deleted.

big_tests/test.config

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
{kicking_service_port, 8666},
4040
{hidden_service_port, 8189},
4141
{gd_endpoint_port, 5555},
42-
{http_notifications_port, 8000}]},
42+
{http_notifications_port, 8000},
43+
{blocks_hosts, [reg]}]},
4344
{mim2, [{node, mongooseim2@localhost},
4445
{domain, <<"localhost">>},
4546
{host_type, <<"localhost">>},

big_tests/tests/mod_global_distrib_SUITE.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -660,13 +660,13 @@ test_pm_with_graceful_reconnection_to_different_server(Config) ->
660660
%% Pause Alice until Eve is reconnected
661661
AliceNode = ct:get_config({hosts, mim, node}),
662662
C2sPid = mongoose_helper:get_session_pid(Alice, #{node => AliceNode}),
663-
ok = rpc(asia_node, sys, suspend, [C2sPid]),
663+
ok = rpc:call(node(C2sPid), sys, suspend, [C2sPid]),
664664

665665
escalus_client:send(Alice, chat_with_seqnum(Eve, <<"Hi from Europe1!">>)),
666666

667667
NewEve = connect_from_spec(EveSpec2, Config),
668668

669-
ok = rpc(asia_node, sys, resume, [C2sPid]),
669+
ok = rpc:call(node(C2sPid), sys, resume, [C2sPid]),
670670

671671

672672
escalus_client:send(Alice, chat_with_seqnum(Eve, <<"Hi again from Europe1!">>)),

rebar.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@
199199
[
200200
{pc, "1.15.0"},
201201
{provider_asn1, "0.3.0"},
202-
{rebar3_codecov, "0.6.0"},
202+
{rebar3_codecov, "0.7.0"},
203203
{rebar3_lint, "2.0.1"}
204204
]}.
205205

0 commit comments

Comments
 (0)