diff --git a/src/main.rs b/src/main.rs index bac7854bb..dcb92acb8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,7 +24,7 @@ async fn main() { }; // Initialize stats tracker - let stats_tracker = StatsTracker::new_running_instance(); + let stats_tracker = StatsTracker::new_instance(config.tracker_usage_statistics); // Initialize Torrust tracker let tracker = match TorrentTracker::new(config.clone(), Box::new(stats_tracker)) { diff --git a/src/tracker/statistics.rs b/src/tracker/statistics.rs index a2a0de99b..fb4e4c0fe 100644 --- a/src/tracker/statistics.rs +++ b/src/tracker/statistics.rs @@ -62,9 +62,24 @@ pub struct StatsTracker { } impl StatsTracker { - pub fn new_running_instance() -> Self { - let mut stats_tracker = Self::new(); - stats_tracker.run_worker(); + pub fn new_active_instance() -> Self { + Self::new_instance(true) + } + + pub fn new_inactive_instance() -> Self { + Self::new_instance(false) + } + + pub fn new_instance(active: bool) -> Self { + let mut stats_tracker = Self { + channel_sender: None, + stats: Arc::new(RwLock::new(TrackerStatistics::new())), + }; + + if active { + stats_tracker.run_worker(); + } + stats_tracker } @@ -161,3 +176,33 @@ impl TrackerStatisticsRepository for StatsTracker { pub trait TrackerStatsService: TrackerStatisticsEventSender + TrackerStatisticsRepository {} impl TrackerStatsService for StatsTracker {} + +#[cfg(test)] +mod test { + + mod event_sender { + use crate::statistics::{StatsTracker, TrackerStatisticsEvent, TrackerStatisticsEventSender}; + + #[tokio::test] + async fn should_not_send_any_event_when_statistics_are_disabled() { + let tracker_usage_statistics = false; + + let inactive_stats_tracker = StatsTracker::new_instance(tracker_usage_statistics); + + let result = inactive_stats_tracker.send_event(TrackerStatisticsEvent::Tcp4Announce).await; + + assert!(result.is_none()); + } + + #[tokio::test] + async fn should_send_events_when_statistics_are_enabled() { + let tracker_usage_statistics = true; + + let active_stats_tracker = StatsTracker::new_instance(tracker_usage_statistics); + + let result = active_stats_tracker.send_event(TrackerStatisticsEvent::Tcp4Announce).await; + + assert!(result.is_some()); + } + } +} diff --git a/src/udp/handlers.rs b/src/udp/handlers.rs index d46cd9231..845b860e9 100644 --- a/src/udp/handlers.rs +++ b/src/udp/handlers.rs @@ -271,17 +271,17 @@ mod tests { fn initialized_public_tracker() -> Arc { let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Public).into()); - Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_running_instance())).unwrap()) + Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_active_instance())).unwrap()) } fn initialized_private_tracker() -> Arc { let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Private).into()); - Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_running_instance())).unwrap()) + Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_active_instance())).unwrap()) } fn initialized_whitelisted_tracker() -> Arc { let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Listed).into()); - Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_running_instance())).unwrap()) + Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_active_instance())).unwrap()) } fn sample_ipv4_remote_addr() -> SocketAddr { @@ -970,7 +970,7 @@ mod tests { async fn the_peer_ip_should_be_changed_to_the_external_ip_in_the_tracker_configuration() { let configuration = Arc::new(TrackerConfigurationBuilder::default().with_external_ip("::126.0.0.1").into()); let tracker = - Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_running_instance())).unwrap()); + Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_active_instance())).unwrap()); let loopback_ipv4 = Ipv4Addr::new(127, 0, 0, 1); let loopback_ipv6 = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);