From 93a93aee0567ca967559f4c80eafa9b682238ad3 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Tue, 29 Nov 2022 13:50:00 +0100 Subject: [PATCH 1/2] chore: add tools app to release package --- scripts/rel_otp_apps.eterm | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/rel_otp_apps.eterm b/scripts/rel_otp_apps.eterm index 4999bbffa..0e6753997 100644 --- a/scripts/rel_otp_apps.eterm +++ b/scripts/rel_otp_apps.eterm @@ -13,4 +13,5 @@ , runtime_tools , {mnesia, load} , xmerl +, tools ]. From 55485f25b2430a74ee8d6fc299f5be2ea79ec330 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Tue, 29 Nov 2022 14:25:25 +0100 Subject: [PATCH 2/2] feat: add emqx_cover --- src/emqx.appup.src | 50 +++++++++++++++++++------- src/emqx_cover.erl | 87 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 13 deletions(-) create mode 100644 src/emqx_cover.erl diff --git a/src/emqx.appup.src b/src/emqx.appup.src index 1572fc18e..6efd9393c 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -2,12 +2,14 @@ %% Unless you know what you are doing, DO NOT edit manually!! {VSN, [{"4.4.11", - [{load_module,emqx_relup,brutal_purge,soft_purge,[]}, + [{add_module,emqx_cover}, + {load_module,emqx_relup,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, {"4.4.10", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {load_module,emqx_listeners,brutal_purge,soft_purge,[]}, @@ -23,7 +25,8 @@ {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.4.9", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -46,7 +49,8 @@ {load_module,emqx_router,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.4.8", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -70,7 +74,8 @@ {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}]}, {"4.4.7", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -94,7 +99,8 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.4.6", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -118,7 +124,8 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}]}, {"4.4.5", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -144,7 +151,8 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]}]}, {"4.4.4", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -177,7 +185,8 @@ {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]}]}, {"4.4.3", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -217,7 +226,8 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_relup}]}, {"4.4.2", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -258,7 +268,8 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_relup}]}, {"4.4.1", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -304,7 +315,8 @@ {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {add_module,emqx_relup}]}, {"4.4.0", - [{add_module,emqx_ocsp_cache}, + [{add_module,emqx_cover}, + {add_module,emqx_ocsp_cache}, {add_module,emqx_crl_cache}, {add_module,emqx_const_v1}, {add_module,emqx_secret}, @@ -356,7 +368,8 @@ [{load_module,emqx_relup,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, - {load_module,emqx_channel,brutal_purge,soft_purge,[]}]}, + {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + {delete_module,emqx_cover}]}, {"4.4.10", [{load_module,emqx_listeners,brutal_purge,soft_purge,[]}, {load_module,emqx_kernel_sup,brutal_purge,soft_purge,[]}, @@ -370,6 +383,7 @@ {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.9", @@ -391,6 +405,7 @@ {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_router,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.8", @@ -413,6 +428,7 @@ {load_module,emqx_shared_sub,brutal_purge,soft_purge,[]}, {load_module,emqx_cm,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.7", @@ -435,6 +451,7 @@ {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.6", @@ -457,6 +474,7 @@ {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.5", @@ -481,6 +499,7 @@ {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_shared_sub,brutal_purge,soft_purge,[]}, {load_module,emqx_relup,brutal_purge,soft_purge,[]}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.4", @@ -512,6 +531,7 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.3", @@ -549,6 +569,7 @@ {load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_relup}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.2", @@ -587,6 +608,7 @@ {load_module,emqx_hooks,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_relup}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.1", @@ -630,6 +652,7 @@ {load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]}, {delete_module,emqx_relup}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {"4.4.0", @@ -674,6 +697,7 @@ {load_module,emqx_app,brutal_purge,soft_purge,[]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}, {delete_module,emqx_relup}, + {delete_module,emqx_cover}, {delete_module,emqx_crl_cache}, {delete_module,emqx_ocsp_cache}]}, {<<".*">>,[]}]}. diff --git a/src/emqx_cover.erl b/src/emqx_cover.erl new file mode 100644 index 000000000..f407d0b7d --- /dev/null +++ b/src/emqx_cover.erl @@ -0,0 +1,87 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%%-------------------------------------------------------------------- + +%% @doc This module is NOT used in production. +%% It is used to collect coverage data when running blackbox test +-module(emqx_cover). + +-export([start/0, + start/1, + export_and_stop/1 + ]). + +start() -> + start(#{}). + +start(Opts) -> + ok = maybe_set_secret(), + case cover:start() of + {ok, _Pid} -> + ok; + {error, {already_started, _Pid}} -> + ok; + Other -> + throw(Other) + end, + ok = cover_compile(Opts). + +export_and_stop(Path) -> + ok = cover:export(Path), + _ = cover:stop(), + ok. + +maybe_set_secret() -> + case os:getenv("EMQX_DEBUG_SECRET_FILE") of + false -> + ok; + "" -> + ok; + File -> + ok = emqx:set_debug_secret(File) + end. + +cover_compile(_Opts) -> + %% TODO better filter based on Opts, + %% e.g. we may want to see coverage info for ehttpc + Filter = fun is_emqx_module/1, + Modules = find_modules(Filter), + Results = cover:compile_beam(Modules), + Errors = lists:filter(fun({ok, _}) -> false; + (_) -> true + end, Results), + case Errors of + [] -> + ok; + _ -> + io:format(user, "failed_to_cover_compile:~n~p~n", [Errors]), + throw(failed_to_cover_compile) + end. + +find_modules(Filter) -> + All = code:all_loaded(), + F = fun({M, _BeamPath}) -> Filter(M) end, + lists:filter(F, All). + +is_emqx_module(?MODULE) -> + %% do not cover-compile self + false; +is_emqx_module(Module) -> + case erlang:atom_to_binary(Module, utf8) of + <<"emqx", _/binary>> -> + true; + _ -> + false + end.