From 6d39176cbf44677f836db518898954334285db14 Mon Sep 17 00:00:00 2001 From: Aravinth Manivannan Date: Wed, 27 Sep 2023 19:46:59 +0530 Subject: [PATCH] feat: run tests in a suite and collect results --- src/runner/mod.rs | 1 + src/runner/suite.rs | 185 +++++++++++++++++++++++++------------------- 2 files changed, 107 insertions(+), 79 deletions(-) diff --git a/src/runner/mod.rs b/src/runner/mod.rs index 290495d..c76fa76 100644 --- a/src/runner/mod.rs +++ b/src/runner/mod.rs @@ -1,2 +1,3 @@ pub mod init_scripts; pub mod results; +pub mod suite; diff --git a/src/runner/suite.rs b/src/runner/suite.rs index 9eeb7f1..ea31b88 100644 --- a/src/runner/suite.rs +++ b/src/runner/suite.rs @@ -114,97 +114,107 @@ impl SuiteRunnerState { mod tests { use super::*; + use crate::complaince::result::Result as CResult; + use crate::complaince::suite::Test; use crate::{AppCtx, Ctx, Settings}; use std::sync::Arc; - use std::sync::RwLock; - #[derive(Clone, Eq, PartialEq, Debug)] - enum ContainerState { - NoContainer, - Running(String), - Stopped, - Removed, - } - - #[derive(Clone)] - struct TestDocker { - state: Arc>, - } - - impl TestDocker { - pub fn new() -> Self { - Self { - state: Arc::new(RwLock::new(ContainerState::NoContainer)), - } - } - } - impl DockerLike for TestDocker { - fn version(&self) -> String { - unimplemented!(); - } - fn run_container( - &self, - name: &str, - img: &str, - detached: bool, - env: &HashMap, - network: Option, - pull: bool, - ) { - let mut w = self.state.write().unwrap(); - if *w == ContainerState::NoContainer { - *w = ContainerState::Running(name.to_string()); - } else { - panic!("Container is {:?}", w); - } - } - fn get_exit_status(&self, name: &str) -> isize { - 0 - } - fn get_logs(&self, name: &str) -> String { - "".into() - } - fn rm_container(&self, name: &str, force: bool) { - let mut w = self.state.write().unwrap(); - if *w == ContainerState::Stopped { - *w = ContainerState::Removed; - } else { - panic!("Container is {:?}", w); - } - } - } + use url::Url; + // use std::sync::RwLock; + // #[derive(Clone, Eq, PartialEq, Debug)] + // enum ContainerState { + // NoContainer, + // Running(String), + // Stopped, + // Removed, + // } + // + // #[derive(Clone)] + // struct TestDocker { + // state: Arc>, + // } + // + // impl TestDocker { + // pub fn new() -> Self { + // Self { + // state: Arc::new(RwLock::new(ContainerState::NoContainer)), + // } + // } + // } + // impl DockerLike for TestDocker { + // fn version(&self) -> String { + // unimplemented!(); + // } + // fn run_container( + // &self, + // name: &str, + // img: &str, + // detached: bool, + // env: &HashMap, + // network: Option, + // pull: bool, + // ) { + // let mut w = self.state.write().unwrap(); + // if *w == ContainerState::NoContainer { + // *w = ContainerState::Running(name.to_string()); + // } else { + // panic!("Container is {:?}", w); + // } + // } + // fn get_exit_status(&self, name: &str) -> isize { + // 0 + // } + // fn get_logs(&self, name: &str) -> String { + // "".into() + // } + // fn rm_container(&self, name: &str, force: bool) { + // let mut w = self.state.write().unwrap(); + // if *w == ContainerState::Stopped { + // *w = ContainerState::Removed; + // } else { + // panic!("Container is {:?}", w); + // } + // } + // } + // #[actix_rt::test] async fn suite_runner_works() { const LOGS: &str = "SUITE RUNNER LOG STRING"; - use crate::complaince::result::Result as CResult; - use crate::complaince::suite::Test; - use url::Url; let settings = Settings::new().unwrap(); let ctx = Ctx::new(settings.clone()).await; // ctx.docker = Arc::new(TestDocker::new()); let ctx = AppCtx::new(Arc::new(ctx)); - let dummy_test = Test { - name: "ftest-docker-cmd-tester".into(), + let mut dummy_test = Test { + name: "suite_runner_works".into(), url: Url::parse("https://git.batsense.net/ForgeFlux/ftest").unwrap(), version: semver::Version::parse("1.0.1").unwrap(), container: "forgeflux/ftest-docker-cmd-tester".into(), env_vars: None, }; + let mut env = HashMap::new(); + env.insert("TEST_NAME".into(), dummy_test.name.clone()); + dummy_test.env_vars = Some(env); + + let mut dummy_test2 = dummy_test.clone(); + dummy_test2.name = "suite_runner_works2".into(); + let mut env = HashMap::new(); + env.insert("TEST_NAME".into(), dummy_test2.name.clone()); + dummy_test2.env_vars = Some(env); let suite = Suite { name: "suite_runner_works".into(), description: "testing suite runner".into(), version: semver::Version::parse("1.0.1").unwrap(), - tests: vec![dummy_test.clone()], + tests: vec![dummy_test.clone(), dummy_test2.clone()], }; let state = SuiteRunnerState::launch_suite(&suite, &ctx); - assert_eq!(state.tests.len(), 1); - std::thread::sleep(std::time::Duration::new(10, 0)); + assert_eq!(state.tests.len(), 2); + std::thread::sleep(std::time::Duration::new(13, 0)); for (k, v) in state.tests.iter() { assert_eq!(ctx.docker.get_exit_status(&v.container_name), 0); @@ -215,26 +225,43 @@ mod tests { test: dummy_test.clone(), success: true, // sent by the app - logs: LOGS.into(), + logs: format!("{}{LOGS}", v.container_name), }; tx.send(tx_result).await.unwrap(); } } let results = state.collect_results(&ctx).await; - assert_eq!(results.tests.len(), 1); - let archivable_test = results.tests.get(0).unwrap(); - assert_eq!(archivable_test.name, dummy_test.name); - assert!(archivable_test.result.success); - assert_eq!(archivable_test.result.logs, LOGS); - println!("{}", archivable_test.result.container.logs); - assert!(archivable_test.result.container.logs.contains("FTEST_AUTH")); - assert!(archivable_test.result.container.logs.contains("FTEST_HOST")); - assert!(archivable_test - .result - .container - .logs - .contains("FTEST_TARGET_HOST")); - assert!(archivable_test.result.container.logs.contains("FTEST_USER")); + assert_eq!(results.tests.len(), 2); + + for archivable_test in results.tests.iter() { + //let archivable_test = results.tests.get(0).unwrap(); + let t = if archivable_test.name == dummy_test.name.as_ref() { + dummy_test.clone() + } else { + dummy_test2.clone() + }; + assert_eq!(archivable_test.name, t.name); + assert!(archivable_test.result.success); + assert!(archivable_test.result.container.name.contains(&t.name)); + assert_eq!( + archivable_test.result.logs, + format!("{}{LOGS}", archivable_test.result.container.name) + ); + println!("{}", archivable_test.result.container.logs); + assert!(archivable_test.result.container.logs.contains("FTEST_AUTH")); + assert!(archivable_test.result.container.logs.contains("FTEST_HOST")); + assert!(archivable_test + .result + .container + .logs + .contains("FTEST_TARGET_HOST")); + assert!(archivable_test.result.container.logs.contains("FTEST_USER")); + assert!(archivable_test + .result + .container + .logs + .contains(&format!("TEST_NAME={}", t.name))); + } } }