Changeset View
Changeset View
Standalone View
Standalone View
tests/sys/aio/lio_test.c
Show First 20 Lines • Show All 205 Lines • ▼ Show 20 Lines | ATF_TC_BODY(lio_listio_empty_nowait_thread, tc) | ||||
sev.sigev_notify_attributes = NULL; | sev.sigev_notify_attributes = NULL; | ||||
ATF_REQUIRE_MSG(0 == lio_listio(LIO_NOWAIT, &list, 0, &sev), | ATF_REQUIRE_MSG(0 == lio_listio(LIO_NOWAIT, &list, 0, &sev), | ||||
"lio_listio: %s", strerror(errno)); | "lio_listio: %s", strerror(errno)); | ||||
ATF_REQUIRE_EQ(0, sem_wait(&completions)); | ATF_REQUIRE_EQ(0, sem_wait(&completions)); | ||||
ATF_REQUIRE_EQ(0, sem_destroy(&completions)); | ATF_REQUIRE_EQ(0, sem_destroy(&completions)); | ||||
} | } | ||||
/* | /* | ||||
* A simple check that the allowed operations work. | |||||
*/ | |||||
ATF_TC_WITHOUT_HEAD(lio_listio_opcodes); | |||||
ATF_TC_BODY(lio_listio_opcodes, tc) | |||||
{ | |||||
struct aiocb write_cb, read_cb, writev_cb, readv_cb; | |||||
struct aiocb *list[] = {&write_cb, &read_cb, &writev_cb, &readv_cb}; | |||||
struct iovec writev_iov[2]; | |||||
struct iovec readv_iov[2]; | |||||
char buffer[6]; | |||||
int fd; | |||||
fd = open("testfile", O_CREAT | O_RDWR); | |||||
ATF_REQUIRE_MSG(fd >= 0, "open: %s", strerror(errno)); | |||||
/* We start with numbers in a file and letters in memory... */ | |||||
ATF_CHECK_EQ(6, write(fd, "123456", 6)); | |||||
asomers: The ftruncate is not necessary, since Kyua will always run the test in a brand-new directory. | |||||
memcpy(buffer, "abcdef", 6); | |||||
/* a -> 1 */ | |||||
bzero(&write_cb, sizeof(write_cb)); | |||||
write_cb.aio_sigevent.sigev_notify = SIGEV_NONE; | |||||
write_cb.aio_fildes = fd; | |||||
write_cb.aio_lio_opcode = LIO_WRITE; | |||||
write_cb.aio_buf = &buffer[0]; | |||||
write_cb.aio_nbytes = 1; | |||||
write_cb.aio_offset = 0; | |||||
/* b <- 2 */ | |||||
bzero(&read_cb, sizeof(read_cb)); | |||||
read_cb.aio_sigevent.sigev_notify = SIGEV_NONE; | |||||
read_cb.aio_fildes = fd; | |||||
read_cb.aio_lio_opcode = LIO_READ; | |||||
read_cb.aio_buf = &buffer[1]; | |||||
read_cb.aio_nbytes = 1; | |||||
read_cb.aio_offset = 1; | |||||
/* d -> 3, c -> 4 */ | |||||
writev_iov[0].iov_base = &buffer[3]; | |||||
writev_iov[0].iov_len = 1; | |||||
writev_iov[1].iov_base = &buffer[2]; | |||||
writev_iov[1].iov_len = 1; | |||||
bzero(&writev_cb, sizeof(writev_cb)); | |||||
writev_cb.aio_sigevent.sigev_notify = SIGEV_NONE; | |||||
writev_cb.aio_fildes = fd; | |||||
writev_cb.aio_lio_opcode = LIO_WRITEV; | |||||
writev_cb.aio_iov = &writev_iov; | |||||
writev_cb.aio_iovcnt = 2; | |||||
writev_cb.aio_offset = 2; | |||||
/* f <- 5, e <- 6 */ | |||||
readv_iov[0].iov_base = &buffer[5]; | |||||
readv_iov[0].iov_len = 1; | |||||
readv_iov[1].iov_base = &buffer[4]; | |||||
readv_iov[1].iov_len = 1; | |||||
bzero(&readv_cb, sizeof(readv_cb)); | |||||
readv_cb.aio_sigevent.sigev_notify = SIGEV_NONE; | |||||
readv_cb.aio_fildes = fd; | |||||
readv_cb.aio_lio_opcode = LIO_READV; | |||||
readv_cb.aio_iov = &readv_iov; | |||||
readv_cb.aio_iovcnt = 2; | |||||
readv_cb.aio_offset = 4; | |||||
ATF_CHECK_EQ(0, lio_listio(LIO_WAIT, list, nitems(list), NULL)); | |||||
ATF_CHECK_EQ(0, aio_error(&write_cb)); | |||||
ATF_CHECK_EQ(1, aio_return(&write_cb)); | |||||
ATF_CHECK_EQ(0, aio_error(&read_cb)); | |||||
ATF_CHECK_EQ(1, aio_return(&read_cb)); | |||||
ATF_CHECK_EQ(0, aio_error(&writev_cb)); | |||||
ATF_CHECK_EQ(2, aio_return(&writev_cb)); | |||||
ATF_CHECK_EQ(0, aio_error(&readv_cb)); | |||||
ATF_CHECK_EQ(2, aio_return(&readv_cb)); | |||||
ATF_CHECK_EQ(0, memcmp(buffer, "a2cd65", 6)); | |||||
ATF_CHECK_EQ(6, pread(fd, buffer, 6, 0)); | |||||
ATF_CHECK_EQ(0, memcmp(buffer, "a2dc56", 6)); | |||||
close(fd); | |||||
} | |||||
/* | |||||
* Only select opcodes are allowed with lio_listio | * Only select opcodes are allowed with lio_listio | ||||
*/ | */ | ||||
ATF_TC_WITHOUT_HEAD(lio_listio_invalid_opcode); | ATF_TC_WITHOUT_HEAD(lio_listio_invalid_opcode); | ||||
ATF_TC_BODY(lio_listio_invalid_opcode, tc) | ATF_TC_BODY(lio_listio_invalid_opcode, tc) | ||||
{ | { | ||||
struct aiocb sync_cb, mlock_cb, writev_cb, readv_cb; | struct aiocb sync_cb, mlock_cb; | ||||
struct aiocb *list[] = {&sync_cb, &mlock_cb, &writev_cb, &readv_cb}; | struct aiocb *list[] = {&sync_cb, &mlock_cb}; | ||||
struct iovec iov; | |||||
int fd; | int fd; | ||||
fd = open("testfile", O_CREAT | O_RDWR); | fd = open("testfile", O_CREAT | O_RDWR); | ||||
ATF_REQUIRE_MSG(fd >= 0, "open: %s", strerror(errno)); | ATF_REQUIRE_MSG(fd >= 0, "open: %s", strerror(errno)); | ||||
bzero(&sync_cb, sizeof(sync_cb)); | bzero(&sync_cb, sizeof(sync_cb)); | ||||
sync_cb.aio_fildes = fd; | sync_cb.aio_fildes = fd; | ||||
sync_cb.aio_lio_opcode = LIO_SYNC; | sync_cb.aio_lio_opcode = LIO_SYNC; | ||||
bzero(&mlock_cb, sizeof(mlock_cb)); | bzero(&mlock_cb, sizeof(mlock_cb)); | ||||
mlock_cb.aio_lio_opcode = LIO_MLOCK; | mlock_cb.aio_lio_opcode = LIO_MLOCK; | ||||
iov.iov_base = NULL; | |||||
iov.iov_len = 0; | |||||
bzero(&readv_cb, sizeof(readv_cb)); | |||||
readv_cb.aio_fildes = fd; | |||||
readv_cb.aio_lio_opcode = LIO_READV; | |||||
readv_cb.aio_iov = &iov; | |||||
readv_cb.aio_iovcnt = 1; | |||||
bzero(&writev_cb, sizeof(writev_cb)); | |||||
writev_cb.aio_fildes = fd; | |||||
writev_cb.aio_lio_opcode = LIO_WRITEV; | |||||
writev_cb.aio_iov = &iov; | |||||
writev_cb.aio_iovcnt = 1; | |||||
ATF_CHECK_ERRNO(EIO, lio_listio(LIO_WAIT, list, nitems(list), NULL)); | ATF_CHECK_ERRNO(EIO, lio_listio(LIO_WAIT, list, nitems(list), NULL)); | ||||
ATF_CHECK_EQ(EINVAL, aio_error(&sync_cb)); | ATF_CHECK_EQ(EINVAL, aio_error(&sync_cb)); | ||||
ATF_CHECK_ERRNO(EINVAL, aio_return(&sync_cb) < 0); | ATF_CHECK_ERRNO(EINVAL, aio_return(&sync_cb) < 0); | ||||
ATF_CHECK_EQ(EINVAL, aio_error(&mlock_cb)); | ATF_CHECK_EQ(EINVAL, aio_error(&mlock_cb)); | ||||
ATF_CHECK_ERRNO(EINVAL, aio_return(&mlock_cb) < 0); | ATF_CHECK_ERRNO(EINVAL, aio_return(&mlock_cb) < 0); | ||||
ATF_CHECK_EQ(EINVAL, aio_error(&readv_cb)); | |||||
ATF_CHECK_ERRNO(EINVAL, aio_return(&readv_cb) < 0); | close(fd); | ||||
ATF_CHECK_EQ(EINVAL, aio_error(&writev_cb)); | |||||
ATF_CHECK_ERRNO(EINVAL, aio_return(&writev_cb) < 0); | |||||
} | } | ||||
ATF_TP_ADD_TCS(tp) | ATF_TP_ADD_TCS(tp) | ||||
{ | { | ||||
ATF_TP_ADD_TC(tp, lio_listio_eagain_kevent); | ATF_TP_ADD_TC(tp, lio_listio_eagain_kevent); | ||||
ATF_TP_ADD_TC(tp, lio_listio_empty_nowait); | ATF_TP_ADD_TC(tp, lio_listio_empty_nowait); | ||||
ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_kevent); | ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_kevent); | ||||
ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_signal); | ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_signal); | ||||
ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_thread); | ATF_TP_ADD_TC(tp, lio_listio_empty_nowait_thread); | ||||
ATF_TP_ADD_TC(tp, lio_listio_empty_wait); | ATF_TP_ADD_TC(tp, lio_listio_empty_wait); | ||||
ATF_TP_ADD_TC(tp, lio_listio_opcodes); | |||||
ATF_TP_ADD_TC(tp, lio_listio_invalid_opcode); | ATF_TP_ADD_TC(tp, lio_listio_invalid_opcode); | ||||
return (atf_no_error()); | return (atf_no_error()); | ||||
} | } |
The ftruncate is not necessary, since Kyua will always run the test in a brand-new directory.