use std::{
  env,
  net::TcpListener,
  process::{Command, Stdio},
  thread,
  time::Duration,
};

use aok::{OK, Void};

#[static_init::constructor(0)]
extern "C" fn _log_init() {
  log_init::init();
}

#[test]
fn test() -> Void {
  if env::var("RUN_TEST_SERVER").is_ok() {
    let port_str = env::var("TEST_PORT").unwrap();
    let listener = TcpListener::bind(format!("127.0.0.1:{port_str}")).unwrap();
    for _stream in listener.incoming() {}
    return OK;
  }

  let port = {
    let listener = TcpListener::bind("127.0.0.1:0").unwrap();
    listener.local_addr().unwrap().port()
  };

  let mut child = Command::new(env::current_exe().unwrap())
    .env("RUN_TEST_SERVER", "1")
    .env("TEST_PORT", port.to_string())
    .stdout(Stdio::null())
    .stderr(Stdio::null())
    .spawn()
    .unwrap();

  thread::sleep(Duration::from_millis(500));

  kill_port::kill(port).unwrap();

  let _status = child.wait().unwrap();

  OK
}
