Blame tests/client/torture_sftp_fsync.c

Packit Service 31306d
#define LIBSSH_STATIC
Packit Service 31306d
Packit Service 31306d
#include "config.h"
Packit Service 31306d
Packit Service 31306d
#include "torture.h"
Packit Service 31306d
#include "sftp.c"
Packit Service 31306d
Packit Service 31306d
#include <sys/types.h>
Packit Service 31306d
#include <pwd.h>
Packit Service 31306d
#include <errno.h>
Packit Service 31306d
Packit Service 31306d
#define MAX_XFER_BUF_SIZE 16384
Packit Service 31306d
Packit Service 31306d
static int sshd_setup(void **state)
Packit Service 31306d
{
Packit Service 31306d
    torture_setup_sshd_server(state, false);
Packit Service 31306d
Packit Service 31306d
    return 0;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
static int sshd_teardown(void **state) {
Packit Service 31306d
    torture_teardown_sshd_server(state);
Packit Service 31306d
Packit Service 31306d
    return 0;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
static int session_setup(void **state)
Packit Service 31306d
{
Packit Service 31306d
    struct torture_state *s = *state;
Packit Service 31306d
    struct passwd *pwd;
Packit Service 31306d
    int rc;
Packit Service 31306d
Packit Service 31306d
    pwd = getpwnam("bob");
Packit Service 31306d
    assert_non_null(pwd);
Packit Service 31306d
Packit Service 31306d
    rc = setuid(pwd->pw_uid);
Packit Service 31306d
    assert_return_code(rc, errno);
Packit Service 31306d
Packit Service 31306d
    s->ssh.session = torture_ssh_session(s,
Packit Service 31306d
                                         TORTURE_SSH_SERVER,
Packit Service 31306d
                                         NULL,
Packit Service 31306d
                                         TORTURE_SSH_USER_ALICE,
Packit Service 31306d
                                         NULL);
Packit Service 31306d
    assert_non_null(s->ssh.session);
Packit Service 31306d
Packit Service 31306d
    s->ssh.tsftp = torture_sftp_session(s->ssh.session);
Packit Service 31306d
    assert_non_null(s->ssh.tsftp);
Packit Service 31306d
Packit Service 31306d
    return 0;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
static int session_teardown(void **state)
Packit Service 31306d
{
Packit Service 31306d
    struct torture_state *s = *state;
Packit Service 31306d
Packit Service 31306d
    torture_rmdirs(s->ssh.tsftp->testdir);
Packit Service 31306d
    torture_sftp_close(s->ssh.tsftp);
Packit Service 31306d
    ssh_disconnect(s->ssh.session);
Packit Service 31306d
    ssh_free(s->ssh.session);
Packit Service 31306d
Packit Service 31306d
    return 0;
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
static void torture_sftp_fsync(void **state) {
Packit Service 31306d
    struct torture_state *s = *state;
Packit Service 31306d
    struct torture_sftp *t = s->ssh.tsftp;
Packit Service 31306d
Packit Service 31306d
    char libssh_tmp_file[] = "/tmp/libssh_sftp_test_XXXXXX";
Packit Service 31306d
    char buf[MAX_XFER_BUF_SIZE] = {0};
Packit Service 31306d
    char buf_verify[MAX_XFER_BUF_SIZE] = {0};
Packit Service 31306d
    size_t count;
Packit Service 31306d
    size_t bytesread;
Packit Service 31306d
    ssize_t byteswritten;
Packit Service 31306d
    int fd;
Packit Service 31306d
    sftp_file file;
Packit Service 31306d
    mode_t mask;
Packit Service 31306d
    int rc;
Packit Service 31306d
    FILE *fp;
Packit Service 31306d
    struct stat sb;
Packit Service 31306d
Packit Service 31306d
    mask = umask(S_IRWXO | S_IRWXG);
Packit Service 31306d
    fd = mkstemp(libssh_tmp_file);
Packit Service 31306d
    umask(mask);
Packit Service 31306d
    assert_return_code(fd, errno);
Packit Service 31306d
    close(fd);
Packit Service 31306d
    unlink(libssh_tmp_file);
Packit Service 31306d
Packit Service 31306d
    file = sftp_open(t->sftp, libssh_tmp_file, O_WRONLY | O_CREAT, 0600);
Packit Service 31306d
    assert_non_null(file);
Packit Service 31306d
Packit Service 31306d
    rc = lstat(libssh_tmp_file, &sb);
Packit Service 31306d
    assert_return_code(rc, errno);
Packit Service 31306d
Packit Service 31306d
    snprintf(buf, sizeof(buf), "libssh fsync test\n");
Packit Service 31306d
    count = strlen(buf) + 1;
Packit Service 31306d
Packit Service 31306d
    byteswritten = sftp_write(file, buf, count);
Packit Service 31306d
    assert_int_equal(byteswritten, count);
Packit Service 31306d
Packit Service 31306d
    rc = sftp_fsync(file);
Packit Service 31306d
    assert_return_code(rc, errno);
Packit Service 31306d
Packit Service 31306d
    fp = fopen(libssh_tmp_file, "r");
Packit Service 31306d
    assert_non_null(fp);
Packit Service 31306d
Packit Service 31306d
    rc = fstat(fileno(fp), &sb);
Packit Service 31306d
    assert_return_code(rc, errno);
Packit Service 31306d
Packit Service 31306d
    bytesread = fread(buf_verify, sizeof(buf_verify), 1, fp);
Packit Service 31306d
    if (bytesread == 0) {
Packit Service 31306d
        if (!feof(fp)) {
Packit Service 31306d
            assert_int_equal(bytesread, count);
Packit Service 31306d
        }
Packit Service 31306d
    }
Packit Service 31306d
    assert_string_equal(buf, buf_verify);
Packit Service 31306d
Packit Service 31306d
    sftp_close(file);
Packit Service 31306d
    fclose(fp);
Packit Service 31306d
    unlink(libssh_tmp_file);
Packit Service 31306d
}
Packit Service 31306d
Packit Service 31306d
int torture_run_tests(void) {
Packit Service 31306d
    int rc;
Packit Service 31306d
    struct CMUnitTest tests[] = {
Packit Service 31306d
        cmocka_unit_test_setup_teardown(torture_sftp_fsync,
Packit Service 31306d
                                        session_setup,
Packit Service 31306d
                                        session_teardown)
Packit Service 31306d
    };
Packit Service 31306d
Packit Service 31306d
    ssh_init();
Packit Service 31306d
Packit Service 31306d
    torture_filter_tests(tests);
Packit Service 31306d
    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);
Packit Service 31306d
    ssh_finalize();
Packit Service 31306d
Packit Service 31306d
    return rc;
Packit Service 31306d
}