Skip to content

Commit edfce7d

Browse files
committed
test: init exit
1 parent 74873a9 commit edfce7d

4 files changed

Lines changed: 93 additions & 9 deletions

File tree

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ Issues = "https://github.com/YoSTEALTH/Liburing/issues"
3737
[project.optional-dependencies]
3838
test = ["pytest"]
3939

40+
[tool.ruff]
41+
line-length = 120
42+
4043
[tool.pyoz]
4144
# Path to your Zig source file
4245
module-path = "src/liburing/root.zig"

src/liburing/class.zig

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,8 @@ pub const Timespec = extern struct {
157157
pub const Ring = extern struct {
158158
_io_uring: ?*c.io_uring,
159159

160-
pub fn __new__() ?Ring {
161-
const io_uring: *c.io_uring = std.heap.c_allocator.create(c.io_uring) catch {
162-
return oz.raiseMemoryError("`Ring()` - Out of Memory!");
163-
};
160+
pub fn __new__() !Ring {
161+
const io_uring: *c.io_uring = try std.heap.c_allocator.create(c.io_uring);
164162
io_uring.* = std.mem.zeroes(c.io_uring); // set default value to `0`
165163
return .{ ._io_uring = io_uring };
166164
}
@@ -261,6 +259,8 @@ pub const Cqe = extern struct {
261259
}
262260
};
263261

262+
// TODO: Merge `CqeIter` into `Cqe`
263+
264264
///Example
265265
/// >>> for i in CqeIter(ring, cqe):
266266
/// >>> cqe[0].user_data == i # do stuff

test/conftest.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,7 @@ def skip_by_platform(request):
7777
"""
7878
if r := request.node.get_closest_marker("skip_linux"):
7979
if liburing.linux_version_check(version := r.args[0]):
80-
msg = (
81-
r.args[1]
82-
if len(r.args) > 1
83-
else f"Kernel `{LINUX_VERSION} < {version}`"
84-
)
80+
msg = r.args[1] if len(r.args) > 1 else f"Kernel `{LINUX_VERSION} < {version}`"
8581
pytest.skip(msg)
8682

8783

test/queue/init_exit_test.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import pytest
2+
import liburing
3+
4+
5+
def test_io_uring_init_exit():
6+
ring = liburing.Ring()
7+
assert ring.flags == 0
8+
assert ring.ring_fd == 0
9+
assert ring.features == 0
10+
assert ring.enter_ring_fd == 0
11+
assert ring.int_flags == 0
12+
13+
with pytest.raises(TypeError):
14+
liburing.io_uring_queue_init(-1, ring, 0)
15+
16+
with pytest.raises(TypeError):
17+
liburing.io_uring_queue_init(8, ring, -1)
18+
19+
assert liburing.io_uring_queue_init(1, ring, 0) == 0
20+
assert ring.ring_fd > -1
21+
assert ring.enter_ring_fd > -1
22+
with pytest.raises(RuntimeError): # Trying to init again
23+
liburing.io_uring_queue_init(4, ring, 0)
24+
assert liburing.io_uring_queue_exit(ring) is None
25+
# Trying to exit again
26+
with pytest.raises(RuntimeError):
27+
liburing.io_uring_queue_exit(ring) is None # will not call internally but
28+
29+
ring = liburing.Ring()
30+
with pytest.raises(RuntimeError):
31+
liburing.io_uring_queue_exit(ring)
32+
33+
34+
def test_setup_iopoll_sqpoll():
35+
for i, setup in enumerate((liburing.IORING_SETUP_IOPOLL, liburing.IORING_SETUP_SQPOLL), 1):
36+
ring = liburing.Ring()
37+
assert liburing.io_uring_queue_init(1, ring, setup) == 0
38+
assert liburing.io_uring_queue_exit(ring) is None
39+
40+
41+
def test_max_entries_plus():
42+
max_plus = 32768 + 1
43+
ring = liburing.Ring()
44+
with pytest.raises(OSError): # OSError: [Errno 22] Invalid argument
45+
liburing.io_uring_queue_init(max_plus, ring)
46+
with pytest.raises(RuntimeError):
47+
liburing.io_uring_queue_exit(ring)
48+
49+
50+
def test_init_max():
51+
ring = liburing.Ring()
52+
cqe = liburing.Cqe()
53+
maximum = 32768
54+
liburing.io_uring_queue_init(maximum, ring)
55+
56+
for i in range(maximum - 1):
57+
sqe = liburing.io_uring_get_sqe(ring)
58+
liburing.io_uring_prep_nop(sqe)
59+
sqe.flags = liburing.IOSQE_IO_LINK | liburing.IOSQE_ASYNC
60+
sqe.user_data = i + 1 # `sqe.user_data` can not be `0`
61+
else: # last
62+
sqe = liburing.io_uring_get_sqe(ring)
63+
liburing.io_uring_prep_nop(sqe)
64+
sqe.flags = liburing.IOSQE_ASYNC
65+
sqe.user_data = i + 1 + 1
66+
67+
assert liburing.io_uring_submit_and_wait_timeout(ring, cqe, maximum) == maximum
68+
69+
for i in range(maximum):
70+
assert cqe[i].user_data == i + 1
71+
72+
liburing.io_uring_cq_advance(ring, maximum)
73+
with pytest.raises(BlockingIOError):
74+
liburing.io_uring_peek_cqe(ring, cqe)
75+
liburing.io_uring_queue_exit(ring)
76+
77+
78+
def test_io_uring_submit_and_wait(ring, cqe):
79+
sqe = liburing.io_uring_get_sqe(ring)
80+
sqe.user_data = 123
81+
assert liburing.io_uring_sq_ready(ring) == 1
82+
assert liburing.io_uring_submit_and_wait(ring, 1) == 1
83+
assert liburing.io_uring_sq_ready(ring) == 0
84+
liburing.io_uring_peek_cqe(ring, cqe)
85+
assert cqe[0].user_data == 123

0 commit comments

Comments
 (0)