#![cfg(unix)]
mod common;
use std::{io::{IoSlice, IoSliceMut}, net::{TcpListener, UdpSocket}, os::unix::net::{UnixDatagram, UnixListener}, time::Duration};
use socket9::{So9Marker, So9MarkerBind, So9MarkerListener, So9MarkerStateless, So9SockDomain, Socket9, address::{IntoSockAddrSpec, So9AddrDomain, So9DomainInets, So9DomainUnix}};
use uds_fork::{UnixSeqpacketListener};
fn test_bind_listern<S: So9Marker + So9MarkerBind + So9MarkerListener, A: IntoSockAddrSpec<S::SockAddrType>>(sock: Socket9<S>, addr: A)
{
sock.bind(&addr).unwrap();
sock.listen(10).unwrap();
let _ = sock.accept_timeout(Duration::from_nanos(100));
}
#[test]
fn test_listeners_marker_bind_listen_accept()
{
let dir = common::make_temp_dir_no();
let p1 = dir.path().join("sock1.sock");
let unxlist = Socket9::<UnixListener>::new_unbound_by_addr(&p1).unwrap();
test_bind_listern(unxlist, p1.as_path());
let p1 = dir.path().join("sock2.sock");
let unxlist = Socket9::<UnixSeqpacketListener>::new_unbound_by_addr(&p1).unwrap();
test_bind_listern(unxlist, p1.as_path());
let p1 = "127.0.0.1:0";
let unxlist = Socket9::<TcpListener>::new_unbound_by_addr(p1).unwrap();
test_bind_listern(unxlist, p1);
}
fn test_datagrams_tests<S, A>(sock: Socket9<S>, addr: A, sock2: Socket9<S>)
where
S: So9Marker + So9MarkerBind + So9MarkerStateless,
A: IntoSockAddrSpec<S::SockAddrType>
{
sock.bind(&addr).unwrap();
let sock_addr = sock.local_addr().unwrap();
let arg_addr_type = addr.from_type().unwrap();
let sock_addr_type = sock_addr.from_type().unwrap();
if arg_addr_type.get_addr_domain() == So9SockDomain::UNIX
{
assert_eq!(arg_addr_type.as_ref(), sock_addr_type.as_ref());
}
let buf = [1,2,3,4];
let n = sock2.send_to(&buf, &sock_addr).unwrap();
let mut rcv = [0_u8; 10];
let rn = sock.recv(&mut rcv).unwrap();
assert_eq!(n, rn);
let n = sock2.send_to_vectored(&[IoSlice::new(&buf)], &sock_addr).unwrap();
let rcv_io = IoSliceMut::new(&mut rcv);
let rn = sock.recv_from_vectored(&mut [rcv_io]).unwrap();
assert_eq!(n, rn.0);
let sock_addr2 = sock2.local_addr().unwrap();
let sock_addr_type2 = sock_addr2.from_type().unwrap();
assert_eq!(sock_addr_type2.as_ref(), &rn.1);
println!("{:?}", rn.1);
}
#[test]
fn test_datagram_unix()
{
let dir = common::make_temp_dir_no();
println!("DGRAM:");
let p1 = dir.path().join("sock_dgram.sock");
let unxlist = Socket9::<UnixDatagram>::new_unbound_by_addr(&p1).unwrap();
let unxlist2 = Socket9::<UnixDatagram>::new_unbound(So9DomainUnix::Unix).unwrap();
test_datagrams_tests(unxlist, p1.as_path(), unxlist2);
println!("STREAM:");
let p1 = dir.path().join("sock_stream.sock");
let p2 = dir.path().join("sock_stream_2.sock");
let unxlist = Socket9::<UnixDatagram>::new_unbound_by_addr(&p1).unwrap();
let unxlist2 = Socket9::<UnixDatagram>::new_with_bind(&p2).unwrap();
test_datagrams_tests(unxlist, p1.as_path(), unxlist2);
println!("UDP DGRAM:");
let p1 = "127.0.0.1:0";
let unxlist = Socket9::<UdpSocket>::new_unbound_by_addr(p1).unwrap();
let unxlist2 = Socket9::<UdpSocket>::new_with_bind(&"127.0.0.1:0").unwrap();
test_datagrams_tests(unxlist, p1, unxlist2);
}