simpletcp 1.2.1

Crate for simple and secure tcp communication
Documentation
use crate::utils;
use crate::utils::{EV_POLLIN, EV_POLLOUT};
use std::io::Write;
use std::net::{TcpListener, TcpStream};
use std::thread::{sleep, spawn};
use std::time::{Duration, Instant};

#[test]
fn poll_read() {
    let server = TcpListener::bind("127.0.0.1:42345").unwrap();

    spawn(move || {
        let (mut socket, _) = server.accept().unwrap();
        sleep(Duration::from_secs(1));
        socket.write(&[1]).unwrap();
        sleep(Duration::from_millis(500));
    });

    let test = TcpStream::connect("127.0.0.1:42345").unwrap();

    let time = Instant::now();
    let success = utils::poll(&test, EV_POLLIN);
    let time = time.elapsed().as_millis();

    assert!(success);
    assert!(time >= 800 && time < 1100);
}

#[test]
fn poll_both() {
    let server = TcpListener::bind("127.0.0.1:12345").unwrap();

    spawn(move || {
        let (mut socket, _) = server.accept().unwrap();
        sleep(Duration::from_secs(1));
        socket.write(&[1]).unwrap();
        sleep(Duration::from_millis(500));
    });

    let test = TcpStream::connect("127.0.0.1:12345").unwrap();

    let time = Instant::now();
    let success = utils::poll(&test, EV_POLLIN | EV_POLLOUT);
    let time = time.elapsed().as_millis();

    assert!(success);
    assert!(time < 10);
}

#[test]
fn poll_read_timeout() {
    let server = TcpListener::bind("127.0.0.1:42365").unwrap();

    spawn(move || {
        let (mut socket, _) = server.accept().unwrap();
        sleep(Duration::from_secs(1));
        socket.write(&[1]).unwrap();
    });

    let test = TcpStream::connect("127.0.0.1:42365").unwrap();

    let time = Instant::now();
    let success = utils::poll_timeout(&test, EV_POLLIN, 500);
    let time = time.elapsed().as_millis();

    assert!(!success);
    assert!(time >= 400 && time < 600);
}

#[test]
fn poll_set() {
    let server = TcpListener::bind("127.0.0.1:43365").unwrap();

    spawn(|| {
        let mut sockets = Vec::new();
        loop {
            sockets.push(TcpStream::connect("127.0.0.1:43365").unwrap());
            if sockets.len() == 20 {
                break;
            }
        }
        sockets[4].write_all(&[1]).unwrap();
        sleep(Duration::from_millis(100));
    });
    let mut sockets = Vec::new();

    loop {
        let (socket, _) = server.accept().unwrap();
        sockets.push(socket);
        if sockets.len() == 20 {
            break;
        }
    }

    let mut fds = utils::get_fd_array(&sockets);
    let res = utils::poll_set(&mut fds, EV_POLLIN);
    assert_eq!(res, 4);
}

#[test]
fn poll_set_timeout() {
    let server = TcpListener::bind("127.0.0.1:43365").unwrap();

    spawn(|| {
        let mut sockets = Vec::new();
        loop {
            sockets.push(TcpStream::connect("127.0.0.1:43365").unwrap());
            if sockets.len() == 20 {
                break;
            }
        }

        sleep(Duration::from_millis(1100));
    });
    let mut sockets = Vec::new();

    loop {
        let (socket, _) = server.accept().unwrap();
        sockets.push(socket);
        if sockets.len() == 20 {
            break;
        }
    }

    let mut fds = utils::get_fd_array(&sockets);
    let time = Instant::now();
    let res = utils::poll_set_timeout(&mut fds, EV_POLLIN, 1000);
    let time = time.elapsed().as_millis();
    assert_eq!(res, None);
    assert!(time > 800 && time < 1100);
}

#[test]
fn poll_set_ev() {
    let server = TcpListener::bind("127.0.0.1:43395").unwrap();

    spawn(|| {
        let mut sockets = Vec::new();
        loop {
            sockets.push(TcpStream::connect("127.0.0.1:43395").unwrap());
            if sockets.len() == 20 {
                break;
            }
        }
        sockets[5].write_all(&[1]).unwrap();
        sleep(Duration::from_millis(100));
        sockets[4].write_all(&[1]).unwrap();
        sleep(Duration::from_millis(100));
    });
    let mut sockets = Vec::new();

    loop {
        let (socket, _) = server.accept().unwrap();
        sockets.push(socket);
        if sockets.len() == 20 {
            break;
        }
    }

    let mut fds = utils::get_fd_array(&sockets);
    let mut events = vec![EV_POLLIN; 20];
    events[5] = 0;
    let res = utils::poll_set_ev(&mut fds, &mut events);
    assert_eq!(res, 4);
}