mio-uds 0.6.4

Unix domain socket bindings for mio
Documentation
extern crate mio;
extern crate tempdir;
extern crate mio_uds;

use std::io::prelude::*;
use std::time::Duration;

use mio::*;
use mio_uds::*;
use tempdir::TempDir;

macro_rules! t {
    ($e:expr) => (match $e {
        Ok(e) => e,
        Err(e) => panic!("{} failed with {}", stringify!($e), e),
    })
}

#[test]
fn listener() {
    let td = t!(TempDir::new("uds"));
    let a = t!(UnixListener::bind(td.path().join("foo")));
    assert!(t!(a.accept()).is_none());
    t!(a.local_addr());
    assert!(t!(a.take_error()).is_none());
    let b = t!(a.try_clone());
    assert!(t!(b.accept()).is_none());

    let poll = t!(Poll::new());
    let mut events = Events::with_capacity(1024);

    t!(poll.register(&a, Token(1), Ready::readable(), PollOpt::edge()));

    let s = t!(UnixStream::connect(td.path().join("foo")));

    assert_eq!(t!(poll.poll(&mut events, None)), 1);

    let (s2, addr) = t!(a.accept()).unwrap();

    assert_eq!(t!(s.peer_addr()).as_pathname(), t!(s2.local_addr()).as_pathname());
    assert_eq!(t!(s.local_addr()).as_pathname(), t!(s2.peer_addr()).as_pathname());
    assert_eq!(addr.as_pathname(), t!(s.local_addr()).as_pathname());
}

#[test]
fn stream() {
    let poll = t!(Poll::new());
    let mut events = Events::with_capacity(1024);
    let (mut a, mut b) = t!(UnixStream::pair());

    let both = Ready::readable() | Ready::writable();
    t!(poll.register(&a, Token(1), both, PollOpt::edge()));
    t!(poll.register(&b, Token(2), both, PollOpt::edge()));

    assert_eq!(t!(poll.poll(&mut events, Some(Duration::new(0, 0)))), 2);
    assert_eq!(events.get(0).unwrap().readiness(), Ready::writable());
    assert_eq!(events.get(1).unwrap().readiness(), Ready::writable());

    assert_eq!(t!(a.write(&[3])), 1);

    assert_eq!(t!(poll.poll(&mut events, Some(Duration::new(0, 0)))), 1);
    assert!(events.get(0).unwrap().readiness().is_readable());
    assert_eq!(events.get(0).unwrap().token(), Token(2));

    assert_eq!(t!(b.read(&mut [0; 1024])), 1);
}