1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
#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, false);
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(s,
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};
ssize_t bwritten, nread;
size_t i;
int rc;
memset(buf_16k, 'X', sizeof(buf_16k));
snprintf(local_path, sizeof(local_path), "%s/128M.dat", t->testdir);
file = sftp_open(sftp, local_path, O_CREAT|O_WRONLY|O_TRUNC, 0644);
assert_non_null(file);
/* Write 128M */
for (i = 0; i < 0x2000; 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 128M has been written */
rc = stat(local_path, &sb);
assert_int_equal(sb.st_size, 0x8000000);
file = sftp_open(sftp, local_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);
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;
}
|