Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
51 changes: 48 additions & 3 deletions src/tracker/statistics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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());
}
}
}
8 changes: 4 additions & 4 deletions src/udp/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,17 +271,17 @@ mod tests {

fn initialized_public_tracker() -> Arc<TorrentTracker> {
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<TorrentTracker> {
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<TorrentTracker> {
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 {
Expand Down Expand Up @@ -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);
Expand Down