diff --git a/tests/runner.c b/tests/runner.c index e743a787..3077416f 100644 --- a/tests/runner.c +++ b/tests/runner.c @@ -34,15 +34,32 @@ int main(void) { - int exit_code = 1; - int skipped, rc; - LIBSSH2_SESSION *session = start_session_fixture(&skipped, &rc); - if(session) - exit_code = (test(session) == 0) ? 0 : 1; - else if(skipped) { - fprintf(stderr, "Test skipped.\n"); - exit_code = 0; - } + int exit_code; + /* Retry tests to mitigate flaky failures */ + int retries = 2, retry = 0; + + do { + int skipped, rc; + LIBSSH2_SESSION *session = start_session_fixture(&skipped, &rc); + if(session) + exit_code = (test(session) == 0) ? 0 : 1; + else if(skipped) { + fprintf(stderr, "Test skipped.\n"); + exit_code = 0; + } + else + exit_code = 1; + stop_session_fixture(exit_code); + /* Retry: + 'libssh2_session_handshake failed (-43): Failed getting banner' */ + if(exit_code == 0 || rc != LIBSSH2_ERROR_SOCKET_RECV || + ++retry > retries) { + break; + } + fprintf(stderr, "Test failed (%d). Retrying... %d / %d\n", + rc, retry, retries); + } while(1); + stop_session_fixture(exit_code); return exit_code; }