use mio::*;
use mio::tcp::*;
use std::io::*;
use std::time::Duration;

const MS: u64 = 1_000;

#[test]
pub fn test_tcp_edge_oneshot() {
    let _ = ::env_logger::init();

    let mut poll = Poll::new().unwrap();
    let mut events = Events::with_capacity(1024);

    // Create the listener
    let l = TcpListener::bind(&"127.0.0.1:0".parse().unwrap()).unwrap();

    // Register the listener with `Poll`
    poll.register(&l, Token(0), Ready::readable(), PollOpt::level()).unwrap();

    // Connect a socket, we are going to write to it
    let mut s1 = TcpStream::connect(&l.local_addr().unwrap()).unwrap();
    poll.register(&s1, Token(1), Ready::writable(), PollOpt::level()).unwrap();

    wait_for(&mut poll, &mut events, Token(0));

    // Get pair
    let (mut s2, _) = l.accept().unwrap();
    poll.register(&s2, Token(2), Ready::readable(), PollOpt::edge() | PollOpt::oneshot()).unwrap();

    wait_for(&mut poll, &mut events, Token(1));

    let res = s1.write(b"foo").unwrap();
    assert_eq!(3, res);

    let mut buf = [0; 1];

    for byte in b"foo" {
        wait_for(&mut poll, &mut events, Token(2));

        assert_eq!(1, s2.read(&mut buf).unwrap());
        assert_eq!(*byte, buf[0]);

        poll.reregister(&s2, Token(2), Ready::readable(), PollOpt::edge() | PollOpt::oneshot()).unwrap();

        if *byte == b'o' {
            poll.reregister(&s2, Token(2), Ready::readable(), PollOpt::edge() | PollOpt::oneshot()).unwrap();
        }
    }
}

fn wait_for(poll: &mut Poll, events: &mut Events, token: Token) {
    loop {
        poll.poll(events, Some(Duration::from_millis(MS))).unwrap();

        let cnt = (0..events.len()).map(|i| events.get(i).unwrap())
                                   .filter(|e| e.token() == token)
                                   .count();

        assert!(cnt < 2, "token appeared multiple times in poll results; cnt={:}", cnt);

        if cnt == 1 { return };
    }
}
