diff options
author | Jens Axboe <axboe@kernel.dk> | 2020-01-07 13:17:05 -0700 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-01-07 13:17:05 -0700 |
commit | 46f92335793e70363c296b4c997da7a808959a49 (patch) | |
tree | f50eb504228eca8ccd956a35a710d98a5cf2d41a | |
parent | 26a33484411e9242520d3967eda1e69f546e3806 (diff) | |
download | liburing-46f92335793e70363c296b4c997da7a808959a49.tar.gz liburing-46f92335793e70363c296b4c997da7a808959a49.tar.bz2 |
Add buffered short read test case
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | test/Makefile | 5 | ||||
-rw-r--r-- | test/short-read.c | 88 |
2 files changed, 91 insertions, 2 deletions
diff --git a/test/Makefile b/test/Makefile index 2d7aa8e..6685608 100644 --- a/test/Makefile +++ b/test/Makefile @@ -18,7 +18,8 @@ all_targets += poll poll-cancel ring-leak fsync io_uring_setup io_uring_register poll-link accept-link fixed-link poll-cancel-ton teardowns \ poll-many b5837bd5311d-test accept-test d77a67ed5f27-test \ connect 7ad0e4b2f83c-test submit-reuse fallocate open-close \ - file-update statx accept-reuse poll-v-poll fadvise madvise + file-update statx accept-reuse poll-v-poll fadvise madvise \ + short-read include ../Makefile.quiet @@ -44,7 +45,7 @@ test_srcs := poll.c poll-cancel.c ring-leak.c fsync.c io_uring_setup.c \ b5837bd5311d-test.c accept-test.c d77a67ed5f27-test.c connect.c \ 7ad0e4b2f83c-test.c submit-reuse.c fallocate.c open-close.c \ file-update.c statx.c accept-reuse.c poll-v-poll.c fadvise.c \ - madvise.c + madvise.c short-read.c test_objs := $(patsubst %.c,%.ol,$(test_srcs)) diff --git a/test/short-read.c b/test/short-read.c new file mode 100644 index 0000000..357078f --- /dev/null +++ b/test/short-read.c @@ -0,0 +1,88 @@ +#include <errno.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/poll.h> + +#include "liburing.h" + +#define BUF_SIZE 4096 +#define FILE_SIZE 1024 + +static int create_file(const char *file) +{ + ssize_t ret; + char *buf; + int fd; + + buf = malloc(FILE_SIZE); + memset(buf, 0xaa, FILE_SIZE); + + fd = open(file, O_WRONLY | O_CREAT, 0644); + if (fd < 0) { + perror("open file"); + return 1; + } + ret = write(fd, buf, FILE_SIZE); + close(fd); + return ret != FILE_SIZE; +} + +int main(int argc, char *argv[]) +{ + int ret, fd; + struct io_uring ring; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + struct iovec vec; + + vec.iov_base = malloc(BUF_SIZE); + vec.iov_len = BUF_SIZE; + + if (create_file(".short-read")) { + fprintf(stderr, "file creation failed\n"); + return 1; + } + + fd = open(".short-read", O_RDONLY); + if (fd < 0) { + perror("file open"); + return 1; + } + + ret = io_uring_queue_init(32, &ring, 0); + if (ret) { + fprintf(stderr, "queue init failed: %d\n", ret); + return ret; + } + + sqe = io_uring_get_sqe(&ring); + if (!sqe) { + fprintf(stderr, "sqe get failed\n"); + return 1; + } + io_uring_prep_readv(sqe, fd, &vec, 1, 0); + + ret = io_uring_submit(&ring); + if (ret != 1) { + fprintf(stderr, "submit failed: %d\n", ret); + return 1; + } + + ret = io_uring_wait_cqes(&ring, &cqe, 1, 0, 0); + if (ret) { + fprintf(stderr, "wait_cqe failed: %d\n", ret); + return 1; + } + + if (cqe->res != FILE_SIZE) { + fprintf(stderr, "Read failed: %d\n", cqe->res); + return 1; + } + + io_uring_cqe_seen(&ring, cqe); + return 0; +} |