aboutsummaryrefslogtreecommitdiff
path: root/test/io.c
blob: 8a269fa1f2e802653912e5eda79dae1b149e2be0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

#include "kpl_test.h"

static const char *linux_version = "/proc/version";

KPL_TEST(statx) {
    kpl_io_uring io_uring = {};
    KPL_ASSERT(kpl_io_uring_init(&io_uring, KPL_IO_URING_QUEUE_SIZE_POW2_MIN) == 0, "should return 0 for success");
    struct statx statx_object = {};
    kpl_object_task *task = calloc(1, sizeof(kpl_object_task) + sizeof(kpl_class) * 1);
    task->io_res = 1;
    KPL_ASSERT(kpl_io_uring_statx(&io_uring, task, AT_FDCWD, linux_version, 0, STATX_ALL, &statx_object),
        "should add statx operation");
    KPL_ASSERT(kpl_io_uring_submit(&io_uring) == 1, "should submit one io operation");
    KPL_ASSERT(task == kpl_io_uring_get_completed(&io_uring), "should return a task");
    KPL_ASSERT(task->io_res == 0, "io_res should have success stax return");
    KPL_ASSERT(statx_object.stx_nlink > 0, "should have one or more hard link(s)");
    free(task);
    kpl_io_uring_free(&io_uring);
}

#define TEST_TO_READ 5

static const char *test_linix_compare = "Linux";

KPL_TEST(open_read_close) {
    kpl_io_uring io_uring = {};
    KPL_ASSERT(kpl_io_uring_init(&io_uring, KPL_IO_URING_QUEUE_SIZE_POW2_MIN) == 0, "should return 0 for success");
    char buffer[TEST_TO_READ + 1] = {};
    kpl_object_task *task = calloc(1, sizeof(kpl_object_task) + sizeof(kpl_class) * 1);
    task->io_res = 1;
    KPL_ASSERT(kpl_io_uring_openat(&io_uring, task, AT_FDCWD, linux_version, O_RDONLY, 0),
        "should add open operation");
    KPL_ASSERT(kpl_io_uring_submit(&io_uring) == 1, "should submit one io operation");
    KPL_ASSERT(task == kpl_io_uring_get_completed(&io_uring), "should return a task");
    KPL_ASSERT(task->io_res > 0, "io_res should have open fd");
    int32_t fd = task->io_res;
    task->io_res = 1;
    KPL_ASSERT(kpl_io_uring_read(&io_uring, task, fd, &buffer, TEST_TO_READ, 0), "should add read operation");
    KPL_ASSERT(kpl_io_uring_submit(&io_uring) == 1, "should submit one io operation");
    KPL_ASSERT(task == kpl_io_uring_get_completed(&io_uring), "should return a task");
    KPL_ASSERT(task->io_res == TEST_TO_READ, "io_res should equal the number of bytes read");
    KPL_ASSERT(strcmp(test_linix_compare, buffer) == 0, "should have Linux string in buffer");
    task->io_res = 1;
    KPL_ASSERT(kpl_io_uring_close(&io_uring, task, fd), "should add close operation");
    KPL_ASSERT(kpl_io_uring_submit(&io_uring) == 1, "should submit one io operation");
    KPL_ASSERT(task == kpl_io_uring_get_completed(&io_uring), "should return a task");
    KPL_ASSERT(task->io_res == 0, "io_res should have close success");
    free(task);
    kpl_io_uring_free(&io_uring);
}