test(psk): improve test coverage

This commit is contained in:
firest 2022-03-17 18:19:12 +08:00
parent 841024461c
commit 435b22273d
3 changed files with 66 additions and 32 deletions

View File

@ -56,6 +56,10 @@
-define(CR, 13). -define(CR, 13).
-define(LF, 10). -define(LF, 10).
-ifdef(TEST).
-export([call/1, trim_crlf/1]).
-endif.
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------
%% Mnesia bootstrap %% Mnesia bootstrap
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------
@ -79,7 +83,7 @@ load() ->
emqx:hook('tls_handshake.psk_lookup', {?MODULE, on_psk_lookup, []}). emqx:hook('tls_handshake.psk_lookup', {?MODULE, on_psk_lookup, []}).
unload() -> unload() ->
emqx:unhook('tls_handshake.psk_lookup', {?MODULE, on_psk_lookup, []}). emqx:unhook('tls_handshake.psk_lookup', {?MODULE, on_psk_lookup}).
on_psk_lookup(PSKIdentity, _UserState) -> on_psk_lookup(PSKIdentity, _UserState) ->
case mnesia:dirty_read(?TAB, PSKIdentity) of case mnesia:dirty_read(?TAB, PSKIdentity) of

View File

@ -24,6 +24,8 @@
, fields/1 , fields/1
]). ]).
-import(emqx_schema, [sc/2]).
roots() -> ["psk_authentication"]. roots() -> ["psk_authentication"].
fields("psk_authentication") -> fields("psk_authentication") ->
@ -42,35 +44,27 @@ to which is configurable by the <code>init_file</code> field.
}. }.
fields() -> fields() ->
[ {enable, fun enable/1} [ {enable, sc(boolean(), #{default => false,
, {init_file, fun init_file/1} desc => <<"Whether to enable TLS PSK support">>
, {separator, fun separator/1} })}
, {chunk_size, fun chunk_size/1} , {init_file, sc(binary(),
#{required => false,
desc =>
<<"If init_file is specified, emqx will import PSKs from the file ",
"into the built-in database at startup for use by the runtime. ",
"The file has to be structured line-by-line, each line must be in ",
"the format of <code>PSKIdentity:SharedSecret</code>. For example: ",
"<code>mydevice1:c2VjcmV0</code>">>
})}
, {separator, sc(binary(),
#{default => <<":">>,
desc =>
<<"The separator between <code>PSKIdentity</code"
" and <code>SharedSecret</code> in the psk file">>
})}
, {chunk_size, sc(integer(),
#{default => 50,
desc => <<"The size of each chunk used to import to"
" the built-in database from psk file">>
})}
]. ].
enable(type) -> boolean();
enable(desc) -> <<"Whether to enable TLS PSK support">>;
enable(default) -> false;
enable(_) -> undefined.
init_file(type) -> binary();
init_file(desc) ->
<<"If init_file is specified, emqx will import PSKs from the file ",
"into the built-in database at startup for use by the runtime. ",
"The file has to be structured line-by-line, each line must be in ",
"the format of <code>PSKIdentity:SharedSecret</code>. For example: ",
"<code>mydevice1:c2VjcmV0</code>">>;
init_file(required) -> false;
init_file(_) -> undefined.
separator(type) -> binary();
separator(desc) ->
<<"The separator between <code>PSKIdentity</code> and <code>SharedSecret</code> in the psk file">>;
separator(default) -> <<":">>;
separator(_) -> undefined.
chunk_size(type) -> integer();
chunk_size(desc) ->
<<"The size of each chunk used to import to the built-in database from psk file">>;
chunk_size(default) -> 50;
chunk_size(_) -> undefined.

View File

@ -21,6 +21,9 @@
-include_lib("common_test/include/ct.hrl"). -include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-define(CR, 13).
-define(LF, 10).
all() -> all() ->
emqx_common_test_helpers:all(?MODULE). emqx_common_test_helpers:all(?MODULE).
@ -83,3 +86,36 @@ t_psk_lookup(_) ->
ok. ok.
t_start_stop(_) ->
?assertNotEqual(undefined, erlang:whereis(emqx_psk)),
?assertEqual(ok, emqx_psk:stop()),
timer:sleep(1000),
?assertNotEqual(undefined, erlang:whereis(emqx_psk)).
t_unexpected(_) ->
?assertEqual({error, unexpected}, emqx_psk:call(unexpected)),
?assertEqual(ok, gen_server:cast(emqx_psk, unexpected)),
?assertEqual(unexpected, erlang:send(erlang:whereis(emqx_psk), unexpected)).
t_load_unload(_) ->
emqx_psk:unload(),
timer:sleep(600),
?assertEqual([], emqx_hooks:lookup('tls_handshake.psk_lookup')),
emqx_psk:load(),
?assertMatch([_Hook], emqx_hooks:lookup('tls_handshake.psk_lookup')).
t_import(_) ->
Init = emqx_conf:get([psk_authentication, init_file], undefined),
?assertEqual(ok, emqx_psk:import(Init)),
?assertMatch({error, _}, emqx_psk:import("~/_none_")),
ok.
t_trim_crlf(_) ->
Bin = <<1, 2>>,
?assertEqual(Bin, emqx_psk:trim_crlf(Bin)),
?assertEqual(Bin, emqx_psk:trim_crlf(<<Bin/binary, ?LF>>)),
?assertEqual(Bin, emqx_psk:trim_crlf(<<Bin/binary, ?CR, ?LF>>)).