@@ -13,6 +13,7 @@ use crate::statistics::{
1313
1414pub 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