Merge pull request #10870 from zhongwencool/stop-dashboard-listener-waiting

fix: flaky test when stopping dashboard listener
This commit is contained in:
zhongwencool 2023-05-31 10:54:12 +08:00 committed by GitHub
commit 6202cefd5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 86 additions and 7 deletions

View File

@ -57,6 +57,7 @@
]). ]).
-export([pre_config_update/3, post_config_update/5]). -export([pre_config_update/3, post_config_update/5]).
-export([wait_listener_stopped/1]).
-export([format_bind/1]). -export([format_bind/1]).

View File

@ -111,14 +111,15 @@ stop_listeners(Listeners) ->
begin begin
case minirest:stop(Name) of case minirest:stop(Name) of
ok -> ok ->
_ = emqx_listeners:wait_listener_stopped(Bind),
?ULOG("Stop listener ~ts on ~ts successfully.~n", [ ?ULOG("Stop listener ~ts on ~ts successfully.~n", [
Name, emqx_listeners:format_bind(Port) Name, emqx_listeners:format_bind(Bind)
]); ]);
{error, not_found} -> {error, not_found} ->
?SLOG(warning, #{msg => "stop_listener_failed", name => Name, port => Port}) ?SLOG(warning, #{msg => "stop_listener_failed", name => Name, bind => Bind})
end end
end end
|| {Name, _, Port, _, _} <- listeners(Listeners) || {Name, _, Bind, _, _} <- listeners(Listeners)
], ],
ok. ok.

View File

@ -234,6 +234,8 @@ do_request_dashboard(Method, Request) ->
-> ->
{ok, Return}; {ok, Return};
{ok, {Reason, _, _}} -> {ok, {Reason, _, _}} ->
{error, Reason};
{error, Reason} ->
{error, Reason} {error, Reason}
end. end.

View File

@ -21,9 +21,11 @@
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-include("emqx_dashboard.hrl"). -include("emqx_dashboard.hrl").
-include_lib("snabbkaffe/include/snabbkaffe.hrl").
-define(NAME, 'https:dashboard'). -define(NAME, 'https:dashboard').
-define(HOST, "https://127.0.0.1:18084"). -define(HOST_HTTPS, "https://127.0.0.1:18084").
-define(HOST_HTTP, "http://127.0.0.1:18083").
-define(BASE_PATH, "/api/v5"). -define(BASE_PATH, "/api/v5").
-define(OVERVIEWS, [ -define(OVERVIEWS, [
"alarms", "alarms",
@ -44,6 +46,76 @@ end_per_suite(_Config) -> emqx_mgmt_api_test_util:end_suite([emqx_management]).
init_per_testcase(_TestCase, Config) -> Config. init_per_testcase(_TestCase, Config) -> Config.
end_per_testcase(_TestCase, _Config) -> emqx_mgmt_api_test_util:end_suite([emqx_management]). end_per_testcase(_TestCase, _Config) -> emqx_mgmt_api_test_util:end_suite([emqx_management]).
t_update_conf(_Config) ->
Conf = #{
dashboard => #{
listeners => #{
https => #{bind => 18084, enable => true},
http => #{bind => 18083, enable => true}
}
}
},
emqx_common_test_helpers:load_config(emqx_dashboard_schema, Conf),
emqx_mgmt_api_test_util:init_suite([emqx_management], fun(X) -> X end),
Headers = emqx_dashboard_SUITE:auth_header_(),
{ok, Client1} = emqx_dashboard_SUITE:request_dashboard(
get, https_api_path(["clients"]), Headers
),
{ok, Client2} = emqx_dashboard_SUITE:request_dashboard(
get, http_api_path(["clients"]), Headers
),
Raw = emqx:get_raw_config([<<"dashboard">>]),
?assertEqual(Client1, Client2),
?check_trace(
begin
Raw1 = emqx_utils_maps:deep_put(
[<<"listeners">>, <<"https">>, <<"enable">>], Raw, false
),
?assertMatch({ok, _}, emqx:update_config([<<"dashboard">>], Raw1)),
?assertEqual(Raw1, emqx:get_raw_config([<<"dashboard">>])),
{ok, _} = ?block_until(#{?snk_kind := regenerate_minirest_dispatch}, 10000),
ok
end,
fun(ok, Trace) ->
%% Don't start new listener, so is empty
?assertMatch([#{listeners := []}], ?of_kind(regenerate_minirest_dispatch, Trace))
end
),
{ok, Client3} = emqx_dashboard_SUITE:request_dashboard(
get, http_api_path(["clients"]), Headers
),
?assertEqual(Client1, Client3),
?assertMatch(
{error,
{failed_connect, [
_,
{inet, [inet], econnrefused}
]}},
emqx_dashboard_SUITE:request_dashboard(get, https_api_path(["clients"]), Headers)
),
%% reset
?check_trace(
begin
?assertMatch({ok, _}, emqx:update_config([<<"dashboard">>], Raw)),
?assertEqual(Raw, emqx:get_raw_config([<<"dashboard">>])),
{ok, _} = ?block_until(#{?snk_kind := regenerate_minirest_dispatch}, 10000),
ok
end,
fun(ok, Trace) ->
%% start new listener('https:dashboard')
?assertMatch(
[#{listeners := ['https:dashboard']}], ?of_kind(regenerate_minirest_dispatch, Trace)
)
end
),
{ok, Client1} = emqx_dashboard_SUITE:request_dashboard(
get, https_api_path(["clients"]), Headers
),
{ok, Client2} = emqx_dashboard_SUITE:request_dashboard(
get, http_api_path(["clients"]), Headers
),
emqx_mgmt_api_test_util:end_suite([emqx_management]).
t_default_ssl_cert(_Config) -> t_default_ssl_cert(_Config) ->
Conf = #{dashboard => #{listeners => #{https => #{bind => 18084, enable => true}}}}, Conf = #{dashboard => #{listeners => #{https => #{bind => 18084, enable => true}}}},
validate_https(Conf, 512, default_ssl_cert(), verify_none), validate_https(Conf, 512, default_ssl_cert(), verify_none),
@ -188,7 +260,7 @@ assert_https_request() ->
Headers = emqx_dashboard_SUITE:auth_header_(), Headers = emqx_dashboard_SUITE:auth_header_(),
lists:foreach( lists:foreach(
fun(Path) -> fun(Path) ->
ApiPath = api_path([Path]), ApiPath = https_api_path([Path]),
?assertMatch( ?assertMatch(
{ok, _}, {ok, _},
emqx_dashboard_SUITE:request_dashboard(get, ApiPath, Headers) emqx_dashboard_SUITE:request_dashboard(get, ApiPath, Headers)
@ -197,8 +269,11 @@ assert_https_request() ->
?OVERVIEWS ?OVERVIEWS
). ).
api_path(Parts) -> https_api_path(Parts) ->
?HOST ++ filename:join([?BASE_PATH | Parts]). ?HOST_HTTPS ++ filename:join([?BASE_PATH | Parts]).
http_api_path(Parts) ->
?HOST_HTTP ++ filename:join([?BASE_PATH | Parts]).
naive_env_interpolation(Str0) -> naive_env_interpolation(Str0) ->
Str1 = emqx_schema:naive_env_interpolation(Str0), Str1 = emqx_schema:naive_env_interpolation(Str0),