aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2018-09-04 14:22:40 +0200
committerAndreas Schneider <asn@cryptomilk.org>2018-09-10 07:34:34 +0200
commitb3ee4d0e3a294e8f45c97d4ad0455e49ed7763f0 (patch)
tree4fcbe293408c175249c3e7268bf9097a930becc5
parentceecd3fd6f8e74bf8d4e9d3c757dc8a531971fe7 (diff)
downloadlibssh-master-sftp.tar.gz
libssh-master-sftp.tar.xz
libssh-master-sftp.zip
tests: Add a sftp benchmark test for write/readmaster-sftp
The tests writes and reads a file of 256M. Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
-rw-r--r--DefineOptions.cmake1
-rw-r--r--tests/client/CMakeLists.txt7
-rw-r--r--tests/client/torture_sftp_benchmark.c137
3 files changed, 144 insertions, 1 deletions
diff --git a/DefineOptions.cmake b/DefineOptions.cmake
index 0834acd9..767d7a3f 100644
--- a/DefineOptions.cmake
+++ b/DefineOptions.cmake
@@ -29,6 +29,7 @@ endif (WITH_ZLIB)
if(WITH_BENCHMARKS)
set(UNIT_TESTING ON)
+ set(CLIENT_TESTING ON)
endif(WITH_BENCHMARKS)
if (WITH_STATIC_LIB)
diff --git a/tests/client/CMakeLists.txt b/tests/client/CMakeLists.txt
index cce25d20..5e92c646 100644
--- a/tests/client/CMakeLists.txt
+++ b/tests/client/CMakeLists.txt
@@ -15,13 +15,18 @@ set(LIBSSH_CLIENT_TESTS
torture_request_env)
if (WITH_SFTP)
+ if (WITH_BENCHMARKS)
+ set(SFTP_BENCHMARK_TESTS
+ torture_sftp_benchmark)
+ endif()
set(LIBSSH_CLIENT_TESTS
${LIBSSH_CLIENT_TESTS}
torture_sftp_ext
torture_sftp_canonicalize_path
torture_sftp_dir
torture_sftp_read
- torture_sftp_fsync)
+ torture_sftp_fsync
+ ${SFTP_BENCHMARK_TESTS})
endif (WITH_SFTP)
foreach(_CLI_TEST ${LIBSSH_CLIENT_TESTS})
diff --git a/tests/client/torture_sftp_benchmark.c b/tests/client/torture_sftp_benchmark.c
new file mode 100644
index 00000000..8ca44c38
--- /dev/null
+++ b/tests/client/torture_sftp_benchmark.c
@@ -0,0 +1,137 @@
+#define LIBSSH_STATIC
+
+#include "config.h"
+
+#include "torture.h"
+#include "sftp.c"
+
+#include <sys/types.h>
+#include <pwd.h>
+#include <errno.h>
+
+#define MAX_XFER_BUF_SIZE 16384
+
+static int sshd_setup(void **state)
+{
+ torture_setup_sshd_server(state);
+
+ return 0;
+}
+
+static int sshd_teardown(void **state) {
+ torture_teardown_sshd_server(state);
+
+ return 0;
+}
+
+static int session_setup(void **state)
+{
+ struct torture_state *s = *state;
+ struct passwd *pwd;
+ int rc;
+
+ pwd = getpwnam("bob");
+ assert_non_null(pwd);
+
+ rc = setuid(pwd->pw_uid);
+ assert_return_code(rc, errno);
+
+ s->ssh.session = torture_ssh_session(TORTURE_SSH_SERVER,
+ NULL,
+ TORTURE_SSH_USER_ALICE,
+ NULL);
+ assert_non_null(s->ssh.session);
+
+ s->ssh.tsftp = torture_sftp_session(s->ssh.session);
+ assert_non_null(s->ssh.tsftp);
+
+ return 0;
+}
+
+static int session_teardown(void **state)
+{
+ struct torture_state *s = *state;
+
+ torture_rmdirs(s->ssh.tsftp->testdir);
+ torture_sftp_close(s->ssh.tsftp);
+ ssh_disconnect(s->ssh.session);
+ ssh_free(s->ssh.session);
+
+ return 0;
+}
+
+static void torture_sftp_benchmark_write_read(void **state)
+{
+ struct torture_state *s = *state;
+ struct torture_sftp *t = s->ssh.tsftp;
+ sftp_session sftp = t->sftp;
+ ssh_session session = s->ssh.session;
+ sftp_file file = NULL;
+ struct stat sb = {
+ .st_size = 0,
+ };
+ uint8_t buf_16k[MAX_XFER_BUF_SIZE];
+ char local_path[1024] = {0};
+ char *remote_path = NULL;
+ ssize_t bwritten, nread;
+ size_t i;
+ int rc;
+
+ memset(buf_16k, 'X', sizeof(buf_16k));
+
+ snprintf(local_path, sizeof(local_path), "%s/256M.dat", t->testdir);
+
+ remote_path = sftp_canonicalize_path(sftp, local_path);
+ assert_non_null(remote_path);
+
+ file = sftp_open(sftp, remote_path, O_CREAT|O_WRONLY|O_TRUNC, 0644);
+ assert_non_null(file);
+
+ /* Write 1G */
+ for (i = 0; i < 0x4000; i++) {
+ bwritten = sftp_write(file, buf_16k, sizeof(buf_16k));
+ assert_int_equal(bwritten, sizeof(buf_16k));
+ }
+
+ rc = sftp_close(file);
+ assert_ssh_return_code(session, rc);
+
+ /* Check that 1G has been written */
+ rc = stat(local_path, &sb);
+ assert_int_equal(sb.st_size, 0x10000000);
+
+ file = sftp_open(sftp, remote_path, O_RDONLY, 0);
+ assert_non_null(file);
+
+ for (;;) {
+ nread = sftp_read(file, buf_16k, sizeof(buf_16k));
+ if (nread == 0) {
+ break; /* EOF */
+ }
+ assert_int_equal(nread, sizeof(buf_16k));
+ }
+
+ rc = sftp_close(file);
+ assert_ssh_return_code(session, rc);
+
+ SSH_STRING_FREE_CHAR(remote_path);
+ unlink(local_path);
+}
+
+int torture_run_tests(void)
+{
+ int rc;
+ struct CMUnitTest tests[] = {
+ cmocka_unit_test_setup_teardown(torture_sftp_benchmark_write_read,
+ session_setup,
+ session_teardown)
+ };
+
+ ssh_init();
+
+ torture_filter_tests(tests);
+ rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);
+ ssh_finalize();
+
+ return rc;
+}