fix(test): пропускать посторонние WS-сообщения при ожидании node_metric.
CI / test (push) Successful in 22m0s

На shared IFT в /admin/ws/metrics приходил report_created от других тестов/активности.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-16 13:13:34 +03:00
parent ee247bd7e7
commit 6d91e9cf18
+23 -6
View File
@@ -153,8 +153,8 @@ test_admin_ws_node_metrics(Url, Token) ->
ok = test_ws_send(WS, #{action => <<"ping">>}), ok = test_ws_send(WS, #{action => <<"ping">>}),
{ok, #{<<"status">> := <<"pong">>}} = test_ws_recv(WS, 3000), {ok, #{<<"status">> := <<"pong">>}} = test_ws_recv(WS, 3000),
ct:pal(" Ping/Pong OK waiting for node metric..."), ct:pal(" Ping/Pong OK waiting for node metric..."),
case test_ws_recv(WS, 15000) of case test_ws_recv_type(WS, <<"node_metric">>, 15000) of
{ok, #{<<"type">> := <<"node_metric">>, <<"data">> := MetricData}} -> {ok, #{<<"data">> := MetricData}} ->
ct:pal(" OK - Received node metric"), ct:pal(" OK - Received node metric"),
?assert(is_map(MetricData)), ?assert(is_map(MetricData)),
?assert(maps:is_key(<<"timestamp">>, MetricData)), ?assert(maps:is_key(<<"timestamp">>, MetricData)),
@@ -164,10 +164,7 @@ test_admin_ws_node_metrics(Url, Token) ->
[maps:get(<<"node">>, MetricData), [maps:get(<<"node">>, MetricData),
maps:get(<<"memory_total">>, MetricData) div 1048576]); maps:get(<<"memory_total">>, MetricData) div 1048576]);
{error, timeout} -> {error, timeout} ->
ct:pal(" WARNING: No node metric received (timeout) check monitor logs"); ct:pal(" WARNING: No node metric received (timeout) check monitor logs")
Other ->
ct:pal(" ERROR: Unexpected response: ~p", [Other]),
?assert(false, {unexpected_ws_message, Other})
end, end,
test_ws_close(WS). test_ws_close(WS).
@@ -287,6 +284,26 @@ test_ws_recv(ConnPid, Timeout) ->
{error, timeout} {error, timeout}
end. end.
%% @doc Ждём WS-сообщение заданного type, пропуская посторонние (шум на shared stand).
test_ws_recv_type(ConnPid, ExpectedType, Timeout) ->
Deadline = erlang:monotonic_time(millisecond) + Timeout,
test_ws_recv_type_loop(ConnPid, ExpectedType, Deadline).
test_ws_recv_type_loop(ConnPid, ExpectedType, Deadline) ->
Remaining = max(0, Deadline - erlang:monotonic_time(millisecond)),
case test_ws_recv(ConnPid, Remaining) of
{ok, #{<<"type">> := ExpectedType} = Msg} ->
{ok, Msg};
{ok, #{<<"type">> := ActualType} = Other} ->
ct:pal(" Skipping WS type=~s (waiting for ~s)", [ActualType, ExpectedType]),
test_ws_recv_type_loop(ConnPid, ExpectedType, Deadline);
{ok, Other} ->
ct:pal(" Skipping WS message ~p (waiting for type ~s)", [Other, ExpectedType]),
test_ws_recv_type_loop(ConnPid, ExpectedType, Deadline);
{error, timeout} = Err ->
Err
end.
test_ws_close(ConnPid) -> test_ws_close(ConnPid) ->
gun:close(ConnPid). gun:close(ConnPid).