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]),