From 0565f09a72265aeb035b7f3509685a07782c2f65 Mon Sep 17 00:00:00 2001 From: Aleksey Sabilin Date: Mon, 24 Aug 2026 00:05:25 +0300 Subject: [PATCH] =?UTF-8?q?test(e2e):=20=D1=80=D0=B5=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=B8=20WS-=D0=BA=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=D0=B0=20?= =?UTF-8?q?=E2=80=94=20=D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B8=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B0=D1=83?= =?UTF-8?q?=D1=82=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20deploy-stage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В run 621 после фикса OOM остался один упавший кейс: admin_websocket_tests падал на gun:await_up(5000) — одиночный TCP/TLS-таймаут в окно стабилизации traefik/бэкенда сразу после рестарта контейнера. ws_connect_up/4 теперь ретраит коннект 3 раза с паузой 2s; одинаково в admins- и users-хелперах. --- test/api/admins/admin_websocket_tests.erl | 28 +++++++++++++++++++++-- test/api/users/user_websocket_tests.erl | 28 +++++++++++++++++++++-- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/test/api/admins/admin_websocket_tests.erl b/test/api/admins/admin_websocket_tests.erl index d829faf..c27f022 100644 --- a/test/api/admins/admin_websocket_tests.erl +++ b/test/api/admins/admin_websocket_tests.erl @@ -205,8 +205,7 @@ test_ws_connect_debug(Url, Token) -> ct:pal(" Host: ~s", [Host]), ct:pal(" Port: ~p", [Port]), ct:pal(" Path: ~s", [Path]), - {ok, ConnPid} = gun:open(Host, Port, Opts), - {ok, http} = gun:await_up(ConnPid, 5000), + ConnPid = ws_connect_up(Host, Port, Opts, 3), Headers = [{<<"host">>, list_to_binary(Host ++ ":" ++ integer_to_list(Port))}], StreamRef = gun:ws_upgrade(ConnPid, Path, Headers), receive @@ -243,6 +242,31 @@ test_ws_connect_debug(Url, Token) -> {error, timeout} end. +%% @doc TCP/TLS-коннект с ретраями: сразу после deploy-stage traefik/бэкенд +%% могут быть нестабильны, и одиночный 5s-таймаут ронял сьюит +%% (badmatch {error,timeout}). +-spec ws_connect_up(string(), integer(), map(), non_neg_integer()) -> pid(). +ws_connect_up(Host, Port, Opts, Retries) -> + Result = + case gun:open(Host, Port, Opts) of + {ok, ConnPid} -> + case gun:await_up(ConnPid, 5000) of + {ok, http} -> {ok, ConnPid}; + {error, Reason} -> gun:close(ConnPid), {error, Reason} + end; + {error, Reason} -> {error, Reason} + end, + case Result of + {ok, Pid} -> Pid; + {error, Err} when Retries > 1 -> + ct:pal(" WS connect failed (~p), retry in 2s (~p attempts left)", + [Err, Retries - 1]), + timer:sleep(2000), + ws_connect_up(Host, Port, Opts, Retries - 1); + {error, Err} -> + error({ws_connect_failed, Err}) + end. + test_ws_send(ConnPid, Data) -> Msg = jsx:encode(Data), ct:pal(" Sending: ~s", [Msg]), diff --git a/test/api/users/user_websocket_tests.erl b/test/api/users/user_websocket_tests.erl index 4a7107f..f8171de 100644 --- a/test/api/users/user_websocket_tests.erl +++ b/test/api/users/user_websocket_tests.erl @@ -91,8 +91,7 @@ test_ws_connect_debug(Url, Token) -> ct:pal(" Host: ~s", [Host]), ct:pal(" Port: ~p", [Port]), ct:pal(" Path: ~s", [Path]), - {ok, ConnPid} = gun:open(Host, Port, Opts), - {ok, http} = gun:await_up(ConnPid, 5000), + ConnPid = ws_connect_up(Host, Port, Opts, 3), Headers = [{<<"host">>, list_to_binary(Host ++ ":" ++ integer_to_list(Port))}], StreamRef = gun:ws_upgrade(ConnPid, Path, Headers), receive @@ -129,6 +128,31 @@ test_ws_connect_debug(Url, Token) -> {error, timeout} end. +%% @doc TCP/TLS-коннект с ретраями: сразу после deploy-stage traefik/бэкенд +%% могут быть нестабильны, и одиночный 5s-таймаут ронял сьюит +%% (badmatch {error,timeout}). +-spec ws_connect_up(string(), integer(), map(), non_neg_integer()) -> pid(). +ws_connect_up(Host, Port, Opts, Retries) -> + Result = + case gun:open(Host, Port, Opts) of + {ok, ConnPid} -> + case gun:await_up(ConnPid, 5000) of + {ok, http} -> {ok, ConnPid}; + {error, Reason} -> gun:close(ConnPid), {error, Reason} + end; + {error, Reason} -> {error, Reason} + end, + case Result of + {ok, Pid} -> Pid; + {error, Err} when Retries > 1 -> + ct:pal(" WS connect failed (~p), retry in 2s (~p attempts left)", + [Err, Retries - 1]), + timer:sleep(2000), + ws_connect_up(Host, Port, Opts, Retries - 1); + {error, Err} -> + error({ws_connect_failed, Err}) + end. + test_ws_send(ConnPid, Data) -> Msg = jsx:encode(Data), ct:pal(" Sending: ~s", [Msg]),