206 lines
5.7 KiB
Erlang
206 lines
5.7 KiB
Erlang
%%--------------------------------------------------------------------
|
|
%% Copyright (c) 2021-2024 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.
|
|
%%--------------------------------------------------------------------
|
|
|
|
-module(emqx_gateway_test_utils).
|
|
|
|
-compile(export_all).
|
|
-compile(nowarn_export_all).
|
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
assert_confs(Expected0, Effected) ->
|
|
Expected = maybe_unconvert_listeners(Expected0),
|
|
case do_assert_confs(root, Expected, Effected) of
|
|
false ->
|
|
io:format(
|
|
standard_error,
|
|
"Expected config: ~p,\n"
|
|
"Effected config: ~p",
|
|
[Expected, Effected]
|
|
),
|
|
exit(conf_not_match);
|
|
true ->
|
|
ok
|
|
end.
|
|
|
|
do_assert_confs(_Key, Expected, Effected) when
|
|
is_map(Expected),
|
|
is_map(Effected)
|
|
->
|
|
Ks1 = maps:keys(Expected),
|
|
lists:all(
|
|
fun(K) ->
|
|
do_assert_confs(
|
|
K,
|
|
maps:get(K, Expected),
|
|
maps:get(K, Effected, undefined)
|
|
)
|
|
end,
|
|
Ks1
|
|
);
|
|
do_assert_confs(Key, Expected, Effected) when
|
|
Key == cacertfile;
|
|
Key == <<"cacertfile">>;
|
|
Key == certfile;
|
|
Key == <<"certfile">>;
|
|
Key == keyfile;
|
|
Key == <<"keyfile">>
|
|
->
|
|
case Expected == Effected of
|
|
true ->
|
|
true;
|
|
false ->
|
|
case file:read_file(Effected) of
|
|
{ok, Content} -> Expected == Content;
|
|
_ -> false
|
|
end
|
|
end;
|
|
do_assert_confs(Key, [Expected | More1], [Effected | More2]) ->
|
|
do_assert_confs(Key, Expected, Effected) andalso
|
|
do_assert_confs(Key, More1, More2);
|
|
do_assert_confs(_Key, [], []) ->
|
|
true;
|
|
do_assert_confs(Key, Expected, Effected) ->
|
|
Res = Expected =:= Effected,
|
|
Res == false andalso
|
|
ct:pal(
|
|
"Errors: ~p value not match, "
|
|
"expected: ~p, got: ~p~n",
|
|
[Key, Expected, Effected]
|
|
),
|
|
Res.
|
|
|
|
maybe_unconvert_listeners(Conf) when is_map(Conf) ->
|
|
case maps:take(<<"listeners">>, Conf) of
|
|
{Ls, Conf1} when is_list(Ls) ->
|
|
Conf1#{
|
|
<<"listeners">> =>
|
|
emqx_gateway_conf:unconvert_listeners(Ls)
|
|
};
|
|
_ ->
|
|
Conf
|
|
end;
|
|
maybe_unconvert_listeners(Conf) ->
|
|
Conf.
|
|
|
|
assert_fields_exist(Ks, Map) ->
|
|
lists:foreach(
|
|
fun(K) ->
|
|
_ = maps:get(K, Map)
|
|
end,
|
|
Ks
|
|
).
|
|
|
|
load_all_gateway_apps() ->
|
|
emqx_cth_suite:load_apps(all_gateway_apps()).
|
|
|
|
all_gateway_apps() ->
|
|
[
|
|
emqx_gateway_stomp,
|
|
emqx_gateway_mqttsn,
|
|
emqx_gateway_coap,
|
|
emqx_gateway_lwm2m,
|
|
emqx_gateway_exproto
|
|
].
|
|
|
|
%%--------------------------------------------------------------------
|
|
%% http
|
|
|
|
-define(http_api_host, "http://127.0.0.1:18083/api/v5").
|
|
|
|
request(delete = Mth, Path) ->
|
|
do_request(Mth, req(Path, []));
|
|
request(get = Mth, Path) ->
|
|
do_request(Mth, req(Path, [])).
|
|
|
|
request(get = Mth, Path, Qs) ->
|
|
do_request(Mth, req(Path, Qs));
|
|
request(put = Mth, Path, Body) ->
|
|
do_request(Mth, req(Path, [], Body));
|
|
request(post = Mth, Path, Body) ->
|
|
do_request(Mth, req(Path, [], Body)).
|
|
|
|
%%--------------------------------------------------------------------
|
|
%% default pems
|
|
|
|
ssl_server_opts() ->
|
|
#{
|
|
cacertfile => file_content(cert_path("cacert.pem")),
|
|
certfile => file_content(cert_path("cert.pem")),
|
|
keyfile => file_content(cert_path("key.pem"))
|
|
}.
|
|
|
|
ssl_client_opts() ->
|
|
#{
|
|
cacertfile => file_content(cert_path("cacert.pem")),
|
|
certfile => file_content(cert_path("client-cert.pem")),
|
|
keyfile => file_content(cert_path("client-key.pem"))
|
|
}.
|
|
|
|
cert_path(Name) ->
|
|
filename:join(["../../lib/emqx/etc/certs/", Name]).
|
|
|
|
file_content(Filename) ->
|
|
case file:read_file(Filename) of
|
|
{ok, Bin} -> Bin;
|
|
Err -> error(Err)
|
|
end.
|
|
|
|
do_request(Mth, Req) ->
|
|
case httpc:request(Mth, Req, [], [{body_format, binary}]) of
|
|
{ok, {{_Vsn, Code, _Text}, _, Resp}} ->
|
|
NResp =
|
|
case Resp of
|
|
<<>> ->
|
|
#{};
|
|
_ ->
|
|
emqx_utils_maps:unsafe_atom_key_map(
|
|
emqx_utils_json:decode(Resp, [return_maps])
|
|
)
|
|
end,
|
|
{Code, NResp};
|
|
{error, Reason} ->
|
|
error({failed_to_request, Reason})
|
|
end.
|
|
|
|
req(Path, Qs) ->
|
|
{url(Path, Qs), auth([])}.
|
|
|
|
req(Path, Qs, Body) ->
|
|
{url(Path, Qs), auth([]), "application/json", emqx_utils_json:encode(Body)}.
|
|
|
|
url(Path, []) ->
|
|
lists:concat([?http_api_host, Path]);
|
|
url(Path, Qs) ->
|
|
lists:concat([?http_api_host, Path, "?", binary_to_list(cow_qs:qs(Qs))]).
|
|
|
|
auth(Headers) ->
|
|
[emqx_mgmt_api_test_util:auth_header_() | Headers].
|
|
|
|
sn_client_connect(ClientId) ->
|
|
{ok, Socket} = gen_udp:open(0, [binary]),
|
|
_ = emqx_sn_protocol_SUITE:send_connect_msg(Socket, ClientId),
|
|
?assertEqual(
|
|
<<3, 16#05, 0>>,
|
|
emqx_sn_protocol_SUITE:receive_response(Socket)
|
|
),
|
|
Socket.
|
|
|
|
sn_client_disconnect(Socket) ->
|
|
_ = emqx_sn_protocol_SUITE:send_disconnect_msg(Socket, undefined),
|
|
gen_udp:close(Socket),
|
|
ok.
|