mirror of
https://github.com/NLnetLabs/krill.git
synced 2026-09-20 16:37:43 +02:00
116 lines
4.2 KiB
Rust
116 lines
4.2 KiB
Rust
#[cfg(feature = "multi-user")]
|
|
mod openid_connect_mock;
|
|
|
|
use tokio::task;
|
|
|
|
use std::{env, process::ExitStatus};
|
|
use std::process::Command;
|
|
|
|
use krill::daemon::config::Config;
|
|
use krill::test::*;
|
|
|
|
pub async fn run_krill_ui_test(test_name: &str, _with_openid_server: bool, testbed_enabled: bool) {
|
|
#[cfg(feature = "multi-user")]
|
|
let mock_server_join_handle = if _with_openid_server {
|
|
openid_connect_mock::start(1).await
|
|
} else {
|
|
None
|
|
};
|
|
|
|
do_run_krill_ui_test(test_name, testbed_enabled).await;
|
|
|
|
#[cfg(feature = "multi-user")]
|
|
if _with_openid_server {
|
|
openid_connect_mock::stop(mock_server_join_handle).await;
|
|
}
|
|
}
|
|
|
|
struct CypressRunner {
|
|
status: ExitStatus
|
|
}
|
|
impl CypressRunner {
|
|
pub async fn run(test_name: &str) -> Self {
|
|
let test_name = test_name.to_string();
|
|
|
|
ctrlc::set_handler(move || {
|
|
// If `cargo test` is stopped with CTRL-C the background Cypress Docker container continues to run. This
|
|
// prevents the next run of `cargo test` from working as the container unexpectedly already exists. Tell
|
|
// Docker to kill it to avoid leaving it lying around.
|
|
Command::new("docker").arg("kill").arg("cypress").spawn().expect("Failed to kill Cypress Docker container");
|
|
}).expect("Error setting Ctrl-C handler");
|
|
|
|
let task = task::spawn_blocking(move || {
|
|
// NOTE: the directory mentioned here must be the same as the directory
|
|
// mentioned in the tests/ui/cypress/plugins/index.js file in the
|
|
// "integrationFolder" property otherwise Cypress mysteriously complains
|
|
// that it cannot find the spec file.
|
|
let cypress_spec_path = format!("tests/ui/cypress/specs/{}.js", test_name);
|
|
|
|
let mut cmd = Command::new("docker");
|
|
|
|
cmd
|
|
.arg("run")
|
|
.arg("--name").arg("cypress")
|
|
.arg("--rm")
|
|
.arg("--net=host")
|
|
.arg("--ipc=host")
|
|
.arg("-v").arg(format!("{}:/e2e", env::current_dir().unwrap().display()))
|
|
.arg("-w").arg("/e2e");
|
|
|
|
if let Ok(debug_level) = std::env::var("CYPRESS_DEBUG") {
|
|
// Example values:
|
|
// - To get LOTS of Cypress logging: CYPRESS_DEBUG=cypress:*
|
|
// - To get logging relating to HTTP requests: CYPRESS_DEBUG=cypress:proxy:http:*
|
|
cmd
|
|
.arg("-e").arg(format!("DEBUG={}", debug_level));
|
|
}
|
|
|
|
if std::env::var("CYPRESS_INTERACTIVE").is_ok() {
|
|
// After running `cargo test` a Chrome browser should open from the Cypress Docker container on your local
|
|
// X server. For this to work you might need to run this command in your shell prior to `cargo test`:
|
|
// xhost +
|
|
cmd
|
|
.arg("-v").arg(format!("/tmp/.X11-unix:/tmp/.X11-unix"))
|
|
.arg("-e").arg("DISPLAY")
|
|
.arg("--entrypoint").arg("cypress");
|
|
}
|
|
|
|
cmd.arg("cypress/included:6.2.0");
|
|
|
|
if std::env::var("CYPRESS_INTERACTIVE").is_ok() {
|
|
cmd
|
|
.arg("open")
|
|
.arg("--project").arg(".");
|
|
} else {
|
|
cmd
|
|
.arg("--spec").arg(cypress_spec_path);
|
|
}
|
|
|
|
cmd
|
|
.arg("--browser").arg("chrome")
|
|
.status()
|
|
.expect("Failed to run Cypress Docker UI test suite")
|
|
}).await;
|
|
|
|
Self {
|
|
status: task.unwrap()
|
|
}
|
|
}
|
|
|
|
pub fn success(self) -> bool {
|
|
self.status.success()
|
|
}
|
|
}
|
|
|
|
async fn do_run_krill_ui_test(test_name: &str, testbed_enabled: bool) {
|
|
krill::constants::enable_test_mode();
|
|
let config_path = &format!("test-resources/ui/{}.conf", test_name);
|
|
let config = Config::read_config(&config_path).unwrap();
|
|
|
|
// Start Krill as a Tokio task in the background and wait just until we can tell that it has started.
|
|
start_krill(Some(config), testbed_enabled).await;
|
|
|
|
// Run the specified Cypress UI test suite and wait for it to finish
|
|
assert!(CypressRunner::run(test_name).await.success());
|
|
}
|