check if server correctly start
in same time than the port was opened. Rename function into `wait_for_server` according.
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
			
		||||
use crate::server::utils::{get_free_port, wait_for_port};
 | 
			
		||||
use crate::server::utils::{get_free_port, wait_for_server};
 | 
			
		||||
use mktemp::Temp;
 | 
			
		||||
use std::io::{self, Cursor, Read};
 | 
			
		||||
use std::process::{Child, Stdio};
 | 
			
		||||
use std::process::{Child, ExitStatus, Stdio};
 | 
			
		||||
use thiserror::Error;
 | 
			
		||||
use zip::{result::ZipError, ZipArchive};
 | 
			
		||||
 | 
			
		||||
@@ -13,6 +13,12 @@ pub enum Error {
 | 
			
		||||
    #[error("Get an available port failed")]
 | 
			
		||||
    GetFreePort(#[source] io::Error),
 | 
			
		||||
 | 
			
		||||
    #[error("Server exit with `{status}`")]
 | 
			
		||||
    ServerExitWithStatus { status: ExitStatus },
 | 
			
		||||
 | 
			
		||||
    #[error("Error append during check grammalecte-server status")]
 | 
			
		||||
    ServerCheckStatus(#[source] io::Error),
 | 
			
		||||
 | 
			
		||||
    #[error("Port {port} did not open in time!")]
 | 
			
		||||
    WaitPortOpen { port: u16 },
 | 
			
		||||
 | 
			
		||||
@@ -80,7 +86,7 @@ impl EmbeddedServer {
 | 
			
		||||
        log::info!("Will execute file {}", server_file);
 | 
			
		||||
 | 
			
		||||
        // Start server
 | 
			
		||||
        let child = std::process::Command::new("/usr/bin/python3")
 | 
			
		||||
        let mut child = std::process::Command::new("/usr/bin/python3")
 | 
			
		||||
            .arg(server_file)
 | 
			
		||||
            .arg("-p")
 | 
			
		||||
            .arg(port.to_string())
 | 
			
		||||
@@ -89,7 +95,7 @@ impl EmbeddedServer {
 | 
			
		||||
            .spawn()
 | 
			
		||||
            .map_err(Error::StartServerProcess)?;
 | 
			
		||||
 | 
			
		||||
        wait_for_port(port)?;
 | 
			
		||||
        wait_for_server(&mut child, port)?;
 | 
			
		||||
 | 
			
		||||
        Ok(Self {
 | 
			
		||||
            _srv_dir: dest,
 | 
			
		||||
@@ -111,9 +117,9 @@ impl Drop for EmbeddedServer {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mod utils {
 | 
			
		||||
    use std::time::Duration;
 | 
			
		||||
 | 
			
		||||
    use super::Error;
 | 
			
		||||
    use std::process::Child;
 | 
			
		||||
    use std::time::Duration;
 | 
			
		||||
 | 
			
		||||
    /// Get a free port
 | 
			
		||||
    pub fn get_free_port() -> u16 {
 | 
			
		||||
@@ -130,8 +136,9 @@ mod utils {
 | 
			
		||||
        port
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn wait_for_port(port: u16) -> Result<(), Error> {
 | 
			
		||||
    pub fn wait_for_server(child: &mut Child, port: u16) -> Result<(), Error> {
 | 
			
		||||
        for _ in 0..50 {
 | 
			
		||||
            check_server(child)?;
 | 
			
		||||
            if port_scanner::scan_port(port) {
 | 
			
		||||
                return Ok(());
 | 
			
		||||
            }
 | 
			
		||||
@@ -140,4 +147,11 @@ mod utils {
 | 
			
		||||
 | 
			
		||||
        Err(Error::WaitPortOpen { port })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn check_server(child: &mut Child) -> Result<(), Error> {
 | 
			
		||||
        match child.try_wait().map_err(Error::ServerCheckStatus)? {
 | 
			
		||||
            None => Ok(()), // Continue
 | 
			
		||||
            Some(status) => Err(Error::ServerExitWithStatus { status }),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user