diff --git a/apps/emqx_resource/src/emqx_resource_validator.erl b/apps/emqx_resource/src/emqx_resource_validator.erl index bc733ef80..ea9547265 100644 --- a/apps/emqx_resource/src/emqx_resource_validator.erl +++ b/apps/emqx_resource/src/emqx_resource_validator.erl @@ -28,10 +28,18 @@ max(Type, Max) -> min(Type, Min) -> limit(Type, '>=', Min). -not_empty(ErrMsg) -> +not_empty(ErrMsg0) -> + ErrMsg = + try + lists:flatten(ErrMsg0) + catch + _:_ -> + ErrMsg0 + end, fun (undefined) -> {error, ErrMsg}; (<<>>) -> {error, ErrMsg}; + ("") -> {error, ErrMsg}; (_) -> ok end. @@ -50,7 +58,8 @@ len(string) -> fun string:length/1; len(_Type) -> fun(Val) -> Val end. err_limit({Type, {Op, Expected}, {got, Got}}) -> - io_lib:format("Expect the ~ts value ~ts ~p but got: ~p", [Type, Op, Expected, Got]). + Msg = io_lib:format("Expect the ~ts value ~ts ~p but got: ~p", [Type, Op, Expected, Got]), + lists:flatten(Msg). return(true, _) -> ok; return(false, Error) -> {error, Error}. diff --git a/apps/emqx_resource/test/emqx_resource_SUITE.erl b/apps/emqx_resource/test/emqx_resource_SUITE.erl index 934a97829..77e680933 100644 --- a/apps/emqx_resource/test/emqx_resource_SUITE.erl +++ b/apps/emqx_resource/test/emqx_resource_SUITE.erl @@ -1121,10 +1121,58 @@ t_create_dry_run_local_failed(_) -> ). t_test_func(_) -> + IsErrorMsgPlainString = fun({error, Msg}) -> io_lib:printable_list(Msg) end, ?assertEqual(ok, erlang:apply(emqx_resource_validator:not_empty("not_empty"), [<<"someval">>])), ?assertEqual(ok, erlang:apply(emqx_resource_validator:min(int, 3), [4])), ?assertEqual(ok, erlang:apply(emqx_resource_validator:max(array, 10), [[a, b, c, d]])), - ?assertEqual(ok, erlang:apply(emqx_resource_validator:max(string, 10), ["less10"])). + ?assertEqual(ok, erlang:apply(emqx_resource_validator:max(string, 10), ["less10"])), + ?assertEqual( + true, IsErrorMsgPlainString(erlang:apply(emqx_resource_validator:min(int, 66), [42])) + ), + ?assertEqual( + true, IsErrorMsgPlainString(erlang:apply(emqx_resource_validator:max(int, 42), [66])) + ), + ?assertEqual( + true, IsErrorMsgPlainString(erlang:apply(emqx_resource_validator:min(array, 3), [[1, 2]])) + ), + ?assertEqual( + true, + IsErrorMsgPlainString(erlang:apply(emqx_resource_validator:max(array, 3), [[1, 2, 3, 4]])) + ), + ?assertEqual( + true, IsErrorMsgPlainString(erlang:apply(emqx_resource_validator:min(string, 3), ["1"])) + ), + ?assertEqual( + true, IsErrorMsgPlainString(erlang:apply(emqx_resource_validator:max(string, 3), ["1234"])) + ), + NestedMsg = io_lib:format("The answer: ~p", [42]), + ExpectedMsg = "The answer: 42", + BinMsg = <<"The answer: 42">>, + MapMsg = #{question => "The question", answer => 42}, + ?assertEqual( + {error, ExpectedMsg}, + erlang:apply(emqx_resource_validator:not_empty(NestedMsg), [""]) + ), + ?assertEqual( + {error, ExpectedMsg}, + erlang:apply(emqx_resource_validator:not_empty(NestedMsg), [<<>>]) + ), + ?assertEqual( + {error, ExpectedMsg}, + erlang:apply(emqx_resource_validator:not_empty(NestedMsg), [undefined]) + ), + ?assertEqual( + {error, ExpectedMsg}, + erlang:apply(emqx_resource_validator:not_empty(NestedMsg), [undefined]) + ), + ?assertEqual( + {error, BinMsg}, + erlang:apply(emqx_resource_validator:not_empty(BinMsg), [undefined]) + ), + ?assertEqual( + {error, MapMsg}, + erlang:apply(emqx_resource_validator:not_empty(MapMsg), [""]) + ). t_reset_metrics(_) -> {ok, _} = emqx_resource:create(