| #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(); |
| } |