use mio::*;
use mio::udp::*;
use sleep_ms;
use std::time::Duration;

const MS: u64 = 1_000;

#[test]
pub fn test_udp_level_triggered() {
    let poll = Poll::new().unwrap();
    let mut events = Events::with_capacity(1024);

    // Create the listener
    let tx = UdpSocket::bind(&"127.0.0.1:0".parse().unwrap()).unwrap();
    let rx = UdpSocket::bind(&"127.0.0.1:0".parse().unwrap()).unwrap();

    poll.register(&tx, Token(0), Ready::all(), PollOpt::level()).unwrap();
    poll.register(&rx, Token(1), Ready::all(), PollOpt::level()).unwrap();

    for _ in 0..2 {
        poll.poll(&mut events, Some(Duration::from_millis(MS))).unwrap();

        let tx_events = filter(&events, Token(0));
        assert_eq!(1, tx_events.len());
        assert_eq!(tx_events[0], Event::new(Ready::writable(), Token(0)));

        let rx_events = filter(&events, Token(1));
        assert_eq!(1, rx_events.len());
        assert_eq!(rx_events[0], Event::new(Ready::writable(), Token(1)));
    }

    tx.send_to(b"hello world!", &rx.local_addr().unwrap()).unwrap();

    sleep_ms(250);

    for _ in 0..2 {
        poll.poll(&mut events, Some(Duration::from_millis(MS))).unwrap();
        let rx_events = filter(&events, Token(1));
        assert_eq!(1, rx_events.len());
        assert_eq!(rx_events[0], Event::new(Ready::readable() | Ready::writable(), Token(1)));
    }

    let mut buf = [0; 200];
    while rx.recv_from(&mut buf).unwrap().is_some() {
    }

    for _ in 0..2 {
        poll.poll(&mut events, Some(Duration::from_millis(MS))).unwrap();
        let rx_events = filter(&events, Token(1));
        assert_eq!(1, rx_events.len());
        assert_eq!(rx_events[0], Event::new(Ready::writable(), Token(1)));
    }

    tx.send_to(b"hello world!", &rx.local_addr().unwrap()).unwrap();
    sleep_ms(250);

    poll.poll(&mut events, Some(Duration::from_millis(MS))).unwrap();
    let rx_events = filter(&events, Token(1));
    assert_eq!(1, rx_events.len());
    assert_eq!(rx_events[0], Event::new(Ready::readable() | Ready::writable(), Token(1)));

    drop(rx);

    poll.poll(&mut events, Some(Duration::from_millis(MS))).unwrap();
    let rx_events = filter(&events, Token(1));
    assert!(rx_events.is_empty());
}

fn filter(events: &Events, token: Token) -> Vec<Event> {
    (0..events.len()).map(|i| events.get(i).unwrap())
                     .filter(|e| e.token() == token)
                     .collect()
}
