examples: export cucumber Mode and share runner defaults

This commit is contained in:
andrussal 2025-12-18 14:11:54 +01:00
parent 91c9044abb
commit bb0378792a
9 changed files with 95 additions and 164 deletions

View File

@ -1,19 +1,13 @@
use std::{ use std::{process, time::Duration};
env, fs,
path::{Path, PathBuf},
process,
time::Duration,
};
use anyhow::{Context as _, Result}; use anyhow::{Context as _, Result};
use runner_examples::{ChaosBuilderExt as _, ScenarioBuilderExt as _, read_env_any}; use runner_examples::{
ChaosBuilderExt as _, ScenarioBuilderExt as _, defaults::Mode, demo, read_env_any,
};
use testing_framework_core::scenario::{Deployer as _, Runner, ScenarioBuilder}; use testing_framework_core::scenario::{Deployer as _, Runner, ScenarioBuilder};
use testing_framework_runner_compose::{ComposeDeployer, ComposeRunnerError}; use testing_framework_runner_compose::{ComposeDeployer, ComposeRunnerError};
use tracing::{info, warn}; use tracing::{info, warn};
const DEFAULT_VALIDATORS: usize = 1;
const DEFAULT_EXECUTORS: usize = 1;
const DEFAULT_RUN_SECS: u64 = 60;
const MIXED_TXS_PER_BLOCK: u64 = 5; const MIXED_TXS_PER_BLOCK: u64 = 5;
const TOTAL_WALLETS: usize = 1000; const TOTAL_WALLETS: usize = 1000;
const TRANSACTION_WALLETS: usize = 500; const TRANSACTION_WALLETS: usize = 500;
@ -30,28 +24,15 @@ const DA_BLOB_RATE: u64 = 1;
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
init_node_log_dir_defaults(); runner_examples::defaults::init_node_log_dir_defaults(Mode::Compose);
// Compose containers mount KZG params at /kzgrs_test_params; ensure the
// generated configs point there unless the caller overrides explicitly.
if env::var("NOMOS_KZGRS_PARAMS_PATH").is_err() {
// Safe: setting a process-wide environment variable before any threads
// or async tasks are spawned.
unsafe {
env::set_var(
"NOMOS_KZGRS_PARAMS_PATH",
"/kzgrs_test_params/kzgrs_test_params",
);
}
}
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
let validators = read_env_any(&["NOMOS_DEMO_VALIDATORS"], DEFAULT_VALIDATORS); let validators = read_env_any(&["NOMOS_DEMO_VALIDATORS"], demo::DEFAULT_VALIDATORS);
let executors = read_env_any(&["NOMOS_DEMO_EXECUTORS"], DEFAULT_EXECUTORS); let executors = read_env_any(&["NOMOS_DEMO_EXECUTORS"], demo::DEFAULT_EXECUTORS);
let run_secs = read_env_any(&["NOMOS_DEMO_RUN_SECS"], DEFAULT_RUN_SECS); let run_secs = read_env_any(&["NOMOS_DEMO_RUN_SECS"], demo::DEFAULT_RUN_SECS);
info!( info!(
validators, validators,
@ -64,35 +45,6 @@ async fn main() {
} }
} }
fn init_node_log_dir_defaults() {
if env::var_os("NOMOS_LOG_DIR").is_some() {
return;
}
let repo_root = repo_root();
let host_dir = repo_root.join("tmp").join("node-logs");
let _ = fs::create_dir_all(&host_dir);
// In compose mode, node processes run inside containers; configs should
// point to the container path, while the compose deployer mounts the host
// repo's `tmp/node-logs` there.
unsafe {
env::set_var("NOMOS_LOG_DIR", "/tmp/node-logs");
}
}
fn repo_root() -> PathBuf {
env::var("CARGO_WORKSPACE_DIR")
.map(PathBuf::from)
.ok()
.or_else(|| {
Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.map(Path::to_path_buf)
})
.expect("repo root must be discoverable from CARGO_WORKSPACE_DIR or CARGO_MANIFEST_DIR")
}
async fn run_compose_case( async fn run_compose_case(
validators: usize, validators: usize,
executors: usize, executors: usize,

View File

@ -1,5 +1,6 @@
use runner_examples::cucumber::{ use runner_examples::{
Mode, init_logging_defaults, init_node_log_dir_defaults, init_tracing, run, cucumber::run,
defaults::{Mode, init_logging_defaults, init_node_log_dir_defaults, init_tracing},
}; };
#[tokio::main(flavor = "current_thread")] #[tokio::main(flavor = "current_thread")]

View File

@ -1,5 +1,6 @@
use runner_examples::cucumber::{ use runner_examples::{
Mode, init_logging_defaults, init_node_log_dir_defaults, init_tracing, run, cucumber::run,
defaults::{Mode, init_logging_defaults, init_node_log_dir_defaults, init_tracing},
}; };
#[tokio::main(flavor = "current_thread")] #[tokio::main(flavor = "current_thread")]

View File

@ -1,7 +1,7 @@
use std::{env, process, time::Duration}; use std::{env, process, time::Duration};
use anyhow::{Context as _, Result}; use anyhow::{Context as _, Result};
use runner_examples::{ScenarioBuilderExt as _, read_env_any}; use runner_examples::{ScenarioBuilderExt as _, demo, read_env_any};
use testing_framework_core::scenario::{ use testing_framework_core::scenario::{
Deployer as _, ObservabilityCapability, Runner, ScenarioBuilder, Deployer as _, ObservabilityCapability, Runner, ScenarioBuilder,
}; };
@ -9,9 +9,6 @@ use testing_framework_runner_k8s::{K8sDeployer, K8sRunnerError};
use testing_framework_workflows::ObservabilityBuilderExt as _; use testing_framework_workflows::ObservabilityBuilderExt as _;
use tracing::{info, warn}; use tracing::{info, warn};
const DEFAULT_RUN_SECS: u64 = 60;
const DEFAULT_VALIDATORS: usize = 1;
const DEFAULT_EXECUTORS: usize = 1;
const MIXED_TXS_PER_BLOCK: u64 = 2; const MIXED_TXS_PER_BLOCK: u64 = 2;
const TOTAL_WALLETS: usize = 200; const TOTAL_WALLETS: usize = 200;
const TRANSACTION_WALLETS: usize = 50; const TRANSACTION_WALLETS: usize = 50;
@ -21,9 +18,9 @@ const DA_BLOB_RATE: u64 = 1;
async fn main() { async fn main() {
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
let validators = read_env_any(&["NOMOS_DEMO_VALIDATORS"], DEFAULT_VALIDATORS); let validators = read_env_any(&["NOMOS_DEMO_VALIDATORS"], demo::DEFAULT_VALIDATORS);
let executors = read_env_any(&["NOMOS_DEMO_EXECUTORS"], DEFAULT_EXECUTORS); let executors = read_env_any(&["NOMOS_DEMO_EXECUTORS"], demo::DEFAULT_EXECUTORS);
let run_secs = read_env_any(&["NOMOS_DEMO_RUN_SECS"], DEFAULT_RUN_SECS); let run_secs = read_env_any(&["NOMOS_DEMO_RUN_SECS"], demo::DEFAULT_RUN_SECS);
info!(validators, executors, run_secs, "starting k8s runner demo"); info!(validators, executors, run_secs, "starting k8s runner demo");
if let Err(err) = run_k8s_case(validators, executors, Duration::from_secs(run_secs)).await { if let Err(err) = run_k8s_case(validators, executors, Duration::from_secs(run_secs)).await {

View File

@ -1,19 +1,11 @@
use std::{ use std::{env, process, time::Duration};
env, fs,
path::{Path, PathBuf},
process,
time::Duration,
};
use anyhow::{Context as _, Result}; use anyhow::{Context as _, Result};
use runner_examples::{ScenarioBuilderExt as _, read_env_any}; use runner_examples::{ScenarioBuilderExt as _, defaults::Mode, demo, read_env_any};
use testing_framework_core::scenario::{Deployer as _, Runner, ScenarioBuilder}; use testing_framework_core::scenario::{Deployer as _, Runner, ScenarioBuilder};
use testing_framework_runner_local::LocalDeployer; use testing_framework_runner_local::LocalDeployer;
use tracing::{info, warn}; use tracing::{info, warn};
const DEFAULT_VALIDATORS: usize = 1;
const DEFAULT_EXECUTORS: usize = 1;
const DEFAULT_RUN_SECS: u64 = 60;
const MIXED_TXS_PER_BLOCK: u64 = 5; const MIXED_TXS_PER_BLOCK: u64 = 5;
const TOTAL_WALLETS: usize = 1000; const TOTAL_WALLETS: usize = 1000;
const TRANSACTION_WALLETS: usize = 500; const TRANSACTION_WALLETS: usize = 500;
@ -22,7 +14,7 @@ const SMOKE_RUN_SECS_MAX: u64 = 30;
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
init_node_log_dir_defaults(); runner_examples::defaults::init_node_log_dir_defaults(Mode::Host);
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
@ -31,9 +23,9 @@ async fn main() {
process::exit(1); process::exit(1);
} }
let validators = read_env_any(&["NOMOS_DEMO_VALIDATORS"], DEFAULT_VALIDATORS); let validators = read_env_any(&["NOMOS_DEMO_VALIDATORS"], demo::DEFAULT_VALIDATORS);
let executors = read_env_any(&["NOMOS_DEMO_EXECUTORS"], DEFAULT_EXECUTORS); let executors = read_env_any(&["NOMOS_DEMO_EXECUTORS"], demo::DEFAULT_EXECUTORS);
let run_secs = read_env_any(&["NOMOS_DEMO_RUN_SECS"], DEFAULT_RUN_SECS); let run_secs = read_env_any(&["NOMOS_DEMO_RUN_SECS"], demo::DEFAULT_RUN_SECS);
info!( info!(
validators, validators,
@ -46,30 +38,6 @@ async fn main() {
} }
} }
fn init_node_log_dir_defaults() {
if env::var_os("NOMOS_LOG_DIR").is_some() {
return;
}
let host_dir = repo_root().join("tmp").join("node-logs");
let _ = fs::create_dir_all(&host_dir);
unsafe {
env::set_var("NOMOS_LOG_DIR", host_dir);
}
}
fn repo_root() -> PathBuf {
env::var("CARGO_WORKSPACE_DIR")
.map(PathBuf::from)
.ok()
.or_else(|| {
Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.map(Path::to_path_buf)
})
.expect("repo root must be discoverable from CARGO_WORKSPACE_DIR or CARGO_MANIFEST_DIR")
}
async fn run_local_case(validators: usize, executors: usize, run_duration: Duration) -> Result<()> { async fn run_local_case(validators: usize, executors: usize, run_duration: Duration) -> Result<()> {
info!( info!(
validators, validators,

View File

@ -1,29 +1,11 @@
use std::{
env, fs,
path::{Path, PathBuf},
};
use cucumber::World; use cucumber::World;
use cucumber_ext::TestingFrameworkWorld; use cucumber_ext::TestingFrameworkWorld;
use tracing_subscriber::{EnvFilter, fmt};
pub use crate::defaults::Mode;
const FEATURES_PATH: &str = "examples/cucumber/features"; const FEATURES_PATH: &str = "examples/cucumber/features";
#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub use crate::defaults::{init_logging_defaults, init_node_log_dir_defaults, init_tracing};
pub enum Mode {
Host,
Compose,
}
fn set_default_env(key: &str, value: &str) {
if std::env::var_os(key).is_none() {
// SAFETY: Used as an early-run default. Prefer setting env vars in the
// shell for multi-threaded runs.
unsafe {
std::env::set_var(key, value);
}
}
}
fn is_compose( fn is_compose(
feature: &cucumber::gherkin::Feature, feature: &cucumber::gherkin::Feature,
@ -33,44 +15,6 @@ fn is_compose(
|| feature.tags.iter().any(|tag| tag == "compose") || feature.tags.iter().any(|tag| tag == "compose")
} }
pub fn init_logging_defaults() {
set_default_env("POL_PROOF_DEV_MODE", "true");
set_default_env("NOMOS_TESTS_KEEP_LOGS", "1");
set_default_env("NOMOS_LOG_LEVEL", "info");
set_default_env("RUST_LOG", "info");
}
pub fn init_node_log_dir_defaults(mode: Mode) {
if env::var_os("NOMOS_LOG_DIR").is_some() {
return;
}
let host_dir = repo_root().join("tmp").join("node-logs");
let _ = fs::create_dir_all(&host_dir);
match mode {
Mode::Host => set_default_env("NOMOS_LOG_DIR", &host_dir.display().to_string()),
Mode::Compose => set_default_env("NOMOS_LOG_DIR", "/tmp/node-logs"),
}
}
fn repo_root() -> PathBuf {
env::var("CARGO_WORKSPACE_DIR")
.map(PathBuf::from)
.ok()
.or_else(|| {
Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.map(Path::to_path_buf)
})
.expect("repo root must be discoverable from CARGO_WORKSPACE_DIR or CARGO_MANIFEST_DIR")
}
pub fn init_tracing() {
let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
let _ = fmt().with_env_filter(filter).with_target(true).try_init();
}
pub async fn run(mode: Mode) { pub async fn run(mode: Mode) {
TestingFrameworkWorld::cucumber() TestingFrameworkWorld::cucumber()
.with_default_cli() .with_default_cli()

63
examples/src/defaults.rs Normal file
View File

@ -0,0 +1,63 @@
use std::{
env, fs,
path::{Path, PathBuf},
};
use tracing_subscriber::{EnvFilter, fmt};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Mode {
Host,
Compose,
}
const DEFAULT_NODE_LOG_DIR_REL: &str = ".tmp/node-logs";
const DEFAULT_CONTAINER_NODE_LOG_DIR: &str = "/tmp/node-logs";
fn set_default_env(key: &str, value: &str) {
if std::env::var_os(key).is_none() {
// SAFETY: Used as an early-run default. Prefer setting env vars in the
// shell for multi-threaded runs.
unsafe {
std::env::set_var(key, value);
}
}
}
pub fn init_logging_defaults() {
set_default_env("POL_PROOF_DEV_MODE", "true");
set_default_env("NOMOS_TESTS_KEEP_LOGS", "1");
set_default_env("NOMOS_LOG_LEVEL", "info");
set_default_env("RUST_LOG", "info");
}
pub fn init_node_log_dir_defaults(mode: Mode) {
if env::var_os("NOMOS_LOG_DIR").is_some() {
return;
}
let host_dir = repo_root().join(DEFAULT_NODE_LOG_DIR_REL);
let _ = fs::create_dir_all(&host_dir);
match mode {
Mode::Host => set_default_env("NOMOS_LOG_DIR", &host_dir.display().to_string()),
Mode::Compose => set_default_env("NOMOS_LOG_DIR", DEFAULT_CONTAINER_NODE_LOG_DIR),
}
}
pub fn init_tracing() {
let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
let _ = fmt().with_env_filter(filter).with_target(true).try_init();
}
fn repo_root() -> PathBuf {
env::var("CARGO_WORKSPACE_DIR")
.map(PathBuf::from)
.ok()
.or_else(|| {
Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.map(Path::to_path_buf)
})
.unwrap_or_else(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")))
}

3
examples/src/demo.rs Normal file
View File

@ -0,0 +1,3 @@
pub const DEFAULT_VALIDATORS: usize = 1;
pub const DEFAULT_EXECUTORS: usize = 1;
pub const DEFAULT_RUN_SECS: u64 = 60;

View File

@ -1,4 +1,6 @@
pub mod cucumber; pub mod cucumber;
pub mod defaults;
pub mod demo;
pub mod env; pub mod env;
pub use env::read_env_any; pub use env::read_env_any;