Skip to content

Commit 41641c4

Browse files
committed
refactor: [torrust#659] use clap and anyhow in E2E test runner
You can execute the E2E runner with: ```bash cargo run --bin e2e_tests_runner -- --config-toml-path "./share/default/config/tracker.e2e.container.sqlite3.toml" ``` Or: ```bash TORRUST_TRACKER_CONFIG_TOML_PATH="./share/default/config/tracker.e2e.container.sqlite3.toml" cargo run --bin e2e_tests_runner ``` Or: ```bash TORRUST_TRACKER_CONFIG_TOML=$(cat "./share/default/config/tracker.e2e.container.sqlite3.toml") cargo run --bin e2e_tests_runner ```
1 parent dc171c1 commit 41641c4

File tree

3 files changed

+61
-30
lines changed

3 files changed

+61
-30
lines changed

.github/workflows/testing.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,4 @@ jobs:
152152

153153
- id: test
154154
name: Run E2E Tests
155-
run: cargo run --bin e2e_tests_runner ./share/default/config/tracker.e2e.container.sqlite3.toml
155+
run: cargo run --bin e2e_tests_runner -- --config-toml-path "./share/default/config/tracker.e2e.container.sqlite3.toml"

src/bin/e2e_tests_runner.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Program to run E2E tests.
22
use torrust_tracker::console::ci::e2e;
33

4-
fn main() {
5-
e2e::runner::run();
4+
fn main() -> anyhow::Result<()> {
5+
e2e::runner::run()
66
}

src/console/ci/e2e/runner.rs

+58-27
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
11
//! Program to run E2E tests.
22
//!
3+
//! You can execute it with (passing a TOML config file path):
4+
//!
5+
//! ```text
6+
//! cargo run --bin e2e_tests_runner -- --config-toml-path "./share/default/config/tracker.e2e.container.sqlite3.toml"
7+
//! ```
8+
//!
9+
//! Or:
10+
//!
311
//! ```text
4-
//! cargo run --bin e2e_tests_runner share/default/config/tracker.e2e.container.sqlite3.toml
12+
//! TORRUST_TRACKER_CONFIG_TOML_PATH="./share/default/config/tracker.e2e.container.sqlite3.toml" cargo run --bin e2e_tests_runner"
513
//! ```
14+
//!
15+
//! You can execute it with (directly passing TOML config):
16+
//!
17+
//! ```text
18+
//! TORRUST_TRACKER_CONFIG_TOML=$(cat "./share/default/config/tracker.e2e.container.sqlite3.toml") cargo run --bin e2e_tests_runner
19+
//! ```
20+
use std::path::PathBuf;
21+
22+
use anyhow::Context;
23+
use clap::Parser;
624
use tracing::info;
725
use tracing::level_filters::LevelFilter;
826

@@ -19,25 +37,38 @@ use crate::console::ci::e2e::tracker_checker::{self};
1937
Should we remove the image too?
2038
*/
2139

22-
const NUMBER_OF_ARGUMENTS: usize = 2;
2340
const CONTAINER_IMAGE: &str = "torrust-tracker:local";
2441
const CONTAINER_NAME_PREFIX: &str = "tracker_";
2542

26-
pub struct Arguments {
27-
pub tracker_config_path: String,
43+
#[derive(Parser, Debug)]
44+
#[clap(author, version, about, long_about = None)]
45+
struct Args {
46+
/// Path to the JSON configuration file.
47+
#[clap(short, long, env = "TORRUST_TRACKER_CONFIG_TOML_PATH")]
48+
config_toml_path: Option<PathBuf>,
49+
50+
/// Direct configuration content in JSON.
51+
#[clap(env = "TORRUST_TRACKER_CONFIG_TOML", hide_env_values = true)]
52+
config_toml: Option<String>,
2853
}
2954

3055
/// Script to run E2E tests.
3156
///
57+
/// # Errors
58+
///
59+
/// Will return an error if it can't load the tracker configuration from arguments.
60+
///
3261
/// # Panics
3362
///
3463
/// Will panic if it can't not perform any of the operations.
35-
pub fn run() {
64+
pub fn run() -> anyhow::Result<()> {
3665
tracing_stdout_init(LevelFilter::INFO);
3766

38-
let args = parse_arguments();
67+
let args = Args::parse();
68+
69+
let tracker_config = load_tracker_configuration(&args)?;
3970

40-
let tracker_config = load_tracker_configuration(&args.tracker_config_path);
71+
info!("tracker config:\n{tracker_config}");
4172

4273
let mut tracker_container = TrackerContainer::new(CONTAINER_IMAGE, CONTAINER_NAME_PREFIX);
4374

@@ -80,36 +111,36 @@ pub fn run() {
80111
tracker_container.remove();
81112

82113
info!("Tracker container final state:\n{:#?}", tracker_container);
114+
115+
Ok(())
83116
}
84117

85118
fn tracing_stdout_init(filter: LevelFilter) {
86119
tracing_subscriber::fmt().with_max_level(filter).with_ansi(false).init();
87-
info!("logging initialized.");
120+
info!("Logging initialized.");
88121
}
89122

90-
fn parse_arguments() -> Arguments {
91-
let args: Vec<String> = std::env::args().collect();
92-
93-
if args.len() < NUMBER_OF_ARGUMENTS {
94-
eprintln!("Usage: cargo run --bin e2e_tests_runner <PATH_TO_TRACKER_CONFIG_FILE>");
95-
eprintln!("For example: cargo run --bin e2e_tests_runner ./share/default/config/tracker.e2e.container.sqlite3.toml");
96-
std::process::exit(1);
97-
}
98-
99-
let config_path = &args[1];
100-
101-
Arguments {
102-
tracker_config_path: config_path.to_string(),
123+
fn load_tracker_configuration(args: &Args) -> anyhow::Result<String> {
124+
match (args.config_toml_path.clone(), args.config_toml.clone()) {
125+
(Some(config_path), _) => {
126+
info!(
127+
"Reading tracker configuration from file: {} ...",
128+
config_path.to_string_lossy()
129+
);
130+
load_config_from_file(&config_path)
131+
}
132+
(_, Some(config_content)) => {
133+
info!("Reading tracker configuration from env var ...");
134+
Ok(config_content)
135+
}
136+
_ => Err(anyhow::anyhow!("No configuration provided")),
103137
}
104138
}
105139

106-
fn load_tracker_configuration(tracker_config_path: &str) -> String {
107-
info!("Reading tracker configuration from file: {} ...", tracker_config_path);
108-
read_file(tracker_config_path)
109-
}
140+
fn load_config_from_file(path: &PathBuf) -> anyhow::Result<String> {
141+
let config = std::fs::read_to_string(path).with_context(|| format!("CSan't read config file {path:?}"))?;
110142

111-
fn read_file(path: &str) -> String {
112-
std::fs::read_to_string(path).unwrap_or_else(|_| panic!("Can't read file {path}"))
143+
Ok(config)
113144
}
114145

115146
fn assert_there_is_at_least_one_service_per_type(running_services: &RunningServices) {

0 commit comments

Comments
 (0)