Skip to content

Commit

Permalink
Add a test to tcp_stream that tests if priority events work
Browse files Browse the repository at this point in the history
This adds a test to the tcp_stream to test if priority events are
working. This only works on linux. Linux sets the EPOLLPRI event type
for those events.
This works by sending a tcp packet with the MSG_OOB flag set.
  • Loading branch information
poeschel committed Feb 2, 2023
1 parent fa4e4b3 commit db776d9
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ libc = "0.2.121"
env_logger = { version = "0.8.4", default-features = false }
rand = "0.8"

[target.'cfg(target_os = "linux")'.dev-dependencies]
nix = { version = "0", features = ["socket", "uio"] }

[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]
Expand Down
51 changes: 51 additions & 0 deletions tests/tcp_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -793,3 +793,54 @@ fn hup_event_on_disconnect() {
vec![ExpectEvent::new(Token(1), Interest::READABLE)],
);
}

#[test]
#[cfg(target_os = "linux")]
fn pollpri() {
use mio::net::TcpListener;
use nix::sys::socket::{
connect, send, socket, AddressFamily, MsgFlags, SockFlag, SockType, SockaddrIn,
};

let (mut poll, mut events) = init_with_poll();
let addr = "127.0.0.1:0".parse().unwrap();

let mut listener = TcpListener::bind(addr).unwrap();
let addr = listener.local_addr().unwrap();
poll.registry()
.register(&mut listener, Token(0), Interest::READABLE)
.unwrap();

let addr_l = match addr {
SocketAddr::V4(a) => SockaddrIn::from(a),
_ => panic!("Unexpected local address."),
};
let fd = socket(
AddressFamily::Inet,
SockType::Stream,
SockFlag::empty(),
None,
)
.unwrap();
connect(fd, &addr_l).expect("nix::sys::socket::connect");

expect_events(
&mut poll,
&mut events,
vec![ExpectEvent::new(Token(0), Interest::READABLE)],
);

let (mut sock, _) = listener.accept().unwrap();
poll.registry()
.register(&mut sock, Token(1), Interest::READABLE)
.unwrap();

// MsgFlags::MSG_OOB sends a tcp packet which is received by linux kernel with
// POLLPRI event type aka Readiness::PRIORITY set.
send(fd, &DATA2, MsgFlags::MSG_OOB).unwrap();
expect_events(
&mut poll,
&mut events,
vec![ExpectEvent::new(Token(1), Readiness::PRIORITY)],
);
}

0 comments on commit db776d9

Please sign in to comment.