use std::{net, thread, time};

use actix_server::Server;
use actix_service::fn_service;
use net2::TcpBuilder;

fn unused_addr() -> net::SocketAddr {
    let addr: net::SocketAddr = "127.0.0.1:0".parse().unwrap();
    let socket = TcpBuilder::new_v4().unwrap();
    socket.bind(&addr).unwrap();
    socket.reuse_address(true).unwrap();
    let tcp = socket.to_tcp_listener().unwrap();
    tcp.local_addr().unwrap()
}

#[test]
fn test_bind() {
    let addr = unused_addr();

    thread::spawn(move || {
        Server::build()
            .bind("test", addr, || fn_service(|_| Ok::<_, ()>(())))
            .unwrap()
            .run()
    });

    thread::sleep(time::Duration::from_millis(500));
    assert!(net::TcpStream::connect(addr).is_ok());
}

#[test]
fn test_listen() {
    let addr = unused_addr();

    thread::spawn(move || {
        let lst = net::TcpListener::bind(addr).unwrap();
        Server::build()
            .listen("test", lst, move || fn_service(|_| Ok::<_, ()>(())))
            .unwrap()
            .run()
    });

    thread::sleep(time::Duration::from_millis(500));
    assert!(net::TcpStream::connect(addr).is_ok());
}