test docker runner timeouts
This commit is contained in:
parent
9643ccf6d6
commit
8f3621813e
4 changed files with 50 additions and 13 deletions
4
planetwars-matchrunner/bots/timeout_bot.py
Normal file
4
planetwars-matchrunner/bots/timeout_bot.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import time
|
||||||
|
|
||||||
|
# I'm going to take my sweet time!
|
||||||
|
time.sleep(1000)
|
|
@ -16,7 +16,7 @@ use match_log::{create_log_sink, MatchLogger};
|
||||||
use planetwars_rules::PwConfig;
|
use planetwars_rules::PwConfig;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use self::match_context::{EventBus, PlayerHandle};
|
pub use self::match_context::{EventBus, PlayerHandle};
|
||||||
|
|
||||||
pub struct MatchConfig {
|
pub struct MatchConfig {
|
||||||
pub map_name: String,
|
pub map_name: String,
|
||||||
|
|
|
@ -150,7 +150,7 @@ impl Future for Request {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub enum RequestError {
|
pub enum RequestError {
|
||||||
Timeout,
|
Timeout,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +1,37 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::io::BufRead;
|
use std::io::BufRead;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use std::sync::{Arc, Mutex};
|
||||||
|
use std::time::Duration;
|
||||||
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
use planetwars_matchrunner::{docker_runner::DockerBotSpec, run_match, MatchConfig, MatchPlayer};
|
use planetwars_matchrunner::docker_runner::DockerBotSpec;
|
||||||
|
use planetwars_matchrunner::match_context::{EventBus, MatchCtx, RequestError};
|
||||||
|
use planetwars_matchrunner::BotSpec;
|
||||||
|
use planetwars_matchrunner::{run_match, MatchConfig, MatchPlayer};
|
||||||
|
|
||||||
const PYTHON_IMAGE: &str = "python:3.10-slim-buster";
|
const PYTHON_IMAGE: &str = "python:3.10-slim-buster";
|
||||||
|
|
||||||
#[tokio::test]
|
fn simple_python_docker_bot_spec(source_dir: &str, file_name: &str) -> DockerBotSpec {
|
||||||
async fn match_does_run() {
|
let source_dir_path = std::fs::canonicalize(source_dir).unwrap();
|
||||||
let simplebot_path = std::fs::canonicalize("bots/simplebot").unwrap();
|
let source_dir_path_str = source_dir_path.as_os_str().to_str().unwrap();
|
||||||
let simplebot_path_str = simplebot_path.as_os_str().to_str().unwrap();
|
|
||||||
|
|
||||||
let log_file = tempfile::NamedTempFile::new().unwrap();
|
DockerBotSpec {
|
||||||
|
|
||||||
let bot = DockerBotSpec {
|
|
||||||
image: PYTHON_IMAGE.to_string(),
|
image: PYTHON_IMAGE.to_string(),
|
||||||
binds: Some(vec![format!("{}:{}", simplebot_path_str, "/workdir")]),
|
binds: Some(vec![format!("{}:{}", source_dir_path_str, "/workdir")]),
|
||||||
argv: Some(vec!["python".to_string(), "simplebot.py".to_string()]),
|
argv: Some(vec!["python".to_string(), file_name.to_string()]),
|
||||||
working_dir: Some("/workdir".to_string()),
|
working_dir: Some("/workdir".to_string()),
|
||||||
pull: false,
|
pull: false,
|
||||||
credentials: None,
|
credentials: None,
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn match_does_run() {
|
||||||
|
let bot = simple_python_docker_bot_spec("./bots/simplebot", "simplebot.py");
|
||||||
|
|
||||||
|
let log_file = tempfile::NamedTempFile::new().unwrap();
|
||||||
|
|
||||||
let config = MatchConfig {
|
let config = MatchConfig {
|
||||||
map_name: "hex".to_string(),
|
map_name: "hex".to_string(),
|
||||||
map_path: PathBuf::from("maps/abc.json"),
|
map_path: PathBuf::from("maps/abc.json"),
|
||||||
|
@ -38,4 +50,25 @@ async fn match_does_run() {
|
||||||
|
|
||||||
let line_count = std::io::BufReader::new(log_file.as_file()).lines().count();
|
let line_count = std::io::BufReader::new(log_file.as_file()).lines().count();
|
||||||
assert!(line_count > 0);
|
assert!(line_count > 0);
|
||||||
|
|
||||||
|
tokio::time::sleep(Duration::from_secs(1)).await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn docker_runner_timeout() {
|
||||||
|
let event_bus = Arc::new(Mutex::new(EventBus::new()));
|
||||||
|
let (logger, _rx) = mpsc::unbounded_channel();
|
||||||
|
let bot_spec = simple_python_docker_bot_spec("./bots", "timeout_bot.py");
|
||||||
|
|
||||||
|
let player_handle = bot_spec.run_bot(1, event_bus.clone(), logger.clone()).await;
|
||||||
|
|
||||||
|
let mut players = HashMap::new();
|
||||||
|
players.insert(1, player_handle);
|
||||||
|
let mut ctx = MatchCtx::new(event_bus, players, logger);
|
||||||
|
|
||||||
|
let resp = ctx
|
||||||
|
.request(1, b"sup".to_vec(), Duration::from_millis(1000))
|
||||||
|
.await;
|
||||||
|
|
||||||
|
assert_eq!(resp, Err(RequestError::Timeout))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue