diff --git a/Cargo.lock b/Cargo.lock index 9045b7c4..ce179501 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3019,6 +3019,7 @@ dependencies = [ "rand", "tokio", "torrust-tracker-configuration", + "torrust-tracker-primitives", ] [[package]] diff --git a/packages/test-helpers/Cargo.toml b/packages/test-helpers/Cargo.toml index 5be0e8ab..2f942bac 100644 --- a/packages/test-helpers/Cargo.toml +++ b/packages/test-helpers/Cargo.toml @@ -9,3 +9,4 @@ tokio = { version = "1", features = ["rt-multi-thread", "net", "sync", "macros", lazy_static = "1.4" rand = "0.8.5" torrust-tracker-configuration = { path = "../configuration"} +torrust-tracker-primitives = { path = "../primitives"} diff --git a/packages/test-helpers/src/configuration.rs b/packages/test-helpers/src/configuration.rs index a978a050..ec29fdbe 100644 --- a/packages/test-helpers/src/configuration.rs +++ b/packages/test-helpers/src/configuration.rs @@ -1,6 +1,8 @@ use std::env; +use std::net::IpAddr; use torrust_tracker_configuration::Configuration; +use torrust_tracker_primitives::TrackerMode; use crate::random; @@ -43,3 +45,70 @@ pub fn ephemeral() -> Configuration { config } + +#[must_use] +pub fn ephemeral_with_reverse_proxy() -> Configuration { + let mut cfg = ephemeral(); + + cfg.on_reverse_proxy = true; + + cfg +} + +#[must_use] +pub fn ephemeral_mode_public() -> Configuration { + let mut cfg = ephemeral(); + + cfg.mode = TrackerMode::Public; + + cfg +} + +#[must_use] +pub fn ephemeral_mode_private() -> Configuration { + let mut cfg = ephemeral(); + + cfg.mode = TrackerMode::Private; + + cfg +} + +#[must_use] +pub fn ephemeral_mode_whitelisted() -> Configuration { + let mut cfg = ephemeral(); + + cfg.mode = TrackerMode::Listed; + + cfg +} + +#[must_use] +pub fn ephemeral_mode_private_whitelisted() -> Configuration { + let mut cfg = ephemeral(); + + cfg.mode = TrackerMode::PrivateListed; + + cfg +} + +#[must_use] +pub fn ephemeral_with_external_ip(ip: IpAddr) -> Configuration { + let mut cfg = ephemeral(); + + cfg.external_ip = Some(ip.to_string()); + + cfg +} + +#[must_use] +pub fn ephemeral_ipv6() -> Configuration { + let mut cfg = ephemeral(); + + let ipv6 = format!("[::]:{}", 0); + + cfg.http_api.bind_address = ipv6.clone(); + cfg.http_trackers[0].bind_address = ipv6.clone(); + cfg.udp_trackers[0].bind_address = ipv6; + + cfg +} diff --git a/src/http/tracker_interface.rs b/src/http/tracker_interface.rs index a8bb057d..fc4ba9c9 100644 --- a/src/http/tracker_interface.rs +++ b/src/http/tracker_interface.rs @@ -33,8 +33,8 @@ pub type StoppedHttpServer = HttpServer>; pub type RunningHttpServer = HttpServer>; pub struct HttpServer { - cfg: torrust_tracker_configuration::HttpTracker, - state: S, + pub cfg: torrust_tracker_configuration::HttpTracker, + pub state: S, } pub struct Stopped { @@ -42,7 +42,7 @@ pub struct Stopped { } pub struct Running { - bind_addr: SocketAddr, + pub bind_addr: SocketAddr, task_killer: tokio::sync::oneshot::Sender, task: tokio::task::JoinHandle, } diff --git a/tests/api/test_environment.rs b/tests/api/test_environment.rs index 4f119fd6..1565530c 100644 --- a/tests/api/test_environment.rs +++ b/tests/api/test_environment.rs @@ -6,7 +6,7 @@ use torrust_tracker::tracker::peer::Peer; use torrust_tracker::tracker::Tracker; use super::connection_info::ConnectionInfo; -use crate::common::tracker::{tracker_configuration, tracker_instance}; +use crate::common::tracker::new_tracker; #[allow(clippy::module_name_repetitions, dead_code)] pub type StoppedTestEnvironment = TestEnvironment; @@ -89,9 +89,9 @@ pub fn running_test_environment() -> RunningTestEnvironment { } pub fn api_server() -> StoppedApiServer { - let config = tracker_configuration(); + let config = Arc::new(torrust_tracker_test_helpers::configuration::ephemeral()); - let tracker = tracker_instance(&config); + let tracker = new_tracker(config.clone()); ApiServer::new(config.http_api.clone(), tracker) } diff --git a/tests/common/http.rs b/tests/common/http.rs index 90275267..d682027f 100644 --- a/tests/common/http.rs +++ b/tests/common/http.rs @@ -1,11 +1,6 @@ pub type ReqwestQuery = Vec; pub type ReqwestQueryParam = (String, String); -#[derive(Clone, Debug)] -pub struct ConnectionInfo { - pub bind_address: String, -} - /// URL Query component #[derive(Default, Debug)] pub struct Query { diff --git a/tests/common/tracker.rs b/tests/common/tracker.rs index c0e44749..7451bbc3 100644 --- a/tests/common/tracker.rs +++ b/tests/common/tracker.rs @@ -4,12 +4,8 @@ use torrust_tracker::tracker::statistics::Keeper; use torrust_tracker::tracker::Tracker; use torrust_tracker::{ephemeral_instance_keys, logging, static_time}; -pub fn tracker_configuration() -> Arc { - Arc::new(torrust_tracker_test_helpers::configuration::ephemeral()) -} - // TODO: Move to test-helpers crate once `Tracker` is isolated. -pub fn tracker_instance(configuration: &Arc) -> Arc { +pub fn new_tracker(configuration: Arc) -> Arc { // Set the time of Torrust app starting lazy_static::initialize(&static_time::TIME_AT_APP_START); @@ -20,7 +16,7 @@ pub fn tracker_instance(configuration: &Arc Arc::new(tracker), Err(error) => { panic!("{}", error) @@ -28,7 +24,7 @@ pub fn tracker_instance(configuration: &Arc, } @@ -23,26 +22,26 @@ pub struct Client { /// base url path query /// ``` impl Client { - pub fn new(connection_info: ConnectionInfo) -> Self { + pub fn new(server_addr: std::net::SocketAddr) -> Self { Self { - connection_info, + server_addr, reqwest_client: reqwest::Client::builder().build().unwrap(), key: None, } } /// Creates the new client binding it to an specific local address - pub fn bind(connection_info: ConnectionInfo, local_address: IpAddr) -> Self { + pub fn bind(server_addr: std::net::SocketAddr, local_address: IpAddr) -> Self { Self { - connection_info, + server_addr, reqwest_client: reqwest::Client::builder().local_address(local_address).build().unwrap(), key: None, } } - pub fn authenticated(connection_info: ConnectionInfo, key: Key) -> Self { + pub fn authenticated(server_addr: std::net::SocketAddr, key: Key) -> Self { Self { - connection_info, + server_addr, reqwest_client: reqwest::Client::builder().build().unwrap(), key: Some(key), } @@ -95,6 +94,6 @@ impl Client { } fn base_url(&self) -> String { - format!("http://{}/", &self.connection_info.bind_address) + format!("http://{}/", &self.server_addr) } } diff --git a/tests/http/mod.rs b/tests/http/mod.rs index a335723e..771145f4 100644 --- a/tests/http/mod.rs +++ b/tests/http/mod.rs @@ -1,10 +1,8 @@ pub mod asserts; pub mod asserts_warp; pub mod client; -pub mod connection_info; pub mod requests; pub mod responses; -pub mod server; pub mod test_environment; use percent_encoding::NON_ALPHANUMERIC; diff --git a/tests/http/server.rs b/tests/http/server.rs deleted file mode 100644 index 4753ee4d..00000000 --- a/tests/http/server.rs +++ /dev/null @@ -1,137 +0,0 @@ -use core::panic; -use std::net::{IpAddr, SocketAddr}; -use std::sync::Arc; - -use torrust_tracker::http::Version; -use torrust_tracker::jobs::http_tracker; -use torrust_tracker::protocol::info_hash::InfoHash; -use torrust_tracker::tracker::peer::Peer; -use torrust_tracker::tracker::statistics::Keeper; -use torrust_tracker::{ephemeral_instance_keys, logging, static_time, tracker}; -use torrust_tracker_configuration::Configuration; -use torrust_tracker_primitives::TrackerMode; - -use super::connection_info::ConnectionInfo; - -/// Starts a HTTP tracker with mode "public" in settings -pub async fn start_public_http_tracker(version: Version) -> Server { - let mut configuration = torrust_tracker_test_helpers::configuration::ephemeral(); - configuration.mode = TrackerMode::Public; - start_custom_http_tracker(Arc::new(configuration), version).await -} - -/// Starts a HTTP tracker with mode "listed" in settings -pub async fn start_whitelisted_http_tracker(version: Version) -> Server { - let mut configuration = torrust_tracker_test_helpers::configuration::ephemeral(); - configuration.mode = TrackerMode::Listed; - start_custom_http_tracker(Arc::new(configuration), version).await -} - -/// Starts a HTTP tracker with mode "private" in settings -pub async fn start_private_http_tracker(version: Version) -> Server { - let mut configuration = torrust_tracker_test_helpers::configuration::ephemeral(); - configuration.mode = TrackerMode::Private; - start_custom_http_tracker(Arc::new(configuration), version).await -} - -/// Starts a HTTP tracker with a wildcard IPV6 address. -/// The configuration in the `config.toml` file would be like this: -/// -/// ```text -/// [[http_trackers]] -/// bind_address = "[::]:7070" -/// ``` -pub async fn start_ipv6_http_tracker(version: Version) -> Server { - let mut configuration = torrust_tracker_test_helpers::configuration::ephemeral(); - - // Change socket address to "wildcard address" (unspecified address which means any IP address) - // but keeping the random port generated with the ephemeral configuration. - let socket_addr: SocketAddr = configuration.http_trackers[0].bind_address.parse().unwrap(); - let new_ipv6_socket_address = format!("[::]:{}", socket_addr.port()); - configuration.http_trackers[0].bind_address = new_ipv6_socket_address; - - start_custom_http_tracker(Arc::new(configuration), version).await -} - -/// Starts a HTTP tracker with an specific `external_ip`. -/// The configuration in the `config.toml` file would be like this: -/// -/// ```text -/// external_ip = "2.137.87.41" -/// ``` -pub async fn start_http_tracker_with_external_ip(external_ip: &IpAddr, version: Version) -> Server { - let mut configuration = torrust_tracker_test_helpers::configuration::ephemeral(); - configuration.external_ip = Some(external_ip.to_string()); - start_custom_http_tracker(Arc::new(configuration), version).await -} - -/// Starts a HTTP tracker `on_reverse_proxy`. -/// The configuration in the `config.toml` file would be like this: -/// -/// ```text -/// on_reverse_proxy = true -/// ``` -pub async fn start_http_tracker_on_reverse_proxy(version: Version) -> Server { - let mut configuration = torrust_tracker_test_helpers::configuration::ephemeral(); - configuration.on_reverse_proxy = true; - start_custom_http_tracker(Arc::new(configuration), version).await -} - -pub async fn start_default_http_tracker(version: Version) -> Server { - let configuration = tracker_configuration(); - start_custom_http_tracker(configuration.clone(), version).await -} - -pub fn tracker_configuration() -> Arc { - Arc::new(torrust_tracker_test_helpers::configuration::ephemeral()) -} - -pub async fn start_custom_http_tracker(configuration: Arc, version: Version) -> Server { - let server = start(&configuration); - http_tracker::start_job(&configuration.http_trackers[0], server.tracker.clone(), version).await; - server -} - -fn start(configuration: &Arc) -> Server { - let connection_info = ConnectionInfo::anonymous(&configuration.http_trackers[0].bind_address.clone()); - - // Set the time of Torrust app starting - lazy_static::initialize(&static_time::TIME_AT_APP_START); - - // Initialize the Ephemeral Instance Random Seed - lazy_static::initialize(&ephemeral_instance_keys::RANDOM_SEED); - - // Initialize stats tracker - let (stats_event_sender, stats_repository) = Keeper::new_active_instance(); - - // Initialize Torrust tracker - let tracker = match tracker::Tracker::new(configuration, Some(stats_event_sender), stats_repository) { - Ok(tracker) => Arc::new(tracker), - Err(error) => { - panic!("{}", error) - } - }; - - // Initialize logging - logging::setup(configuration); - - Server { - tracker, - connection_info, - } -} - -pub struct Server { - pub tracker: Arc, - pub connection_info: ConnectionInfo, -} - -impl Server { - pub fn get_connection_info(&self) -> ConnectionInfo { - self.connection_info.clone() - } - - pub async fn add_torrent_peer(&self, info_hash: &InfoHash, peer: &Peer) { - self.tracker.update_torrent_with_peer_and_get_stats(info_hash, peer).await; - } -} diff --git a/tests/http/test_environment.rs b/tests/http/test_environment.rs index 87232f79..a2cb4619 100644 --- a/tests/http/test_environment.rs +++ b/tests/http/test_environment.rs @@ -5,7 +5,7 @@ use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::peer::Peer; use torrust_tracker::tracker::Tracker; -use crate::common::tracker::{tracker_configuration, tracker_instance}; +use crate::common::tracker::new_tracker; #[allow(clippy::module_name_repetitions, dead_code)] pub type StoppedTestEnvironment = TestEnvironment>; @@ -13,6 +13,7 @@ pub type StoppedTestEnvironment = TestEnvironment>; pub type RunningTestEnvironment = TestEnvironment>; pub struct TestEnvironment { + pub cfg: Arc, pub tracker: Arc, pub state: S, } @@ -35,14 +36,15 @@ impl TestEnvironment { impl TestEnvironment> { #[allow(dead_code)] - pub fn new_stopped() -> Self { - let cfg = tracker_configuration(); + pub fn new_stopped(cfg: torrust_tracker_configuration::Configuration) -> Self { + let cfg = Arc::new(cfg); - let tracker = tracker_instance(&cfg); + let tracker = new_tracker(cfg.clone()); let http_server = stopped_http_server(cfg.http_trackers[0].clone()); Self { + cfg, tracker, state: Stopped { http_server }, } @@ -51,39 +53,61 @@ impl TestEnvironment> { #[allow(dead_code)] pub async fn start(self) -> TestEnvironment> { TestEnvironment { + cfg: self.cfg, tracker: self.tracker.clone(), state: Running { http_server: self.state.http_server.start(self.tracker).await.unwrap(), }, } } + + pub fn config(&self) -> &torrust_tracker_configuration::HttpTracker { + &self.state.http_server.cfg + } + + pub fn config_mut(&mut self) -> &mut torrust_tracker_configuration::HttpTracker { + &mut self.state.http_server.cfg + } } impl TestEnvironment> { - pub async fn new_running() -> Self { - let test_env = StoppedTestEnvironment::new_stopped(); + pub async fn new_running(cfg: torrust_tracker_configuration::Configuration) -> Self { + let test_env = StoppedTestEnvironment::new_stopped(cfg); test_env.start().await } pub async fn stop(self) -> TestEnvironment> { TestEnvironment { + cfg: self.cfg, tracker: self.tracker, state: Stopped { http_server: self.state.http_server.stop().await.unwrap(), }, } } + + pub fn bind_address(&self) -> &std::net::SocketAddr { + &self.state.http_server.state.bind_addr + } + + pub fn config(&self) -> &torrust_tracker_configuration::HttpTracker { + &self.state.http_server.cfg + } } #[allow(clippy::module_name_repetitions)] -pub async fn stopped_test_environment() -> StoppedTestEnvironment { - TestEnvironment::new_stopped().await +pub fn stopped_test_environment( + cfg: torrust_tracker_configuration::Configuration, +) -> StoppedTestEnvironment { + TestEnvironment::new_stopped(cfg) } #[allow(clippy::module_name_repetitions)] -pub async fn running_test_environment() -> RunningTestEnvironment { - TestEnvironment::new_running().await +pub async fn running_test_environment( + cfg: torrust_tracker_configuration::Configuration, +) -> RunningTestEnvironment { + TestEnvironment::new_running(cfg).await } pub fn stopped_http_server( diff --git a/tests/http_tracker.rs b/tests/http_tracker.rs index c0d0bdd2..22a6c44f 100644 --- a/tests/http_tracker.rs +++ b/tests/http_tracker.rs @@ -2,12 +2,12 @@ /// /// Warp version: /// ```text -/// cargo test `warp_http_tracker_server` -- --nocapture +/// cargo test `warp_test_env` -- --nocapture /// ``` /// /// Axum version (WIP): /// ```text -/// cargo test `warp_http_tracker_server` -- --nocapture +/// cargo test `warp_test_env` -- --nocapture /// ``` mod common; mod http; @@ -15,31 +15,30 @@ mod http; pub type Axum = torrust_tracker::http::axum_implementation::server::Server; pub type Warp = torrust_tracker::http::warp_implementation::server::Server; -mod http_tracker_test_environment { +mod test_env_test_environment { use crate::http::test_environment::running_test_environment; use crate::{Axum, Warp}; #[tokio::test] async fn should_be_able_to_start_and_stop_a_test_environment_using_axum() { - let test_env = running_test_environment::().await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; test_env.stop().await; } #[tokio::test] async fn should_be_able_to_start_and_stop_a_test_environment_using_warp() { - let test_env = running_test_environment::().await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; test_env.stop().await; } } -mod warp_http_tracker_server { +mod warp_test_env { mod for_all_config_modes { mod running_on_reverse_proxy { - use torrust_tracker::http::Version; use crate::http::asserts::{ assert_could_not_find_remote_address_on_xff_header_error_response, @@ -47,18 +46,21 @@ mod warp_http_tracker_server { }; use crate::http::client::Client; use crate::http::requests::announce::QueryBuilder; - use crate::http::server::start_http_tracker_on_reverse_proxy; + use crate::http::test_environment::{running_test_environment, stopped_test_environment}; + use crate::Warp; #[tokio::test] async fn should_fail_when_the_http_request_does_not_include_the_xff_http_request_header() { // If the tracker is running behind a reverse proxy, the peer IP is the // last IP in the `X-Forwarded-For` HTTP header, which is the IP of the proxy client. - let http_tracker_server = start_http_tracker_on_reverse_proxy(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_reverse_proxy()) + .await; let params = QueryBuilder::default().query().params(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -67,11 +69,13 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_when_the_xff_http_request_header_contains_an_invalid_ip() { - let http_tracker_server = start_http_tracker_on_reverse_proxy(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_reverse_proxy()) + .await; let params = QueryBuilder::default().query().params(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get_with_header(&format!("announce?{params}"), "X-Forwarded-For", "INVALID IP") .await; @@ -97,7 +101,6 @@ mod warp_http_tracker_server { use local_ip_address::local_ip; use reqwest::Response; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::peer; @@ -113,20 +116,18 @@ mod warp_http_tracker_server { use crate::http::responses; use crate::http::responses::announce::{Announce, CompactPeer, CompactPeerList}; use crate::http::responses::announce_warp::{WarpAnnounce, WarpDictionaryPeer}; - use crate::http::server::{ - start_default_http_tracker, start_http_tracker_on_reverse_proxy, start_http_tracker_with_external_ip, - start_ipv6_http_tracker, start_public_http_tracker, - }; + use crate::http::test_environment::running_test_environment; + use crate::Warp; #[tokio::test] async fn should_respond_if_only_the_mandatory_fields_are_provided() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); params.remove_optional_params(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -135,16 +136,16 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_when_the_url_query_component_is_empty() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; - let response = Client::new(http_tracker_server.get_connection_info()).get("announce").await; + let response = Client::new(test_env.bind_address().clone()).get("announce").await; assert_internal_server_error_response(response).await; } #[tokio::test] async fn should_fail_when_a_mandatory_field_is_missing() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; // Without `info_hash` param @@ -152,7 +153,7 @@ mod warp_http_tracker_server { params.info_hash = None; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -164,7 +165,7 @@ mod warp_http_tracker_server { params.peer_id = None; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -176,7 +177,7 @@ mod warp_http_tracker_server { params.port = None; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -185,14 +186,14 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_when_the_info_hash_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); for invalid_value in &invalid_info_hashes() { params.set("info_hash", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -207,13 +208,13 @@ mod warp_http_tracker_server { // 1. If tracker is NOT running `on_reverse_proxy` from the remote client IP if there. // 2. If tracker is running `on_reverse_proxy` from `X-Forwarded-For` request header is tracker is running `on_reverse_proxy`. - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); params.peer_addr = Some("INVALID-IP-ADDRESS".to_string()); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -222,7 +223,7 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_when_the_downloaded_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -231,7 +232,7 @@ mod warp_http_tracker_server { for invalid_value in invalid_values { params.set("downloaded", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -241,7 +242,7 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_when_the_uploaded_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -250,7 +251,7 @@ mod warp_http_tracker_server { for invalid_value in invalid_values { params.set("uploaded", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -260,7 +261,7 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_when_the_peer_id_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -276,7 +277,7 @@ mod warp_http_tracker_server { for invalid_value in invalid_values { params.set("peer_id", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -286,7 +287,7 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_when_the_port_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -295,7 +296,7 @@ mod warp_http_tracker_server { for invalid_value in invalid_values { params.set("port", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -305,7 +306,7 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_when_the_left_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -314,7 +315,7 @@ mod warp_http_tracker_server { for invalid_value in invalid_values { params.set("left", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -326,7 +327,7 @@ mod warp_http_tracker_server { async fn should_not_fail_when_the_event_param_is_invalid() { // All invalid values are ignored as if the `event` param were empty - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -343,7 +344,7 @@ mod warp_http_tracker_server { for invalid_value in invalid_values { params.set("event", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -353,7 +354,7 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_not_fail_when_the_compact_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Warp).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -362,7 +363,7 @@ mod warp_http_tracker_server { for invalid_value in invalid_values { params.set("compact", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -372,9 +373,10 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_return_no_peers_if_the_announced_peer_is_the_first_one() { - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap()) @@ -387,8 +389,8 @@ mod warp_http_tracker_server { &Announce { complete: 1, // the peer for this test incomplete: 0, - interval: http_tracker_server.tracker.config.announce_interval, - min_interval: http_tracker_server.tracker.config.min_announce_interval, + interval: test_env.tracker.config.announce_interval, + min_interval: test_env.tracker.config.min_announce_interval, peers: vec![], }, ) @@ -397,7 +399,8 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_return_the_list_of_previously_announced_peers() { - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); @@ -407,12 +410,10 @@ mod warp_http_tracker_server { .build(); // Add the Peer 1 - http_tracker_server - .add_torrent_peer(&info_hash, &previously_announced_peer) - .await; + test_env.add_torrent_peer(&info_hash, &previously_announced_peer).await; // Announce the new Peer 2. This new peer is non included on the response peer list - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&info_hash) @@ -427,8 +428,8 @@ mod warp_http_tracker_server { &WarpAnnounce { complete: 2, incomplete: 0, - interval: http_tracker_server.tracker.config.announce_interval, - min_interval: http_tracker_server.tracker.config.min_announce_interval, + interval: test_env.tracker.config.announce_interval, + min_interval: test_env.tracker.config.min_announce_interval, peers: vec![WarpDictionaryPeer::from(previously_announced_peer)], }, ) @@ -437,13 +438,14 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_consider_two_peers_to_be_the_same_when_they_have_the_same_peer_id_even_if_the_ip_is_different() { - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let peer = PeerBuilder::default().build(); // Add a peer - http_tracker_server.add_torrent_peer(&info_hash, &peer).await; + test_env.add_torrent_peer(&info_hash, &peer).await; let announce_query = QueryBuilder::default() .with_info_hash(&info_hash) @@ -452,9 +454,7 @@ mod warp_http_tracker_server { assert_ne!(peer.peer_addr.ip(), announce_query.peer_addr); - let response = Client::new(http_tracker_server.get_connection_info()) - .announce(&announce_query) - .await; + let response = Client::new(test_env.bind_address().clone()).announce(&announce_query).await; assert_empty_announce_response(response).await; } @@ -464,7 +464,8 @@ mod warp_http_tracker_server { // Tracker Returns Compact Peer Lists // https://www.bittorrent.org/beps/bep_0023.html - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); @@ -474,12 +475,10 @@ mod warp_http_tracker_server { .build(); // Add the Peer 1 - http_tracker_server - .add_torrent_peer(&info_hash, &previously_announced_peer) - .await; + test_env.add_torrent_peer(&info_hash, &previously_announced_peer).await; // Announce the new Peer 2 accepting compact responses - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&info_hash) @@ -505,7 +504,8 @@ mod warp_http_tracker_server { // code-review: the HTTP tracker does not return the compact response by default if the "compact" // param is not provided in the announce URL. The BEP 23 suggest to do so. - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); @@ -515,14 +515,12 @@ mod warp_http_tracker_server { .build(); // Add the Peer 1 - http_tracker_server - .add_torrent_peer(&info_hash, &previously_announced_peer) - .await; + test_env.add_torrent_peer(&info_hash, &previously_announced_peer).await; // Announce the new Peer 2 without passing the "compact" param // By default it should respond with the compact peer list // https://www.bittorrent.org/beps/bep_0023.html - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&info_hash) @@ -543,26 +541,28 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_increase_the_number_of_tcp4_connections_handled_in_statistics() { - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - Client::new(http_tracker_server.get_connection_info()) + Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().query()) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp4_connections_handled, 1); } #[tokio::test] async fn should_increase_the_number_of_tcp6_connections_handled_in_statistics() { - let http_tracker_server = start_ipv6_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_ipv6()).await; - Client::bind(http_tracker_server.get_connection_info(), IpAddr::from_str("::1").unwrap()) + Client::bind(test_env.bind_address().clone(), IpAddr::from_str("::1").unwrap()) .announce(&QueryBuilder::default().query()) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_connections_handled, 1); } @@ -571,9 +571,10 @@ mod warp_http_tracker_server { async fn should_not_increase_the_number_of_tcp6_connections_handled_if_the_client_is_not_using_an_ipv6_ip() { // The tracker ignores the peer address in the request param. It uses the client remote ip address. - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - Client::new(http_tracker_server.get_connection_info()) + Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_peer_addr(&IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))) @@ -581,33 +582,35 @@ mod warp_http_tracker_server { ) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_connections_handled, 0); } #[tokio::test] async fn should_increase_the_number_of_tcp4_announce_requests_handled_in_statistics() { - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - Client::new(http_tracker_server.get_connection_info()) + Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().query()) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp4_announces_handled, 1); } #[tokio::test] async fn should_increase_the_number_of_tcp6_announce_requests_handled_in_statistics() { - let http_tracker_server = start_ipv6_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_ipv6()).await; - Client::bind(http_tracker_server.get_connection_info(), IpAddr::from_str("::1").unwrap()) + Client::bind(test_env.bind_address().clone(), IpAddr::from_str("::1").unwrap()) .announce(&QueryBuilder::default().query()) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_announces_handled, 1); } @@ -616,9 +619,10 @@ mod warp_http_tracker_server { async fn should_not_increase_the_number_of_tcp6_announce_requests_handled_if_the_client_is_not_using_an_ipv6_ip() { // The tracker ignores the peer address in the request param. It uses the client remote ip address. - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - Client::new(http_tracker_server.get_connection_info()) + Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_peer_addr(&IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))) @@ -626,19 +630,20 @@ mod warp_http_tracker_server { ) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_announces_handled, 0); } #[tokio::test] async fn should_assign_to_the_peer_ip_the_remote_client_ip_instead_of_the_peer_address_in_the_request_param() { - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let client_ip = local_ip().unwrap(); - let client = Client::bind(http_tracker_server.get_connection_info(), client_ip); + let client = Client::bind(test_env.bind_address().clone(), client_ip); let announce_query = QueryBuilder::default() .with_info_hash(&info_hash) @@ -647,7 +652,7 @@ mod warp_http_tracker_server { client.announce(&announce_query).await; - let peers = http_tracker_server.tracker.get_all_torrent_peers(&info_hash).await; + let peers = test_env.tracker.get_all_torrent_peers(&info_hash).await; let peer_addr = peers[0].peer_addr; assert_eq!(peer_addr.ip(), client_ip); @@ -663,14 +668,17 @@ mod warp_http_tracker_server { 127.0.0.1 external_ip = "2.137.87.41" */ - let http_tracker_server = - start_http_tracker_with_external_ip(&IpAddr::from_str("2.137.87.41").unwrap(), Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_external_ip( + IpAddr::from_str("2.137.87.41").unwrap(), + )) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let loopback_ip = IpAddr::from_str("127.0.0.1").unwrap(); let client_ip = loopback_ip; - let client = Client::bind(http_tracker_server.get_connection_info(), client_ip); + let client = Client::bind(test_env.bind_address().clone(), client_ip); let announce_query = QueryBuilder::default() .with_info_hash(&info_hash) @@ -679,10 +687,10 @@ mod warp_http_tracker_server { client.announce(&announce_query).await; - let peers = http_tracker_server.tracker.get_all_torrent_peers(&info_hash).await; + let peers = test_env.tracker.get_all_torrent_peers(&info_hash).await; let peer_addr = peers[0].peer_addr; - assert_eq!(peer_addr.ip(), http_tracker_server.tracker.config.get_ext_ip().unwrap()); + assert_eq!(peer_addr.ip(), test_env.tracker.config.get_ext_ip().unwrap()); assert_ne!(peer_addr.ip(), IpAddr::from_str("2.2.2.2").unwrap()); } @@ -695,17 +703,17 @@ mod warp_http_tracker_server { ::1 external_ip = "2345:0425:2CA1:0000:0000:0567:5673:23b5" */ - let http_tracker_server = start_http_tracker_with_external_ip( - &IpAddr::from_str("2345:0425:2CA1:0000:0000:0567:5673:23b5").unwrap(), - Version::Warp, - ) - .await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_external_ip( + IpAddr::from_str("2345:0425:2CA1:0000:0000:0567:5673:23b5").unwrap(), + )) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let loopback_ip = IpAddr::from_str("127.0.0.1").unwrap(); let client_ip = loopback_ip; - let client = Client::bind(http_tracker_server.get_connection_info(), client_ip); + let client = Client::bind(test_env.bind_address().clone(), client_ip); let announce_query = QueryBuilder::default() .with_info_hash(&info_hash) @@ -714,10 +722,10 @@ mod warp_http_tracker_server { client.announce(&announce_query).await; - let peers = http_tracker_server.tracker.get_all_torrent_peers(&info_hash).await; + let peers = test_env.tracker.get_all_torrent_peers(&info_hash).await; let peer_addr = peers[0].peer_addr; - assert_eq!(peer_addr.ip(), http_tracker_server.tracker.config.get_ext_ip().unwrap()); + assert_eq!(peer_addr.ip(), test_env.tracker.config.get_ext_ip().unwrap()); assert_ne!(peer_addr.ip(), IpAddr::from_str("2.2.2.2").unwrap()); } @@ -730,11 +738,13 @@ mod warp_http_tracker_server { 145.254.214.256 X-Forwarded-For = 145.254.214.256 on_reverse_proxy = true 145.254.214.256 */ - let http_tracker_server = start_http_tracker_on_reverse_proxy(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_reverse_proxy()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - let client = Client::new(http_tracker_server.get_connection_info()); + let client = Client::new(test_env.bind_address().clone()); let announce_query = QueryBuilder::default().with_info_hash(&info_hash).query(); @@ -746,7 +756,7 @@ mod warp_http_tracker_server { ) .await; - let peers = http_tracker_server.tracker.get_all_torrent_peers(&info_hash).await; + let peers = test_env.tracker.get_all_torrent_peers(&info_hash).await; let peer_addr = peers[0].peer_addr; assert_eq!(peer_addr.ip(), IpAddr::from_str("150.172.238.178").unwrap()); @@ -766,7 +776,6 @@ mod warp_http_tracker_server { use std::net::IpAddr; use std::str::FromStr; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::peer; @@ -776,26 +785,29 @@ mod warp_http_tracker_server { use crate::http::requests; use crate::http::requests::scrape::QueryBuilder; use crate::http::responses::scrape::{self, File, ResponseBuilder}; - use crate::http::server::{start_ipv6_http_tracker, start_public_http_tracker}; + use crate::http::test_environment::running_test_environment; + use crate::Warp; #[tokio::test] async fn should_fail_when_the_request_is_empty() { - let http_tracker_server = start_public_http_tracker(Version::Warp).await; - let response = Client::new(http_tracker_server.get_connection_info()).get("scrape").await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; + let response = Client::new(test_env.bind_address().clone()).get("scrape").await; assert_internal_server_error_response(response).await; } #[tokio::test] async fn should_fail_when_the_info_hash_param_is_invalid() { - let http_tracker_server = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let mut params = QueryBuilder::default().query().params(); for invalid_value in &invalid_info_hashes() { params.set_one_info_hash_param(invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -806,11 +818,12 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_return_the_file_with_the_incomplete_peer_when_there_is_one_peer_with_bytes_pending_to_download() { - let http_tracker = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -820,7 +833,7 @@ mod warp_http_tracker_server { ) .await; - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -844,11 +857,12 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_return_the_file_with_the_complete_peer_when_there_is_one_peer_with_no_bytes_pending_to_download() { - let http_tracker = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -858,7 +872,7 @@ mod warp_http_tracker_server { ) .await; - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -882,11 +896,12 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_return_a_file_with_zeroed_values_when_there_are_no_peers() { - let http_tracker = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -899,12 +914,13 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_accept_multiple_infohashes() { - let http_tracker = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash1 = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let info_hash2 = InfoHash::from_str("3b245504cf5f11bbdbe1201cea6a6bf45aee1bc0").unwrap(); - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .add_info_hash(&info_hash1) @@ -923,11 +939,12 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_increase_the_number_ot_tcp4_scrape_requests_handled_in_statistics() { - let http_tracker = start_public_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - Client::new(http_tracker.get_connection_info()) + Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -935,18 +952,19 @@ mod warp_http_tracker_server { ) .await; - let stats = http_tracker.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp4_scrapes_handled, 1); } #[tokio::test] async fn should_increase_the_number_ot_tcp6_scrape_requests_handled_in_statistics() { - let http_tracker = start_ipv6_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_ipv6()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - Client::bind(http_tracker.get_connection_info(), IpAddr::from_str("::1").unwrap()) + Client::bind(test_env.bind_address().clone(), IpAddr::from_str("::1").unwrap()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -954,7 +972,7 @@ mod warp_http_tracker_server { ) .await; - let stats = http_tracker.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_scrapes_handled, 1); } @@ -966,21 +984,23 @@ mod warp_http_tracker_server { mod and_receiving_an_announce_request { use std::str::FromStr; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use crate::http::asserts::{assert_is_announce_response, assert_torrent_not_in_whitelist_error_response}; use crate::http::client::Client; use crate::http::requests::announce::QueryBuilder; - use crate::http::server::start_whitelisted_http_tracker; + use crate::http::test_environment::running_test_environment; + use crate::Warp; #[tokio::test] async fn should_fail_if_the_torrent_is_not_in_the_whitelist() { - let http_tracker_server = start_whitelisted_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_whitelisted()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().with_info_hash(&info_hash).query()) .await; @@ -990,17 +1010,19 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_allow_announcing_a_whitelisted_torrent() { - let http_tracker_server = start_whitelisted_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_whitelisted()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker_server + test_env .tracker .add_torrent_to_whitelist(&info_hash) .await .expect("should add the torrent to the whitelist"); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().with_info_hash(&info_hash).query()) .await; @@ -1011,7 +1033,6 @@ mod warp_http_tracker_server { mod receiving_an_scrape_request { use std::str::FromStr; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::peer; @@ -1020,15 +1041,18 @@ mod warp_http_tracker_server { use crate::http::client::Client; use crate::http::requests; use crate::http::responses::scrape::{File, ResponseBuilder}; - use crate::http::server::start_whitelisted_http_tracker; + use crate::http::test_environment::running_test_environment; + use crate::Warp; #[tokio::test] async fn should_return_the_zeroed_file_when_the_requested_file_is_not_whitelisted() { - let http_tracker = start_whitelisted_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_whitelisted()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -1038,7 +1062,7 @@ mod warp_http_tracker_server { ) .await; - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -1053,11 +1077,13 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_return_the_file_stats_when_the_requested_file_is_whitelisted() { - let http_tracker = start_whitelisted_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_whitelisted()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -1067,13 +1093,13 @@ mod warp_http_tracker_server { ) .await; - http_tracker + test_env .tracker .add_torrent_to_whitelist(&info_hash) .await .expect("should add the torrent to the whitelist"); - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -1103,7 +1129,6 @@ mod warp_http_tracker_server { use std::str::FromStr; use std::time::Duration; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::auth::Key; @@ -1113,19 +1138,17 @@ mod warp_http_tracker_server { }; use crate::http::client::Client; use crate::http::requests::announce::QueryBuilder; - use crate::http::server::start_private_http_tracker; + use crate::http::test_environment::running_test_environment; + use crate::Warp; #[tokio::test] async fn should_respond_to_authenticated_peers() { - let http_tracker_server = start_private_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; - let key = http_tracker_server - .tracker - .generate_auth_key(Duration::from_secs(60)) - .await - .unwrap(); + let key = test_env.tracker.generate_auth_key(Duration::from_secs(60)).await.unwrap(); - let response = Client::authenticated(http_tracker_server.get_connection_info(), key.id()) + let response = Client::authenticated(test_env.bind_address().clone(), key.id()) .announce(&QueryBuilder::default().query()) .await; @@ -1134,11 +1157,12 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_if_the_peer_has_not_provided_the_authentication_key() { - let http_tracker_server = start_private_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().with_info_hash(&info_hash).query()) .await; @@ -1147,12 +1171,13 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_fail_if_the_peer_authentication_key_is_not_valid() { - let http_tracker_server = start_private_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; // The tracker does not have this key let unregistered_key = Key::from_str("YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ").unwrap(); - let response = Client::authenticated(http_tracker_server.get_connection_info(), unregistered_key) + let response = Client::authenticated(test_env.bind_address().clone(), unregistered_key) .announce(&QueryBuilder::default().query()) .await; @@ -1165,7 +1190,6 @@ mod warp_http_tracker_server { use std::str::FromStr; use std::time::Duration; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::auth::Key; use torrust_tracker::tracker::peer; @@ -1175,15 +1199,17 @@ mod warp_http_tracker_server { use crate::http::client::Client; use crate::http::requests; use crate::http::responses::scrape::{File, ResponseBuilder}; - use crate::http::server::start_private_http_tracker; + use crate::http::test_environment::running_test_environment; + use crate::Warp; #[tokio::test] async fn should_return_the_zeroed_file_when_the_client_is_not_authenticated() { - let http_tracker = start_private_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -1193,7 +1219,7 @@ mod warp_http_tracker_server { ) .await; - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -1208,11 +1234,12 @@ mod warp_http_tracker_server { #[tokio::test] async fn should_return_the_real_file_stats_when_the_client_is_authenticated() { - let http_tracker = start_private_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -1222,9 +1249,9 @@ mod warp_http_tracker_server { ) .await; - let key = http_tracker.tracker.generate_auth_key(Duration::from_secs(60)).await.unwrap(); + let key = test_env.tracker.generate_auth_key(Duration::from_secs(60)).await.unwrap(); - let response = Client::authenticated(http_tracker.get_connection_info(), key.id()) + let response = Client::authenticated(test_env.bind_address().clone(), key.id()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -1250,11 +1277,12 @@ mod warp_http_tracker_server { async fn should_return_the_zeroed_file_when_the_authentication_key_provided_by_the_client_is_invalid() { // There is not authentication error - let http_tracker = start_private_http_tracker(Version::Warp).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -1266,7 +1294,7 @@ mod warp_http_tracker_server { let false_key: Key = "YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ".parse().unwrap(); - let response = Client::authenticated(http_tracker.get_connection_info(), false_key) + let response = Client::authenticated(test_env.bind_address().clone(), false_key) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -1289,30 +1317,32 @@ mod warp_http_tracker_server { } } -mod axum_http_tracker_server { +mod axum_test_env { // WIP: migration HTTP from Warp to Axum mod for_all_config_modes { mod and_running_on_reverse_proxy { - use torrust_tracker::http::Version; use crate::http::asserts::assert_could_not_find_remote_address_on_x_forwarded_for_header_error_response; use crate::http::client::Client; use crate::http::requests::announce::QueryBuilder; - use crate::http::server::start_http_tracker_on_reverse_proxy; + use crate::http::test_environment::running_test_environment; + use crate::Axum; #[tokio::test] async fn should_fail_when_the_http_request_does_not_include_the_xff_http_request_header() { // If the tracker is running behind a reverse proxy, the peer IP is the // right most IP in the `X-Forwarded-For` HTTP header, which is the IP of the proxy's client. - let http_tracker_server = start_http_tracker_on_reverse_proxy(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_reverse_proxy()) + .await; let params = QueryBuilder::default().query().params(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1321,11 +1351,13 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_xff_http_request_header_contains_an_invalid_ip() { - let http_tracker_server = start_http_tracker_on_reverse_proxy(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_reverse_proxy()) + .await; let params = QueryBuilder::default().query().params(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get_with_header(&format!("announce?{params}"), "X-Forwarded-For", "INVALID IP") .await; @@ -1351,7 +1383,6 @@ mod axum_http_tracker_server { use local_ip_address::local_ip; use reqwest::Response; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::peer; @@ -1366,20 +1397,18 @@ mod axum_http_tracker_server { use crate::http::requests::announce::{Compact, QueryBuilder}; use crate::http::responses; use crate::http::responses::announce::{Announce, CompactPeer, CompactPeerList, DictionaryPeer}; - use crate::http::server::{ - start_default_http_tracker, start_http_tracker_on_reverse_proxy, start_http_tracker_with_external_ip, - start_ipv6_http_tracker, start_public_http_tracker, - }; + use crate::http::test_environment::running_test_environment; + use crate::Axum; #[tokio::test] async fn should_respond_if_only_the_mandatory_fields_are_provided() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); params.remove_optional_params(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1388,20 +1417,20 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_url_query_component_is_empty() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; - let response = Client::new(http_tracker_server.get_connection_info()).get("announce").await; + let response = Client::new(test_env.bind_address().clone()).get("announce").await; assert_missing_query_params_for_announce_request_error_response(response).await; } #[tokio::test] async fn should_fail_when_url_query_parameters_are_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let invalid_query_param = "a=b=c"; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{invalid_query_param}")) .await; @@ -1410,7 +1439,7 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_a_mandatory_field_is_missing() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; // Without `info_hash` param @@ -1418,7 +1447,7 @@ mod axum_http_tracker_server { params.info_hash = None; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1430,7 +1459,7 @@ mod axum_http_tracker_server { params.peer_id = None; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1442,7 +1471,7 @@ mod axum_http_tracker_server { params.port = None; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1451,14 +1480,14 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_info_hash_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); for invalid_value in &invalid_info_hashes() { params.set("info_hash", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1473,13 +1502,13 @@ mod axum_http_tracker_server { // 1. If tracker is NOT running `on_reverse_proxy` from the remote client IP. // 2. If tracker is running `on_reverse_proxy` from `X-Forwarded-For` request HTTP header. - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); params.peer_addr = Some("INVALID-IP-ADDRESS".to_string()); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1488,7 +1517,7 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_downloaded_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -1497,7 +1526,7 @@ mod axum_http_tracker_server { for invalid_value in invalid_values { params.set("downloaded", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1507,7 +1536,7 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_uploaded_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -1516,7 +1545,7 @@ mod axum_http_tracker_server { for invalid_value in invalid_values { params.set("uploaded", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1526,7 +1555,7 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_peer_id_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -1542,7 +1571,7 @@ mod axum_http_tracker_server { for invalid_value in invalid_values { params.set("peer_id", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1552,7 +1581,7 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_port_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -1561,7 +1590,7 @@ mod axum_http_tracker_server { for invalid_value in invalid_values { params.set("port", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1571,7 +1600,7 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_left_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -1580,7 +1609,7 @@ mod axum_http_tracker_server { for invalid_value in invalid_values { params.set("left", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1590,7 +1619,7 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_event_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -1607,7 +1636,7 @@ mod axum_http_tracker_server { for invalid_value in invalid_values { params.set("event", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1617,7 +1646,7 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_when_the_compact_param_is_invalid() { - let http_tracker_server = start_default_http_tracker(Version::Axum).await; + let test_env = running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral()).await; let mut params = QueryBuilder::default().query().params(); @@ -1626,7 +1655,7 @@ mod axum_http_tracker_server { for invalid_value in invalid_values { params.set("compact", invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -1636,9 +1665,10 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_no_peers_if_the_announced_peer_is_the_first_one() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap()) @@ -1651,8 +1681,8 @@ mod axum_http_tracker_server { &Announce { complete: 1, // the peer for this test incomplete: 0, - interval: http_tracker_server.tracker.config.announce_interval, - min_interval: http_tracker_server.tracker.config.min_announce_interval, + interval: test_env.tracker.config.announce_interval, + min_interval: test_env.tracker.config.min_announce_interval, peers: vec![], }, ) @@ -1661,7 +1691,8 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_the_list_of_previously_announced_peers() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); @@ -1671,12 +1702,10 @@ mod axum_http_tracker_server { .build(); // Add the Peer 1 - http_tracker_server - .add_torrent_peer(&info_hash, &previously_announced_peer) - .await; + test_env.add_torrent_peer(&info_hash, &previously_announced_peer).await; // Announce the new Peer 2. This new peer is non included on the response peer list - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&info_hash) @@ -1691,8 +1720,8 @@ mod axum_http_tracker_server { &Announce { complete: 2, incomplete: 0, - interval: http_tracker_server.tracker.config.announce_interval, - min_interval: http_tracker_server.tracker.config.min_announce_interval, + interval: test_env.tracker.config.announce_interval, + min_interval: test_env.tracker.config.min_announce_interval, peers: vec![DictionaryPeer::from(previously_announced_peer)], }, ) @@ -1701,7 +1730,8 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_the_list_of_previously_announced_peers_including_peers_using_ipv4_and_ipv6() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); @@ -1710,7 +1740,7 @@ mod axum_http_tracker_server { .with_peer_id(&peer::Id(*b"-qB00000000000000001")) .with_peer_addr(&SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0x69, 0x69, 0x69, 0x69)), 8080)) .build(); - http_tracker_server.add_torrent_peer(&info_hash, &peer_using_ipv4).await; + test_env.add_torrent_peer(&info_hash, &peer_using_ipv4).await; // Announce a peer using IPV6 let peer_using_ipv6 = PeerBuilder::default() @@ -1720,10 +1750,10 @@ mod axum_http_tracker_server { 8080, )) .build(); - http_tracker_server.add_torrent_peer(&info_hash, &peer_using_ipv6).await; + test_env.add_torrent_peer(&info_hash, &peer_using_ipv6).await; // Announce the new Peer. - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&info_hash) @@ -1739,8 +1769,8 @@ mod axum_http_tracker_server { &Announce { complete: 3, incomplete: 0, - interval: http_tracker_server.tracker.config.announce_interval, - min_interval: http_tracker_server.tracker.config.min_announce_interval, + interval: test_env.tracker.config.announce_interval, + min_interval: test_env.tracker.config.min_announce_interval, peers: vec![DictionaryPeer::from(peer_using_ipv4), DictionaryPeer::from(peer_using_ipv6)], }, ) @@ -1749,13 +1779,14 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_consider_two_peers_to_be_the_same_when_they_have_the_same_peer_id_even_if_the_ip_is_different() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let peer = PeerBuilder::default().build(); // Add a peer - http_tracker_server.add_torrent_peer(&info_hash, &peer).await; + test_env.add_torrent_peer(&info_hash, &peer).await; let announce_query = QueryBuilder::default() .with_info_hash(&info_hash) @@ -1764,9 +1795,7 @@ mod axum_http_tracker_server { assert_ne!(peer.peer_addr.ip(), announce_query.peer_addr); - let response = Client::new(http_tracker_server.get_connection_info()) - .announce(&announce_query) - .await; + let response = Client::new(test_env.bind_address().clone()).announce(&announce_query).await; assert_empty_announce_response(response).await; } @@ -1776,7 +1805,8 @@ mod axum_http_tracker_server { // Tracker Returns Compact Peer Lists // https://www.bittorrent.org/beps/bep_0023.html - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); @@ -1786,12 +1816,10 @@ mod axum_http_tracker_server { .build(); // Add the Peer 1 - http_tracker_server - .add_torrent_peer(&info_hash, &previously_announced_peer) - .await; + test_env.add_torrent_peer(&info_hash, &previously_announced_peer).await; // Announce the new Peer 2 accepting compact responses - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&info_hash) @@ -1817,7 +1845,8 @@ mod axum_http_tracker_server { // code-review: the HTTP tracker does not return the compact response by default if the "compact" // param is not provided in the announce URL. The BEP 23 suggest to do so. - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); @@ -1827,14 +1856,12 @@ mod axum_http_tracker_server { .build(); // Add the Peer 1 - http_tracker_server - .add_torrent_peer(&info_hash, &previously_announced_peer) - .await; + test_env.add_torrent_peer(&info_hash, &previously_announced_peer).await; // Announce the new Peer 2 without passing the "compact" param // By default it should respond with the compact peer list // https://www.bittorrent.org/beps/bep_0023.html - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_info_hash(&info_hash) @@ -1855,26 +1882,28 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_increase_the_number_of_tcp4_connections_handled_in_statistics() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - Client::new(http_tracker_server.get_connection_info()) + Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().query()) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp4_connections_handled, 1); } #[tokio::test] async fn should_increase_the_number_of_tcp6_connections_handled_in_statistics() { - let http_tracker_server = start_ipv6_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_ipv6()).await; - Client::bind(http_tracker_server.get_connection_info(), IpAddr::from_str("::1").unwrap()) + Client::bind(test_env.bind_address().clone(), IpAddr::from_str("::1").unwrap()) .announce(&QueryBuilder::default().query()) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_connections_handled, 1); } @@ -1883,9 +1912,10 @@ mod axum_http_tracker_server { async fn should_not_increase_the_number_of_tcp6_connections_handled_if_the_client_is_not_using_an_ipv6_ip() { // The tracker ignores the peer address in the request param. It uses the client remote ip address. - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - Client::new(http_tracker_server.get_connection_info()) + Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_peer_addr(&IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))) @@ -1893,33 +1923,35 @@ mod axum_http_tracker_server { ) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_connections_handled, 0); } #[tokio::test] async fn should_increase_the_number_of_tcp4_announce_requests_handled_in_statistics() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - Client::new(http_tracker_server.get_connection_info()) + Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().query()) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp4_announces_handled, 1); } #[tokio::test] async fn should_increase_the_number_of_tcp6_announce_requests_handled_in_statistics() { - let http_tracker_server = start_ipv6_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_ipv6()).await; - Client::bind(http_tracker_server.get_connection_info(), IpAddr::from_str("::1").unwrap()) + Client::bind(test_env.bind_address().clone(), IpAddr::from_str("::1").unwrap()) .announce(&QueryBuilder::default().query()) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_announces_handled, 1); } @@ -1928,9 +1960,10 @@ mod axum_http_tracker_server { async fn should_not_increase_the_number_of_tcp6_announce_requests_handled_if_the_client_is_not_using_an_ipv6_ip() { // The tracker ignores the peer address in the request param. It uses the client remote ip address. - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; - Client::new(http_tracker_server.get_connection_info()) + Client::new(test_env.bind_address().clone()) .announce( &QueryBuilder::default() .with_peer_addr(&IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1))) @@ -1938,19 +1971,20 @@ mod axum_http_tracker_server { ) .await; - let stats = http_tracker_server.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_announces_handled, 0); } #[tokio::test] async fn should_assign_to_the_peer_ip_the_remote_client_ip_instead_of_the_peer_address_in_the_request_param() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let client_ip = local_ip().unwrap(); - let client = Client::bind(http_tracker_server.get_connection_info(), client_ip); + let client = Client::bind(test_env.bind_address().clone(), client_ip); let announce_query = QueryBuilder::default() .with_info_hash(&info_hash) @@ -1959,7 +1993,7 @@ mod axum_http_tracker_server { client.announce(&announce_query).await; - let peers = http_tracker_server.tracker.get_all_torrent_peers(&info_hash).await; + let peers = test_env.tracker.get_all_torrent_peers(&info_hash).await; let peer_addr = peers[0].peer_addr; assert_eq!(peer_addr.ip(), client_ip); @@ -1975,14 +2009,17 @@ mod axum_http_tracker_server { 127.0.0.1 external_ip = "2.137.87.41" */ - let http_tracker_server = - start_http_tracker_with_external_ip(&IpAddr::from_str("2.137.87.41").unwrap(), Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_external_ip( + IpAddr::from_str("2.137.87.41").unwrap(), + )) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let loopback_ip = IpAddr::from_str("127.0.0.1").unwrap(); let client_ip = loopback_ip; - let client = Client::bind(http_tracker_server.get_connection_info(), client_ip); + let client = Client::bind(test_env.bind_address().clone(), client_ip); let announce_query = QueryBuilder::default() .with_info_hash(&info_hash) @@ -1991,10 +2028,10 @@ mod axum_http_tracker_server { client.announce(&announce_query).await; - let peers = http_tracker_server.tracker.get_all_torrent_peers(&info_hash).await; + let peers = test_env.tracker.get_all_torrent_peers(&info_hash).await; let peer_addr = peers[0].peer_addr; - assert_eq!(peer_addr.ip(), http_tracker_server.tracker.config.get_ext_ip().unwrap()); + assert_eq!(peer_addr.ip(), test_env.tracker.config.get_ext_ip().unwrap()); assert_ne!(peer_addr.ip(), IpAddr::from_str("2.2.2.2").unwrap()); } @@ -2007,17 +2044,17 @@ mod axum_http_tracker_server { ::1 external_ip = "2345:0425:2CA1:0000:0000:0567:5673:23b5" */ - let http_tracker_server = start_http_tracker_with_external_ip( - &IpAddr::from_str("2345:0425:2CA1:0000:0000:0567:5673:23b5").unwrap(), - Version::Axum, - ) - .await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_external_ip( + IpAddr::from_str("2345:0425:2CA1:0000:0000:0567:5673:23b5").unwrap(), + )) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let loopback_ip = IpAddr::from_str("127.0.0.1").unwrap(); let client_ip = loopback_ip; - let client = Client::bind(http_tracker_server.get_connection_info(), client_ip); + let client = Client::bind(test_env.bind_address().clone(), client_ip); let announce_query = QueryBuilder::default() .with_info_hash(&info_hash) @@ -2026,10 +2063,10 @@ mod axum_http_tracker_server { client.announce(&announce_query).await; - let peers = http_tracker_server.tracker.get_all_torrent_peers(&info_hash).await; + let peers = test_env.tracker.get_all_torrent_peers(&info_hash).await; let peer_addr = peers[0].peer_addr; - assert_eq!(peer_addr.ip(), http_tracker_server.tracker.config.get_ext_ip().unwrap()); + assert_eq!(peer_addr.ip(), test_env.tracker.config.get_ext_ip().unwrap()); assert_ne!(peer_addr.ip(), IpAddr::from_str("2.2.2.2").unwrap()); } @@ -2042,11 +2079,13 @@ mod axum_http_tracker_server { 145.254.214.256 X-Forwarded-For = 145.254.214.256 on_reverse_proxy = true 145.254.214.256 */ - let http_tracker_server = start_http_tracker_on_reverse_proxy(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_with_reverse_proxy()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - let client = Client::new(http_tracker_server.get_connection_info()); + let client = Client::new(test_env.bind_address().clone()); let announce_query = QueryBuilder::default().with_info_hash(&info_hash).query(); @@ -2058,7 +2097,7 @@ mod axum_http_tracker_server { ) .await; - let peers = http_tracker_server.tracker.get_all_torrent_peers(&info_hash).await; + let peers = test_env.tracker.get_all_torrent_peers(&info_hash).await; let peer_addr = peers[0].peer_addr; assert_eq!(peer_addr.ip(), IpAddr::from_str("150.172.238.178").unwrap()); @@ -2078,7 +2117,6 @@ mod axum_http_tracker_server { use std::net::IpAddr; use std::str::FromStr; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::peer; @@ -2091,26 +2129,30 @@ mod axum_http_tracker_server { use crate::http::requests; use crate::http::requests::scrape::QueryBuilder; use crate::http::responses::scrape::{self, File, ResponseBuilder}; - use crate::http::server::{start_ipv6_http_tracker, start_public_http_tracker}; + use crate::http::test_environment::running_test_environment; + use crate::Axum; - #[tokio::test] - async fn should_fail_when_the_url_query_component_is_empty() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; - let response = Client::new(http_tracker_server.get_connection_info()).get("scrape").await; + //#[tokio::test] + #[allow(dead_code)] + async fn should_fail_when_the_request_is_empty() { + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; + let response = Client::new(test_env.bind_address().clone()).get("scrape").await; assert_missing_query_params_for_scrape_request_error_response(response).await; } #[tokio::test] async fn should_fail_when_the_info_hash_param_is_invalid() { - let http_tracker_server = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let mut params = QueryBuilder::default().query().params(); for invalid_value in &invalid_info_hashes() { params.set_one_info_hash_param(invalid_value); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!("announce?{params}")) .await; @@ -2120,11 +2162,12 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_the_file_with_the_incomplete_peer_when_there_is_one_peer_with_bytes_pending_to_download() { - let http_tracker = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -2134,7 +2177,7 @@ mod axum_http_tracker_server { ) .await; - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2158,11 +2201,12 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_the_file_with_the_complete_peer_when_there_is_one_peer_with_no_bytes_pending_to_download() { - let http_tracker = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -2172,7 +2216,7 @@ mod axum_http_tracker_server { ) .await; - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2196,11 +2240,12 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_a_file_with_zeroed_values_when_there_are_no_peers() { - let http_tracker = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2213,12 +2258,13 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_accept_multiple_infohashes() { - let http_tracker = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash1 = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); let info_hash2 = InfoHash::from_str("3b245504cf5f11bbdbe1201cea6a6bf45aee1bc0").unwrap(); - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .add_info_hash(&info_hash1) @@ -2237,11 +2283,12 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_increase_the_number_ot_tcp4_scrape_requests_handled_in_statistics() { - let http_tracker = start_public_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_public()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - Client::new(http_tracker.get_connection_info()) + Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2249,18 +2296,19 @@ mod axum_http_tracker_server { ) .await; - let stats = http_tracker.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp4_scrapes_handled, 1); } #[tokio::test] async fn should_increase_the_number_ot_tcp6_scrape_requests_handled_in_statistics() { - let http_tracker = start_ipv6_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_ipv6()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - Client::bind(http_tracker.get_connection_info(), IpAddr::from_str("::1").unwrap()) + Client::bind(test_env.bind_address().clone(), IpAddr::from_str("::1").unwrap()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2268,7 +2316,7 @@ mod axum_http_tracker_server { ) .await; - let stats = http_tracker.tracker.get_stats().await; + let stats = test_env.tracker.get_stats().await; assert_eq!(stats.tcp6_scrapes_handled, 1); } @@ -2280,21 +2328,23 @@ mod axum_http_tracker_server { mod and_receiving_an_announce_request { use std::str::FromStr; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use crate::http::asserts::{assert_is_announce_response, assert_torrent_not_in_whitelist_error_response}; use crate::http::client::Client; use crate::http::requests::announce::QueryBuilder; - use crate::http::server::start_whitelisted_http_tracker; + use crate::http::test_environment::running_test_environment; + use crate::Axum; #[tokio::test] async fn should_fail_if_the_torrent_is_not_in_the_whitelist() { - let http_tracker_server = start_whitelisted_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_whitelisted()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().with_info_hash(&info_hash).query()) .await; @@ -2303,17 +2353,19 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_allow_announcing_a_whitelisted_torrent() { - let http_tracker_server = start_whitelisted_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_whitelisted()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker_server + test_env .tracker .add_torrent_to_whitelist(&info_hash) .await .expect("should add the torrent to the whitelist"); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().with_info_hash(&info_hash).query()) .await; @@ -2324,7 +2376,6 @@ mod axum_http_tracker_server { mod receiving_an_scrape_request { use std::str::FromStr; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::peer; @@ -2333,15 +2384,18 @@ mod axum_http_tracker_server { use crate::http::client::Client; use crate::http::requests; use crate::http::responses::scrape::{File, ResponseBuilder}; - use crate::http::server::start_whitelisted_http_tracker; + use crate::http::test_environment::running_test_environment; + use crate::Axum; #[tokio::test] async fn should_return_the_zeroed_file_when_the_requested_file_is_not_whitelisted() { - let http_tracker = start_whitelisted_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_whitelisted()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -2351,7 +2405,7 @@ mod axum_http_tracker_server { ) .await; - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2366,11 +2420,13 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_the_file_stats_when_the_requested_file_is_whitelisted() { - let http_tracker = start_whitelisted_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_whitelisted()) + .await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -2380,13 +2436,13 @@ mod axum_http_tracker_server { ) .await; - http_tracker + test_env .tracker .add_torrent_to_whitelist(&info_hash) .await .expect("should add the torrent to the whitelist"); - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2416,26 +2472,23 @@ mod axum_http_tracker_server { use std::str::FromStr; use std::time::Duration; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::auth::Key; use crate::http::asserts::{assert_authentication_error_response, assert_is_announce_response}; use crate::http::client::Client; use crate::http::requests::announce::QueryBuilder; - use crate::http::server::start_private_http_tracker; + use crate::http::test_environment::running_test_environment; + use crate::Axum; #[tokio::test] async fn should_respond_to_authenticated_peers() { - let http_tracker_server = start_private_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; - let key = http_tracker_server - .tracker - .generate_auth_key(Duration::from_secs(60)) - .await - .unwrap(); + let key = test_env.tracker.generate_auth_key(Duration::from_secs(60)).await.unwrap(); - let response = Client::authenticated(http_tracker_server.get_connection_info(), key.id()) + let response = Client::authenticated(test_env.bind_address().clone(), key.id()) .announce(&QueryBuilder::default().query()) .await; @@ -2444,11 +2497,12 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_if_the_peer_has_not_provided_the_authentication_key() { - let http_tracker_server = start_private_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .announce(&QueryBuilder::default().with_info_hash(&info_hash).query()) .await; @@ -2457,11 +2511,12 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_if_the_key_query_param_cannot_be_parsed() { - let http_tracker_server = start_private_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let invalid_key = "INVALID_KEY"; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!( "announce/{invalid_key}?info_hash=%81%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00&peer_addr=2.137.87.41&downloaded=0&uploaded=0&peer_id=-qB00000000000000001&port=17548&left=0&event=completed&compact=0" )) @@ -2472,12 +2527,13 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_fail_if_the_peer_cannot_be_authenticated_with_the_provided_key() { - let http_tracker_server = start_private_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; // The tracker does not have this key let unregistered_key = Key::from_str("YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ").unwrap(); - let response = Client::authenticated(http_tracker_server.get_connection_info(), unregistered_key) + let response = Client::authenticated(test_env.bind_address().clone(), unregistered_key) .announce(&QueryBuilder::default().query()) .await; @@ -2490,7 +2546,6 @@ mod axum_http_tracker_server { use std::str::FromStr; use std::time::Duration; - use torrust_tracker::http::Version; use torrust_tracker::protocol::info_hash::InfoHash; use torrust_tracker::tracker::auth::Key; use torrust_tracker::tracker::peer; @@ -2500,15 +2555,17 @@ mod axum_http_tracker_server { use crate::http::client::Client; use crate::http::requests; use crate::http::responses::scrape::{File, ResponseBuilder}; - use crate::http::server::start_private_http_tracker; + use crate::http::test_environment::running_test_environment; + use crate::Axum; #[tokio::test] async fn should_fail_if_the_key_query_param_cannot_be_parsed() { - let http_tracker_server = start_private_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let invalid_key = "INVALID_KEY"; - let response = Client::new(http_tracker_server.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .get(&format!( "scrape/{invalid_key}?info_hash=%3B%24U%04%CF%5F%11%BB%DB%E1%20%1C%EAjk%F4Z%EE%1B%C0" )) @@ -2519,11 +2576,12 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_the_zeroed_file_when_the_client_is_not_authenticated() { - let http_tracker = start_private_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -2533,7 +2591,7 @@ mod axum_http_tracker_server { ) .await; - let response = Client::new(http_tracker.get_connection_info()) + let response = Client::new(test_env.bind_address().clone()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2548,11 +2606,12 @@ mod axum_http_tracker_server { #[tokio::test] async fn should_return_the_real_file_stats_when_the_client_is_authenticated() { - let http_tracker = start_private_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -2562,9 +2621,9 @@ mod axum_http_tracker_server { ) .await; - let key = http_tracker.tracker.generate_auth_key(Duration::from_secs(60)).await.unwrap(); + let key = test_env.tracker.generate_auth_key(Duration::from_secs(60)).await.unwrap(); - let response = Client::authenticated(http_tracker.get_connection_info(), key.id()) + let response = Client::authenticated(test_env.bind_address().clone(), key.id()) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) @@ -2591,11 +2650,12 @@ mod axum_http_tracker_server { // There is not authentication error // code-review: should this really be this way? - let http_tracker = start_private_http_tracker(Version::Axum).await; + let test_env = + running_test_environment::(torrust_tracker_test_helpers::configuration::ephemeral_mode_private()).await; let info_hash = InfoHash::from_str("9c38422213e30bff212b30c360d26f9a02136422").unwrap(); - http_tracker + test_env .add_torrent_peer( &info_hash, &PeerBuilder::default() @@ -2607,7 +2667,7 @@ mod axum_http_tracker_server { let false_key: Key = "YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ".parse().unwrap(); - let response = Client::authenticated(http_tracker.get_connection_info(), false_key) + let response = Client::authenticated(test_env.bind_address().clone(), false_key) .scrape( &requests::scrape::QueryBuilder::default() .with_one_info_hash(&info_hash) diff --git a/tests/udp/test_environment.rs b/tests/udp/test_environment.rs index 585a8f93..f805d9a0 100644 --- a/tests/udp/test_environment.rs +++ b/tests/udp/test_environment.rs @@ -6,7 +6,7 @@ use torrust_tracker::tracker::peer::Peer; use torrust_tracker::tracker::Tracker; use torrust_tracker::udp::server::{RunningUdpServer, StoppedUdpServer, UdpServer}; -use crate::common::tracker::{tracker_configuration, tracker_instance}; +use crate::common::tracker::new_tracker; #[allow(clippy::module_name_repetitions, dead_code)] pub type StoppedTestEnvironment = TestEnvironment; @@ -88,9 +88,9 @@ pub async fn running_test_environment() -> RunningTestEnvironment { } pub fn udp_server() -> StoppedUdpServer { - let config = tracker_configuration(); + let config = Arc::new(torrust_tracker_test_helpers::configuration::ephemeral()); - let tracker = tracker_instance(&config); + let tracker = new_tracker(config.clone()); UdpServer::new(config.udp_trackers[0].clone(), tracker) }