Skip to content

Commit 1405ff5

Browse files
committed
test: [#1358] add tests for events in torrent-repository pkg
1 parent f71211f commit 1405ff5

File tree

2 files changed

+194
-0
lines changed

2 files changed

+194
-0
lines changed

packages/torrent-repository/src/event.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,29 @@ pub mod bus {
8383

8484
pub type EventBus = torrust_tracker_events::bus::EventBus<Event>;
8585
}
86+
87+
#[cfg(test)]
88+
pub mod test {
89+
90+
use torrust_tracker_primitives::peer::Peer;
91+
92+
use super::Event;
93+
use crate::tests::sample_info_hash;
94+
95+
#[test]
96+
fn events_should_be_comparable() {
97+
let info_hash = sample_info_hash();
98+
99+
let event1 = Event::TorrentAdded {
100+
info_hash,
101+
announcement: Peer::default(),
102+
};
103+
104+
let event2 = Event::TorrentRemoved { info_hash };
105+
106+
let event1_clone = event1.clone();
107+
108+
assert!(event1 == event1_clone);
109+
assert!(event1 != event2);
110+
}
111+
}

packages/torrent-repository/src/statistics/event/handler.rs

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::statistics::{
1313

1414
pub async fn handle_event(event: Event, stats_repository: &Arc<Repository>, now: DurationSinceUnixEpoch) {
1515
match event {
16+
// Torrent events
1617
Event::TorrentAdded { info_hash, .. } => {
1718
tracing::debug!(info_hash = ?info_hash, "Torrent added",);
1819

@@ -27,6 +28,8 @@ pub async fn handle_event(event: Event, stats_repository: &Arc<Repository>, now:
2728
.decrement_gauge(&metric_name!(TORRENT_REPOSITORY_TORRENTS_TOTAL), &LabelSet::default(), now)
2829
.await;
2930
}
31+
32+
// Peer events
3033
Event::PeerAdded { info_hash, peer } => {
3134
tracing::debug!(info_hash = ?info_hash, peer = ?peer, "Peer added", );
3235

@@ -96,3 +99,168 @@ fn label_set_for_peer(peer: &Peer) -> LabelSet {
9699
(label_name!("peer_role"), LabelValue::new("leecher")).into()
97100
}
98101
}
102+
103+
#[cfg(test)]
104+
mod tests {
105+
use std::sync::Arc;
106+
107+
use torrust_tracker_metrics::label::LabelSet;
108+
use torrust_tracker_metrics::metric::MetricName;
109+
110+
use crate::statistics::repository::Repository;
111+
112+
async fn expect_metric_to_be(
113+
stats_repository: &Arc<Repository>,
114+
metric_name: &MetricName,
115+
label_set: &LabelSet,
116+
expected_value: f64,
117+
) {
118+
let torrents_total = stats_repository
119+
.get_metrics()
120+
.await
121+
.metric_collection
122+
.get_gauge_value(metric_name, label_set)
123+
.unwrap()
124+
.value();
125+
126+
assert_eq!(torrents_total.to_string(), expected_value.to_string());
127+
}
128+
129+
mod for_torrent_events {
130+
131+
use std::sync::Arc;
132+
133+
use torrust_tracker_clock::clock::stopped::Stopped;
134+
use torrust_tracker_clock::clock::{self, Time};
135+
use torrust_tracker_metrics::label::LabelSet;
136+
use torrust_tracker_metrics::metric_name;
137+
138+
use crate::event::Event;
139+
use crate::statistics::event::handler::handle_event;
140+
use crate::statistics::event::handler::tests::expect_metric_to_be;
141+
use crate::statistics::repository::Repository;
142+
use crate::statistics::TORRENT_REPOSITORY_TORRENTS_TOTAL;
143+
use crate::tests::{sample_info_hash, sample_peer};
144+
use crate::CurrentClock;
145+
146+
#[tokio::test]
147+
async fn it_should_increment_the_number_of_torrents_when_a_torrent_added_event_is_received() {
148+
clock::Stopped::local_set_to_unix_epoch();
149+
150+
let stats_repository = Arc::new(Repository::new());
151+
152+
handle_event(
153+
Event::TorrentAdded {
154+
info_hash: sample_info_hash(),
155+
announcement: sample_peer(),
156+
},
157+
&stats_repository,
158+
CurrentClock::now(),
159+
)
160+
.await;
161+
162+
expect_metric_to_be(
163+
&stats_repository,
164+
&metric_name!(TORRENT_REPOSITORY_TORRENTS_TOTAL),
165+
&LabelSet::default(),
166+
1.0,
167+
)
168+
.await;
169+
}
170+
171+
#[tokio::test]
172+
async fn it_should_decrement_the_number_of_torrents_when_a_torrent_removed_event_is_received() {
173+
clock::Stopped::local_set_to_unix_epoch();
174+
175+
let stats_repository = Arc::new(Repository::new());
176+
let metric_name = metric_name!(TORRENT_REPOSITORY_TORRENTS_TOTAL);
177+
let label_set = LabelSet::default();
178+
179+
// Increment the gauge first to simulate a torrent being added.
180+
stats_repository
181+
.increment_gauge(&metric_name, &label_set, CurrentClock::now())
182+
.await
183+
.unwrap();
184+
185+
handle_event(
186+
Event::TorrentRemoved {
187+
info_hash: sample_info_hash(),
188+
},
189+
&stats_repository,
190+
CurrentClock::now(),
191+
)
192+
.await;
193+
194+
expect_metric_to_be(&stats_repository, &metric_name, &label_set, 0.0).await;
195+
}
196+
}
197+
198+
mod for_peer_events {
199+
200+
use std::sync::Arc;
201+
202+
use torrust_tracker_clock::clock::stopped::Stopped;
203+
use torrust_tracker_clock::clock::{self, Time};
204+
use torrust_tracker_metrics::label::LabelValue;
205+
use torrust_tracker_metrics::{label_name, metric_name};
206+
207+
use crate::event::Event;
208+
use crate::statistics::event::handler::handle_event;
209+
use crate::statistics::event::handler::tests::expect_metric_to_be;
210+
use crate::statistics::repository::Repository;
211+
use crate::statistics::TORRENT_REPOSITORY_PEER_CONNECTIONS_TOTAL;
212+
use crate::tests::{sample_info_hash, sample_peer, seeder};
213+
use crate::CurrentClock;
214+
215+
#[tokio::test]
216+
async fn it_should_increment_the_number_of_peer_connections_from_seeders_when_a_peer_added_event_is_received_from_a_seeder(
217+
) {
218+
clock::Stopped::local_set_to_unix_epoch();
219+
220+
let stats_repository = Arc::new(Repository::new());
221+
let metric_name = metric_name!(TORRENT_REPOSITORY_PEER_CONNECTIONS_TOTAL);
222+
let label_set = (label_name!("peer_role"), LabelValue::new("seeder")).into();
223+
224+
handle_event(
225+
Event::PeerAdded {
226+
info_hash: sample_info_hash(),
227+
peer: seeder(),
228+
},
229+
&stats_repository,
230+
CurrentClock::now(),
231+
)
232+
.await;
233+
234+
expect_metric_to_be(&stats_repository, &metric_name, &label_set, 1.0).await;
235+
}
236+
237+
#[tokio::test]
238+
async fn it_should_decrement_the_number_of_peer_connections_from_seeders_when_a_peer_removed_event_is_received_from_a_seeder(
239+
) {
240+
clock::Stopped::local_set_to_unix_epoch();
241+
242+
let stats_repository = Arc::new(Repository::new());
243+
244+
let metric_name = metric_name!(TORRENT_REPOSITORY_PEER_CONNECTIONS_TOTAL);
245+
let label_set = (label_name!("peer_role"), LabelValue::new("seeder")).into();
246+
247+
// Increment the gauge first to simulate a peer being added.
248+
stats_repository
249+
.increment_gauge(&metric_name, &label_set, CurrentClock::now())
250+
.await
251+
.unwrap();
252+
253+
handle_event(
254+
Event::PeerRemoved {
255+
info_hash: sample_info_hash(),
256+
peer: sample_peer(),
257+
},
258+
&stats_repository,
259+
CurrentClock::now(),
260+
)
261+
.await;
262+
263+
expect_metric_to_be(&stats_repository, &metric_name, &label_set, 0.0).await;
264+
}
265+
}
266+
}

0 commit comments

Comments
 (0)