1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4
5include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
6
7#[cfg(test)]
8mod test {
9 use std::{
10 mem::{self, MaybeUninit},
11 os::fd::AsRawFd,
12 ptr,
13 };
14
15 use super::*;
16
17 #[test]
18 fn cq_size() {
19 unsafe {
20 assert!(unsafe_cq_size(4) == 0);
21 assert!(unsafe_cq_size(0) == -libc::EINVAL);
22 }
23 }
24
25 unsafe fn unsafe_cq_size(cq_size: u32) -> i32 {
26 let mut params: io_uring_params = mem::zeroed();
27 params.flags = IORING_SETUP_CQSIZE;
28 params.cq_entries = cq_size;
29 let mut ring = MaybeUninit::uninit();
30 let ret = io_uring_queue_init_params(4, ring.as_mut_ptr(), &mut params);
31 let mut ring = ring.assume_init();
32 if cq_size > 0 {
33 assert!(params.cq_entries >= cq_size);
34 }
35 io_uring_queue_exit(&mut ring);
36 ret
37 }
38
39 #[test]
40 fn fsync() {
41 unsafe {
42 let mut ring = MaybeUninit::uninit();
43 let ret = io_uring_queue_init(8, ring.as_mut_ptr(), 0);
44 assert!(ret == 0);
45 let mut ring = ring.assume_init();
46
47 let f = tempfile::NamedTempFile::new().unwrap();
48 let fd = f.as_file().as_raw_fd();
49
50 let sqe = io_uring_get_sqe(&mut ring);
51 assert!(!sqe.is_null());
52 io_uring_prep_fsync(sqe, fd, 0);
53 let ret = io_uring_submit(&mut ring);
54 assert!(ret > 0);
55
56 let mut cqe = ptr::null_mut();
57 let ret = io_uring_wait_cqe(&mut ring, &mut cqe);
58 assert!(ret >= 0);
59 io_uring_cqe_seen(&mut ring, cqe);
60 }
61 }
62}