#![cfg(all(unix, feature = "p2p"))]
use std::os::unix::net::UnixStream;
use ntest::timeout;
use test_log::test;
use zbus::{Guid, block_on, connection::Builder};
#[test]
#[timeout(15000)]
fn closed_resolves_when_peer_disconnects() {
block_on(async {
let (s0, s1) = UnixStream::pair().unwrap();
let guid = Guid::generate();
let server_builder = Builder::unix_stream(s0).server(guid).unwrap().p2p();
let client_builder = Builder::unix_stream(s1).p2p();
let (server, client) = futures_util::join!(server_builder.build(), client_builder.build());
let server = server.unwrap();
let client = client.unwrap();
assert!(!server.is_closed());
drop(client);
server.closed().await;
assert!(server.is_closed());
});
}
#[test]
#[timeout(15000)]
fn closed_resolves_on_explicit_close() {
block_on(async {
let (s0, s1) = UnixStream::pair().unwrap();
let guid = Guid::generate();
let server_builder = Builder::unix_stream(s0).server(guid).unwrap().p2p();
let client_builder = Builder::unix_stream(s1).p2p();
let (server, client) = futures_util::join!(server_builder.build(), client_builder.build());
let server = server.unwrap();
let client = client.unwrap();
assert!(!client.is_closed());
client.close().await.unwrap();
server.closed().await;
assert!(server.is_closed());
});
}
#[test]
#[timeout(15000)]
fn closed_resolves_immediately_if_already_closed() {
block_on(async {
let (s0, s1) = UnixStream::pair().unwrap();
let guid = Guid::generate();
let server_builder = Builder::unix_stream(s0).server(guid).unwrap().p2p();
let client_builder = Builder::unix_stream(s1).p2p();
let (server, client) = futures_util::join!(server_builder.build(), client_builder.build());
let server = server.unwrap();
let client = client.unwrap();
drop(client);
server.closed().await;
server.closed().await;
assert!(server.is_closed());
});
}