diff --git a/Makefile b/Makefile index 3789a7ec3..1d9137c41 100644 --- a/Makefile +++ b/Makefile @@ -69,7 +69,7 @@ mix-deps-get: $(ELIXIR_COMMON_DEPS) .PHONY: eunit eunit: $(REBAR) merge-config - @$(REBAR) eunit --name eunit@127.0.0.1 -v -c --cover_export_name $(CT_COVER_EXPORT_PREFIX)-eunit + @$(REBAR) eunit --name eunit@127.0.0.1 -c -v --cover_export_name $(CT_COVER_EXPORT_PREFIX)-eunit .PHONY: proper proper: $(REBAR) @@ -105,16 +105,22 @@ ifneq ($(GROUPS),) GROUPS_ARG := --groups $(GROUPS) endif +ifeq ($(ENABLE_COVER_COMPILE),1) +cover_args = --cover --cover_export_name $(CT_COVER_EXPORT_PREFIX)-$(subst /,-,$1) +else +cover_args = +endif + ## example: ## env SUITES=apps/appname/test/test_SUITE.erl CASES=t_foo make apps/appname-ct define gen-app-ct-target $1-ct: $(REBAR) merge-config clean-test-cluster-config $(eval SUITES := $(shell $(SCRIPTS)/find-suites.sh $1)) ifneq ($(SUITES),) - @$(REBAR) ct -c -v \ + $(REBAR) ct -v \ --readable=$(CT_READABLE) \ --name $(CT_NODE_NAME) \ - --cover_export_name $(CT_COVER_EXPORT_PREFIX)-$(subst /,-,$1) \ + $(call cover_args,$1) \ --suite $(SUITES) \ $(GROUPS_ARG) \ $(CASES_ARG) diff --git a/apps/emqx_bridge/src/emqx_bridge_api.erl b/apps/emqx_bridge/src/emqx_bridge_api.erl index ff7f8d44d..945ff250c 100644 --- a/apps/emqx_bridge/src/emqx_bridge_api.erl +++ b/apps/emqx_bridge/src/emqx_bridge_api.erl @@ -902,7 +902,7 @@ format_resource( redact( maps:merge( RawConfFull#{ - type => Type, + type => downgrade_type(Type), name => maps:get(<<"name">>, RawConf, BridgeName), node => Node }, @@ -1156,3 +1156,6 @@ non_compat_bridge_msg() -> upgrade_type(Type) -> emqx_bridge_lib:upgrade_type(Type). + +downgrade_type(Type) -> + emqx_bridge_lib:downgrade_type(Type). diff --git a/apps/emqx_bridge_kafka/test/emqx_bridge_kafka_impl_producer_SUITE.erl b/apps/emqx_bridge_kafka/test/emqx_bridge_kafka_impl_producer_SUITE.erl index c8c3bbed7..ef9e6cdf6 100644 --- a/apps/emqx_bridge_kafka/test/emqx_bridge_kafka_impl_producer_SUITE.erl +++ b/apps/emqx_bridge_kafka/test/emqx_bridge_kafka_impl_producer_SUITE.erl @@ -258,6 +258,18 @@ pre_create_atoms() -> kafka__probe_ ]. +http_get_bridges(UrlPath, Name0) -> + Name = iolist_to_binary(Name0), + {ok, _Code, BridgesData} = http_get(UrlPath), + Bridges = json(BridgesData), + lists:filter( + fun + (#{<<"name">> := N}) when N =:= Name -> true; + (_) -> false + end, + Bridges + ). + kafka_bridge_rest_api_helper(Config) -> BridgeType = ?BRIDGE_TYPE, BridgeName = "my_kafka_bridge", @@ -277,27 +289,16 @@ kafka_bridge_rest_api_helper(Config) -> BridgesPartsOpRestart = OpUrlFun("restart"), BridgesPartsOpStop = OpUrlFun("stop"), %% List bridges - MyKafkaBridgeExists = fun() -> - {ok, _Code, BridgesData} = http_get(BridgesParts), - Bridges = json(BridgesData), - lists:any( - fun - (#{<<"name">> := <<"my_kafka_bridge">>}) -> true; - (_) -> false - end, - Bridges - ) - end, %% Delete if my_kafka_bridge exists - case MyKafkaBridgeExists() of - true -> + case http_get_bridges(BridgesParts, BridgeName) of + [_] -> %% Delete the bridge my_kafka_bridge {ok, 204, <<>>} = http_delete(BridgesPartsIdDeleteAlsoActions); - false -> + [] -> ok end, try - false = MyKafkaBridgeExists(), + ?assertEqual([], http_get_bridges(BridgesParts, BridgeName)), %% Create new Kafka bridge KafkaTopic = test_topic_one_partition(), CreateBodyTmp = #{ @@ -319,7 +320,7 @@ kafka_bridge_rest_api_helper(Config) -> CreateBody = CreateBodyTmp#{<<"ssl">> => maps:get(<<"ssl">>, Config)}, {ok, 201, _Data} = http_post(BridgesParts, CreateBody), %% Check that the new bridge is in the list of bridges - true = MyKafkaBridgeExists(), + ?assertMatch([#{<<"type">> := <<"kafka">>}], http_get_bridges(BridgesParts, BridgeName)), %% Probe should work %% no extra atoms should be created when probing %% See pre_create_atoms() above @@ -419,8 +420,9 @@ kafka_bridge_rest_api_helper(Config) -> % this delete should not be necessary beause of the also_delete_dep_actions flag % {ok, 204, _} = http_delete(["rules", RuleId]), {ok, 204, _} = http_delete(BridgesPartsIdDeleteAlsoActions), - false = MyKafkaBridgeExists(), - delete_all_bridges() + Remain = http_get_bridges(BridgesParts, BridgeName), + delete_all_bridges(), + ?assertEqual([], Remain) end, ok. diff --git a/scripts/find-suites.sh b/scripts/find-suites.sh index 41b9b5e61..0d7df5f6d 100755 --- a/scripts/find-suites.sh +++ b/scripts/find-suites.sh @@ -12,15 +12,46 @@ set -euo pipefail # ensure dir cd -P -- "$(dirname -- "$0")/.." +DIR="$1" + +complete_path() { + local filename="$1" + # Check if path prefix is present + if [[ "$filename" != */* ]]; then + filename="$DIR/test/$filename" + fi + + # Check if suffix is present + if [[ "$filename" != *.erl ]]; then + filename="$filename.erl" + fi + + echo "$filename" +} ## EMQX_CT_SUITES or SUITES is useful in ad-hoc runs EMQX_CT_SUITES="${EMQX_CT_SUITES:-${SUITES:-}}" if [ -n "${EMQX_CT_SUITES:-}" ]; then - echo "${EMQX_CT_SUITES}" + OUTPUT="" + IFS=',' read -ra FILE_ARRAY <<< "$EMQX_CT_SUITES" + for file in "${FILE_ARRAY[@]}"; do + path=$(complete_path "$file") + if [ ! -f "$path" ]; then + echo '' + echo "ERROR: '$path' is not a file. Ignored!" >&2 + exit 1 + fi + if [ -z "$OUTPUT" ]; then + OUTPUT="$path" + else + OUTPUT="$OUTPUT,$path" + fi + done + echo "${OUTPUT}" exit 0 fi -TESTDIR="$1/test" -INTEGRATION_TESTDIR="$1/integration_test" +TESTDIR="$DIR/test" +INTEGRATION_TESTDIR="$DIR/integration_test" # Get the output of the find command IFS=$'\n' read -r -d '' -a FILES < <(find "${TESTDIR}" -name "*_SUITE.erl" 2>/dev/null | sort && printf '\0') if [[ -d "${INTEGRATION_TESTDIR}" ]]; then