|
|
#include "../../unity/unity.h" |
|
|
#include <unistd.h> |
|
|
#include <fcntl.h> |
|
|
#include <errno.h> |
|
|
#include <stdlib.h> |
|
|
#include <stdio.h> |
|
|
#include <string.h> |
|
|
#include <signal.h> |
|
|
#include <sys/types.h> |
|
|
#include <sys/stat.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int make_tempfile(char *tmpl, size_t tmpls) |
|
|
{ |
|
|
|
|
|
const char *prefix = "/tmp/dd_ifdatasync_test_XXXXXX"; |
|
|
size_t need = strlen(prefix) + 1; |
|
|
if (tmpls < need) return -1; |
|
|
strcpy(tmpl, prefix); |
|
|
int fd = mkstemp(tmpl); |
|
|
return fd; |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
|
|
|
|
|
|
extern int status_level; |
|
|
extern sigset_t caught_signals; |
|
|
extern volatile sig_atomic_t interrupt_signal; |
|
|
extern volatile sig_atomic_t info_signal_count; |
|
|
extern int progress_len; |
|
|
|
|
|
status_level = 2; |
|
|
sigemptyset(&caught_signals); |
|
|
interrupt_signal = 0; |
|
|
info_signal_count = 0; |
|
|
progress_len = 0; |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void test_ifdatasync_valid_fd_returns_zero(void) |
|
|
{ |
|
|
char path[128]; |
|
|
int fd = make_tempfile(path, sizeof(path)); |
|
|
TEST_ASSERT_TRUE_MESSAGE(fd >= 0, "mkstemp failed to create temp file"); |
|
|
|
|
|
|
|
|
const char *data = "hello"; |
|
|
ssize_t w = write(fd, data, (size_t)5); |
|
|
TEST_ASSERT_TRUE_MESSAGE(w == 5, "write to temp file failed"); |
|
|
|
|
|
|
|
|
errno = 0; |
|
|
int ret = ifdatasync(fd); |
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_INT_MESSAGE(0, ret, "ifdatasync failed on regular file"); |
|
|
|
|
|
|
|
|
close(fd); |
|
|
unlink(path); |
|
|
} |
|
|
|
|
|
|
|
|
void test_ifdatasync_invalid_fd_sets_errno_and_returns_minus1(void) |
|
|
{ |
|
|
errno = 0; |
|
|
int ret = ifdatasync(-1); |
|
|
TEST_ASSERT_EQUAL_INT(-1, ret); |
|
|
TEST_ASSERT_EQUAL_INT(EBADF, errno); |
|
|
} |
|
|
|
|
|
|
|
|
void test_ifdatasync_process_signals_consumes_info_signal(void) |
|
|
{ |
|
|
|
|
|
char path[128]; |
|
|
int fd = make_tempfile(path, sizeof(path)); |
|
|
TEST_ASSERT_TRUE_MESSAGE(fd >= 0, "mkstemp failed to create temp file"); |
|
|
|
|
|
const char *data = "abc"; |
|
|
ssize_t w = write(fd, data, (size_t)3); |
|
|
TEST_ASSERT_TRUE_MESSAGE(w == 3, "write to temp file failed"); |
|
|
|
|
|
|
|
|
extern volatile sig_atomic_t info_signal_count; |
|
|
extern sigset_t caught_signals; |
|
|
extern int status_level; |
|
|
|
|
|
sigemptyset(&caught_signals); |
|
|
status_level = 2; |
|
|
|
|
|
info_signal_count = 1; |
|
|
|
|
|
errno = 0; |
|
|
int ret = ifdatasync(fd); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(0, ret); |
|
|
TEST_ASSERT_EQUAL_INT(0, info_signal_count); |
|
|
|
|
|
close(fd); |
|
|
unlink(path); |
|
|
} |
|
|
|
|
|
int main(void) |
|
|
{ |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_ifdatasync_valid_fd_returns_zero); |
|
|
RUN_TEST(test_ifdatasync_invalid_fd_sets_errno_and_returns_minus1); |
|
|
RUN_TEST(test_ifdatasync_process_signals_consumes_info_signal); |
|
|
return UNITY_END(); |
|
|
} |