aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelen <jjelen@redhat.com>2018-09-18 15:28:48 +0200
committerAndreas Schneider <asn@cryptomilk.org>2018-09-18 18:07:27 +0200
commitc15ad753a7083e3886891f0a1db7cd809ad23582 (patch)
treee280d52c46a119ca2cdc85c9fc56b8b15a131814
parent63aa274f4b7ee34f108f284d63a1e921308ef628 (diff)
downloadlibssh-c15ad753a7083e3886891f0a1db7cd809ad23582.tar.gz
libssh-c15ad753a7083e3886891f0a1db7cd809ad23582.tar.xz
libssh-c15ad753a7083e3886891f0a1db7cd809ad23582.zip
tests: Wait for the server to start
The previous timeout of 500 ms was not enough on slower machines or while running the tests under valgrind. On much faster machines the sleep() was bringing unnecessary overhead. This method opens simple connection to the server verifying it is ready to accept the connection from the test for 5 seconds. It the server does not start until then, it fails the tests during initialization, rather than leaving the cases to run against missing server. Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
-rw-r--r--tests/CMakeLists.txt8
-rw-r--r--tests/ssh_ping.c67
-rw-r--r--tests/torture.c26
3 files changed, 98 insertions, 3 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 3fb68738..ca9f89c5 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -31,6 +31,9 @@ add_library(${TORTURE_LIBRARY}
torture_pki.c
torture_cmocka.c)
target_link_libraries(${TORTURE_LIBRARY} ${TORTURE_LINK_LIBRARIES})
+target_compile_options(${TORTURE_LIBRARY} PRIVATE
+ -DSSH_PING_EXECUTABLE="${CMAKE_CURRENT_BINARY_DIR}/ssh_ping"
+)
if (ARGP_LIBRARY)
target_link_libraries(${TORTURE_LIBRARY}
@@ -87,6 +90,11 @@ if (CLIENT_TESTING)
chroot_wrapper
)
+ # ssh_ping
+ add_executable(ssh_ping ssh_ping.c)
+ target_compile_options(ssh_ping PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
+ target_link_libraries(ssh_ping ${LIBSSH_SHARED_LIBRARY})
+
# homedir will be used in passwd
set(HOMEDIR ${CMAKE_CURRENT_BINARY_DIR}/home)
diff --git a/tests/ssh_ping.c b/tests/ssh_ping.c
new file mode 100644
index 00000000..c9b5dad5
--- /dev/null
+++ b/tests/ssh_ping.c
@@ -0,0 +1,67 @@
+/* ssh_ping.c */
+/*
+Copyright 2018 Red Hat, Inc
+
+Author: Jakub Jelen <jjelen@redhat.com>
+
+This file is part of the SSH Library
+
+You are free to copy this file, modify it in any way, consider it being public
+domain. This does not apply to the rest of the library though, but it is
+allowed to cut-and-paste working code from this file to any license of
+program.
+The goal is to show the API in action. It's not a reference on how terminal
+clients must be made or how a client should react.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <libssh/libssh.h>
+
+int main(int argc, char **argv)
+{
+ const char *banner = NULL;
+ ssh_session session = NULL;
+ int rc = 1;
+
+ if (argc < 1 || argv[1] == NULL) {
+ fprintf(stderr, "Error: Need an argument (hostname)\n");
+ goto out;
+ }
+
+ session = ssh_new();
+ if (session == NULL) {
+ goto out;
+ }
+
+ rc = ssh_options_set(session, SSH_OPTIONS_HOST, argv[1]);
+ if (rc < 0) {
+ goto out;
+ }
+
+ /* The automatic username is not available under uid wrapper */
+ rc = ssh_options_set(session, SSH_OPTIONS_USER, "ping");
+ if (rc < 0) {
+ goto out;
+ }
+
+ rc = ssh_connect(session);
+ if (rc != SSH_OK) {
+ fprintf(stderr, "Connection failed : %s\n", ssh_get_error(session));
+ goto out;
+ }
+
+ banner = ssh_get_serverbanner(session);
+ if (banner == NULL) {
+ fprintf(stderr, "Did not receive SSH banner\n");
+ goto out;
+ }
+
+ printf("%s", banner);
+ rc = 0;
+
+out:
+ ssh_free(session);
+ return rc;
+}
+
diff --git a/tests/torture.c b/tests/torture.c
index 95da3c67..23b1d1fd 100644
--- a/tests/torture.c
+++ b/tests/torture.c
@@ -42,6 +42,7 @@
#include "torture.h"
#include "torture_key.h"
+#include "libssh/misc.h"
/* for pattern matching */
#include "match.c"
@@ -696,6 +697,24 @@ static void torture_setup_create_sshd_config(void **state)
torture_write_file(s->srv_config, sshd_config);
}
+static int torture_wait_for_daemon(unsigned int seconds)
+{
+ struct ssh_timestamp start;
+ int rc;
+
+ ssh_timestamp_init(&start);
+
+ while (!ssh_timeout_elapsed(&start, seconds * 1000)) {
+ rc = system(SSH_PING_EXECUTABLE " " TORTURE_SSH_SERVER);
+ if (rc == 0) {
+ return 0;
+ }
+ /* Wait 200 ms before retrying */
+ usleep(200 * 1000);
+ }
+ return 1;
+}
+
void torture_setup_sshd_server(void **state)
{
struct torture_state *s;
@@ -718,11 +737,12 @@ void torture_setup_sshd_server(void **state)
rc = system(sshd_start_cmd);
assert_return_code(rc, errno);
- /* Give the process 500ms time to initialize and start */
- usleep(500 * 1000);
-
setenv("SOCKET_WRAPPER_DEFAULT_IFACE", "21", 1);
unsetenv("PAM_WRAPPER");
+
+ /* Wait until the sshd is ready to accept connections */
+ rc = torture_wait_for_daemon(5);
+ assert_int_equal(rc, 0);
}
void torture_teardown_socket_dir(void **state)