1
1
//! Program to run E2E tests.
2
2
//!
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
+ //!
3
11
//! ```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"
5
13
//! ```
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 ;
6
24
use tracing:: info;
7
25
use tracing:: level_filters:: LevelFilter ;
8
26
@@ -19,25 +37,38 @@ use crate::console::ci::e2e::tracker_checker::{self};
19
37
Should we remove the image too?
20
38
*/
21
39
22
- const NUMBER_OF_ARGUMENTS : usize = 2 ;
23
40
const CONTAINER_IMAGE : & str = "torrust-tracker:local" ;
24
41
const CONTAINER_NAME_PREFIX : & str = "tracker_" ;
25
42
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 > ,
28
53
}
29
54
30
55
/// Script to run E2E tests.
31
56
///
57
+ /// # Errors
58
+ ///
59
+ /// Will return an error if it can't load the tracker configuration from arguments.
60
+ ///
32
61
/// # Panics
33
62
///
34
63
/// Will panic if it can't not perform any of the operations.
35
- pub fn run ( ) {
64
+ pub fn run ( ) -> anyhow :: Result < ( ) > {
36
65
tracing_stdout_init ( LevelFilter :: INFO ) ;
37
66
38
- let args = parse_arguments ( ) ;
67
+ let args = Args :: parse ( ) ;
68
+
69
+ let tracker_config = load_tracker_configuration ( & args) ?;
39
70
40
- let tracker_config = load_tracker_configuration ( & args . tracker_config_path ) ;
71
+ info ! ( "tracker config: \n { tracker_config}" ) ;
41
72
42
73
let mut tracker_container = TrackerContainer :: new ( CONTAINER_IMAGE , CONTAINER_NAME_PREFIX ) ;
43
74
@@ -80,36 +111,36 @@ pub fn run() {
80
111
tracker_container. remove ( ) ;
81
112
82
113
info ! ( "Tracker container final state:\n {:#?}" , tracker_container) ;
114
+
115
+ Ok ( ( ) )
83
116
}
84
117
85
118
fn tracing_stdout_init ( filter : LevelFilter ) {
86
119
tracing_subscriber:: fmt ( ) . with_max_level ( filter) . with_ansi ( false ) . init ( ) ;
87
- info ! ( "logging initialized." ) ;
120
+ info ! ( "Logging initialized." ) ;
88
121
}
89
122
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" ) ) ,
103
137
}
104
138
}
105
139
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:?}" ) ) ?;
110
142
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)
113
144
}
114
145
115
146
fn assert_there_is_at_least_one_service_per_type ( running_services : & RunningServices ) {
0 commit comments