use mio::*;
use mio::fuchsia::EventedHandle;
use zircon::{self, AsHandleRef};
use std::time::Duration;

const MS: u64 = 1_000;

#[test]
pub fn test_fuchsia_channel() {
    let poll = Poll::new().unwrap();
    let mut event_buffer = Events::with_capacity(1);
    let event_buffer = &mut event_buffer;

    let (channel0, channel1) = zircon::Channel::create().unwrap();
    let channel1_evented = unsafe { EventedHandle::new(channel1.raw_handle()) };

    poll.register(&channel1_evented, Token(1), Ready::readable(), PollOpt::edge()).unwrap();

    poll.poll(event_buffer, Some(Duration::from_millis(MS))).unwrap();
    assert_eq!(event_buffer.len(), 0);

    channel0.write(&[1, 2, 3], &mut vec![]).unwrap();

    poll.poll(event_buffer, Some(Duration::from_millis(MS))).unwrap();
    let event = event_buffer.get(0).unwrap();
    assert_eq!(event.token(), Token(1));
    assert!(event.readiness().is_readable());

    poll.deregister(&channel1_evented).unwrap();
}
